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 1vnrA2-00Ccs8-0d for pgsql-hackers@arkaria.postgresql.org; Thu, 05 Feb 2026 04:40:10 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vnrA1-00F7cp-0k for pgsql-hackers@arkaria.postgresql.org; Thu, 05 Feb 2026 04:40:09 +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 1vnrA0-00F7cf-2a for pgsql-hackers@lists.postgresql.org; Thu, 05 Feb 2026 04:40:08 +0000 Received: from mail-qv1-xf30.google.com ([2607:f8b0:4864:20::f30]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vnr9x-000000018Zp-40J2 for pgsql-hackers@lists.postgresql.org; Thu, 05 Feb 2026 04:40:08 +0000 Received: by mail-qv1-xf30.google.com with SMTP id 6a1803df08f44-895071c5527so7732926d6.1 for ; Wed, 04 Feb 2026 20:40:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1770266404; cv=none; d=google.com; s=arc-20240605; b=IIEFRRC0pfhZSWeO0+uaoGFlrhxxUa0ZTfz2FsVr9VPv4A1ftYZoobKb620R/CRdwx hPsjBQop68+fgXVHvG0IfInKHdEVbO1bpygjQWyf1CMhonPItK77ClIUk04FtFKGbrKB kqjXKueGJhmsGb6lRYiM951kXLkzt4EHYY4ia1f0Hk7VE0Z0/oJxY3FKS0QhXnuulhXI WSbLjxQzBZadaDQ8jpw1E1IiUp8CrU40TjKPW66t+PxzffsLsedbwYJkzXVVcce9pQEz XagjQR6/LcQcOjCoEfeUC98vdmf8zTCVb7PBIzWx7GRyysK7WOlpcv4maqx39LRJVbex og2w== 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=DpiwLyWCC9wc3kuBYGcPKvjvh6WAY1TYnfeshkEo5JE=; fh=0WVMofLSLE1QNM04I2+CAy76i40lNGXnOXUnq5dvmUc=; b=VivV0RmTgPTJyQ72EKD8YSepeH7HrA34R0/blKh2cHTMo5PyyKdyDZOAWuQa8rp7Gz 5YIOUWu+a0ySH3+R3gt6nSDua1BG+Hw4aIjgQcLZuG9sbSochMJ6ztz2leNHioIRGuaa 44b0jXDxTAzTTVHAq1u02F7iaZWHwPi5saOALcTkkSXEcIirK3Qklow4TPdYuJv0aEyZ jE0CbS0YgmRUc/y/wMfpZfUOgdvBly5pIRRlwGK2XRH/XhPMYbYxs4eAbSQLEwhu0897 T3cwWCR3z9biychXLVjYfurXB5aq34hNzNQIgGHnSWLu+90XH2To32Tv0zHiZgAWjzb2 QdpQ==; 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=20230601; t=1770266404; x=1770871204; 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=DpiwLyWCC9wc3kuBYGcPKvjvh6WAY1TYnfeshkEo5JE=; b=L2+HQIZkyoKGZHPfdKRTuqlxPc/7eMfciMn22fB/Sy4Jx49fe0nEbTh0CXFCZVd3EG yyLCWTSmYMTQqqGXMD6QYyYQFyja08//9fSjLGxpcwwTJnRMSXiRyt6hOIaitRAKlI1o rKT+rBI8gyozksRHvI2JIgtJgVNXb1MY8bRfBCmQ7CPCZCT4g0lH/DJbCsCJES0lHY37 dtMxeT23o6vu96Iygs5w4YyIoa0zf2osm8Utab35qo9AhBOdOJQQtRad5OdTLRt8D+RW JjbvC5uIVFFsYZ0DJb4+lWIGee3hyQS3qAIlA3wn66mDbp/BcYl3+9pnJSn8t+ayc7GG i0ng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770266404; x=1770871204; 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=DpiwLyWCC9wc3kuBYGcPKvjvh6WAY1TYnfeshkEo5JE=; b=AAx406BvpYSPtEviT5q3nVqBMp0ENuaiesxXMhgDcjf60VrKmvBlViDFmGwbLGLVtZ 9rRpPcNMjuAdUda+bFiJBLYRaswvAXSNfnxO+88r2Hcjekl7W77B0miMVtSgYfKP8sh+ Jd9E6iA7HQcZEXtnH/oMu1Hw7PwbvTH3qznelIlMkzNGoqZKXEqi+ROHOkZsYQfC69my U7u38Jwr9zmr/jTMTB6K+DijHUtr0KV7TAMpDY/b59bITMqVxi9bSBgX4AdjZFAb330E 1V+fdL1+mzWWqlm4uv9rjWZ+cqVlSVTc++/QeJLOzZ9/FozKJkW6XR41LsGFPBHrjZ/9 uqHA== X-Forwarded-Encrypted: i=1; AJvYcCWF1CDQKfO5r6N+0TyXYGcu+mgEaPFAyQYKaLOPPsfvnqzWsFnCaZwk1VYpWLtHsEGFgqkQqxjdGN4x0OL5@lists.postgresql.org X-Gm-Message-State: AOJu0YxFnISvIRhGbQOuZkLOaJyvrfR79ikyZpeNpPF2XDa/9k3qQAlI VmPyvLFwIVQf0bRJ4l4nY1IemXEVmozR/8svO7e8BVHQcCHBy5NfWQSRvBjKuZqkpda9w86u7zD gDDPEZiIu2w1NreWEd895esJPyzV4sg== X-Gm-Gg: AZuq6aJs1/j0G1jDQZcIGnnE4NdA6yQOuACq1kG6NZ5UDYOCg+odadRUoP6emFOKb8i 7pHPaDeLOy/3TYWOdVwkm+QEzoQfRub5OysNNJZBwo8xGBIcKJ6Ti9CUKVOwUQODjuTpZBy5/T6 NmNHmRDM5tTXbwosyMOjiBOmPwASyckQFoer0ZgaFQu+vlZ60GqKjK/CjfhzrRuV8DQ8L6vORxW taVVlmuukhpvXUu6AJ1EzqJa60yd/dcJrfijNbpOWhfbGHKCr76vq4IPFCIdRdBVweWAng= X-Received: by 2002:a05:6214:1942:b0:894:72a9:68ee with SMTP id 6a1803df08f44-895221227fbmr75258666d6.11.1770266403869; Wed, 04 Feb 2026 20:40:03 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Shinya Kato Date: Thu, 5 Feb 2026 13:39:27 +0900 X-Gm-Features: AZwV_QjqnKXAoEL04prg1_9S4SOUFRCOfoouox1G05YeUMhekPR1TXS0pEwNDhI Message-ID: Subject: Re: Report oldest xmin source when autovacuum cannot remove tuples To: wenhui qiu Cc: Sami Imseih , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="0000000000002a58df064a0c449a" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000002a58df064a0c449a Content-Type: text/plain; charset="UTF-8" HI, Sorry for the late reply. I've updated the patch to follow Sami's recommended approach. Overview: - Instead of modifying ComputeXidHorizons(), this patch introduces two new functions: GetXidHorizonBlockers() and GetXidHorizonBlocker(). - GetXidHorizonBlockers() retrieves all potential blockers. This API design leaves open the possibility of exposing this information through a dynamic statistics view in the future [0]. - GetXidHorizonBlocker() selects the highest-priority blocker from the candidates returned by GetXidHorizonBlockers(). - Priority is defined in the XidHorizonBlockerType enum. By distinguishing whether the blocker matches the horizon via xid or xmin, the appropriate blocker is selected. Changes addressed from review comments: - Fixed unstable regression test (Fujii-san's and Andres's comments). - When multiple blockers share the same horizon, the blocker with the highest priority is now selected for output (Fujii-san's comment). - Removed unnecessary code (Fujii-san's comment). - Distinguished between active transactions and idle-in-transaction sessions, and added tests for both (Sami's and Wenhui's comments). - Added a trailing comma to the last value of the enum (Sami's comment). - Added a new function GetXidHorizonBlockers(), modeled after BackendXidGetPid(), instead of modifying ComputeXidHorizons() (Sami's comment). - Added a test for a SERIALIZABLE transaction (Sami's comment). Not addressed: - Did not switch from int to pid_t for the pid type, because int is used consistently throughout the PostgreSQL codebase for this purpose (Sami's comment). Other changes: - Changed the TAP test to use VACUUM (VERBOSE) instead of autovacuum. [0] https://www.postgresql.org/message-id/CAAaqYe9Dy9sicKg3xzCQUMK3VLdEP39g9nMGZheqtFYfNiO5Bg%40mail.gmail.com -- Best regards, Shinya Kato NTT OSS Center --0000000000002a58df064a0c449a Content-Type: application/x-patch; name="v2-0001-Report-oldest-xmin-blocker-when-VACUUM-cannot-rem.patch" Content-Disposition: attachment; filename="v2-0001-Report-oldest-xmin-blocker-when-VACUUM-cannot-rem.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ml8ytyzm0 RnJvbSBlODI3Y2NjZjIwNDk0NmFkMDg4ZjIwZjAzNDAxNjBjNjM1NzQwMTQ4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBTaGlueWEgS2F0byA8c2hpbnlhMTEua2F0b0BnbWFpbC5jb20+ CkRhdGU6IFRodSwgNSBGZWIgMjAyNiAxMzozNTozNyArMDkwMApTdWJqZWN0OiBbUEFUQ0ggdjJd IFJlcG9ydCBvbGRlc3QgeG1pbiBibG9ja2VyIHdoZW4gVkFDVVVNIGNhbm5vdCByZW1vdmUKIHR1 cGxlcwoKV2hlbiBWQUNVVU0gZW5jb3VudGVycyByZWNlbnRseS1kZWFkIHR1cGxlcyB0aGF0IGNh bm5vdCBiZSByZW1vdmVkLAppdCBpcyBvZnRlbiB1bmNsZWFyIHdoYXQgaXMgcHJldmVudGluZyB0 aGUgeGlkIGhvcml6b24gZnJvbSBhZHZhbmNpbmcuClRoaXMgcGF0Y2ggYWRkcyBkaWFnbm9zdGlj IGluZm9ybWF0aW9uIHRvIHRoZSBWQUNVVU0gVkVSQk9TRSBsb2cKb3V0cHV0IGlkZW50aWZ5aW5n IHRoZSBibG9ja2VyIHRoYXQgaXMgaG9sZGluZyBiYWNrIE9sZGVzdFhtaW4uCgpUaGUgbmV3IEdl dFhpZEhvcml6b25CbG9ja2VyKCkgZnVuY3Rpb24gaW4gcHJvY2FycmF5LmMgc2VhcmNoZXMgZm9y CnRoZSBzb3VyY2Ugb2YgdGhlIGhvcml6b246IGFjdGl2ZSB0cmFuc2FjdGlvbnMsIGlkbGUtaW4t dHJhbnNhY3Rpb24Kc2Vzc2lvbnMsIHByZXBhcmVkIHRyYW5zYWN0aW9ucywgaG90IHN0YW5kYnkg ZmVlZGJhY2sgdmlhIHdhbHNlbmRlcnMsCmFuZCBsb2dpY2FsIHJlcGxpY2F0aW9uIHNsb3RzLiAg V2hlbiByZWNlbnRseV9kZWFkX3R1cGxlcyA+IDAsIFZBQ1VVTQpWRVJCT1NFIG5vdyByZXBvcnRz IHRoZSBoaWdoZXN0LXByaW9yaXR5IGJsb2NrZXIgd2l0aCBpZGVudGlmeWluZwpkZXRhaWxzIChw aWQsIHByZXBhcmVkIHRyYW5zYWN0aW9uIEdJRCwgc3RhbmRieSBhcHBsaWNhdGlvbiBuYW1lLCBv cgpzbG90IG5hbWUpLgoKQmVjYXVzZSB0aGUgaG9yaXpvbiB3YXMgY29tcHV0ZWQgZWFybGllciwg dGhlIG9yaWdpbmFsIGJsb2NrZXIgbWF5CmhhdmUgYWxyZWFkeSBjb21taXR0ZWQgYnkgdGhlIHRp bWUgdGhlIGNoZWNrIHJ1bnMuICBUaGUgcmVzdWx0IGlzCnRoZXJlZm9yZSBiZXN0LWVmZm9ydDog aXQgbWF5IHJlcG9ydCBhIGRpZmZlcmVudCBibG9ja2VyIG9yIG5vbmUgYXQKYWxsLgoKQXV0aG9y OiBTaGlueWEgS2F0byA8c2hpbnlhMTEua2F0b0BnbWFpbC5jb20+ClJldmlld2VkLWJ5OiB3ZW5o dWkgcWl1IDxxaXV3ZW5odWlmeEBnbWFpbC5jb20+ClJldmlld2VkLWJ5OiBGdWppaSBNYXNhbyA8 bWFzYW8uZnVqaWlAZ21haWwuY29tPgpSZXZpZXdlZC1ieTogU2FtaSBJbXNlaWggPHNhbWltc2Vp aEBnbWFpbC5jb20+ClJldmlld2VkLWJ5OiBEaWxpcCBLdW1hciA8ZGlsaXBiYWxhdXRAZ21haWwu Y29tPgpEaXNjdXNzaW9uOiBodHRwczovL3Bvc3Rnci5lcy9tL0NBT3pFdXJTZ3ktZ0R0d0ZtRWJq NStSOVBMMF9HM3FZQjZubnpKdE5TdHl1Zjg3VlNWZ0BtYWlsLmdtYWlsLmNvbQotLS0KIHNyYy9i YWNrZW5kL2FjY2Vzcy9oZWFwL3ZhY3V1bWxhenkuYyAgICAgICAgICB8ICA1OSArKysrCiBzcmMv YmFja2VuZC9hY2Nlc3MvdHJhbnNhbS90d29waGFzZS5jICAgICAgICAgfCAgMzkgKysrCiBzcmMv YmFja2VuZC9zdG9yYWdlL2lwYy9wcm9jYXJyYXkuYyAgICAgICAgICAgfCAyNjIgKysrKysrKysr KysrKysrCiBzcmMvaW5jbHVkZS9hY2Nlc3MvdHdvcGhhc2UuaCAgICAgICAgICAgICAgICAgfCAg IDEgKwogc3JjL2luY2x1ZGUvc3RvcmFnZS9wcm9jYXJyYXkuaCAgICAgICAgICAgICAgIHwgIDM4 ICsrKwogc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X21pc2MvbWVzb24uYnVpbGQgICAgICAgIHwgICAx ICsKIC4uLi90ZXN0X21pc2MvdC8wMTFfbG9nX3ZhY3V1bV9ibG9ja2Vycy5wbCAgICB8IDMxNCAr KysrKysrKysrKysrKysrKysKIHNyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0ICAgICAg ICAgICAgICB8ICAgMiArCiA4IGZpbGVzIGNoYW5nZWQsIDcxNiBpbnNlcnRpb25zKCspCiBjcmVh dGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X21pc2MvdC8wMTFfbG9nX3ZhY3V1 bV9ibG9ja2Vycy5wbAoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL3ZhY3V1 bWxhenkuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL3ZhY3V1bWxhenkuYwppbmRleCA0YmUy NjdmZjY1Ny4uN2I2OTcyN2NkMjYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9oZWFw L3ZhY3V1bWxhenkuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC92YWN1dW1sYXp5LmMK QEAgLTE1MCw2ICsxNTAsNyBAQAogI2luY2x1ZGUgInN0b3JhZ2UvYnVmbWdyLmgiCiAjaW5jbHVk ZSAic3RvcmFnZS9mcmVlc3BhY2UuaCIKICNpbmNsdWRlICJzdG9yYWdlL2xtZ3IuaCIKKyNpbmNs dWRlICJzdG9yYWdlL3Byb2NhcnJheS5oIgogI2luY2x1ZGUgInN0b3JhZ2UvcmVhZF9zdHJlYW0u aCIKICNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKICNpbmNsdWRlICJ1dGlscy9wZ19ydXNh Z2UuaCIKQEAgLTEwNTgsNiArMTA1OSw2NCBAQCBoZWFwX3ZhY3V1bV9yZWwoUmVsYXRpb24gcmVs LCBjb25zdCBWYWN1dW1QYXJhbXMgcGFyYW1zLAogCQkJCQkJCSB2YWNyZWwtPnR1cGxlc19kZWxl dGVkLAogCQkJCQkJCSAoaW50NjQpIHZhY3JlbC0+bmV3X3JlbF90dXBsZXMsCiAJCQkJCQkJIHZh Y3JlbC0+cmVjZW50bHlfZGVhZF90dXBsZXMpOworCQkJaWYgKHZhY3JlbC0+cmVjZW50bHlfZGVh ZF90dXBsZXMgPiAwKQorCQkJeworCQkJCVhpZEhvcml6b25CbG9ja2VyIGJsb2NrZXI7CisKKwkJ CQlpZiAoR2V0WGlkSG9yaXpvbkJsb2NrZXIodmFjcmVsLT5jdXRvZmZzLk9sZGVzdFhtaW4sICZi bG9ja2VyKSkKKwkJCQl7CisJCQkJCXN3aXRjaCAoYmxvY2tlci50eXBlKQorCQkJCQl7CisJCQkJ CQljYXNlIFhIQl9BQ1RJVkVfVFJBTlNBQ1RJT046CisJCQkJCQkJYXBwZW5kU3RyaW5nSW5mbygm YnVmLAorCQkJCQkJCQkJCQkgXygib2xkZXN0IHhtaW4gYmxvY2tlcjogYWN0aXZlIHRyYW5zYWN0 aW9uIChwaWQgPSAlZClcbiIpLAorCQkJCQkJCQkJCQkgYmxvY2tlci5waWQpOworCQkJCQkJCWJy ZWFrOworCQkJCQkJY2FzZSBYSEJfSURMRV9JTl9UUkFOU0FDVElPTjoKKwkJCQkJCQlhcHBlbmRT dHJpbmdJbmZvKCZidWYsCisJCQkJCQkJCQkJCSBfKCJvbGRlc3QgeG1pbiBibG9ja2VyOiBpZGxl IGluIHRyYW5zYWN0aW9uIChwaWQgPSAlZClcbiIpLAorCQkJCQkJCQkJCQkgYmxvY2tlci5waWQp OworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBYSEJfWE1JTl9BQ1RJVkVfVFJBTlNBQ1RJT046 CisJCQkJCQkJYXBwZW5kU3RyaW5nSW5mbygmYnVmLAorCQkJCQkJCQkJCQkgXygib2xkZXN0IHht aW4gYmxvY2tlcjogYWN0aXZlIHRyYW5zYWN0aW9uIGhvbGRpbmcgc25hcHNob3QgKHBpZCA9ICVk KVxuIiksCisJCQkJCQkJCQkJCSBibG9ja2VyLnBpZCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQlj YXNlIFhIQl9YTUlOX0lETEVfSU5fVFJBTlNBQ1RJT046CisJCQkJCQkJYXBwZW5kU3RyaW5nSW5m bygmYnVmLAorCQkJCQkJCQkJCQkgXygib2xkZXN0IHhtaW4gYmxvY2tlcjogaWRsZSBpbiB0cmFu c2FjdGlvbiBob2xkaW5nIHNuYXBzaG90IChwaWQgPSAlZClcbiIpLAorCQkJCQkJCQkJCQkgYmxv Y2tlci5waWQpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBYSEJfUFJFUEFSRURfVFJBTlNB Q1RJT046CisJCQkJCQkJaWYgKGJsb2NrZXIubmFtZVswXSAhPSAnXDAnKQorCQkJCQkJCQlhcHBl bmRTdHJpbmdJbmZvKCZidWYsCisJCQkJCQkJCQkJCQkgXygib2xkZXN0IHhtaW4gYmxvY2tlcjog cHJlcGFyZWQgdHJhbnNhY3Rpb24gKGdpZCA9ICVzKVxuIiksCisJCQkJCQkJCQkJCQkgYmxvY2tl ci5uYW1lKTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCWFwcGVuZFN0cmluZ0luZm8oJmJ1ZiwKKwkJ CQkJCQkJCQkJCSBfKCJvbGRlc3QgeG1pbiBibG9ja2VyOiBwcmVwYXJlZCB0cmFuc2FjdGlvblxu IikpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBYSEJfSE9UX1NUQU5EQllfRkVFREJBQ0s6 CisJCQkJCQkJaWYgKGJsb2NrZXIubmFtZVswXSAhPSAnXDAnKQorCQkJCQkJCQlhcHBlbmRTdHJp bmdJbmZvKCZidWYsCisJCQkJCQkJCQkJCQkgXygib2xkZXN0IHhtaW4gYmxvY2tlcjogaG90IHN0 YW5kYnkgZmVlZGJhY2sgKHN0YW5kYnkgbmFtZSA9ICVzLCBwaWQgPSAlZClcbiIpLAorCQkJCQkJ CQkJCQkJIGJsb2NrZXIubmFtZSwKKwkJCQkJCQkJCQkJCSBibG9ja2VyLnBpZCk7CisJCQkJCQkJ ZWxzZQorCQkJCQkJCQlhcHBlbmRTdHJpbmdJbmZvKCZidWYsCisJCQkJCQkJCQkJCQkgXygib2xk ZXN0IHhtaW4gYmxvY2tlcjogaG90IHN0YW5kYnkgZmVlZGJhY2sgKHBpZCA9ICVkKVxuIiksCisJ CQkJCQkJCQkJCQkgYmxvY2tlci5waWQpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBYSEJf UkVQTElDQVRJT05fU0xPVDoKKwkJCQkJCQlhcHBlbmRTdHJpbmdJbmZvKCZidWYsCisJCQkJCQkJ CQkJCSBfKCJvbGRlc3QgeG1pbiBibG9ja2VyOiBsb2dpY2FsIHJlcGxpY2F0aW9uIHNsb3QgKHNs b3QgbmFtZSA9ICVzKVxuIiksCisJCQkJCQkJCQkJCSBibG9ja2VyLm5hbWUpOworCQkJCQkJCWJy ZWFrOworCQkJCQkJY2FzZSBYSEJfTk9ORToKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0K KwkJCX0KIAkJCWlmICh2YWNyZWwtPm1pc3NlZF9kZWFkX3R1cGxlcyA+IDApCiAJCQkJYXBwZW5k U3RyaW5nSW5mbygmYnVmLAogCQkJCQkJCQkgXygidHVwbGVzIG1pc3NlZDogJSIgUFJJZDY0ICIg ZGVhZCBmcm9tICV1IHBhZ2VzIG5vdCByZW1vdmVkIGR1ZSB0byBjbGVhbnVwIGxvY2sgY29udGVu dGlvblxuIiksCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS90d29waGFz ZS5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vdHdvcGhhc2UuYwppbmRleCBlYWJjNGQ0 ODIwOC4uNmM2Y2FkNjEzMzYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2Ft L3R3b3BoYXNlLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vdHdvcGhhc2UuYwpA QCAtMjgxNiw2ICsyODE2LDQ1IEBAIExvb2t1cEdYYWN0QnlTdWJpZChPaWQgc3ViaWQpCiAJcmV0 dXJuIGZvdW5kOwogfQogCisvKgorICogR2V0UHJlcGFyZWRUcmFuc2FjdGlvbkdpZAorICoJCUdl dCB0aGUgR0lEIGZvciB0aGUgcHJlcGFyZWQgdHJhbnNhY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gWElE LgorICoKKyAqIFJldHVybnMgdHJ1ZSB3aGVuIGEgbWF0Y2hpbmcgcHJlcGFyZWQgdHJhbnNhY3Rp b24gaXMgZm91bmQuICBnaWQgd2lsbCBiZQorICogc2V0IHRvIGFuIGVtcHR5IHN0cmluZyB3aGVu IG5vIG1hdGNoIGlzIGZvdW5kLgorICovCitib29sCitHZXRQcmVwYXJlZFRyYW5zYWN0aW9uR2lk KFRyYW5zYWN0aW9uSWQgeGlkLCBjaGFyIGdpZFtHSURTSVpFXSkKK3sKKwlib29sCQlmb3VuZCA9 IGZhbHNlOworCisJQXNzZXJ0KFRyYW5zYWN0aW9uSWRJc1ZhbGlkKHhpZCkpOworCisJZ2lkWzBd ID0gJ1wwJzsKKworCWlmIChtYXhfcHJlcGFyZWRfeGFjdHMgPT0gMCB8fCBUd29QaGFzZVN0YXRl ID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKworCUxXTG9ja0FjcXVpcmUoVHdvUGhhc2VTdGF0 ZUxvY2ssIExXX1NIQVJFRCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBUd29QaGFzZVN0YXRlLT5u dW1QcmVwWGFjdHM7IGkrKykKKwl7CisJCUdsb2JhbFRyYW5zYWN0aW9uIGd4YWN0ID0gVHdvUGhh c2VTdGF0ZS0+cHJlcFhhY3RzW2ldOworCisJCWlmICghZ3hhY3QtPnZhbGlkKQorCQkJY29udGlu dWU7CisKKwkJaWYgKCFUcmFuc2FjdGlvbklkRXF1YWxzKFhpZEZyb21GdWxsVHJhbnNhY3Rpb25J ZChneGFjdC0+ZnhpZCksIHhpZCkpCisJCQljb250aW51ZTsKKworCQlzdHJsY3B5KGdpZCwgZ3hh Y3QtPmdpZCwgR0lEU0laRSk7CisJCWZvdW5kID0gdHJ1ZTsKKwkJYnJlYWs7CisJfQorCUxXTG9j a1JlbGVhc2UoVHdvUGhhc2VTdGF0ZUxvY2spOworCisJcmV0dXJuIGZvdW5kOworfQorCiAvKgog ICogVHdvUGhhc2VHZXRPbGRlc3RYaWRJbkNvbW1pdAogICoJCVJldHVybiB0aGUgb2xkZXN0IHRy YW5zYWN0aW9uIElEIGZyb20gcHJlcGFyZWQgdHJhbnNhY3Rpb25zIHRoYXQgYXJlCmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9wcm9jYXJyYXkuYyBiL3NyYy9iYWNrZW5kL3N0 b3JhZ2UvaXBjL3Byb2NhcnJheS5jCmluZGV4IDMwMWY1NGZiNWE4Li4yNDRlMmQ4MDBmYSAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvcHJvY2FycmF5LmMKKysrIGIvc3JjL2Jh Y2tlbmQvc3RvcmFnZS9pcGMvcHJvY2FycmF5LmMKQEAgLTU4LDE0ICs1OCwxNyBAQAogI2luY2x1 ZGUgInBnc3RhdC5oIgogI2luY2x1ZGUgInBvc3RtYXN0ZXIvYmd3b3JrZXIuaCIKICNpbmNsdWRl ICJwb3J0L3BnX2xmaW5kLmgiCisjaW5jbHVkZSAicmVwbGljYXRpb24vc2xvdC5oIgogI2luY2x1 ZGUgInN0b3JhZ2UvcHJvYy5oIgogI2luY2x1ZGUgInN0b3JhZ2UvcHJvY2FycmF5LmgiCiAjaW5j bHVkZSAidXRpbHMvYWNsLmgiCisjaW5jbHVkZSAidXRpbHMvYmFja2VuZF9zdGF0dXMuaCIKICNp bmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgogI2luY2x1ZGUgInV0aWxzL2luamVjdGlvbl9wb2lu dC5oIgogI2luY2x1ZGUgInV0aWxzL2xzeXNjYWNoZS5oIgogI2luY2x1ZGUgInV0aWxzL3JlbC5o IgogI2luY2x1ZGUgInV0aWxzL3NuYXBtZ3IuaCIKKyNpbmNsdWRlICJ1dGlscy93YWl0X2V2ZW50 LmgiCiAKICNkZWZpbmUgVUlOVDMyX0FDQ0VTU19PTkNFKHZhcikJCSAoKHVpbnQzMikoKigodm9s YXRpbGUgdWludDMyICopJih2YXIpKSkpCiAKQEAgLTIwMDUsNiArMjAwOCwyNjUgQEAgR2V0UmVw bGljYXRpb25Ib3Jpem9ucyhUcmFuc2FjdGlvbklkICp4bWluLCBUcmFuc2FjdGlvbklkICpjYXRh bG9nX3htaW4pCiAJKmNhdGFsb2dfeG1pbiA9IGhvcml6b25zLnNsb3RfY2F0YWxvZ194bWluOwog fQogCisvKgorICogRmV0Y2ggdGhlIHN0YW5kYnkncyBhcHBsaWNhdGlvbl9uYW1lIGFzIHJlcG9y dGVkIGJ5IHRoZSB3YWxzZW5kZXIgYmFja2VuZC4KKyAqLworc3RhdGljIHZvaWQKK0dldFN0YW5k YnlBcHBuYW1lKGludCBwaWQsIGNoYXIgKm5hbWUsIFNpemUgbGVuKQoreworCWludAkJCW5iYWNr ZW5kcyA9IHBnc3RhdF9mZXRjaF9zdGF0X251bWJhY2tlbmRzKCk7CisKKwluYW1lWzBdID0gJ1ww JzsKKworCWZvciAoaW50IGkgPSAxOyBpIDw9IG5iYWNrZW5kczsgaSsrKQorCXsKKwkJTG9jYWxQ Z0JhY2tlbmRTdGF0dXMgKmxvY2FsX2JlZW50cnk7CisJCVBnQmFja2VuZFN0YXR1cyAqYmVlbnRy eTsKKworCQlsb2NhbF9iZWVudHJ5ID0gcGdzdGF0X2dldF9sb2NhbF9iZWVudHJ5X2J5X2luZGV4 KGkpOworCQlpZiAobG9jYWxfYmVlbnRyeSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJYmVl bnRyeSA9ICZsb2NhbF9iZWVudHJ5LT5iYWNrZW5kU3RhdHVzOworCQlpZiAoYmVlbnRyeS0+c3Rf cHJvY3BpZCAhPSBwaWQpCisJCQljb250aW51ZTsKKworCQlpZiAoYmVlbnRyeS0+c3RfYXBwbmFt ZSAmJiBiZWVudHJ5LT5zdF9hcHBuYW1lWzBdICE9ICdcMCcpCisJCQlzdHJsY3B5KG5hbWUsIGJl ZW50cnktPnN0X2FwcG5hbWUsIGxlbik7CisJCXJldHVybjsKKwl9Cit9CisKKy8qCisgKiBSZXR1 cm4gWGlkSG9yaXpvbkJsb2NrZXJUeXBlIGZvciBhIGJhY2tlbmQgd2hvc2UgeGlkIG1hdGNoZXMg dGhlIGhvcml6b24uCisgKi8KK3N0YXRpYyBpbmxpbmUgWGlkSG9yaXpvbkJsb2NrZXJUeXBlCitY aWRIb3Jpem9uQmxvY2tlclR5cGVGb3JCYWNrZW5kKGNvbnN0IFBHUFJPQyAqcHJvYykKK3sKKwlp ZiAocHJvYy0+d2FpdF9ldmVudF9pbmZvID09IFdBSVRfRVZFTlRfQ0xJRU5UX1JFQUQpCisJCXJl dHVybiBYSEJfSURMRV9JTl9UUkFOU0FDVElPTjsKKwlyZXR1cm4gWEhCX0FDVElWRV9UUkFOU0FD VElPTjsKK30KKworLyoKKyAqIFJldHVybiBYaWRIb3Jpem9uQmxvY2tlclR5cGUgZm9yIGEgYmFj a2VuZCB3aG9zZSB4bWluIG1hdGNoZXMgdGhlIGhvcml6b24uCisgKi8KK3N0YXRpYyBpbmxpbmUg WGlkSG9yaXpvbkJsb2NrZXJUeXBlCitYaWRIb3Jpem9uQmxvY2tlclR5cGVGb3JYbWluQmFja2Vu ZChjb25zdCBQR1BST0MgKnByb2MpCit7CisJaWYgKHByb2MtPndhaXRfZXZlbnRfaW5mbyA9PSBX QUlUX0VWRU5UX0NMSUVOVF9SRUFEKQorCQlyZXR1cm4gWEhCX1hNSU5fSURMRV9JTl9UUkFOU0FD VElPTjsKKwlyZXR1cm4gWEhCX1hNSU5fQUNUSVZFX1RSQU5TQUNUSU9OOworfQorCisvKgorICog RmluZCB0aGUgYmxvY2tlcnMgdGhhdCBhcmUgaG9sZGluZyBiYWNrIHRoZSBnaXZlbiB4aWQgaG9y aXpvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciB3aGF0IGlzIHByZXZlbnRp bmcgdGhlIGdpdmVuIGhvcml6b24gZnJvbSBiZWluZworICogYWR2YW5jZWQgdG8gYWxsb3cgcmVt b3ZhbCBvZiBkZWFkIHR1cGxlcy4gSXQgY2hlY2tzOgorICogMS4gQWN0aXZlIHRyYW5zYWN0aW9u cyAocnVubmluZyBzdGF0ZW1lbnRzKQorICogMi4gSWRsZS1pbi10cmFuc2FjdGlvbiBzZXNzaW9u cworICogMy4gUHJlcGFyZWQgdHJhbnNhY3Rpb25zCisgKiA0LiBIb3Qgc3RhbmRieSBmZWVkYmFj aworICogNS4gTG9naWNhbCByZXBsaWNhdGlvbiBzbG90cworICoKKyAqIEJlY2F1c2UgdGhlIGhv cml6b24gd2FzIGNvbXB1dGVkIGVhcmxpZXIsIHRoZSBvcmlnaW5hbCBibG9ja2VyIG1heSBoYXZl CisgKiBhbHJlYWR5IGNvbW1pdHRlZCBieSB0aGUgdGltZSB0aGlzIGZ1bmN0aW9uIHJ1bnMuICBU aGUgcmVzdWx0IGlzIHRoZXJlZm9yZQorICogYmVzdC1lZmZvcnQ6IGl0IG1heSByZXR1cm4gYSBk aWZmZXJlbnQgYmxvY2tlciwgb3Igbm8gYmxvY2tlciBhdCBhbGwuCisgKgorICogUmV0dXJucyBh IHBhbGxvYydkIGFycmF5IG9mIGJsb2NrZXJzIGFuZCBzdG9yZXMgdGhlIG51bWJlciBvZiBlbnRy aWVzIGluCisgKiAqbmJsb2NrZXJzLiBUaGUgYXJyYXkgbWF5IGJlIGVtcHR5IGlmIG5vIGJsb2Nr ZXIgaXMgZm91bmQuCisgKgorICogTm90ZTogdGhlIHNhbWUgdW5kZXJseWluZyBjYXVzZSAoZS5n LiBhIHBoeXNpY2FsIHJlcGxpY2F0aW9uIHNsb3Qgd2l0aAorICogaG90X3N0YW5kYnlfZmVlZGJh Y2spIGNhbiBhcHBlYXIgYXMgYm90aCBhbiBYSEJfSE9UX1NUQU5EQllfRkVFREJBQ0sgZW50cnkK KyAqIChmcm9tIHRoZSB3YWxzZW5kZXIgUEdQUk9DKSBhbmQgYW4gWEhCX1JFUExJQ0FUSU9OX1NM T1QgZW50cnkgKGZyb20gdGhlCisgKiBzbG90J3MgeG1pbikuICBDYWxsZXJzIHRoYXQgY29uc3Vt ZSBhbGwgZW50cmllcyBzaG91bGQgYmUgcHJlcGFyZWQgZm9yIHN1Y2gKKyAqIGR1cGxpY2F0ZXMu CisgKi8KK3N0YXRpYyBYaWRIb3Jpem9uQmxvY2tlciAqCitHZXRYaWRIb3Jpem9uQmxvY2tlcnMo VHJhbnNhY3Rpb25JZCBob3Jpem9uLCBpbnQgKm5ibG9ja2VycykKK3sKKwlQcm9jQXJyYXlTdHJ1 Y3QgKmFycmF5UCA9IHByb2NBcnJheTsKKwlUcmFuc2FjdGlvbklkICpvdGhlcl94aWRzID0gUHJv Y0dsb2JhbC0+eGlkczsKKwlYaWRIb3Jpem9uQmxvY2tlciAqcmVzdWx0OworCWludAkJCWNvdW50 ID0gMDsKKwlpbnQJCQltYXhfYmxvY2tlcnM7CisKKwlBc3NlcnQoVHJhbnNhY3Rpb25JZElzVmFs aWQoaG9yaXpvbikpOworCUFzc2VydChuYmxvY2tlcnMgIT0gTlVMTCk7CisKKwkvKgorCSAqIEFs bG9jYXRlIGVub3VnaCBzcGFjZSBmb3IgZXZlcnkgUEdQUk9DIHBsdXMgYWxsIHJlcGxpY2F0aW9u IHNsb3RzLiBUaGlzCisJICogaXMgYSBnZW5lcm91cyB1cHBlciBib3VuZCAodHlwaWNhbGx5IG9u bHkgMC0yIGVudHJpZXMgYXJlIHJldHVybmVkKSwKKwkgKiBidXQga2VlcHMgdGhlIGxvZ2ljIHNp bXBsZSBmb3IgYSBkaWFnbm9zdGljIGZ1bmN0aW9uIHRoYXQgcnVucworCSAqIGluZnJlcXVlbnRs eS4KKwkgKi8KKwltYXhfYmxvY2tlcnMgPSBhcnJheVAtPm1heFByb2NzICsgbWF4X3JlcGxpY2F0 aW9uX3Nsb3RzOworCXJlc3VsdCA9IHBhbGxvYzBfYXJyYXkoWGlkSG9yaXpvbkJsb2NrZXIsIG1h eF9ibG9ja2Vycyk7CisKKwlMV0xvY2tBY3F1aXJlKFByb2NBcnJheUxvY2ssIExXX1NIQVJFRCk7 CisKKwlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgYXJyYXlQLT5udW1Qcm9jczsgaW5kZXgr KykKKwl7CisJCWludAkJCXBncHJvY25vID0gYXJyYXlQLT5wZ3Byb2Nub3NbaW5kZXhdOworCQlQ R1BST0MJICAgKnByb2MgPSAmYWxsUHJvY3NbcGdwcm9jbm9dOworCQlpbnQ4CQlzdGF0dXNGbGFn cyA9IFByb2NHbG9iYWwtPnN0YXR1c0ZsYWdzW2luZGV4XTsKKwkJVHJhbnNhY3Rpb25JZCBwcm9j X3hpZDsKKwkJVHJhbnNhY3Rpb25JZCBwcm9jX3htaW47CisJCVhpZEhvcml6b25CbG9ja2VyVHlw ZSBjYW5kaWRhdGVfdHlwZSA9IFhIQl9OT05FOworCQlpbnQJCQljYW5kaWRhdGVfcGlkID0gMDsK KwkJVHJhbnNhY3Rpb25JZCBjYW5kaWRhdGVfeGlkID0gSW52YWxpZFRyYW5zYWN0aW9uSWQ7CisK KwkJLyoKKwkJICogU2tpcCBvdmVyIGJhY2tlbmRzIGVpdGhlciB2YWN1dW1pbmcgKHdoaWNoIGlz IG9rIHdpdGggcm93cyBiZWluZworCQkgKiByZW1vdmVkLCBhcyBsb25nIGFzIHBnX3N1YnRyYW5z IGlzIG5vdCB0cnVuY2F0ZWQpLCBkb2luZyBsb2dpY2FsCisJCSAqIGRlY29kaW5nICh3aGljaCBt YW5hZ2VzIHhtaW4gc2VwYXJhdGVseSwgY2hlY2sgYmVsb3cpLCBvciBteXNlbGYuCisJCSAqLwor CQlpZiAoc3RhdHVzRmxhZ3MgJiAoUFJPQ19JTl9WQUNVVU0gfCBQUk9DX0lOX0xPR0lDQUxfREVD T0RJTkcpIHx8CisJCQlwcm9jID09IE15UHJvYykKKwkJCWNvbnRpbnVlOworCisJCS8qIEZldGNo IHhpZCBqdXN0IG9uY2UgLSBzZWUgR2V0TmV3VHJhbnNhY3Rpb25JZCAqLworCQlwcm9jX3hpZCA9 IFVJTlQzMl9BQ0NFU1NfT05DRShvdGhlcl94aWRzW2luZGV4XSk7CisJCXByb2NfeG1pbiA9IFVJ TlQzMl9BQ0NFU1NfT05DRShwcm9jLT54bWluKTsKKworCQkvKiBDaGVjayBpZiB0aGlzIHByb2Mn cyB4aWQgbWF0Y2hlcyAqLworCQlpZiAoVHJhbnNhY3Rpb25JZEVxdWFscyhwcm9jX3hpZCwgaG9y aXpvbikpCisJCXsKKwkJCWlmIChwcm9jLT5waWQgPT0gMCkKKwkJCXsKKwkJCQljYW5kaWRhdGVf dHlwZSA9IFhIQl9QUkVQQVJFRF9UUkFOU0FDVElPTjsKKwkJCQljYW5kaWRhdGVfcGlkID0gMDsK KwkJCQljYW5kaWRhdGVfeGlkID0gcHJvY194aWQ7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJ Y2FuZGlkYXRlX3R5cGUgPSBYaWRIb3Jpem9uQmxvY2tlclR5cGVGb3JCYWNrZW5kKHByb2MpOwor CQkJCWNhbmRpZGF0ZV9waWQgPSBwcm9jLT5waWQ7CisJCQkJY2FuZGlkYXRlX3hpZCA9IHByb2Nf eGlkOworCQkJfQorCQl9CisJCS8qIENoZWNrIGlmIHRoaXMgcHJvYydzIHhtaW4gbWF0Y2hlcyAq LworCQllbHNlIGlmIChUcmFuc2FjdGlvbklkRXF1YWxzKHByb2NfeG1pbiwgaG9yaXpvbikpCisJ CXsKKwkJCWlmIChzdGF0dXNGbGFncyAmIFBST0NfQUZGRUNUU19BTExfSE9SSVpPTlMpCisJCQl7 CisJCQkJY2FuZGlkYXRlX3R5cGUgPSBYSEJfSE9UX1NUQU5EQllfRkVFREJBQ0s7CisJCQkJY2Fu ZGlkYXRlX3BpZCA9IHByb2MtPnBpZDsKKwkJCQljYW5kaWRhdGVfeGlkID0gcHJvY194bWluOwor CQkJfQorCQkJZWxzZQorCQkJeworCQkJCWNhbmRpZGF0ZV90eXBlID0gWGlkSG9yaXpvbkJsb2Nr ZXJUeXBlRm9yWG1pbkJhY2tlbmQocHJvYyk7CisJCQkJY2FuZGlkYXRlX3BpZCA9IHByb2MtPnBp ZDsKKwkJCQljYW5kaWRhdGVfeGlkID0gcHJvY194bWluOworCQkJfQorCQl9CisKKwkJLyoKKwkJ ICogSWYgd2UgZm91bmQgYSBjYW5kaWRhdGUsIHJlY29yZCBpdC4gQ2FuZGlkYXRlcyBhcmUgY29s bGVjdGVkIGluCisJCSAqIFByb2NBcnJheSBvcmRlcjsgY2FsbGVycyBjYW4gcmVvcmRlciBpZiBu ZWVkZWQuCisJCSAqLworCQlpZiAoY2FuZGlkYXRlX3R5cGUgIT0gWEhCX05PTkUpCisJCXsKKwkJ CVhpZEhvcml6b25CbG9ja2VyICpkc3Q7CisKKwkJCWRzdCA9ICZyZXN1bHRbY291bnQrK107CisJ CQlkc3QtPnR5cGUgPSBjYW5kaWRhdGVfdHlwZTsKKwkJCWRzdC0+cGlkID0gY2FuZGlkYXRlX3Bp ZDsKKwkJCWRzdC0+eGlkID0gY2FuZGlkYXRlX3hpZDsKKwkJfQorCX0KKworCUxXTG9ja1JlbGVh c2UoUHJvY0FycmF5TG9jayk7CisKKwkvKgorCSAqIE5vdyB0aGF0IFByb2NBcnJheUxvY2sgaXMg cmVsZWFzZWQsIGZldGNoIGFueSBleHRyYSBkZXRhaWxzIHdlIHdhbnQgdG8KKwkgKiBhdHRhY2gg dG8gYmxvY2tlcnMsIHN1Y2ggYXMgcHJlcGFyZWQgdHJhbnNhY3Rpb24gR0lEcyBhbmQgc3RhbmRi eQorCSAqIGFwcGxpY2F0aW9uIG5hbWVzLgorCSAqLworCWZvciAoaW50IGkgPSAwOyBpIDwgY291 bnQ7IGkrKykKKwl7CisJCWlmIChyZXN1bHRbaV0udHlwZSA9PSBYSEJfUFJFUEFSRURfVFJBTlNB Q1RJT04pCisJCQlHZXRQcmVwYXJlZFRyYW5zYWN0aW9uR2lkKHJlc3VsdFtpXS54aWQsIHJlc3Vs dFtpXS5uYW1lKTsKKwkJZWxzZSBpZiAocmVzdWx0W2ldLnR5cGUgPT0gWEhCX0hPVF9TVEFOREJZ X0ZFRURCQUNLKQorCQkJR2V0U3RhbmRieUFwcG5hbWUocmVzdWx0W2ldLnBpZCwgcmVzdWx0W2ld Lm5hbWUsCisJCQkJCQkJICBzaXplb2YocmVzdWx0W2ldLm5hbWUpKTsKKwl9CisKKwkvKgorCSAq IEFsc28gY2hlY2sgcmVwbGljYXRpb24gc2xvdHMuCisJICovCisJaWYgKG1heF9yZXBsaWNhdGlv bl9zbG90cyA+IDApCisJeworCQlMV0xvY2tBY3F1aXJlKFJlcGxpY2F0aW9uU2xvdENvbnRyb2xM b2NrLCBMV19TSEFSRUQpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4X3JlcGxpY2F0aW9u X3Nsb3RzOyBpKyspCisJCXsKKwkJCVJlcGxpY2F0aW9uU2xvdCAqcyA9ICZSZXBsaWNhdGlvblNs b3RDdGwtPnJlcGxpY2F0aW9uX3Nsb3RzW2ldOworCQkJVHJhbnNhY3Rpb25JZCBzbG90X3htaW47 CisJCQlUcmFuc2FjdGlvbklkIHNsb3RfY2F0YWxvZ194bWluOworCisJCQlpZiAoIXMtPmluX3Vz ZSkKKwkJCQljb250aW51ZTsKKworCQkJU3BpbkxvY2tBY3F1aXJlKCZzLT5tdXRleCk7CisJCQlz bG90X3htaW4gPSBzLT5kYXRhLnhtaW47CisJCQlzbG90X2NhdGFsb2dfeG1pbiA9IHMtPmRhdGEu Y2F0YWxvZ194bWluOworCQkJU3BpbkxvY2tSZWxlYXNlKCZzLT5tdXRleCk7CisKKwkJCWlmIChU cmFuc2FjdGlvbklkRXF1YWxzKHNsb3RfeG1pbiwgaG9yaXpvbikgfHwKKwkJCQlUcmFuc2FjdGlv bklkRXF1YWxzKHNsb3RfY2F0YWxvZ194bWluLCBob3Jpem9uKSkKKwkJCXsKKwkJCQlYaWRIb3Jp em9uQmxvY2tlciAqZHN0OworCisJCQkJZHN0ID0gJnJlc3VsdFtjb3VudCsrXTsKKwkJCQlkc3Qt PnR5cGUgPSBYSEJfUkVQTElDQVRJT05fU0xPVDsKKwkJCQlkc3QtPnBpZCA9IDA7CisJCQkJZHN0 LT54aWQgPSBUcmFuc2FjdGlvbklkSXNWYWxpZChzbG90X3htaW4pID8KKwkJCQkJc2xvdF94bWlu IDoKKwkJCQkJc2xvdF9jYXRhbG9nX3htaW47CisJCQkJc3RybGNweShkc3QtPm5hbWUsIE5hbWVT dHIocy0+ZGF0YS5uYW1lKSwgc2l6ZW9mKGRzdC0+bmFtZSkpOworCQkJfQorCQl9CisKKwkJTFdM b2NrUmVsZWFzZShSZXBsaWNhdGlvblNsb3RDb250cm9sTG9jayk7CisJfQorCisJKm5ibG9ja2Vy cyA9IGNvdW50OworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBHZXQgdGhlIGhpZ2hlc3Qt cHJpb3JpdHkgYmxvY2tlciBob2xkaW5nIGJhY2sgdGhlIHhpZCBob3Jpem9uLgorICoKKyAqIFJl dHVybnMgdHJ1ZSBhbmQgc3RvcmVzIHRoZSBibG9ja2VyIGluICpibG9ja2VyIGlmIGFueSBhcmUg Zm91bmQuCisgKi8KK2Jvb2wKK0dldFhpZEhvcml6b25CbG9ja2VyKFRyYW5zYWN0aW9uSWQgaG9y aXpvbiwgWGlkSG9yaXpvbkJsb2NrZXIgKmJsb2NrZXIpCit7CisJWGlkSG9yaXpvbkJsb2NrZXIg KmJsb2NrZXJzOworCVhpZEhvcml6b25CbG9ja2VyICpiZXN0ID0gTlVMTDsKKwlpbnQJCQluYmxv Y2tlcnM7CisKKwlBc3NlcnQoVHJhbnNhY3Rpb25JZElzVmFsaWQoaG9yaXpvbikpOworCUFzc2Vy dChibG9ja2VyICE9IE5VTEwpOworCisJYmxvY2tlcnMgPSBHZXRYaWRIb3Jpem9uQmxvY2tlcnMo aG9yaXpvbiwgJm5ibG9ja2Vycyk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBuYmxvY2tlcnM7IGkr KykKKwl7CisJCWlmIChiZXN0ID09IE5VTEwgfHwgYmxvY2tlcnNbaV0udHlwZSA8IGJlc3QtPnR5 cGUpCisJCQliZXN0ID0gJmJsb2NrZXJzW2ldOworCX0KKworCWlmIChiZXN0ICE9IE5VTEwpCisJ CSpibG9ja2VyID0gKmJlc3Q7CisKKwlwZnJlZShibG9ja2Vycyk7CisKKwlyZXR1cm4gKGJlc3Qg IT0gTlVMTCk7Cit9CisKIC8qCiAgKiBHZXRNYXhTbmFwc2hvdFhpZENvdW50IC0tIGdldCBtYXgg c2l6ZSBmb3Igc25hcHNob3QgWElEIGFycmF5CiAgKgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUv YWNjZXNzL3R3b3BoYXNlLmggYi9zcmMvaW5jbHVkZS9hY2Nlc3MvdHdvcGhhc2UuaAppbmRleCBl MzEyNTE0YmE4Ny4uYjA3NmExNTU0ODQgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2FjY2Vzcy90 d29waGFzZS5oCisrKyBiL3NyYy9pbmNsdWRlL2FjY2Vzcy90d29waGFzZS5oCkBAIC02OCw2ICs2 OCw3IEBAIGV4dGVybiB2b2lkIFR3b1BoYXNlVHJhbnNhY3Rpb25HaWQoT2lkIHN1YmlkLCBUcmFu c2FjdGlvbklkIHhpZCwgY2hhciAqZ2lkX3JlcywKIAkJCQkJCQkJICAgaW50IHN6Z2lkKTsKIGV4 dGVybiBib29sIExvb2t1cEdYYWN0QnlTdWJpZChPaWQgc3ViaWQpOwogCitleHRlcm4gYm9vbCBH ZXRQcmVwYXJlZFRyYW5zYWN0aW9uR2lkKFRyYW5zYWN0aW9uSWQgeGlkLCBjaGFyIGdpZFtHSURT SVpFXSk7CiBleHRlcm4gVHJhbnNhY3Rpb25JZCBUd29QaGFzZUdldE9sZGVzdFhpZEluQ29tbWl0 KHZvaWQpOwogCiAjZW5kaWYJCQkJCQkJLyogVFdPUEhBU0VfSCAqLwpkaWZmIC0tZ2l0IGEvc3Jj L2luY2x1ZGUvc3RvcmFnZS9wcm9jYXJyYXkuaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2UvcHJvY2Fy cmF5LmgKaW5kZXggM2E4NTkzZjg3YmEuLjRjMTNmNGRmMTJiIDEwMDY0NAotLS0gYS9zcmMvaW5j bHVkZS9zdG9yYWdlL3Byb2NhcnJheS5oCisrKyBiL3NyYy9pbmNsdWRlL3N0b3JhZ2UvcHJvY2Fy cmF5LmgKQEAgLTE0LDExICsxNCw0NiBAQAogI2lmbmRlZiBQUk9DQVJSQVlfSAogI2RlZmluZSBQ Uk9DQVJSQVlfSAogCisjaW5jbHVkZSAiYWNjZXNzL3hhY3QuaCIKICNpbmNsdWRlICJzdG9yYWdl L2xvY2suaCIKICNpbmNsdWRlICJzdG9yYWdlL3N0YW5kYnkuaCIKICNpbmNsdWRlICJ1dGlscy9y ZWxjYWNoZS5oIgogI2luY2x1ZGUgInV0aWxzL3NuYXBzaG90LmgiCiAKKy8qCisgKiBUeXBlIG9m IGJsb2NrZXIgdGhhdCBpcyBob2xkaW5nIGJhY2sgdGhlIHhpZCBob3Jpem9uLgorICogTGlzdGVk IGluIHByaW9yaXR5IG9yZGVyIGZyb20gaGlnaGVzdCB0byBsb3dlc3QuICBCbG9ja2VycyB3aG9z ZSB4aWQKKyAqIG1hdGNoZXMgdGhlIGhvcml6b24gKHRoZSByb290IGNhdXNlKSBhcmUgbGlzdGVk IGJlZm9yZSBibG9ja2VycyB3aG9zZQorICogeG1pbiBtYXRjaGVzIChoZWxkIGJhY2sgYnkgdGhl IHJvb3QgY2F1c2UpLiAgV2l0aGluIGVhY2ggZ3JvdXAsIGFjdGl2ZQorICogdHJhbnNhY3Rpb25z IGFyZSBsaXN0ZWQgZmlyc3QgYmVjYXVzZSB0aGV5IGFyZSB0aGUgbW9zdCBhY3Rpb25hYmxlIGZv cgorICogdGhlIERCQSAodGhlIHJ1bm5pbmcgcXVlcnkgY2FuIGJlIGlkZW50aWZpZWQgYW5kIGNh bmNlbGxlZCkuCisgKi8KK3R5cGVkZWYgZW51bSBYaWRIb3Jpem9uQmxvY2tlclR5cGUKK3sKKwlY SEJfTk9ORSA9IDAsCisJLyogeGlkLW1hdGNoIHR5cGVzIChob3Jpem9uID09IHByb2MncyB4aWQp ICovCisJWEhCX0FDVElWRV9UUkFOU0FDVElPTiwJCS8qIGJhY2tlbmQgcnVubmluZyBhIHN0YXRl bWVudCAqLworCVhIQl9JRExFX0lOX1RSQU5TQUNUSU9OLAkvKiBiYWNrZW5kIGlkbGUgaW4gdHJh bnNhY3Rpb24gKi8KKwlYSEJfUFJFUEFSRURfVFJBTlNBQ1RJT04sCS8qIHByZXBhcmVkICh0d28t cGhhc2UpIHRyYW5zYWN0aW9uICovCisJLyogeG1pbi1tYXRjaCB0eXBlcyAoaG9yaXpvbiA9PSBw cm9jJ3MgeG1pbiBvciBzbG90J3MgeG1pbikgKi8KKwlYSEJfWE1JTl9BQ1RJVkVfVFJBTlNBQ1RJ T04sCS8qIGJhY2tlbmQgcnVubmluZyBhIHN0YXRlbWVudCAqLworCVhIQl9YTUlOX0lETEVfSU5f VFJBTlNBQ1RJT04sCS8qIGJhY2tlbmQgaWRsZSBpbiB0cmFuc2FjdGlvbiAqLworCVhIQl9IT1Rf U1RBTkRCWV9GRUVEQkFDSywJLyogd2Fsc2VuZGVyIHdpdGggaG90X3N0YW5kYnlfZmVlZGJhY2sg Ki8KKwlYSEJfUkVQTElDQVRJT05fU0xPVCwJCS8qIGxvZ2ljYWwgcmVwbGljYXRpb24gc2xvdCAq LworfSBYaWRIb3Jpem9uQmxvY2tlclR5cGU7CisKKy8qCisgKiBJbmZvcm1hdGlvbiBhYm91dCBh IGJsb2NrZXIgdGhhdCBpcyBob2xkaW5nIGJhY2sgdGhlIHhpZCBob3Jpem9uLgorICovCit0eXBl ZGVmIHN0cnVjdCBYaWRIb3Jpem9uQmxvY2tlcgoreworCVhpZEhvcml6b25CbG9ja2VyVHlwZSB0 eXBlOworCVRyYW5zYWN0aW9uSWQgeGlkOwkJCS8qIHRoZSBibG9ja2luZyB4aWQveG1pbiAqLwor CWludAkJCXBpZDsJCQkvKiBiYWNrZW5kIHBpZCAoMCBmb3Igc2xvdHMpICovCisJLyogbGFyZ2Ug ZW5vdWdoIGZvciBwcmVwYXJlZC10eG4gR0lEIG9yIHJlcGxpY2F0aW9uIHNsb3QgbmFtZSAqLwor CWNoYXIJCW5hbWVbTWF4KEdJRFNJWkUsIE5BTUVEQVRBTEVOKV07Cit9IFhpZEhvcml6b25CbG9j a2VyOworCiAKIGV4dGVybiBTaXplIFByb2NBcnJheVNobWVtU2l6ZSh2b2lkKTsKIGV4dGVybiB2 b2lkIFByb2NBcnJheVNobWVtSW5pdCh2b2lkKTsKQEAgLTk4LDQgKzEzMyw3IEBAIGV4dGVybiB2 b2lkIFByb2NBcnJheVNldFJlcGxpY2F0aW9uU2xvdFhtaW4oVHJhbnNhY3Rpb25JZCB4bWluLAog ZXh0ZXJuIHZvaWQgUHJvY0FycmF5R2V0UmVwbGljYXRpb25TbG90WG1pbihUcmFuc2FjdGlvbklk ICp4bWluLAogCQkJCQkJCQkJCQlUcmFuc2FjdGlvbklkICpjYXRhbG9nX3htaW4pOwogCitleHRl cm4gYm9vbCBHZXRYaWRIb3Jpem9uQmxvY2tlcihUcmFuc2FjdGlvbklkIGhvcml6b24sCisJCQkJ CQkJCSBYaWRIb3Jpem9uQmxvY2tlciAqYmxvY2tlcik7CisKICNlbmRpZgkJCQkJCQkvKiBQUk9D QVJSQVlfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X21pc2MvbWVzb24u YnVpbGQgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbWlzYy9tZXNvbi5idWlsZAppbmRleCA2ZThk YjE2MjFhNy4uZDNiOTJlMjA3MzcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9t aXNjL21lc29uLmJ1aWxkCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9taXNjL21lc29uLmJ1 aWxkCkBAIC0xOSw2ICsxOSw3IEBAIHRlc3RzICs9IHsKICAgICAgICd0LzAwOF9yZXBsc2xvdF9z aW5nbGVfdXNlci5wbCcsCiAgICAgICAndC8wMDlfbG9nX3RlbXBfZmlsZXMucGwnLAogICAgICAg J3QvMDEwX2luZGV4X2NvbmN1cnJlbnRseV91cHNlcnQucGwnLAorICAgICAgJ3QvMDExX2xvZ192 YWN1dW1fYmxvY2tlcnMucGwnLAogICAgIF0sCiAgICAgIyBUaGUgaW5qZWN0aW9uIHBvaW50cyBh cmUgY2x1c3Rlci13aWRlLCBzbyBkaXNhYmxlIGluc3RhbGxjaGVjawogICAgICdydW5uaW5nY2hl Y2snOiBmYWxzZSwKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9taXNjL3QvMDEx X2xvZ192YWN1dW1fYmxvY2tlcnMucGwgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbWlzYy90LzAx MV9sb2dfdmFjdXVtX2Jsb2NrZXJzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwMDAwLi4yZTI2ZjBmM2JlYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L21vZHVsZXMv dGVzdF9taXNjL3QvMDExX2xvZ192YWN1dW1fYmxvY2tlcnMucGwKQEAgLTAsMCArMSwzMTQgQEAK KyMgQ29weXJpZ2h0IChjKSAyMDI2LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91 cAorIworIyBWYWxpZGF0ZSB0aGF0IFZBQ1VVTSBsb2dzIGV4cGxhaW4gd2h5IGRlYWQgdHVwbGVz IGNvdWxkIG5vdCBiZSByZW1vdmVkLgorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzIEZBVEFM ID0+ICdhbGwnOworCit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3RlcjsKK3VzZSBQb3N0Z3Jl U1FMOjpUZXN0OjpVdGlsczsKK3VzZSBUZXN0OjpNb3JlOworCisjIFNldCB1cCBhIGNsdXN0ZXIK K215ICRub2RlID0gUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rlci0+bmV3KCdtYWluJyk7Ciskbm9k ZS0+aW5pdChhbGxvd3Nfc3RyZWFtaW5nID0+ICdsb2dpY2FsJyk7Ciskbm9kZS0+YXBwZW5kX2Nv bmYoJ3Bvc3RncmVzcWwuY29uZicsIHFbCittYXhfcHJlcGFyZWRfdHJhbnNhY3Rpb25zID0gNQor XSk7Ciskbm9kZS0+c3RhcnQ7CisKKyMgQ3JlYXRlIHRoZSBob3Qgc3RhbmRieSB0ZXN0IHRhYmxl IGFuZCBwcmVwYXJlIGJhY2t1cC9zdGFuZGJ5IGVhcmx5LCBiZWZvcmUKKyMgYW55IGJhY2tncm91 bmQgcHNxbCBzZXNzaW9ucyBhcmUgc3RhcnRlZC4gIE9uIFdpbmRvd3MsIGJhY2tncm91bmQgcHNx bAorIyBzZXNzaW9ucyB0aGF0IGFyZSB0ZXJtaW5hdGVkIGR1cmluZyBlYXJsaWVyIHRlc3RzIGNh biBsZWF2ZSBmaWxlIGhhbmRsZXMKKyMgbGluZ2VyaW5nLCB3aGljaCBjYXVzZXMgcGdfY3RsIHN0 YXJ0IGZvciB0aGUgc3RhbmRieSB0byBmYWlsLiAgQnkgdGFraW5nCisjIHRoZSBiYWNrdXAgYW5k IGluaXRpYWxpemluZyB0aGUgc3RhbmRieSBoZXJlLCB0aGUgc3RhbmRieSBzdGFydCBsYXRlciBv bmx5CisjIG5lZWRzIHRvIGxhdW5jaCBwZ19jdGwgYWZ0ZXIgYWxsIHRob3NlIHNlc3Npb25zIGhh dmUgYmVlbiBmdWxseSBjbGVhbmVkIHVwLgorJG5vZGUtPmJhY2t1cCgnb2xkZXN0eG1pbl9ob3Rz dGFuZGJ5X2JrcCcpOworbXkgJHN0YW5kYnkgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyLT5u ZXcoJ29sZGVzdHhtaW5fc3RhbmRieScpOworJHN0YW5kYnktPmluaXRfZnJvbV9iYWNrdXAoJG5v ZGUsICdvbGRlc3R4bWluX2hvdHN0YW5kYnlfYmtwJywKKwloYXNfc3RyZWFtaW5nID0+IDEpOwor JHN0YW5kYnktPmFwcGVuZF9jb25mKCdwb3N0Z3Jlc3FsLmNvbmYnLCBxWworaG90X3N0YW5kYnlf ZmVlZGJhY2sgPSBvbgord2FsX3JlY2VpdmVyX3N0YXR1c19pbnRlcnZhbCA9IDEwMG1zCitdKTsK KworCisjCisjIEFjdGl2ZSBzdGF0ZW1lbnQKKyMKK215ICRhY3RpdmVfdGFibGUgPSAnYmxvY2tl cl9hY3RpdmUnOworJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCBxcVsKK0NSRUFURSBUQUJM RSAkYWN0aXZlX3RhYmxlKGlkIGludCk7CitJTlNFUlQgSU5UTyAkYWN0aXZlX3RhYmxlIFZBTFVF UyAoMCk7CitdKTsKKworbXkgJGJsb2NrZXIgPSAkbm9kZS0+YmFja2dyb3VuZF9wc3FsKCdwb3N0 Z3JlcycpOworbXkgJGJsb2NrZXJfcGlkID0gJGJsb2NrZXItPnF1ZXJ5X3NhZmUoJ1NFTEVDVCBw Z19iYWNrZW5kX3BpZCgpOycpOworY2hvbXAoJGJsb2NrZXJfcGlkKTsKKworIyBTdGFydCBhIGxv bmctcnVubmluZyBxdWVyeSBpbiB0aGUgYmFja2dyb3VuZCB0aGF0IGFjY2Vzc2VzIGEgdGFibGUK KyMgVGhpcyBlbnN1cmVzIHhtaW4gaXMgc2V0IChwZ19zbGVlcCBhbG9uZSBkb2Vzbid0IHJlcXVp cmUgYSBzbmFwc2hvdCkKKyRibG9ja2VyLT5xdWVyeV91bnRpbChxci8vLCBxcVsKK0JFR0lOOwor U0VMRUNUICogRlJPTSAkYWN0aXZlX3RhYmxlLCBwZ19zbGVlcCg2MCk7CitdKTsKKworIyBXYWl0 IGZvciB0aGUgYmxvY2tlciB0byBoYXZlIHhtaW4gc2V0Ciskbm9kZS0+cG9sbF9xdWVyeV91bnRp bCgncG9zdGdyZXMnLCBxcVsKK1NFTEVDVCBiYWNrZW5kX3htaW4gSVMgTk9UIE5VTEwKK0ZST00g cGdfc3RhdF9hY3Rpdml0eQorV0hFUkUgcGlkID0gJGJsb2NrZXJfcGlkOworXSk7CisKKyRub2Rl LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgIkRFTEVURSBGUk9NICRhY3RpdmVfdGFibGU7Iik7CisK K215ICRzdGRlcnIgPSAnJzsKKyRub2RlLT5wc3FsKCdwb3N0Z3JlcycsICJWQUNVVU0gKFZFUkJP U0UpICRhY3RpdmVfdGFibGU7Iiwgc3RkZXJyID0+IFwkc3RkZXJyKTsKK2xpa2UoCisJJHN0ZGVy ciwKKwlxci9vbGRlc3QgeG1pbiBibG9ja2VyOiBhY3RpdmUgdHJhbnNhY3Rpb24gaG9sZGluZyBz bmFwc2hvdCBcKHBpZCA9ICRibG9ja2VyX3BpZFwpLywKKwknVkFDVVVNIFZFUkJPU0UgcmVwb3J0 ZWQgYWN0aXZlIHRyYW5zYWN0aW9uIGhvbGRpbmcgc25hcHNob3QgYXMgb2xkZXN0IHhtaW4gYmxv Y2tlcicpOworCisjIENsZWFudXAKKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgcXFbCitT RUxFQ1QgcGdfdGVybWluYXRlX2JhY2tlbmQoJGJsb2NrZXJfcGlkKTsKK0RST1AgVEFCTEUgJGFj dGl2ZV90YWJsZTsKK10pOworCisKKyMKKyMgSWRsZSBpbiB0cmFuc2FjdGlvbgorIworbXkgJGlk bGVfdGFibGUgPSAnYmxvY2tlcl9pZGxlJzsKKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywg cXFbCitDUkVBVEUgVEFCTEUgJGlkbGVfdGFibGUoaWQgaW50KTsKK0lOU0VSVCBJTlRPICRpZGxl X3RhYmxlIFZBTFVFUyAoMCk7CitdKTsKKworbXkgJGlkbGVfYmxvY2tlciA9ICRub2RlLT5iYWNr Z3JvdW5kX3BzcWwoJ3Bvc3RncmVzJyk7CitteSAkaWRsZV9ibG9ja2VyX3BpZCA9ICRpZGxlX2Js b2NrZXItPnF1ZXJ5X3NhZmUoJ1NFTEVDVCBwZ19iYWNrZW5kX3BpZCgpOycpOworY2hvbXAoJGlk bGVfYmxvY2tlcl9waWQpOworCisjIFNldCBpc29sYXRpb24gbGV2ZWwgdG8gUkVQRUFUQUJMRSBS RUFEIHRvIGVuc3VyZSB4bWluIGlzIHNldAorJGlkbGVfYmxvY2tlci0+cXVlcnlfc2FmZShxcVsK K0JFR0lOOworU0VUIFRSQU5TQUNUSU9OIElTT0xBVElPTiBMRVZFTCBSRVBFQVRBQkxFIFJFQUQ7 CitTRUxFQ1QgKiBGUk9NICRpZGxlX3RhYmxlOworXSk7CisKKyRub2RlLT5zYWZlX3BzcWwoJ3Bv c3RncmVzJywgIkRFTEVURSBGUk9NICRpZGxlX3RhYmxlOyIpOworCiskc3RkZXJyID0gJyc7Cisk bm9kZS0+cHNxbCgncG9zdGdyZXMnLCAiVkFDVVVNIChWRVJCT1NFKSAkaWRsZV90YWJsZTsiLCBz dGRlcnIgPT4gXCRzdGRlcnIpOworbGlrZSgKKwkkc3RkZXJyLAorCXFyL29sZGVzdCB4bWluIGJs b2NrZXI6IGlkbGUgaW4gdHJhbnNhY3Rpb24gaG9sZGluZyBzbmFwc2hvdCBcKHBpZCA9ICRpZGxl X2Jsb2NrZXJfcGlkXCkvLAorCSdWQUNVVU0gVkVSQk9TRSByZXBvcnRlZCBpZGxlIGluIHRyYW5z YWN0aW9uIGhvbGRpbmcgc25hcHNob3QgYXMgb2xkZXN0IHhtaW4gYmxvY2tlcicpOworCisjIENs ZWFudXAKKyRpZGxlX2Jsb2NrZXItPnF1aXQ7Ciskbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3Jlcycs ICJEUk9QIFRBQkxFICRpZGxlX3RhYmxlOyIpOworCisKKyMKKyMgU2VyaWFsaXphYmxlIHRyYW5z YWN0aW9uIChpZGxlIGluIHRyYW5zYWN0aW9uKQorIworbXkgJHNlcmlhbGl6YWJsZV90YWJsZSA9 ICdibG9ja2VyX3NlcmlhbGl6YWJsZSc7Ciskbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsIHFx WworQ1JFQVRFIFRBQkxFICRzZXJpYWxpemFibGVfdGFibGUoaWQgaW50KTsKK0lOU0VSVCBJTlRP ICRzZXJpYWxpemFibGVfdGFibGUgVkFMVUVTICgwKTsKK10pOworCitteSAkc2VyX2Jsb2NrZXIg PSAkbm9kZS0+YmFja2dyb3VuZF9wc3FsKCdwb3N0Z3JlcycpOworbXkgJHNlcl9ibG9ja2VyX3Bp ZCA9ICRzZXJfYmxvY2tlci0+cXVlcnlfc2FmZSgnU0VMRUNUIHBnX2JhY2tlbmRfcGlkKCk7Jyk7 CitjaG9tcCgkc2VyX2Jsb2NrZXJfcGlkKTsKKworJHNlcl9ibG9ja2VyLT5xdWVyeV9zYWZlKHFx WworQkVHSU47CitTRVQgVFJBTlNBQ1RJT04gSVNPTEFUSU9OIExFVkVMIFNFUklBTElaQUJMRTsK K1NFTEVDVCAqIEZST00gJHNlcmlhbGl6YWJsZV90YWJsZTsKK10pOworCiskbm9kZS0+c2FmZV9w c3FsKCdwb3N0Z3JlcycsICJERUxFVEUgRlJPTSAkc2VyaWFsaXphYmxlX3RhYmxlOyIpOworCisk c3RkZXJyID0gJyc7Ciskbm9kZS0+cHNxbCgncG9zdGdyZXMnLCAiVkFDVVVNIChWRVJCT1NFKSAk c2VyaWFsaXphYmxlX3RhYmxlOyIsIHN0ZGVyciA9PiBcJHN0ZGVycik7CitsaWtlKAorCSRzdGRl cnIsCisJcXIvb2xkZXN0IHhtaW4gYmxvY2tlcjogaWRsZSBpbiB0cmFuc2FjdGlvbiBob2xkaW5n IHNuYXBzaG90IFwocGlkID0gJHNlcl9ibG9ja2VyX3BpZFwpLywKKwknVkFDVVVNIFZFUkJPU0Ug cmVwb3J0ZWQgc2VyaWFsaXphYmxlIHRyYW5zYWN0aW9uIGFzIG9sZGVzdCB4bWluIGJsb2NrZXIn KTsKKworIyBDbGVhbnVwCiskc2VyX2Jsb2NrZXItPnF1aXQ7Ciskbm9kZS0+c2FmZV9wc3FsKCdw b3N0Z3JlcycsICJEUk9QIFRBQkxFICRzZXJpYWxpemFibGVfdGFibGU7Iik7CisKKworIworIyBQ cmVmZXIgeGlkIG93bmVyIG92ZXIgeG1pbiBtYXRjaAorIworbXkgJHByZWZlcl90YWJsZSA9ICdi bG9ja2VyX3ByZWZlcl94aWRfb3duZXInOworJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCBx cVsKK0NSRUFURSBUQUJMRSAkcHJlZmVyX3RhYmxlKGlkIGludCk7CitJTlNFUlQgSU5UTyAkcHJl ZmVyX3RhYmxlIFZBTFVFUyAoMCk7CitdKTsKKworbXkgJHhpZF9vd25lciA9ICRub2RlLT5iYWNr Z3JvdW5kX3BzcWwoJ3Bvc3RncmVzJyk7CitteSAkeGlkX293bmVyX3BpZCA9ICR4aWRfb3duZXIt PnF1ZXJ5X3NhZmUoJ1NFTEVDVCBwZ19iYWNrZW5kX3BpZCgpOycpOworY2hvbXAoJHhpZF9vd25l cl9waWQpOworCiskeGlkX293bmVyLT5xdWVyeV9zYWZlKHFxWworQkVHSU47CitTRUxFQ1QgcGdf Y3VycmVudF94YWN0X2lkKCk7CitdKTsKKworJG5vZGUtPnBvbGxfcXVlcnlfdW50aWwoJ3Bvc3Rn cmVzJywgcXFbCitTRUxFQ1QgYmFja2VuZF94aWQgSVMgTk9UIE5VTEwKK0ZST00gcGdfc3RhdF9h Y3Rpdml0eQorV0hFUkUgcGlkID0gJHhpZF9vd25lcl9waWQ7CitdKTsKKworbXkgJG93bmVyX3hp ZCA9ICRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgcXFbCitTRUxFQ1QgYmFja2VuZF94aWQK K0ZST00gcGdfc3RhdF9hY3Rpdml0eQorV0hFUkUgcGlkID0gJHhpZF9vd25lcl9waWQ7CitdKTsK K2Nob21wKCRvd25lcl94aWQpOworCitteSAkeG1pbl9ob2xkZXIgPSAkbm9kZS0+YmFja2dyb3Vu ZF9wc3FsKCdwb3N0Z3JlcycpOworbXkgJHhtaW5faG9sZGVyX3BpZCA9ICR4bWluX2hvbGRlci0+ cXVlcnlfc2FmZSgnU0VMRUNUIHBnX2JhY2tlbmRfcGlkKCk7Jyk7CitjaG9tcCgkeG1pbl9ob2xk ZXJfcGlkKTsKKworIyBTdGFydCBhIGxvbmctcnVubmluZyBxdWVyeSB0aGF0IHdpbGwgdGFrZSBh IHNuYXBzaG90IGFmdGVyIHhpZF9vd25lciBiZWdpbnMKKyR4bWluX2hvbGRlci0+cXVlcnlfdW50 aWwocXIvLywgcXFbCitCRUdJTjsKK1NFTEVDVCAqIEZST00gJHByZWZlcl90YWJsZSwgcGdfc2xl ZXAoNjApOworXSk7CisKKyMgRW5zdXJlIHhtaW5faG9sZGVyJ3MgeG1pbiBpcyBoZWxkIGJhY2sg YnkgeGlkX293bmVyCiskbm9kZS0+cG9sbF9xdWVyeV91bnRpbCgncG9zdGdyZXMnLCBxcVsKK1NF TEVDVCBiYWNrZW5kX3htaW4gPSAnJG93bmVyX3hpZCc6OnhpZAorRlJPTSBwZ19zdGF0X2FjdGl2 aXR5CitXSEVSRSBwaWQgPSAkeG1pbl9ob2xkZXJfcGlkOworXSk7CisKKyRub2RlLT5zYWZlX3Bz cWwoJ3Bvc3RncmVzJywgIkRFTEVURSBGUk9NICRwcmVmZXJfdGFibGU7Iik7CisKKyRzdGRlcnIg PSAnJzsKKyRub2RlLT5wc3FsKCdwb3N0Z3JlcycsICJWQUNVVU0gKFZFUkJPU0UpICRwcmVmZXJf dGFibGU7Iiwgc3RkZXJyID0+IFwkc3RkZXJyKTsKK2xpa2UoCisJJHN0ZGVyciwKKwlxci9vbGRl c3QgeG1pbiBibG9ja2VyOiBpZGxlIGluIHRyYW5zYWN0aW9uIFwocGlkID0gJHhpZF9vd25lcl9w aWRcKS8sCisJJ1ZBQ1VVTSBWRVJCT1NFIHByZWZlcnJlZCB4aWQgb3duZXIgb3ZlciB4bWluIG1h dGNoJyk7CisKKyMgQ2xlYW51cAorJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCBxcVsKK1NF TEVDVCBwZ190ZXJtaW5hdGVfYmFja2VuZCgkeG1pbl9ob2xkZXJfcGlkKTsKK1NFTEVDVCBwZ190 ZXJtaW5hdGVfYmFja2VuZCgkeGlkX293bmVyX3BpZCk7CitEUk9QIFRBQkxFICRwcmVmZXJfdGFi bGU7CitdKTsKKworCisjCisjIFByZXBhcmVkIHRyYW5zYWN0aW9uCisjCitteSAkcHJlcGFyZWRf dGFibGUgPSAnYmxvY2tlcl9wcmVwYXJlZCc7Ciskbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3Jlcycs IHFxWworQ1JFQVRFIFRBQkxFICRwcmVwYXJlZF90YWJsZShpZCBpbnQpOworSU5TRVJUIElOVE8g JHByZXBhcmVkX3RhYmxlIFZBTFVFUyAoMCk7CitCRUdJTjsKK1BSRVBBUkUgVFJBTlNBQ1RJT04g J2d4X3ZhY3V1bV94bWluJzsKK10pOworCiskbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJE RUxFVEUgRlJPTSAkcHJlcGFyZWRfdGFibGU7Iik7CisKKyRzdGRlcnIgPSAnJzsKKyRub2RlLT5w c3FsKCdwb3N0Z3JlcycsICJWQUNVVU0gKFZFUkJPU0UpICRwcmVwYXJlZF90YWJsZTsiLCBzdGRl cnIgPT4gXCRzdGRlcnIpOworbGlrZSgKKwkkc3RkZXJyLAorCXFyL29sZGVzdCB4bWluIGJsb2Nr ZXI6IHByZXBhcmVkIHRyYW5zYWN0aW9uIFwoZ2lkID0gZ3hfdmFjdXVtX3htaW5cKS8sCisJJ1ZB Q1VVTSBWRVJCT1NFIHJlcG9ydGVkIHByZXBhcmVkIHRyYW5zYWN0aW9uIGFzIG9sZGVzdCB4bWlu IGJsb2NrZXInKTsKKworIyBDbGVhbnVwCiskbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsIHFx WworUk9MTEJBQ0sgUFJFUEFSRUQgJ2d4X3ZhY3V1bV94bWluJzsKK0RST1AgVEFCTEUgJHByZXBh cmVkX3RhYmxlOworXSk7CisKKworIworIyBMb2dpY2FsIHJlcGxpY2F0aW9uIHNsb3QKKyMKK215 ICRzbG90X3RhYmxlID0gJ2Jsb2NrZXJfc2xvdCc7Ciskbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3Jl cycsIHFxWworQ1JFQVRFIFRBQkxFICRzbG90X3RhYmxlKGlkIGludCk7CitTRUxFQ1QgcGdfY3Jl YXRlX2xvZ2ljYWxfcmVwbGljYXRpb25fc2xvdCgnbG9naWNhbF9zbG90JywgJ3Rlc3RfZGVjb2Rp bmcnKTsKK0RST1AgVEFCTEUgJHNsb3RfdGFibGU7CitdKTsKKworJHN0ZGVyciA9ICcnOworJG5v ZGUtPnBzcWwoJ3Bvc3RncmVzJywgJ1ZBQ1VVTSAoVkVSQk9TRSkgcGdfY2xhc3M7Jywgc3RkZXJy ID0+IFwkc3RkZXJyKTsKK2xpa2UoCisJJHN0ZGVyciwKKwlxci9vbGRlc3QgeG1pbiBibG9ja2Vy OiBsb2dpY2FsIHJlcGxpY2F0aW9uIHNsb3QgXChzbG90IG5hbWUgPSBsb2dpY2FsX3Nsb3RcKS8s CisJJ1ZBQ1VVTSBWRVJCT1NFIHJlcG9ydGVkIGxvZ2ljYWwgcmVwbGljYXRpb24gc2xvdCBhcyBv bGRlc3QgeG1pbiBzb3VyY2UnKTsKKworIyBDbGVhbnVwCiskbm9kZS0+c2FmZV9wc3FsKCdwb3N0 Z3JlcycsIHFxWworU0VMRUNUIHBnX2Ryb3BfcmVwbGljYXRpb25fc2xvdCgnbG9naWNhbF9zbG90 Jyk7CitdKTsKKworCisjCisjIEhvdCBzdGFuZGJ5IGZlZWRiYWNrCisjCisjIFRoZSBzdGFuZGJ5 IHdhcyBhbHJlYWR5IGluaXRpYWxpemVkIGZyb20gYSBiYWNrdXAgdGFrZW4gYWJvdmUuICBTdGFy dCBpdAorIyBub3csIGFmdGVyIGFsbCBiYWNrZ3JvdW5kIHBzcWwgc2Vzc2lvbnMgZnJvbSBlYXJs aWVyIHRlc3RzIGhhdmUgYmVlbiBmdWxseQorIyBjbGVhbmVkIHVwLgorbXkgJGhzX3RhYmxlID0g J2Jsb2NrZXJfaG90c3RhbmRieSc7Ciskbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsIHFxWwor Q1JFQVRFIFRBQkxFICRoc190YWJsZShpZCBpbnQpOworSU5TRVJUIElOVE8gJGhzX3RhYmxlIFZB TFVFUyAoMCk7CitdKTsKKworJHN0YW5kYnktPnN0YXJ0OworJG5vZGUtPndhaXRfZm9yX2NhdGNo dXAoJHN0YW5kYnksICdyZXBsYXknLCAkbm9kZS0+bHNuKCdmbHVzaCcpKTsKKworbXkgJHN0YW5k YnlfcmVhZGVyID0gJHN0YW5kYnktPmJhY2tncm91bmRfcHNxbCgncG9zdGdyZXMnKTsKK215ICRz dGFuZGJ5X3JlYWRlcl9waWQgPSAkc3RhbmRieV9yZWFkZXItPnF1ZXJ5X3NhZmUoJ1NFTEVDVCBw Z19iYWNrZW5kX3BpZCgpOycpOworY2hvbXAoJHN0YW5kYnlfcmVhZGVyX3BpZCk7CisKKyRzdGFu ZGJ5X3JlYWRlci0+cXVlcnlfdW50aWwocXIvLywgcXFbCitCRUdJTjsKK1NFTEVDVCAqIEZST00g JGhzX3RhYmxlLCBwZ19zbGVlcCg2MCk7CitdKTsKKworIyBXYWl0IGZvciBob3Qgc3RhbmRieSBm ZWVkYmFjayB0byBiZSBzZW50Ciskbm9kZS0+cG9sbF9xdWVyeV91bnRpbCgncG9zdGdyZXMnLCBx WworU0VMRUNUIGJhY2tlbmRfeG1pbiBJUyBOT1QgTlVMTAorRlJPTSBwZ19zdGF0X3JlcGxpY2F0 aW9uCitXSEVSRSBhcHBsaWNhdGlvbl9uYW1lID0gJ29sZGVzdHhtaW5fc3RhbmRieSc7CitdKTsK KworbXkgJGhzX2Jsb2NrZXJfcGlkID0gJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCBxWwor U0VMRUNUIHBpZCBGUk9NIHBnX3N0YXRfcmVwbGljYXRpb24KK1dIRVJFIGFwcGxpY2F0aW9uX25h bWUgPSAnb2xkZXN0eG1pbl9zdGFuZGJ5JzsKK10pOworY2hvbXAoJGhzX2Jsb2NrZXJfcGlkKTsK KworJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiREVMRVRFIEZST00gJGhzX3RhYmxlOyIp OworCiskc3RkZXJyID0gJyc7Ciskbm9kZS0+cHNxbCgncG9zdGdyZXMnLCAiVkFDVVVNIChWRVJC T1NFKSAkaHNfdGFibGU7Iiwgc3RkZXJyID0+IFwkc3RkZXJyKTsKK2xpa2UoCisJJHN0ZGVyciwK Kwlxci9vbGRlc3QgeG1pbiBibG9ja2VyOiBob3Qgc3RhbmRieSBmZWVkYmFjayBcKHN0YW5kYnkg bmFtZSA9IG9sZGVzdHhtaW5fc3RhbmRieSwgcGlkID0gJGhzX2Jsb2NrZXJfcGlkXCkvLAorCSdW QUNVVU0gVkVSQk9TRSByZXBvcnRlZCBob3Qgc3RhbmRieSBmZWVkYmFjayBhcyBvbGRlc3QgeG1p biBibG9ja2VyJyk7CisKKyMgQ2xlYW51cAorJHN0YW5kYnktPnNhZmVfcHNxbCgncG9zdGdyZXMn LCAiU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKCRzdGFuZGJ5X3JlYWRlcl9waWQpOyIpOwor JG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiRFJPUCBUQUJMRSAkaHNfdGFibGU7Iik7CisK KworJHN0YW5kYnktPnN0b3A7Ciskbm9kZS0+c3RvcDsKK2RvbmVfdGVzdGluZygpOwpkaWZmIC0t Z2l0IGEvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QgYi9zcmMvdG9vbHMvcGdpbmRl bnQvdHlwZWRlZnMubGlzdAppbmRleCA5ZjVlZThmZDQ4Mi4uOTc2ZjUwNWM3NTggMTAwNjQ0Ci0t LSBhL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CisrKyBiL3NyYy90b29scy9wZ2lu ZGVudC90eXBlZGVmcy5saXN0CkBAIC0zNDMxLDYgKzM0MzEsOCBAQCBYYWN0TG9ja1RhYmxlV2Fp dEluZm8KIFhpZEJvdW5kc1Zpb2xhdGlvbgogWGlkQ2FjaGVTdGF0dXMKIFhpZENvbW1pdFN0YXR1 cworWGlkSG9yaXpvbkJsb2NrZXIKK1hpZEhvcml6b25CbG9ja2VyVHlwZQogWGlkU3RhdHVzCiBY bWxFeHByCiBYbWxFeHByT3AKLS0gCjIuNDcuMwoK --0000000000002a58df064a0c449a--