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 1vKycf-00FOu5-0m for pgsql-hackers@arkaria.postgresql.org; Mon, 17 Nov 2025 12:46:20 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vKycc-00EBIu-2r for pgsql-hackers@arkaria.postgresql.org; Mon, 17 Nov 2025 12:46:18 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vKycc-00EBIl-11 for pgsql-hackers@lists.postgresql.org; Mon, 17 Nov 2025 12:46:18 +0000 Received: from mail-wm1-x32f.google.com ([2a00:1450:4864:20::32f]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vKycZ-007dJn-2l for pgsql-hackers@lists.postgresql.org; Mon, 17 Nov 2025 12:46:17 +0000 Received: by mail-wm1-x32f.google.com with SMTP id 5b1f17b1804b1-47795f6f5c0so15853345e9.1 for ; Mon, 17 Nov 2025 04:46:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1763383574; x=1763988374; darn=lists.postgresql.org; h=to:subject:from:content-language:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=WWV5FbkIwkJV/qT8VgqryYvEwhq/0KZMajw+ANu9l14=; b=guOZIVi/JQkneAf/YxUeNLLDCyRxJzcRX/7JYpXBAtYPjqvRqK3m66wV3/PJYg06/j Is/9cF+2n8KdMCpzjsuOAMF0XbqUN5SMHqgewZxlrnYfVefZBF0d6dtcupGItzRhZPdO KtjrSuEf29ZrF0x3XRsJeq7E012S8Mkso8tba3HmTikINNfYiBul26pMZ/nrF6uMVkDg ake/SdMXE+vSxQtwBd06uict1K8QvCjAG6UVHejIHbjoB176CtM/8w+lIgQM32u+ESie FPYvrgJyGR9oBVXmF0d26GnsNeQLtrFzj+ymPngYtbIsosvWAuPMEtO4K4n6HMW6CbO4 VPYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763383574; x=1763988374; h=to:subject:from:content-language:user-agent:mime-version:date :message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=WWV5FbkIwkJV/qT8VgqryYvEwhq/0KZMajw+ANu9l14=; b=aDndOHF2GF2WuoN03tgpF2l1yZb3Jvu/0FHYXudn/+HujFSSQSwrg1v/jAh2/SNLnE rFE++OpUOlWesx40VploF1+E8tTiISt/YA96buxcSsg4odOody8sXgIcNwBWLLdEiXLt jzpnpsQ01unUl/Z+UI03Kytk1BAvN+WAicaLDZEK154CcNy0f26jpykl7s72sXFOWpM9 oIVjiUfitlw6L4kS9+2X4wyJW3pNvt9LIOddV8VinjGIs2Kh7pkQ1EiY1rXHiGQ/vkEK 20XIxbYEFt8WkRJV98FWINWbaGGK2x8o/ueQdb4KSNEbX9K1uvU6yOx8FrkLr4t8AP4F 6v3Q== X-Gm-Message-State: AOJu0YxPBjBNIpJDHq3gDaA9x1H/UjYjh0YFpIKk5I801Zqf4cb9LSmR G0boEwkPEKeqoKILvZ/PJ4UsS1t2eOWUq+yqgnUJcEjV5SnE17J/eR0fisALq1+5 X-Gm-Gg: ASbGnct+6jhUUbYb9hQJjpVQJoYN9P0HzHqgPSGnqbs5NFXKbDAFuV4vIpH+BLv5flt YCHj70wgJdDTUGZp2HI7Z/SRxA/MfPils8xUn5usMRx8YxocaPbF4dO3EDg+/mzxfeDnNSVSpVY /+BiIynSNnZXIEy9lnhEh9D7JZ2xnt5gYrFDHIHBQkrsjMi6l/F2TnvJ45tk693zkBrQawdNeaf gysPkHXnRz4lS7eS0LhUumoSA3lvhxekMa9BemPl8Xh/a9xPGbUWr6hRqdV/uphlAKG3LXccRhU 1drea670YdGGJyvINRgWjU619uFtR9w1RC7Sr12w2QPJA4A6gyQ9U/TrUIeMJZdXIG8Y5kr1rvE QH5Lg0YWoaTzGtphZNUqRV/pd+k4m1vXquVDLictLVeXN1BSVyZvzIawo4Zv+84uTyTzEB2LYmd 48Ra7U6tdyHtYDrLfCelBdCjIxM2PN56wW5DXeq8MriFU5xCs3BSkR0shX2Zna+NaIb551axmFV AxtohhbKNqFf0383A== X-Google-Smtp-Source: AGHT+IFIkttHtj0Layjf5jDfv+Cy8ZDNimY5LeLVPJnuve9RhrrfFuMSuXI4ve2qw9WH1zeRw2V2vg== X-Received: by 2002:a05:600c:6287:b0:477:7f4a:44b4 with SMTP id 5b1f17b1804b1-4778fe60641mr113901925e9.1.1763383573519; Mon, 17 Nov 2025 04:46:13 -0800 (PST) Received: from [192.168.4.121] (host-92-25-165-171.as13285.net. [92.25.165.171]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-47787e45677sm310644955e9.8.2025.11.17.04.46.12 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 17 Nov 2025 04:46:12 -0800 (PST) Content-Type: multipart/mixed; boundary="------------VpV4FsKLxrL060DmFSLHrYfR" Message-ID: Date: Mon, 17 Nov 2025 12:46:12 +0000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-GB From: Mircea Cadariu Subject: parallel data loading for pgbench -i To: PostgreSQL Hackers List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------VpV4FsKLxrL060DmFSLHrYfR Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi, I propose a patch for speeding up pgbench -i through multithreading. To enable this, pass -j and then the number of workers you want to use. Here are some results I got on my laptop: master --- -i -s 100 done in 20.95 s (drop tables 0.00 s, create tables 0.01 s, client-side generate 14.51 s, vacuum 0.27 s, primary keys 6.16 s). -i -s 100 --partitions=10 done in 29.73 s (drop tables 0.00 s, create tables 0.02 s, client-side generate 16.33 s, vacuum 8.72 s, primary keys 4.67 s). patch (-j 10) --- -i -s 100 -j 10 done in 18.64 s (drop tables 0.00 s, create tables 0.01 s, client-side generate 5.82 s, vacuum 6.89 s, primary keys 5.93 s). -i -s 100 -j 10 --partitions=10 done in 14.66 s (drop tables 0.00 s, create tables 0.01 s, client-side generate 8.42 s, vacuum 1.55 s, primary keys 4.68 s). The speedup is more significant for the partitioned use-case. This is because all workers can use COPY FREEZE (thus incurring a lower vacuum penalty) because they create their separate partitions. For the non-partitioned case the speedup is lower, but I observe it improves somewhat with larger scale factors. When parallel vacuum support is merged, this should further reduce the time. I'd still need to update docs, tests, better integrate the code with its surroundings, and other aspects. Would appreciate any feedback on what I have so far though. Thanks! Kind regards, Mircea Cadariu --------------VpV4FsKLxrL060DmFSLHrYfR Content-Type: text/plain; charset=UTF-8; name="v1-0001-parallel-pgbench-wip.patch" Content-Disposition: attachment; filename="v1-0001-parallel-pgbench-wip.patch" Content-Transfer-Encoding: base64 RnJvbSAxOGQ5MWVjOWMyMmQ0MzUyMmRjMWNkODNjMTYzNTljMzZiM2RjNThkIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBNaXJjZWEgQ2FkYXJpdSA8Y2FkYXJpdS5taXJjZWFA Z21haWwuY29tPgpEYXRlOiBTdW4sIDkgTm92IDIwMjUgMTA6NDE6NTEgKzAwMDAKU3ViamVj dDogW1BBVENIIHYxXSB3aXAKCi0tLQogc3JjL2Jpbi9wZ2JlbmNoL3BnYmVuY2guYyB8IDQ1 NSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLQogMSBmaWxlIGNoYW5n ZWQsIDQyMCBpbnNlcnRpb25zKCspLCAzNSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9z cmMvYmluL3BnYmVuY2gvcGdiZW5jaC5jIGIvc3JjL2Jpbi9wZ2JlbmNoL3BnYmVuY2guYwpp bmRleCBhNDI1MTc2ZWNkLi5lZjRlMDU2NzhhIDEwMDY0NAotLS0gYS9zcmMvYmluL3BnYmVu Y2gvcGdiZW5jaC5jCisrKyBiL3NyYy9iaW4vcGdiZW5jaC9wZ2JlbmNoLmMKQEAgLTc4LDYg Kzc4LDggQEAKICNkZWZpbmUgRVJSQ09ERV9UX1JfREVBRExPQ0tfREVURUNURUQgICI0MFAw MSIKICNkZWZpbmUgRVJSQ09ERV9VTkRFRklORURfVEFCTEUgICI0MlAwMSIKIAorI2RlZmlu ZSBDT1BZX0JBVENIX1NJWkUJKDEwMjQgKiAxMDI0KQorCiAvKgogICogSGFzaGluZyBjb25z dGFudHMKICAqLwpAQCAtODI1LDcgKzgyNyw2IEBAIHN0YXRpYyBjb25zdCBCdWlsdGluU2Ny aXB0IGJ1aWx0aW5fc2NyaXB0W10gPQogCX0KIH07CiAKLQogLyogRnVuY3Rpb24gcHJvdG90 eXBlcyAqLwogc3RhdGljIHZvaWQgc2V0TnVsbFZhbHVlKFBnQmVuY2hWYWx1ZSAqcHYpOwog c3RhdGljIHZvaWQgc2V0Qm9vbFZhbHVlKFBnQmVuY2hWYWx1ZSAqcHYsIGJvb2wgYnZhbCk7 CkBAIC04NDgsNiArODQ5LDggQEAgc3RhdGljIHZvaWQgY2xlYXJfc29ja2V0X3NldChzb2Nr ZXRfc2V0ICpzYSk7CiBzdGF0aWMgdm9pZCBhZGRfc29ja2V0X3RvX3NldChzb2NrZXRfc2V0 ICpzYSwgaW50IGZkLCBpbnQgaWR4KTsKIHN0YXRpYyBpbnQJd2FpdF9vbl9zb2NrZXRfc2V0 KHNvY2tldF9zZXQgKnNhLCBpbnQ2NCB1c2Vjcyk7CiBzdGF0aWMgYm9vbCBzb2NrZXRfaGFz X2lucHV0KHNvY2tldF9zZXQgKnNhLCBpbnQgZmQsIGludCBpZHgpOworc3RhdGljIHZvaWQg Y3JlYXRlUGFydGl0aW9ucyhQR2Nvbm4gKmNvbiwgaW50IHBhcnRfc3RhcnQsIGludCBwYXJ0 X2VuZCk7CitzdGF0aWMgdm9pZCBhdHRhY2hQYXJ0aXRpb25zKFBHY29ubiAqY29uKTsKIAog LyogY2FsbGJhY2sgdXNlZCB0byBidWlsZCByb3dzIGZvciBDT1BZIGR1cmluZyBkYXRhIGxv YWRpbmcgKi8KIHR5cGVkZWYgdm9pZCAoKmluaXRSb3dNZXRob2QpIChQUUV4cEJ1ZmZlckRh dGEgKnNxbCwgaW50NjQgY3Vycik7CkBAIC04NTYsNiArODU5LDE5IEBAIHR5cGVkZWYgdm9p ZCAoKmluaXRSb3dNZXRob2QpIChQUUV4cEJ1ZmZlckRhdGEgKnNxbCwgaW50NjQgY3Vycik7 CiBzdGF0aWMgY29uc3QgUHNxbFNjYW5DYWxsYmFja3MgcGdiZW5jaF9jYWxsYmFja3MgPSB7 CiAJTlVMTCwJCQkJCQkvKiBkb24ndCBuZWVkIGdldF92YXJpYWJsZSBmdW5jdGlvbmFsaXR5 ICovCiB9OworLyogV29ya2VyIHRocmVhZCBkYXRhIGZvciBwYXJhbGxlbCB0YWJsZSBsb2Fk aW5nICovCit0eXBlZGVmIHN0cnVjdCBXb3JrZXJUYXNrRGVzY3JpcHRpb24KK3sKKwlQR2Nv bm4JICAgKmNvbjsKKwljb25zdCBjaGFyICp0YWJsZTsKKwlpbnQ2NAkJc3RhcnRfcm93Owor CWludDY0CQllbmRfcm93OworCWluaXRSb3dNZXRob2QgYXBwZW5kX3JvdzsKKwlpbnQJCQl3 b3JrZXJfaWQ7CisJaW50CQkJcGFydF9zdGFydDsKKwlpbnQJCQlwYXJ0X2VuZDsKKwlpbnQ2 NAkJcGFydF9zaXplOworfSBXb3JrZXJUYXNrRGVzY3JpcHRpb247CiAKIHN0YXRpYyBjaGFy CiBnZXRfdGFibGVfcmVsa2luZChQR2Nvbm4gKmNvbiwgY29uc3QgY2hhciAqdGFibGUpCkBA IC0xNjMxLDYgKzE2NDcsMjc3IEBAIGRvQ29ubmVjdCh2b2lkKQogCXJldHVybiBjb25uOwog fQogCisvKgorICogVHJ1bmNhdGUgc3BlY2lmaWVkIHRhYmxlKHMpCisgKiB0YWJsZU5hbWUg Y2FuIGJlIGEgc2luZ2xlIHRhYmxlIG9yIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRhYmxl cworICovCitzdGF0aWMgdm9pZAordHJ1bmNhdGVUYWJsZShQR2Nvbm4gKmNvbiwgY29uc3Qg Y2hhciAqdGFibGVOYW1lKQoreworCVBRRXhwQnVmZmVyRGF0YSBxdWVyeTsKKworCWluaXRQ UUV4cEJ1ZmZlcigmcXVlcnkpOworCXByaW50ZlBRRXhwQnVmZmVyKCZxdWVyeSwgIlRSVU5D QVRFIFRBQkxFICVzIiwgdGFibGVOYW1lKTsKKwlleGVjdXRlU3RhdGVtZW50KGNvbiwgcXVl cnkuZGF0YSk7CisJdGVybVBRRXhwQnVmZmVyKCZxdWVyeSk7Cit9CisKKy8qCisgKiBQYXJh bWV0ZXJzIG5lZWRlZCBmb3IgQ09QWSBvcGVyYXRpb25zLgorICovCit0eXBlZGVmIHN0cnVj dCBDb3B5VGFyZ2V0Cit7CisJY29uc3QgY2hhciAqdGFibGVfbmFtZTsKKwlpbnQ2NAkJc3Rh cnRfcm93OworCWludDY0CQllbmRfcm93OworCWJvb2wJCXVzZV9mcmVlemU7Cit9IENvcHlU YXJnZXQ7CisKKy8qCisgKiBQZXJmb3JtIENPUFkgb3BlcmF0aW9uIGZvciBhIHNpbmdsZSB0 YWJsZSBvciBwYXJ0aXRpb24uCisgKiBCYXRjaGVzIHJvd3MgaW50byBsYXJnZXIgYnVmZmVy cyBiZWZvcmUgc2VuZGluZyB0byByZWR1Y2Ugb3ZlcmhlYWQuCisgKi8KK3N0YXRpYyB2b2lk CitwZXJmb3JtQ29weShQR2Nvbm4gKmNvbm4sIFdvcmtlclRhc2tEZXNjcmlwdGlvbiAqd3Rk LCBDb3B5VGFyZ2V0ICp0YXJnZXQpCit7CisJUEdyZXN1bHQgICAqcmVzOworCWNoYXIJCWNv cHlfc3RhdGVtZW50W05BTUVEQVRBTEVOICsgMzJdOworCWludDY0CQlyb3c7CisJUFFFeHBC dWZmZXJEYXRhIGJhdGNoX2J1ZmZlcjsKKworCS8qIEJ1aWxkIHRoZSBDT1BZIGNvbW1hbmQg Ki8KKwlpZiAodGFyZ2V0LT51c2VfZnJlZXplKQorCQlzbnByaW50Zihjb3B5X3N0YXRlbWVu dCwgc2l6ZW9mKGNvcHlfc3RhdGVtZW50KSwKKwkJCQkgIkNPUFkgJXMgRlJPTSBTVERJTiAo RlJFRVpFIE9OKSIsIHRhcmdldC0+dGFibGVfbmFtZSk7CisJZWxzZQorCQlzbnByaW50Zihj b3B5X3N0YXRlbWVudCwgc2l6ZW9mKGNvcHlfc3RhdGVtZW50KSwKKwkJCQkgIkNPUFkgJXMg RlJPTSBTVERJTiIsIHRhcmdldC0+dGFibGVfbmFtZSk7CisKKwkvKiBJbml0aWF0ZSBDT1BZ IG1vZGUgKi8KKwlyZXMgPSBQUWV4ZWMoY29ubiwgY29weV9zdGF0ZW1lbnQpOworCWlmIChQ UXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX0NPUFlfSU4pCisJCXBnX2ZhdGFsKCJDT1BZ IGNvbW1hbmQgZmFpbGVkIGZvciB0YWJsZSBcIiVzXCI6ICVzIiwKKwkJCQkgdGFyZ2V0LT50 YWJsZV9uYW1lLCBQUWVycm9yTWVzc2FnZShjb25uKSk7CisJUFFjbGVhcihyZXMpOworCisJ LyogUHJlLWFsbG9jYXRlIGJ1ZmZlciB0byBhdm9pZCByZXBlYXRlZCByZWFsbG9jcyAqLwor CWluaXRQUUV4cEJ1ZmZlcigmYmF0Y2hfYnVmZmVyKTsKKwllbmxhcmdlUFFFeHBCdWZmZXIo JmJhdGNoX2J1ZmZlciwgQ09QWV9CQVRDSF9TSVpFKTsKKworCS8qIEdlbmVyYXRlIGFuZCBz ZW5kIHJvd3MgaW4gYmF0Y2hlcyB1c2luZyBhcHBlbmRfcm93ICovCisJZm9yIChyb3cgPSB0 YXJnZXQtPnN0YXJ0X3Jvdzsgcm93IDwgdGFyZ2V0LT5lbmRfcm93OyByb3crKykKKwl7CisJ CS8qIFVzZSBhcHBlbmRfcm93IHRvIGFjY3VtdWxhdGUgbXVsdGlwbGUgcm93cyBpbiB0aGUg YnVmZmVyICovCisJCXd0ZC0+YXBwZW5kX3JvdygmYmF0Y2hfYnVmZmVyLCByb3cpOworCisJ CS8qIFNlbmQgYmF0Y2ggd2hlbiBidWZmZXIgcmVhY2hlcyBzaXplIHRocmVzaG9sZCAqLwor CQlpZiAoYmF0Y2hfYnVmZmVyLmxlbiA+PSBDT1BZX0JBVENIX1NJWkUpCisJCXsKKwkJCWlm IChQUXB1dENvcHlEYXRhKGNvbm4sIGJhdGNoX2J1ZmZlci5kYXRhLCBiYXRjaF9idWZmZXIu bGVuKSA8PSAwKQorCQkJCXBnX2ZhdGFsKCJlcnJvciBpbiBQUXB1dENvcHlEYXRhOiAlcyIs IFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKworCQkJcmVzZXRQUUV4cEJ1ZmZlcigmYmF0Y2hf YnVmZmVyKTsKKwkJfQorCX0KKworCS8qIFNlbmQgYW55IHJlbWFpbmluZyBidWZmZXJlZCBk YXRhICovCisJaWYgKGJhdGNoX2J1ZmZlci5sZW4gPiAwKQorCXsKKwkJaWYgKFBRcHV0Q29w eURhdGEoY29ubiwgYmF0Y2hfYnVmZmVyLmRhdGEsIGJhdGNoX2J1ZmZlci5sZW4pIDw9IDAp CisJCQlwZ19mYXRhbCgiZXJyb3IgaW4gUFFwdXRDb3B5RGF0YTogJXMiLCBQUWVycm9yTWVz c2FnZShjb25uKSk7CisJfQorCisJLyogRmluYWxpemUgdGhlIENPUFkgb3BlcmF0aW9uICov CisJaWYgKFBRcHV0Q29weUVuZChjb25uLCBOVUxMKSA8PSAwKQorCQlwZ19mYXRhbCgiZXJy b3IgaW4gUFFwdXRDb3B5RW5kOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKworCXJl cyA9IFBRZ2V0UmVzdWx0KGNvbm4pOworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBH UkVTX0NPTU1BTkRfT0spCisJCXBnX2ZhdGFsKCJDT1BZIGZhaWxlZCBmb3IgdGFibGUgXCIl c1wiOiAlcyIsCisJCQkJIHRhcmdldC0+dGFibGVfbmFtZSwgUFFlcnJvck1lc3NhZ2UoY29u bikpOworCVBRY2xlYXIocmVzKTsKKworCXRlcm1QUUV4cEJ1ZmZlcigmYmF0Y2hfYnVmZmVy KTsKK30KKworCitzdGF0aWMgdm9pZAorYXNzaWduV29ya2VyUm93cyhXb3JrZXJUYXNrRGVz Y3JpcHRpb24gKnd0ZCwgaW50IG51bV93b3JrZXJzLCBpbnQ2NCB0b3RhbF9yb3dzKQorewor CWludDY0CQlyb3dzX3Blcl93b3JrZXIgPSB0b3RhbF9yb3dzIC8gbnVtX3dvcmtlcnM7CisK Kwl3dGQtPnN0YXJ0X3JvdyA9IHd0ZC0+d29ya2VyX2lkICogcm93c19wZXJfd29ya2VyOwor CXd0ZC0+ZW5kX3JvdyA9ICh3dGQtPndvcmtlcl9pZCA9PSBudW1fd29ya2VycyAtIDEpID8K KwkJdG90YWxfcm93cyA6CisJCSh3dGQtPndvcmtlcl9pZCArIDEpICogcm93c19wZXJfd29y a2VyOworfQorCisvKgorICogQ292ZXJzIG9ubHkgbXVsdGlwbGUgcGFydGl0aW9ucyBwZXIg d29ya2VyICh3b3JrZXJzIDw9IHBhcnRpdGlvbnMpIGZvciBub3cuCisgKiBFYWNoIHdvcmtl ciBsb2FkcyBjb21wbGV0ZSBwYXJ0aXRpb25zIGluZGVwZW5kZW50bHkgYW5kIGNhbiB1c2Ug Q09QWSBGUkVFWkUuCisgKi8KK3N0YXRpYyB2b2lkCithc3NpZ25Xb3JrZXJQYXJ0aXRpb25z KFdvcmtlclRhc2tEZXNjcmlwdGlvbiAqd3RkLCBpbnQgbnVtX3dvcmtlcnMsIGludDY0IHRv dGFsX3Jvd3MsCisJCQkJCSAgIGludCBudW1fcGFydHMpCit7CisJaW50CQkJcGFydHNfcGVy X3dvcmtlciA9IG51bV9wYXJ0cyAvIG51bV93b3JrZXJzOworCWludAkJCWV4dHJhX3BhcnRz ID0gbnVtX3BhcnRzICUgbnVtX3dvcmtlcnM7CisKKwl3dGQtPnBhcnRfc3RhcnQgPSB3dGQt Pndvcmtlcl9pZCAqIHBhcnRzX3Blcl93b3JrZXIgKyAxICsKKwkJKHd0ZC0+d29ya2VyX2lk IDwgZXh0cmFfcGFydHMgPyB3dGQtPndvcmtlcl9pZCA6IGV4dHJhX3BhcnRzKTsKKwl3dGQt PnBhcnRfZW5kID0gd3RkLT5wYXJ0X3N0YXJ0ICsgcGFydHNfcGVyX3dvcmtlciAtIDEgKwor CQkod3RkLT53b3JrZXJfaWQgPCBleHRyYV9wYXJ0cyA/IDEgOiAwKTsKKworCXd0ZC0+c3Rh cnRfcm93ID0gKHd0ZC0+cGFydF9zdGFydCAtIDEpICogd3RkLT5wYXJ0X3NpemU7CisJd3Rk LT5lbmRfcm93ID0gKHd0ZC0+cGFydF9lbmQgPT0gbnVtX3BhcnRzKSA/CisJCXRvdGFsX3Jv d3MgOgorCQl3dGQtPnBhcnRfZW5kICogd3RkLT5wYXJ0X3NpemU7Cit9CisKKworLyogTG9h ZCBkYXRhIGludG8gcGFydGl0aW9uZWQgdGFibGUgKi8KK3N0YXRpYyB2b2lkCitsb2FkUGFy dGl0aW9uZWRUYWJsZShQR2Nvbm4gKmNvbm4sIFdvcmtlclRhc2tEZXNjcmlwdGlvbiAqd3Rk KQoreworCWludAkJCXA7CisKKwlmb3IgKHAgPSB3dGQtPnBhcnRfc3RhcnQ7IHAgPD0gd3Rk LT5wYXJ0X2VuZDsgcCsrKQorCXsKKwkJQ29weVRhcmdldAl0YXJnZXQ7CisJCWludDY0CQlw YXJ0X3N0YXJ0X3JvdyA9IChwIC0gMSkgKiB3dGQtPnBhcnRfc2l6ZTsKKwkJaW50NjQJCXBh cnRfZW5kX3JvdyA9IChwID09IHBhcnRpdGlvbnMpID8gKG5hY2NvdW50cyAqIChpbnQ2NCkg c2NhbGUpIDogKHAgKiB3dGQtPnBhcnRfc2l6ZSk7CisJCWNoYXIJCXBhcnRpdGlvbl90YWJs ZVtOQU1FREFUQUxFTl07CisKKwkJc25wcmludGYocGFydGl0aW9uX3RhYmxlLCBzaXplb2Yo cGFydGl0aW9uX3RhYmxlKSwgInBnYmVuY2hfYWNjb3VudHNfJWQiLCBwKTsKKworCQl0YXJn ZXQudGFibGVfbmFtZSA9IHBhcnRpdGlvbl90YWJsZTsKKwkJdGFyZ2V0LnN0YXJ0X3JvdyA9 IHBhcnRfc3RhcnRfcm93OworCQl0YXJnZXQuZW5kX3JvdyA9IHBhcnRfZW5kX3JvdzsKKwkJ dGFyZ2V0LnVzZV9mcmVlemUgPSB0cnVlOworCisJCXBlcmZvcm1Db3B5KGNvbm4sIHd0ZCwg JnRhcmdldCk7CisJfQorfQorCisvKiBMb2FkIGRhdGEgaW50byBub24tcGFydGl0aW9uZWQg dGFibGUgKi8KK3N0YXRpYyB2b2lkCitsb2FkUmVndWxhclRhYmxlKFBHY29ubiAqY29ubiwg V29ya2VyVGFza0Rlc2NyaXB0aW9uICp3dGQpCit7CisJQ29weVRhcmdldAl0YXJnZXQ7CisK Kwl0YXJnZXQudGFibGVfbmFtZSA9IHd0ZC0+dGFibGU7CisJdGFyZ2V0LnN0YXJ0X3JvdyA9 IHd0ZC0+c3RhcnRfcm93OworCXRhcmdldC5lbmRfcm93ID0gd3RkLT5lbmRfcm93OworCXRh cmdldC51c2VfZnJlZXplID0gKHd0ZC0+d29ya2VyX2lkID09IDApOworCisJcGVyZm9ybUNv cHkoY29ubiwgd3RkLCAmdGFyZ2V0KTsKK30KKworc3RhdGljIFRIUkVBRF9GVU5DX1JFVFVS Tl9UWVBFIFRIUkVBRF9GVU5DX0NDCitpbml0V29ya2VyVGhyZWFkKHZvaWQgKmFyZykKK3sK KwlXb3JrZXJUYXNrRGVzY3JpcHRpb24JCSp3dGQgPSAoV29ya2VyVGFza0Rlc2NyaXB0aW9u ICopIGFyZzsKKwlQR2Nvbm4JCQkqY29ubjsKKworCS8qIENvbm5lY3Rpb24gaXMgcHJlLWNy ZWF0ZWQsIGp1c3QgdXNlIGl0ICovCisJY29ubiA9IHd0ZC0+Y29uOworCisJLyoKKwkgKiBT dGFydCBhIG5ldyB0cmFuc2FjdGlvbiBmb3IgdGhpcyB3b3JrZXIsIGV4Y2VwdCBmb3Igd29y a2VyIDAgb24KKwkgKiBub24tcGFydGl0aW9uZWQgdGFibGVzLiBXb3JrZXIgMCBjb250aW51 ZXMgdGhlIHRyYW5zYWN0aW9uIGZyb20gdGhlCisJICogbWFpbiB0aHJlYWQgdGhhdCBhbHJl YWR5IGRpZCB0aGUgdHJ1bmNhdGUgKHRvIGVuYWJsZSBDT1BZIEZSRUVaRSkuCisJICovCisJ aWYgKHd0ZC0+cGFydF9zdGFydCA+IDAgfHwgd3RkLT53b3JrZXJfaWQgPiAwKQorCQlleGVj dXRlU3RhdGVtZW50KGNvbm4sICJiZWdpbiIpOworCisJaWYgKHd0ZC0+cGFydF9zdGFydCA+ IDApCisJeworCQljcmVhdGVQYXJ0aXRpb25zKGNvbm4sIHd0ZC0+cGFydF9zdGFydCwgd3Rk LT5wYXJ0X2VuZCk7CisJCWxvYWRQYXJ0aXRpb25lZFRhYmxlKGNvbm4sIHd0ZCk7CisJfQor CWVsc2UKKwkJbG9hZFJlZ3VsYXJUYWJsZShjb25uLCB3dGQpOworCisJZXhlY3V0ZVN0YXRl bWVudChjb25uLCAiY29tbWl0Iik7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZv aWQKK2luaXRQb3B1bGF0ZVRhYmxlUGFyYWxsZWwoUEdjb25uICpjb25uZWN0aW9uLCBpbnQg bnVtX3dvcmtlcnMsCisJCQkJCQkgIGNvbnN0IGNoYXIgKnRhYmxlLCBpbnQ2NCB0b3RhbF9y b3dzLAorCQkJCQkJICBpbml0Um93TWV0aG9kIGFwcGVuZF9yb3cpCit7CisJVEhSRUFEX1Qg ICAqd29ya2VyX3RocmVhZHM7CisJV29ya2VyVGFza0Rlc2NyaXB0aW9uICp3b3JrZXJfZGF0 YTsKKwlQR2Nvbm4JICAqKmNvbm5lY3Rpb25zOworCWJvb2wJCWlzX3BhcnRpdGlvbmVkOwor CWludAkJCWk7CisKKwkvKiBBbGxvY2F0ZSB3b3JrZXIgZGF0YSBhbmQgdGhyZWFkcyAqLwor CXdvcmtlcl90aHJlYWRzID0gcGdfbWFsbG9jKG51bV93b3JrZXJzICogc2l6ZW9mKHB0aHJl YWRfdCkpOworCXdvcmtlcl9kYXRhID0gcGdfbWFsbG9jMChudW1fd29ya2VycyAqIHNpemVv ZihXb3JrZXJUYXNrRGVzY3JpcHRpb24pKTsKKwljb25uZWN0aW9ucyA9IHBnX21hbGxvYyhu dW1fd29ya2VycyAqIHNpemVvZihQR2Nvbm4gKikpOworCisJLyogUmV1c2UgbWFpbiBjb25u ZWN0aW9uIGZvciB3b3JrZXIgMCwgY3JlYXRlIG5ldyBvbmVzIGZvciBvdGhlcnMgKi8KKwlj b25uZWN0aW9uc1swXSA9IGNvbm5lY3Rpb247CisJZm9yIChpID0gMTsgaSA8IG51bV93b3Jr ZXJzOyBpKyspCisJCWNvbm5lY3Rpb25zW2ldID0gZG9Db25uZWN0KCk7CisKKwkvKiBXb3Jr cyBvbmx5IGZvciBwZ2JlbmNoX2FjY291bnRzIGFuZCB0aGUgcmFuZ2UgcGFydGl0aW9uaW5n IG9wdGlvbiAqLworCWlzX3BhcnRpdGlvbmVkID0gc3RyY21wKHRhYmxlLCAicGdiZW5jaF9h Y2NvdW50cyIpID09IDAgJiYgcGFydGl0aW9uX21ldGhvZCA9PSBQQVJUX1JBTkdFOworCisJ LyogRm9yIHBhcnRpdGlvbmVkIHRhYmxlcywgd2UgaGFuZGxlIG9ubHkgbnVtX3dvcmtlcnMg PD0gcGFydGl0aW9ucyBmb3Igbm93ICovCisJaWYgKGlzX3BhcnRpdGlvbmVkICYmIG51bV93 b3JrZXJzID4gcGFydGl0aW9ucykKKwkJcGdfZmF0YWwoIm51bWJlciBvZiB0aHJlYWRzICgl ZCkgbXVzdCBub3QgZXhjZWVkIHRoZSBudW1iZXIgb2YgcGFydGl0aW9ucyAoJWQpIiwKKwkJ CQkgbnVtX3dvcmtlcnMsIHBhcnRpdGlvbnMpOworCisJZXhlY3V0ZVN0YXRlbWVudChjb25u ZWN0aW9uc1swXSwgImJlZ2luIik7CisJdHJ1bmNhdGVUYWJsZShjb25uZWN0aW9uc1swXSwg dGFibGUpOworCisJaWYgKGlzX3BhcnRpdGlvbmVkKQorCXsKKwkJZXhlY3V0ZVN0YXRlbWVu dChjb25uZWN0aW9uc1swXSwgImNvbW1pdCIpOworCX0KKworCS8qIENyZWF0ZSBhbmQgc3Rh cnQgd29ya2VyIHRocmVhZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3dvcmtlcnM7IGkr KykKKwl7CisJCXdvcmtlcl9kYXRhW2ldLmNvbiA9IGNvbm5lY3Rpb25zW2ldOworCQl3b3Jr ZXJfZGF0YVtpXS50YWJsZSA9IHRhYmxlOworCQl3b3JrZXJfZGF0YVtpXS5hcHBlbmRfcm93 ID0gYXBwZW5kX3JvdzsKKwkJd29ya2VyX2RhdGFbaV0ud29ya2VyX2lkID0gaTsKKworCQlp ZiAoIWlzX3BhcnRpdGlvbmVkKQorCQkJYXNzaWduV29ya2VyUm93cygmd29ya2VyX2RhdGFb aV0sIG51bV93b3JrZXJzLCB0b3RhbF9yb3dzKTsKKwkJZWxzZQorCQl7CisJCQl3b3JrZXJf ZGF0YVtpXS5wYXJ0X3NpemUgPSAobmFjY291bnRzICogKGludDY0KSBzY2FsZSArIHBhcnRp dGlvbnMgLSAxKSAvIHBhcnRpdGlvbnM7CisJCQlhc3NpZ25Xb3JrZXJQYXJ0aXRpb25zKCZ3 b3JrZXJfZGF0YVtpXSwgbnVtX3dvcmtlcnMsIHRvdGFsX3Jvd3MsCisJCQkJCQkJCSAgIHBh cnRpdGlvbnMpOworCQl9CisKKwkJVEhSRUFEX0NSRUFURSgmd29ya2VyX3RocmVhZHNbaV0s IGluaXRXb3JrZXJUaHJlYWQsICZ3b3JrZXJfZGF0YVtpXSk7CisJfQorCisJZm9yIChpID0g MDsgaSA8IG51bV93b3JrZXJzOyBpKyspCisJCVRIUkVBRF9KT0lOKHdvcmtlcl90aHJlYWRz W2ldKTsKKworCS8qCisJICogRm9yIHBhcnRpdGlvbmVkIHRhYmxlcywgYXR0YWNoIGFsbCBw YXJ0aXRpb25zIG5vdyB0aGF0IGRhdGEgaXMgbG9hZGVkLgorCSAqLworCWlmIChpc19wYXJ0 aXRpb25lZCkKKwkJYXR0YWNoUGFydGl0aW9ucyhjb25uZWN0aW9uKTsKKworCS8qIENsZWFu IHVwIHdvcmtlciBjb25uZWN0aW9ucyAoc2tpcCBpbmRleCAwLCB3aGljaCBpcyB0aGUgbWFp biBjb25uZWN0aW9uKSAqLworCWZvciAoaSA9IDE7IGkgPCBudW1fd29ya2VyczsgaSsrKQor CQlQUWZpbmlzaChjb25uZWN0aW9uc1tpXSk7CisKKwlmcmVlKGNvbm5lY3Rpb25zKTsKKwlm cmVlKHdvcmtlcl90aHJlYWRzKTsKKwlmcmVlKHdvcmtlcl9kYXRhKTsKK30KKwogLyogcXNv cnQgY29tcGFyYXRvciBmb3IgVmFyaWFibGUgYXJyYXkgKi8KIHN0YXRpYyBpbnQKIGNvbXBh cmVWYXJpYWJsZU5hbWVzKGNvbnN0IHZvaWQgKnYxLCBjb25zdCB2b2lkICp2MikKQEAgLTQ4 NjksMTQgKzUxNTYsNTggQEAgaW5pdERyb3BUYWJsZXMoUEdjb25uICpjb24pCiAgKiB3aXRo IGEga25vd24gc2l6ZSwgc28gd2UgY2hvb3NlIHRvIHBhcnRpdGlvbiBpdC4KICAqLwogc3Rh dGljIHZvaWQKLWNyZWF0ZVBhcnRpdGlvbnMoUEdjb25uICpjb24pCitjcmVhdGVQYXJ0aXRp b25zKFBHY29ubiAqY29uLCBpbnQgcGFydF9zdGFydCwgaW50IHBhcnRfZW5kKQogewogCVBR RXhwQnVmZmVyRGF0YSBxdWVyeTsKIAogCS8qIHdlIG11c3QgaGF2ZSB0byBjcmVhdGUgc29t ZSBwYXJ0aXRpb25zICovCiAJQXNzZXJ0KHBhcnRpdGlvbnMgPiAwKTsKIAotCWZwcmludGYo c3RkZXJyLCAiY3JlYXRpbmcgJWQgcGFydGl0aW9ucy4uLlxuIiwgcGFydGl0aW9ucyk7CisJ LyogSWYgY2FsbGVkIHdpdGggLTEsIGNyZWF0ZSBhbGwgcGFydGl0aW9ucyAqLworCWlmIChw YXJ0X3N0YXJ0ID09IC0xKQorCXsKKwkJcGFydF9zdGFydCA9IDE7CisJCXBhcnRfZW5kID0g cGFydGl0aW9uczsKKwkJZnByaW50ZihzdGRlcnIsICJjcmVhdGluZyAlZCBwYXJ0aXRpb25z Li4uXG4iLCBwYXJ0aXRpb25zKTsKKwl9CisKKwlpbml0UFFFeHBCdWZmZXIoJnF1ZXJ5KTsK KworCWZvciAoaW50IHAgPSBwYXJ0X3N0YXJ0OyBwIDw9IHBhcnRfZW5kOyBwKyspCisJewor CQkvKgorCQkgKiBDcmVhdGUgc3RhbmRhbG9uZSB0YWJsZXMgKG5vdCBhdHRhY2hlZCB0byBw YXJlbnQgeWV0KS4KKwkJICogVGhpcyBhdm9pZHMgQWNjZXNzRXhjbHVzaXZlTG9jayBvbiB0 aGUgcGFyZW50IHRhYmxlLCBhbGxvd2luZworCQkgKiBwYXJhbGxlbCBjcmVhdGlvbi4gVGFi bGVzIHdpbGwgYmUgYXR0YWNoZWQgYWZ0ZXIgZGF0YSBsb2FkaW5nLgorCQkgKi8KKwkJcHJp bnRmUFFFeHBCdWZmZXIoJnF1ZXJ5LAorCQkJCQkJICAiY3JlYXRlJXMgdGFibGUgcGdiZW5j aF9hY2NvdW50c18lZFxuIgorCQkJCQkJICAiICAoYWlkIGludCBub3QgbnVsbCxcbiIKKwkJ CQkJCSAgIiAgIGJpZCBpbnQsXG4iCisJCQkJCQkgICIgICBhYmFsYW5jZSBpbnQsXG4iCisJ CQkJCQkgICIgICBmaWxsZXIgY2hhcmFjdGVyKDg0KSlcbiIKKwkJCQkJCSAgIiAgd2l0aCAo ZmlsbGZhY3Rvcj0lZCkiLAorCQkJCQkJICB1bmxvZ2dlZF90YWJsZXMgPyAiIHVubG9nZ2Vk IiA6ICIiLCBwLAorCQkJCQkJICBmaWxsZmFjdG9yKTsKKworCQlleGVjdXRlU3RhdGVtZW50 KGNvbiwgcXVlcnkuZGF0YSk7CisJfQorCisJdGVybVBRRXhwQnVmZmVyKCZxdWVyeSk7Cit9 CisKKy8qCisgKiBBdHRhY2ggc3RhbmRhbG9uZSBwYXJ0aXRpb24gdGFibGVzIHRvIHRoZSBw YXJlbnQgdGFibGUuCisgKiBDYWxsZWQgYWZ0ZXIgYWxsIGRhdGEgaGFzIGJlZW4gbG9hZGVk IGluIHBhcmFsbGVsLgorICovCitzdGF0aWMgdm9pZAorYXR0YWNoUGFydGl0aW9ucyhQR2Nv bm4gKmNvbikKK3sKKwlQUUV4cEJ1ZmZlckRhdGEgcXVlcnk7CisKKwlBc3NlcnQocGFydGl0 aW9ucyA+IDApOworCisJZnByaW50ZihzdGRlcnIsICJhdHRhY2hpbmcgJWQgcGFydGl0aW9u cy4uLlxuIiwgcGFydGl0aW9ucyk7CiAKIAlpbml0UFFFeHBCdWZmZXIoJnF1ZXJ5KTsKIApA QCAtNDg4NCwxMyArNTIxNSwxMiBAQCBjcmVhdGVQYXJ0aXRpb25zKFBHY29ubiAqY29uKQog CXsKIAkJaWYgKHBhcnRpdGlvbl9tZXRob2QgPT0gUEFSVF9SQU5HRSkKIAkJewotCQkJaW50 NjQJCXBhcnRfc2l6ZSA9IChuYWNjb3VudHMgKiAoaW50NjQpIHNjYWxlICsgcGFydGl0aW9u cyAtIDEpIC8gcGFydGl0aW9uczsKKwkJCWludDY0IHBhcnRfc2l6ZSA9IChuYWNjb3VudHMg KiAoaW50NjQpIHNjYWxlICsgcGFydGl0aW9ucyAtIDEpIC8gcGFydGl0aW9uczsKIAogCQkJ cHJpbnRmUFFFeHBCdWZmZXIoJnF1ZXJ5LAotCQkJCQkJCSAgImNyZWF0ZSVzIHRhYmxlIHBn YmVuY2hfYWNjb3VudHNfJWRcbiIKLQkJCQkJCQkgICIgIHBhcnRpdGlvbiBvZiBwZ2JlbmNo X2FjY291bnRzXG4iCi0JCQkJCQkJICAiICBmb3IgdmFsdWVzIGZyb20gKCIsCi0JCQkJCQkJ ICB1bmxvZ2dlZF90YWJsZXMgPyAiIHVubG9nZ2VkIiA6ICIiLCBwKTsKKwkJCQkJCQkgICJh bHRlciB0YWJsZSBwZ2JlbmNoX2FjY291bnRzXG4iCisJCQkJCQkJICAiICBhdHRhY2ggcGFy dGl0aW9uIHBnYmVuY2hfYWNjb3VudHNfJWRcbiIKKwkJCQkJCQkgICIgIGZvciB2YWx1ZXMg ZnJvbSAoIiwgcCk7CiAKIAkJCS8qCiAJCQkgKiBGb3IgUkFOR0UsIHdlIHVzZSBvcGVuLWVu ZGVkIHBhcnRpdGlvbnMgYXQgdGhlIGJlZ2lubmluZyBhbmQKQEAgLTQ5MTMsMjEgKzUyNDMs MTYgQEAgY3JlYXRlUGFydGl0aW9ucyhQR2Nvbm4gKmNvbikKIAkJCWFwcGVuZFBRRXhwQnVm ZmVyQ2hhcigmcXVlcnksICcpJyk7CiAJCX0KIAkJZWxzZSBpZiAocGFydGl0aW9uX21ldGhv ZCA9PSBQQVJUX0hBU0gpCisJCXsKIAkJCXByaW50ZlBRRXhwQnVmZmVyKCZxdWVyeSwKLQkJ CQkJCQkgICJjcmVhdGUlcyB0YWJsZSBwZ2JlbmNoX2FjY291bnRzXyVkXG4iCi0JCQkJCQkJ ICAiICBwYXJ0aXRpb24gb2YgcGdiZW5jaF9hY2NvdW50c1xuIgorCQkJCQkJCSAgImFsdGVy IHRhYmxlIHBnYmVuY2hfYWNjb3VudHNcbiIKKwkJCQkJCQkgICIgIGF0dGFjaCBwYXJ0aXRp b24gcGdiZW5jaF9hY2NvdW50c18lZFxuIgogCQkJCQkJCSAgIiAgZm9yIHZhbHVlcyB3aXRo IChtb2R1bHVzICVkLCByZW1haW5kZXIgJWQpIiwKLQkJCQkJCQkgIHVubG9nZ2VkX3RhYmxl cyA/ICIgdW5sb2dnZWQiIDogIiIsIHAsCi0JCQkJCQkJICBwYXJ0aXRpb25zLCBwIC0gMSk7 CisJCQkJCQkJICBwLCBwYXJ0aXRpb25zLCBwIC0gMSk7CisJCX0KIAkJZWxzZQkJCQkJLyog Y2Fubm90IGdldCB0aGVyZSAqLwogCQkJQXNzZXJ0KDApOwogCi0JCS8qCi0JCSAqIFBlciBk ZGxpbmZvIGluIGluaXRDcmVhdGVUYWJsZXMsIGZpbGxmYWN0b3IgaXMgbmVlZGVkIG9uIHRh YmxlCi0JCSAqIHBnYmVuY2hfYWNjb3VudHMuCi0JCSAqLwotCQlhcHBlbmRQUUV4cEJ1ZmZl cigmcXVlcnksICIgd2l0aCAoZmlsbGZhY3Rvcj0lZCkiLCBmaWxsZmFjdG9yKTsKLQogCQll eGVjdXRlU3RhdGVtZW50KGNvbiwgcXVlcnkuZGF0YSk7CiAJfQogCkBAIC01MDI1LDggKzUz NTAsOCBAQCBpbml0Q3JlYXRlVGFibGVzKFBHY29ubiAqY29uKQogCiAJdGVybVBRRXhwQnVm ZmVyKCZxdWVyeSk7CiAKLQlpZiAocGFydGl0aW9uX21ldGhvZCAhPSBQQVJUX05PTkUpCi0J CWNyZWF0ZVBhcnRpdGlvbnMoY29uKTsKKwlpZiAocGFydGl0aW9uX21ldGhvZCAhPSBQQVJU X05PTkUgJiYgKG50aHJlYWRzID09IDEgfHwgcGFydGl0aW9uX21ldGhvZCA9PSBQQVJUX0hB U0gpKQorCQljcmVhdGVQYXJ0aXRpb25zKGNvbiwgLTEsIC0xKTsKIH0KIAogLyoKQEAgLTUw MzUsMTEgKzUzNjAsNyBAQCBpbml0Q3JlYXRlVGFibGVzKFBHY29ubiAqY29uKQogc3RhdGlj IHZvaWQKIGluaXRUcnVuY2F0ZVRhYmxlcyhQR2Nvbm4gKmNvbikKIHsKLQlleGVjdXRlU3Rh dGVtZW50KGNvbiwgInRydW5jYXRlIHRhYmxlICIKLQkJCQkJICJwZ2JlbmNoX2FjY291bnRz LCAiCi0JCQkJCSAicGdiZW5jaF9icmFuY2hlcywgIgotCQkJCQkgInBnYmVuY2hfaGlzdG9y eSwgIgotCQkJCQkgInBnYmVuY2hfdGVsbGVycyIpOworCXRydW5jYXRlVGFibGUoY29uLCAi cGdiZW5jaF9hY2NvdW50cywgcGdiZW5jaF9icmFuY2hlcywgcGdiZW5jaF9oaXN0b3J5LCBw Z2JlbmNoX3RlbGxlcnMiKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTUwNjksOCArNTM5MCw0 MCBAQCBpbml0QWNjb3VudChQUUV4cEJ1ZmZlckRhdGEgKnNxbCwgaW50NjQgY3VycikKIAkJ CQkJICBjdXJyICsgMSwgY3VyciAvIG5hY2NvdW50cyArIDEpOwogfQogCisvKgorICogQXBw ZW5kLWJhc2VkIHZlcnNpb25zIHRvIGVuYWJsZSBiYXRjaGluZy4KKyAqIFRoZXNlIHVzZSBh cHBlbmRQUUV4cEJ1ZmZlciBpbnN0ZWFkIG9mIHByaW50ZlBRRXhwQnVmZmVyIHRvIGFsbG93 CisgKiBtdWx0aXBsZSByb3dzIHRvIGJlIGFjY3VtdWxhdGVkIGluIGEgc2luZ2xlIGJ1ZmZl ci4KKyAqLworc3RhdGljIHZvaWQKK2FwcGVuZEJyYW5jaChQUUV4cEJ1ZmZlckRhdGEgKnNx bCwgaW50NjQgY3VycikKK3sKKwkvKiAiZmlsbGVyIiBjb2x1bW4gdXNlcyBOVUxMICovCisJ YXBwZW5kUFFFeHBCdWZmZXIoc3FsLAorCQkJCQkgIElOVDY0X0ZPUk1BVCAiXHQwXHRcXE5c biIsCisJCQkJCSAgY3VyciArIDEpOworfQorCitzdGF0aWMgdm9pZAorYXBwZW5kVGVsbGVy KFBRRXhwQnVmZmVyRGF0YSAqc3FsLCBpbnQ2NCBjdXJyKQoreworCS8qICJmaWxsZXIiIGNv bHVtbiB1c2VzIE5VTEwgKi8KKwlhcHBlbmRQUUV4cEJ1ZmZlcihzcWwsCisJCQkJCSAgSU5U NjRfRk9STUFUICJcdCIgSU5UNjRfRk9STUFUICJcdDBcdFxcTlxuIiwKKwkJCQkJICBjdXJy ICsgMSwgY3VyciAvIG50ZWxsZXJzICsgMSk7Cit9CisKIHN0YXRpYyB2b2lkCi1pbml0UG9w dWxhdGVUYWJsZShQR2Nvbm4gKmNvbiwgY29uc3QgY2hhciAqdGFibGUsIGludDY0IGJhc2Us CithcHBlbmRBY2NvdW50KFBRRXhwQnVmZmVyRGF0YSAqc3FsLCBpbnQ2NCBjdXJyKQorewor CS8qICJmaWxsZXIiIGNvbHVtbiBkZWZhdWx0cyB0byBibGFuayBwYWRkZWQgZW1wdHkgc3Ry aW5nICovCisJYXBwZW5kUFFFeHBCdWZmZXIoc3FsLAorCQkJCQkgIElOVDY0X0ZPUk1BVCAi XHQiIElOVDY0X0ZPUk1BVCAiXHQwXHRcbiIsCisJCQkJCSAgY3VyciArIDEsIGN1cnIgLyBu YWNjb3VudHMgKyAxKTsKK30KKworc3RhdGljIHZvaWQKK2luaXRQb3B1bGF0ZVRhYmxlU2Vy aWFsKFBHY29ubiAqY29uLCBjb25zdCBjaGFyICp0YWJsZSwgaW50NjQgYmFzZSwKIAkJCQkg IGluaXRSb3dNZXRob2QgaW5pdF9yb3cpCiB7CiAJaW50CQkJbjsKQEAgLTUwNzksNyArNTQz Miw3IEBAIGluaXRQb3B1bGF0ZVRhYmxlKFBHY29ubiAqY29uLCBjb25zdCBjaGFyICp0YWJs ZSwgaW50NjQgYmFzZSwKIAlpbnQJCQlwcmV2X2NoYXJzID0gMDsKIAlQR3Jlc3VsdCAgICpy ZXM7CiAJUFFFeHBCdWZmZXJEYXRhIHNxbDsKLQljaGFyCQljb3B5X3N0YXRlbWVudFsyNTZd OworCWNoYXIJCWNvcHlfc3RhdGVtZW50W05BTUVEQVRBTEVOICsgMzJdOwogCWNvbnN0IGNo YXIgKmNvcHlfc3RhdGVtZW50X2ZtdCA9ICJjb3B5ICVzIGZyb20gc3RkaW4iOwogCWludDY0 CQl0b3RhbCA9IGJhc2UgKiBzY2FsZTsKIApAQCAtNTE4OCw2ICs1NTQxLDI3IEBAIGluaXRQ b3B1bGF0ZVRhYmxlKFBHY29ubiAqY29uLCBjb25zdCBjaGFyICp0YWJsZSwgaW50NjQgYmFz ZSwKIAl0ZXJtUFFFeHBCdWZmZXIoJnNxbCk7CiB9CiAKK3N0YXRpYyB2b2lkCitpbml0UG9w dWxhdGVUYWJsZShQR2Nvbm4gKmNvbiwgY29uc3QgY2hhciAqdGFibGUsIGludDY0IHRvdGFs X3Jvd3MsCisJCQkJICBpbml0Um93TWV0aG9kIGluaXRfcm93LCBpbml0Um93TWV0aG9kIGFw cGVuZF9yb3csIGJvb2wgdXNlX3BhcmFsbGVsKQoreworCWJvb2wJCWlzX2FjY291bnRzID0g KHN0cmNtcCh0YWJsZSwgInBnYmVuY2hfYWNjb3VudHMiKSA9PSAwKTsKKworCWlmICh1c2Vf cGFyYWxsZWwgJiYgbnRocmVhZHMgPiAxKQorCQlpbml0UG9wdWxhdGVUYWJsZVBhcmFsbGVs KGNvbiwgbnRocmVhZHMsIHRhYmxlLCB0b3RhbF9yb3dzICogc2NhbGUsIGFwcGVuZF9yb3cp OworCWVsc2UKKwl7CisJCS8qCisJCSAqIEZvciBzaW5nbGUtdGhyZWFkZWQgbW9kZSB3aXRo IHBhcnRpdGlvbmVkIHRhYmxlcywgYXR0YWNoIHBhcnRpdGlvbnMKKwkJICogYmVmb3JlIGxv YWRpbmcgZGF0YSBzbyBDT1BZIHRvIHRoZSBwYXJlbnQgdGFibGUgY2FuIHJvdXRlIHJvd3Mu CisJCSAqLworCQlpZiAoaXNfYWNjb3VudHMgJiYgcGFydGl0aW9ucyA+IDAgJiYgcGFydGl0 aW9uX21ldGhvZCAhPSBQQVJUX05PTkUpCisJCQlhdHRhY2hQYXJ0aXRpb25zKGNvbik7CisK KwkJaW5pdFBvcHVsYXRlVGFibGVTZXJpYWwoY29uLCB0YWJsZSwgdG90YWxfcm93cywgaW5p dF9yb3cpOworCX0KK30KKwogLyoKICAqIEZpbGwgdGhlIHN0YW5kYXJkIHRhYmxlcyB3aXRo IHNvbWUgZGF0YSBnZW5lcmF0ZWQgYW5kIHNlbnQgZnJvbSB0aGUgY2xpZW50LgogICoKQEAg LTUyMDAsOCArNTU3NCw5IEBAIGluaXRHZW5lcmF0ZURhdGFDbGllbnRTaWRlKFBHY29ubiAq Y29uKQogCWZwcmludGYoc3RkZXJyLCAiZ2VuZXJhdGluZyBkYXRhIChjbGllbnQtc2lkZSku Li5cbiIpOwogCiAJLyoKLQkgKiB3ZSBkbyBhbGwgb2YgdGhpcyBpbiBvbmUgdHJhbnNhY3Rp b24gdG8gZW5hYmxlIHRoZSBiYWNrZW5kJ3MKLQkgKiBkYXRhLWxvYWRpbmcgb3B0aW1pemF0 aW9ucworCSAqIEZvciBzaW5nbGUtdGhyZWFkZWQgbW9kZSwgZG8gZXZlcnl0aGluZyBpbiBv bmUgdHJhbnNhY3Rpb24uCisJICogRm9yIG11bHRpLXRocmVhZGVkIG1vZGUsIGRvIGJyYW5j aGVzL3RlbGxlcnMvaGlzdG9yeSBpbiBvbmUgdHJhbnNhY3Rpb24sCisJICogdGhlbiBhY2Nv dW50cyBpbiBwYXJhbGxlbCAoZWFjaCB0aHJlYWQgaGFuZGxlcyBpdHMgb3duIHRyYW5zYWN0 aW9uKS4KIAkgKi8KIAlleGVjdXRlU3RhdGVtZW50KGNvbiwgImJlZ2luIik7CiAKQEAgLTUy MTIsMTEgKzU1ODcsMTYgQEAgaW5pdEdlbmVyYXRlRGF0YUNsaWVudFNpZGUoUEdjb25uICpj b24pCiAJICogZmlsbCBicmFuY2hlcywgdGVsbGVycywgYWNjb3VudHMgaW4gdGhhdCBvcmRl ciBpbiBjYXNlIGZvcmVpZ24ga2V5cwogCSAqIGFscmVhZHkgZXhpc3QKIAkgKi8KLQlpbml0 UG9wdWxhdGVUYWJsZShjb24sICJwZ2JlbmNoX2JyYW5jaGVzIiwgbmJyYW5jaGVzLCBpbml0 QnJhbmNoKTsKLQlpbml0UG9wdWxhdGVUYWJsZShjb24sICJwZ2JlbmNoX3RlbGxlcnMiLCBu dGVsbGVycywgaW5pdFRlbGxlcik7Ci0JaW5pdFBvcHVsYXRlVGFibGUoY29uLCAicGdiZW5j aF9hY2NvdW50cyIsIG5hY2NvdW50cywgaW5pdEFjY291bnQpOworCWluaXRQb3B1bGF0ZVRh YmxlKGNvbiwgInBnYmVuY2hfYnJhbmNoZXMiLCBuYnJhbmNoZXMsIGluaXRCcmFuY2gsIGFw cGVuZEJyYW5jaCwgZmFsc2UpOworCWluaXRQb3B1bGF0ZVRhYmxlKGNvbiwgInBnYmVuY2hf dGVsbGVycyIsIG50ZWxsZXJzLCBpbml0VGVsbGVyLCBhcHBlbmRUZWxsZXIsIGZhbHNlKTsK IAotCWV4ZWN1dGVTdGF0ZW1lbnQoY29uLCAiY29tbWl0Iik7CisJaWYgKG50aHJlYWRzID4g MSkKKwkJZXhlY3V0ZVN0YXRlbWVudChjb24sICJjb21taXQiKTsKKworCWluaXRQb3B1bGF0 ZVRhYmxlKGNvbiwgInBnYmVuY2hfYWNjb3VudHMiLCBuYWNjb3VudHMsIGluaXRBY2NvdW50 LCBhcHBlbmRBY2NvdW50LCBudGhyZWFkcyA+IDEpOworCisJaWYgKG50aHJlYWRzID09IDEp CisJCWV4ZWN1dGVTdGF0ZW1lbnQoY29uLCAiY29tbWl0Iik7CiB9CiAKIC8qCkBAIC01MjQy LDYgKzU2MjIsOSBAQCBpbml0R2VuZXJhdGVEYXRhU2VydmVyU2lkZShQR2Nvbm4gKmNvbikK IAkvKiB0cnVuY2F0ZSBhd2F5IGFueSBvbGQgZGF0YSAqLwogCWluaXRUcnVuY2F0ZVRhYmxl cyhjb24pOwogCisJaWYgKHBhcnRpdGlvbnMgPiAwICYmIHBhcnRpdGlvbl9tZXRob2QgIT0g UEFSVF9OT05FKQorCQlhdHRhY2hQYXJ0aXRpb25zKGNvbik7CisKIAlpbml0UFFFeHBCdWZm ZXIoJnNxbCk7CiAKIAlwcmludGZQUUV4cEJ1ZmZlcigmc3FsLApAQCAtNjk4OSw3ICs3Mzcy LDYgQEAgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQkJaW5pdGlhbGl6YXRpb25f b3B0aW9uX3NldCA9IHRydWU7CiAJCQkJYnJlYWs7CiAJCQljYXNlICdqJzoJCQkvKiBqb2Jz ICovCi0JCQkJYmVuY2htYXJraW5nX29wdGlvbl9zZXQgPSB0cnVlOwogCQkJCWlmICghb3B0 aW9uX3BhcnNlX2ludChvcHRhcmcsICItai8tLWpvYnMiLCAxLCBJTlRfTUFYLAogCQkJCQkJ CQkJICAmbnRocmVhZHMpKQogCQkJCXsKQEAgLTcyMjEsNyArNzYwMyw3IEBAIG1haW4oaW50 IGFyZ2MsIGNoYXIgKiphcmd2KQogCSAqIG9wdGltaXphdGlvbjsgdGhyb3R0bGVfZGVsYXkg aXMgY2FsY3VsYXRlZCBpbmNvcnJlY3RseSBiZWxvdyBpZiBzb21lCiAJICogdGhyZWFkcyBo YXZlIG5vIGNsaWVudHMgYXNzaWduZWQgdG8gdGhlbS4pCiAJICovCi0JaWYgKG50aHJlYWRz ID4gbmNsaWVudHMpCisJaWYgKG50aHJlYWRzID4gbmNsaWVudHMgJiYgIWlzX2luaXRfbW9k ZSkKIAkJbnRocmVhZHMgPSBuY2xpZW50czsKIAogCS8qCkBAIC03MjY2LDYgKzc2NDgsOSBA QCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJaWYgKHBhcnRpdGlvbnMgPiAwICYm IHBhcnRpdGlvbl9tZXRob2QgPT0gUEFSVF9OT05FKQogCQkJcGFydGl0aW9uX21ldGhvZCA9 IFBBUlRfUkFOR0U7CiAKKwkJaWYgKHBhcnRpdGlvbl9tZXRob2QgPT0gUEFSVF9IQVNIICYm IG50aHJlYWRzID4gMSkKKwkJCXBnX2ZhdGFsKCJwYXJhbGxlbCBkYXRhIGxvYWRpbmcgKC1q KSBpcyBub3Qgc3VwcG9ydGVkIHdpdGggaGFzaCBwYXJ0aXRpb25pbmciKTsKKwogCQlpZiAo aW5pdGlhbGl6ZV9zdGVwcyA9PSBOVUxMKQogCQkJaW5pdGlhbGl6ZV9zdGVwcyA9IHBnX3N0 cmR1cChERUZBVUxUX0lOSVRfU1RFUFMpOwogCi0tIAoyLjM5LjUgKEFwcGxlIEdpdC0xNTQp Cgo= --------------VpV4FsKLxrL060DmFSLHrYfR--