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 1wAI10-002EvT-0D for pgsql-hackers@arkaria.postgresql.org; Wed, 08 Apr 2026 01:47:34 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wAHzz-003p8N-20 for pgsql-hackers@arkaria.postgresql.org; Wed, 08 Apr 2026 01:46:32 +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 1wAHzy-003p1R-3D for pgsql-hackers@lists.postgresql.org; Wed, 08 Apr 2026 01:46:31 +0000 Received: from mail-vs1-xe31.google.com ([2607:f8b0:4864:20::e31]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wAHzw-000000018Zk-0vX5 for pgsql-hackers@lists.postgresql.org; Wed, 08 Apr 2026 01:46:30 +0000 Received: by mail-vs1-xe31.google.com with SMTP id ada2fe7eead31-605590b7687so1714427137.0 for ; Tue, 07 Apr 2026 18:46:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1775612787; cv=none; d=google.com; s=arc-20240605; b=klB5Oo/t5qXIXU8Q6RJ7VbmmWio0VCBF9G3MM3qKZH3uP5gzGEtiCXDnnENxaO9Bq0 x4n/7RWNQ391fjneBVr+IL2PPD2l3D+SV8UdwSSallx2zqPoYMO2eSjkrsfX7nr4bQkc /W4nqlEe87DpQvnBTenQuiCrNg4cENt9wtJih9XYsGNg7G86x4hMjBmd/V6DhVLbEtsX qlTK/TvSUzGm3puwR1j0bThEQujdN8ek/ib98he3LgoH+seEdf4XxM3IRM7fifkCwqbH N7pKKs1sqovy+WpT+6hBTq/9S5Qbejqi7nUC/V4pfuobBFK/jnb7nL0DhSh8jkuRGy8f fynA== 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=p4o91rNDCqyqpw9ASmuj8sSmVGd+3LUBAe0WH8Q8ekg=; fh=tvS4T4+oR2J2hxK5aNJGfORVVBBvqUJPnvm76ijROZw=; b=W6Fy5B+Ysh37kG8rfeNoyTlwfU2c2BIBIqNP65CVo9GC7ssV1g8S7PMJxCfvb8bAy/ gvHkklvOqrUW8NnY6GWtLLXa24OrKvtSnF91sfko9ng+jlIoHA/Zn+2i8kje+FiSj6qD VLVxOQczh71rSWTeMQXTDMNalBwfCM1OMyHSskxqOtIWKwzgtm66174/wPhea1sEIMdf z/Cc6WzPGVS0Xp9ltYRdjspHiX0GMy1/4pU+htHaoJTt8xBbEel1OLZ0CJ/LkcKtxs/x c5T3iMz0i74wHzqLVRbbyLSo+7CquzZNk1gmARdrAmQRa6n2ZebMCCvE9u2CwOPuPAPZ nobw==; 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=1775612787; x=1776217587; 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=p4o91rNDCqyqpw9ASmuj8sSmVGd+3LUBAe0WH8Q8ekg=; b=TfcfQDXzr3KrsDLIxjZDx8xKpnQnTYwuqOaeo3GI4GQa90cpdAisVpQSLN98x2wsF8 oR2xu8i8mxg3wGKSI5rv31ERNJf3bwS6VZTQZ1vosEAg+ISuJr9YE7y8FI3q9eqbSxFX 6LsVFG5rK2DcocemOBS9TexYFvg7+D2Ggbg4aHitSWQzNSDvCePPx1S14pjoR9pLTUD6 oyQk0LJgdn1tUAXyysPBIkJ0D41/Ilg+Z1s0Ah267kwdzHQpzFpZ18owyFmbc5HknCSA tEQx6BlH7nnCF34V8RpP9EpCC2RyjTH8iE3s4w9Hx7CIXmxhIBuzmWSFLHDaKXqZmK62 sTGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775612787; x=1776217587; 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=p4o91rNDCqyqpw9ASmuj8sSmVGd+3LUBAe0WH8Q8ekg=; b=m+MHCCUGl/zpI3E1JFLOP9LbXUHnvZOcab0Fpk5GnUFmOicMAMFcM2EIgPhMzNjNlH 8Zm6Etu4U100MtVrzZ0eBhhgdqE+EtPm0/HhpK61qetB60sIzChVhRpI/mWZY0g5nJMR t5el7afs4013thJwQ5Ha/d98NDsnf/DNtLjXP7hDSIM39edEp7gQ6EkJFVKiMCEWXVrq jQCh2Dn9695neo3FRRtRXir22ZZWjRiIw4kRMHZBw3W40eSndIhRnQhDOOk2HEwIqtwQ 88O3pSdEXcOVph2cPZiAj8PZs/KKdG8IqtwRNKzi1bfhq+FYMlQ3TH2qxjlIsWQnT156 vIAA== X-Gm-Message-State: AOJu0YzKoFNyz+SlhXoGA7nHUcRQkMQMrAWty2fCmc0fD7Y2KzgrrijQ 8Dy7pu1/Fnn6aiSvWoKSzwKJ4ER/0Sly8AgNI7loe0C8b/gI/O/Aon4mCcIQaqMwkxG8ktB4Ndl 5wVr8eiIA3HQ5XXgLiTSXk9JJYa8zDhs= X-Gm-Gg: AeBDiesYlOnreelCGuU4Gae/QuY6eNm+kcSRGUl6V9oWouBxXs+PCW7vc/vtJEjM6nG iCZlyVwByL7iBYSVVqcps1acl5IdfM/QHXEW3Y9wMKzDerzIGHYvX2clJhm7/7dXnzeErFFaKJS 8X4Vw8T9+ZTY9fSrloT6OV4wG5hpZPWGCyLJNWtrxgXHTgQpi6NmZGpAUo2ZwH8PS4S4/YxGTNP WPMGzCqozads69OpSlSJ3I3qLfX+MnmJCjtaXbptrMp60wQz0VMMeEQgGoP4zw62r4QBCzvTL7m 7znCmF2myFwulhIEzxaZNE7nrDwRbOpXNhQXgKiAcw4VU/lujXvCKY3bZpu4BqMo28YP8cs1K/J zH9vmxoo83J9n98B38OBgJvoQ7IWphBHqSVvCrvAfENZZE+hSpC83R3TmZk5cVQd6TML5UxhLmE YIkAhPiz5bACy9qRhdNws8XA== X-Received: by 2002:a05:6102:5486:b0:605:4cbd:91ad with SMTP id ada2fe7eead31-605a4dceba8mr6497531137.6.1775612787495; Tue, 07 Apr 2026 18:46:27 -0700 (PDT) MIME-Version: 1.0 References: <202604070954.qesyoeqbnvm6@alvherre.pgsql> In-Reply-To: <202604070954.qesyoeqbnvm6@alvherre.pgsql> From: jian he Date: Wed, 8 Apr 2026 09:45:50 +0800 X-Gm-Features: AQROBzCBjpk9mXyHiRyHqWrDn_87fnDDgX6Ze7WEYg4ng3adXGuJpIbyuqir2gc Message-ID: Subject: Re: using index to speedup add not null constraints to a table To: =?UTF-8?Q?=C3=81lvaro_Herrera?= Cc: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000753453064ee91110" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000753453064ee91110 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, Apr 7, 2026 at 6:02=E2=80=AFPM =C3=81lvaro Herrera wrote: > > Hello, > > I think you may have not looked at my review at > https://postgr.es/m/202601131715.cheonohttbyj@alvherre.pgsql > because as far as I can tell, this new version has essentially the same > structure as before that review. > Hi. I guess the point I haven't addressed yet is: > However, if we do this, then I think computing notnull_attrs is > pointless. So we should only change the order: do this new check first, > and if we find that any new not-null column is on a generated column, > then we compute both notnull_virtual_attrs and notnull_attrs. No? > The attached patch implements this reordering, first do index_check_notnull then compute both notnull_virtual_attrs and notnull_attrs. -- jian https://www.enterprisedb.com/ --000000000000753453064ee91110 Content-Type: text/x-patch; charset="US-ASCII"; name="v14-0001-using-indexscan-to-speedup-add-not-null-constraints.patch" Content-Disposition: attachment; filename="v14-0001-using-indexscan-to-speedup-add-not-null-constraints.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnpdymw10 RnJvbSBiMWRhYjc5YmIwYzgxZTY2ODgxMWJkMTI0MzYwZDYwMmI1YzQ2NzRkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBqaWFuIGhlIDxqaWFuLnVuaXZlcnNhbGl0eUBnbWFpbC5jb20+ CkRhdGU6IFdlZCwgOCBBcHIgMjAyNiAwOTozMzo1NiArMDgwMApTdWJqZWN0OiBbUEFUQ0ggdjE0 IDEvMV0gdXNpbmcgaW5kZXhzY2FuIHRvIHNwZWVkdXAgYWRkIG5vdCBudWxsIGNvbnN0cmFpbnRz CgpUaGlzIHBhdGNoIHRyaWVzIHRvIHVzZSBpbmRleF9iZWdpbnNjYW4oKSAvIGluZGV4X2dldG5l eHQoKSAvIGluZGV4X2VuZHNjYW4oKQptZW50aW9uZWQgaW4gWzFdIHRvIHNwZWVkdXAgYWRkaW5n IG5vdC1udWxsIGNvbnN0cmFpbnRzIHRvIHRoZSBleGlzdGluZyB0YWJsZS4KClRoZSBtYWluIGxv Z2ljIGhhcHBlbnMgaW4gcGhhc2UzIEFUUmV3cml0ZVRhYmxlCjEuIGNvbGxlY3QgYWxsIG5vdC1u dWxsIGNvbnN0cmFpbnRzLgoyLiBGb3IgZWFjaCBub3QtbnVsbCBjb25zdHJhaW50LCBjaGVjayB3 aGV0aGVyIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyBpbmRleAphdmFpbGFibGUgZm9yIHZhbGlk YXRpb24uIElmIG5vdCwgdGhlbiBjYW5ub3QgdXNlIGluZGV4c2NhbiBtZWNoYW5pc20gdG8gdmVy aWZ5IG5vdC1udWxsCmNvbnN0cmFpbnRzLgozLiBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25k aXRpb25zIGFyZSB0cnVlCiAgKiB0YWJsZSBzY2FuIG9yIHJld3JpdGUgaXMgcmVxdWlyZWQsCiAg KiB0YWJsZSB3YXNuJ3QgbG9ja2VkIHdpdGggYEFjY2Vzc0V4Y2x1c2l2ZUxvY2tgCiAgKiB0aGUg Tk9UIE5VTEwgY29uc3RyYWludCBhcHBsaWVzIHRvIGEgdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1u CiB0aGVuIGluZGV4IHNjYW4gY2Fubm90IGJlIHVzZWQgZm9yIGZhc3QgdmFsaWRhdGlvbi4KSWYg YWxsIGNvbmRpdGlvbnMgYXJlIHNhdGlzZmllZCwgYXR0ZW1wdCB0byB1c2UgaW5kZXhzY2FuIHRv IHZlcmlmeSB3aGV0aGVyIHRoZQpjb2x1bW4gY29udGFpbnMgYW55IE5VTEwgdmFsdWVzLgoKY29u Y3VycmVuY3kgY29uY2VybjoKQUxURVIgVEFCTEUgU0VUIE5PVCBOVUxMIHdpbGwgdGFrZSBhbiBB Q0NFU1MgRVhDTFVTSVZFIGxvY2ssIHNvIHRoZXJlIGlzIGxlc3MKdmFyaWFudCBvZiByYWNpbmcg aXNzdWUgY2FuIG9jY3VyLiBzZWVbMl0KCnJlZmVyZW5jZXM6ClsxXSBodHRwczovL3Bvc3Rnci5l cy9tL0NBJTJCVGdtb2E1Tkt6OGlHV185djd3eiUzRC0lMkJ6UUZ1JTNERTRTWm9hVGFVMXpuTGFF WFJZcC1RJTQwbWFpbC5nbWFpbC5jb20KWzJdIGh0dHBzOi8vcG9zdGdyLmVzL20vOTAwMDU2RDEt MzJERi00OTI3LTgyNTEtM0UwQzBEQzQwN0ZEJTQwYW5hcmF6ZWwuZGUKCmRpc2N1c3Npb246IGh0 dHBzOi8vcG9zdGdyLmVzL20vQ0FDSnVmeEZpVz00azFpcz1GMUo9ci1DeDFSdUJ5WFFQVXJXQjMz MVU0N3JTbkd6K2h3QG1haWwuZ21haWwuY29tCmNvbW1pdGZlc3QgZW50cnk6IGh0dHBzOi8vY29t bWl0ZmVzdC5wb3N0Z3Jlc3FsLm9yZy9wYXRjaC81NDQ0Ci0tLQogc3JjL2JhY2tlbmQvY29tbWFu ZHMvdGFibGVjbWRzLmMgICAgICAgICAgICAgIHwgMjk1ICsrKysrKysrKysrKysrKysrLQogc3Jj L3Rlc3QvbW9kdWxlcy90ZXN0X21pc2MvbWVzb24uYnVpbGQgICAgICAgIHwgICAxICsKIC4uLi90 LzAxMl9pbmRleHNjYW5fdmFsaWRhdGVfbm90bnVsbC5wbCAgICAgICB8IDExOCArKysrKysrCiAz IGZpbGVzIGNoYW5nZWQsIDQwOSBpbnNlcnRpb25zKCspLCA1IGRlbGV0aW9ucygtKQogY3JlYXRl IG1vZGUgMTAwNjQ0IHNyYy90ZXN0L21vZHVsZXMvdGVzdF9taXNjL3QvMDEyX2luZGV4c2Nhbl92 YWxpZGF0ZV9ub3RudWxsLnBsCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFi bGVjbWRzLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNtZHMuYwppbmRleCBlZWMwOWJh MWRlZC4uMTc4YWM1ZjJhOWIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3RhYmxl Y21kcy5jCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3RhYmxlY21kcy5jCkBAIC0yMTEsMTYg KzIxMSwxOSBAQCB0eXBlZGVmIHN0cnVjdCBBbHRlcmVkVGFibGVJbmZvCiAJTGlzdAkgICAqY2hh bmdlZFN0YXRpc3RpY3NEZWZzOwkvKiBzdHJpbmcgZGVmaW5pdGlvbnMgb2Ygc2FtZSAqLwogfSBB bHRlcmVkVGFibGVJbmZvOwogCi0vKiBTdHJ1Y3QgZGVzY3JpYmluZyBvbmUgbmV3IGNvbnN0cmFp bnQgdG8gY2hlY2sgaW4gUGhhc2UgMyBzY2FuICovCi0vKiBOb3RlOiBuZXcgbm90LW51bGwgY29u c3RyYWludHMgYXJlIGhhbmRsZWQgZWxzZXdoZXJlICovCisvKgorICogU3RydWN0IGRlc2NyaWJp bmcgb25lIG5ldyBjb25zdHJhaW50IHRvIGNoZWNrIGluIFBoYXNlIDMgc2Nhbi4gTm90ZTogbmV3 CisgKiBub3QtbnVsbCBjb25zdHJhaW50cyBhcmUgaGFuZGxlZCBoZXJlIHRvby4KKyovCiB0eXBl ZGVmIHN0cnVjdCBOZXdDb25zdHJhaW50CiB7CiAJY2hhcgkgICAqbmFtZTsJCQkvKiBDb25zdHJh aW50IG5hbWUsIG9yIE5VTEwgaWYgbm9uZSAqLwotCUNvbnN0clR5cGUJY29udHlwZTsJCS8qIENI RUNLIG9yIEZPUkVJR04gKi8KKwlDb25zdHJUeXBlCWNvbnR5cGU7CQkvKiBDSEVDSyBvciBGT1JF SUdOIG9yIE5PVCBOVUxMICovCiAJT2lkCQkJcmVmcmVsaWQ7CQkvKiBQSyByZWwsIGlmIEZPUkVJ R04gKi8KIAlPaWQJCQlyZWZpbmRpZDsJCS8qIE9JRCBvZiBQSydzIGluZGV4LCBpZiBGT1JFSUdO ICovCiAJYm9vbAkJY29ud2l0aHBlcmlvZDsJLyogV2hldGhlciB0aGUgbmV3IEZPUkVJR04gS0VZ IHVzZXMgUEVSSU9EICovCiAJT2lkCQkJY29uaWQ7CQkJLyogT0lEIG9mIHBnX2NvbnN0cmFpbnQg ZW50cnksIGlmIEZPUkVJR04gKi8KKwlpbnQJCQlhdHRudW07CQkJLyogTk9UIE5VTEwgY29uc3Ry YWludCBhdHRyaWJ1dGUgbnVtYmVyICovCiAJTm9kZQkgICAqcXVhbDsJCQkvKiBDaGVjayBleHBy IG9yIENPTlNUUl9GT1JFSUdOIENvbnN0cmFpbnQgKi8KIAlFeHByU3RhdGUgICpxdWFsc3RhdGU7 CQkvKiBFeGVjdXRpb24gc3RhdGUgZm9yIENIRUNLIGV4cHIgKi8KIH0gTmV3Q29uc3RyYWludDsK QEAgLTc2MCw2ICs3NjMsNyBAQCBzdGF0aWMgdm9pZCBBVEV4ZWNNZXJnZVBhcnRpdGlvbnMoTGlz dCAqKndxdWV1ZSwgQWx0ZXJlZFRhYmxlSW5mbyAqdGFiLCBSZWxhdGlvbgogc3RhdGljIHZvaWQg QVRFeGVjU3BsaXRQYXJ0aXRpb24oTGlzdCAqKndxdWV1ZSwgQWx0ZXJlZFRhYmxlSW5mbyAqdGFi LAogCQkJCQkJCQkgUmVsYXRpb24gcmVsLCBQYXJ0aXRpb25DbWQgKmNtZCwKIAkJCQkJCQkJIEFs dGVyVGFibGVVdGlsaXR5Q29udGV4dCAqY29udGV4dCk7CitzdGF0aWMgYm9vbCBpbmRleF9jaGVj a19ub3RudWxsKFJlbGF0aW9uIHJlbGF0aW9uLCBMaXN0ICpub3RudWxsX2F0dG51bXMpOwogCiAv KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCiAgKgkJRGVmaW5lUmVsYXRpb24KQEAgLTYyNTEsNiArNjI1NSw5IEBAIEFUUmV3 cml0ZVRhYmxlKEFsdGVyZWRUYWJsZUluZm8gKnRhYiwgT2lkIE9JRE5ld0hlYXApCiAJCQkJbmVl ZHNjYW4gPSB0cnVlOwogCQkJCWNvbi0+cXVhbHN0YXRlID0gRXhlY1ByZXBhcmVFeHByKChFeHBy ICopIGV4cGFuZF9nZW5lcmF0ZWRfY29sdW1uc19pbl9leHByKGNvbi0+cXVhbCwgb2xkcmVsLCAx KSwgZXN0YXRlKTsKIAkJCQlicmVhazsKKwkJCWNhc2UgQ09OU1RSX05PVE5VTEw6CisJCQkJLyog Tm90aGluZyB0byBkbyBoZXJlICovCisJCQkJYnJlYWs7CiAJCQljYXNlIENPTlNUUl9GT1JFSUdO OgogCQkJCS8qIE5vdGhpbmcgdG8gZG8gaGVyZSAqLwogCQkJCWJyZWFrOwpAQCAtNjI3OCw2ICs2 Mjg1LDc4IEBAIEFUUmV3cml0ZVRhYmxlKEFsdGVyZWRUYWJsZUluZm8gKnRhYiwgT2lkIE9JRE5l d0hlYXApCiAJbm90bnVsbF9hdHRycyA9IG5vdG51bGxfdmlydHVhbF9hdHRycyA9IE5JTDsKIAlp ZiAobmV3cmVsIHx8IHRhYi0+dmVyaWZ5X25ld19ub3RudWxsKQogCXsKKwkJYm9vbAkJbnVsbF92 ZXJ0aWZpZWQgPSBmYWxzZTsKKworCQkvKgorCQkgKiBUaGUgY29uZGl0aW9ucyBmb3IgdXNpbmcg aW5kZXhzY2FuIG1lY2hhbmlzbSBmYXN0IHZlcmlmeWluZworCQkgKiBub3QtbnVsbCBjb25zdHJh aW50cyBhcmUgcXVpdGUgc3RyaWN0LiBBbGwgb2YgdGhlIGZvbGxvd2luZworCQkgKiBjb25kaXRp b25zIG11c3QgYmUgbWV0LgorCQkgKgorCQkgKiAxLiBBbHRlcmVkVGFibGVJbmZvLT52ZXJpZnlf bmV3X25vdG51bGwgaXMgdHJ1ZS4KKwkJICoKKwkJICogMi4gTm8gdGFibGUgc2NhbiAoZS5nLiwg Zm9yIENIRUNLIGNvbnN0cmFpbnQgdmVyaWZpY2F0aW9uKSBvciB0YWJsZQorCQkgKiByZXdyaXRl IGlzIGV4cGVjdGVkIGxhdGVyLCBpZiBvbmUgaXMsIHVzaW5nIGluZGV4c2NhbiB3b3VsZCBqdXN0 CisJCSAqIHdhc3RlcyBjeWNsZXMuCisJCSAqCisJCSAqIDMuIEluZGV4ZXMgY2Fubm90IGJlIGNy ZWF0ZWQgb24gdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1ucywgc28gZmFzdAorCQkgKiBjaGVja2lu ZyBub3QtbnVsbCBjb25zdHJhaW50cyBpcyBub3QgYXBwbGljYWJsZSB0byB0aGVtLgorCQkgKgor CQkgKiA0LiBUaGUgcmVsYXRpb24gbXVzdCBiZSBhIHBsYWluIHRhYmxlLgorCQkgKgorCQkgKiA1 LiBUbyBwcmV2ZW50IHBvc3NpYmxlIGNvbmN1cnJlbmN5IGlzc3VlcywgdGhlIHRhYmxlIG11c3Qg YWxyZWFkeQorCQkgKiBiZSBsb2NrZWQgd2l0aCBhbiBBY2Nlc3NFeGNsdXNpdmVMb2NrLCB3aGlj aCBpcyB0aGUgbG9jayBvYnRhaW5lZAorCQkgKiBkdXJpbmcgQUxURVIgVEFCTEUgU0VUIE5PVCBO VUxMLgorCQkgKi8KKwkJaWYgKCFuZWVkc2NhbiAmJgorCQkJbmV3cmVsID09IE5VTEwgJiYKKwkJ CW9sZHJlbC0+cmRfcmVsLT5yZWxraW5kID09IFJFTEtJTkRfUkVMQVRJT04gJiYKKwkJCUNoZWNr UmVsYXRpb25Mb2NrZWRCeU1lKG9sZHJlbCwgQWNjZXNzRXhjbHVzaXZlTG9jaywgZmFsc2UpKQor CQl7CisJCQlMaXN0CSAgICpub3RudWxsX2F0dG51bXMgPSBOSUw7CisKKwkJCUFzc2VydCghdGFi LT5yZXdyaXRlKTsKKworCQkJZm9yZWFjaChsLCB0YWItPmNvbnN0cmFpbnRzKQorCQkJeworCQkJ CUZvcm1fcGdfYXR0cmlidXRlIGF0dHI7CisJCQkJTmV3Q29uc3RyYWludCAqY29uID0gbGZpcnN0 KGwpOworCisJCQkJaWYgKGNvbi0+Y29udHlwZSAhPSBDT05TVFJfTk9UTlVMTCkKKwkJCQkJY29u dGludWU7CisKKwkJCQlhdHRyID0gVHVwbGVEZXNjQXR0cihuZXdUdXBEZXNjLCBjb24tPmF0dG51 bSAtIDEpOworCisJCQkJaWYgKGF0dHItPmF0dGlzZHJvcHBlZCkKKwkJCQkJY29udGludWU7CisK KwkJCQlBc3NlcnQoYXR0ci0+YXR0bm90bnVsbCk7CisJCQkJQXNzZXJ0KGF0dHItPmF0dG51bSA9 PSBjb24tPmF0dG51bSk7CisKKwkJCQlpZiAoYXR0ci0+YXR0Z2VuZXJhdGVkID09IEFUVFJJQlVU RV9HRU5FUkFURURfVklSVFVBTCkKKwkJCQl7CisJCQkJCW5lZWRzY2FuID0gdHJ1ZTsKKwkJCQkJ YnJlYWs7CisJCQkJfQorCisJCQkJbm90bnVsbF9hdHRudW1zID0gbGlzdF9hcHBlbmRfdW5pcXVl X2ludChub3RudWxsX2F0dG51bXMsCisJCQkJCQkJCQkJCQkJCSBhdHRyLT5hdHRudW0pOworCQkJ fQorCisJCQlpZiAoIW5lZWRzY2FuKQorCQkJeworCQkJCWlmIChpbmRleF9jaGVja19ub3RudWxs KG9sZHJlbCwgbm90bnVsbF9hdHRudW1zKSkKKwkJCQl7CisJCQkJCW51bGxfdmVydGlmaWVkID0g dHJ1ZTsKKworCQkJCQllcmVwb3J0KERFQlVHMSwKKwkJCQkJCQllcnJtc2dfaW50ZXJuYWwoImFs bCBuZXcgbm90LW51bGwgY29uc3RyYWludHMgb24gcmVsYXRpb24gXCIlc1wiIGhhdmUgYmVlbiB2 YWxpZGF0ZWQgYnkgdXNpbmcgaW5kZXggc2NhbiIsCisJCQkJCQkJCQkJCVJlbGF0aW9uR2V0UmVs YXRpb25OYW1lKG9sZHJlbCkpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQluZWVkc2NhbiA9IHRy dWU7CisJCQl9CisJCX0KKwogCQkvKgogCQkgKiBJZiB3ZSBhcmUgcmVidWlsZGluZyB0aGUgdHVw bGVzIE9SIGlmIHdlIGFkZGVkIGFueSBuZXcgYnV0IG5vdAogCQkgKiB2ZXJpZmllZCBub3QtbnVs bCBjb25zdHJhaW50cywgY2hlY2sgYWxsICp2YWxpZCogbm90LW51bGwKQEAgLTYyODgsNyArNjM2 Nyw3IEBAIEFUUmV3cml0ZVRhYmxlKEFsdGVyZWRUYWJsZUluZm8gKnRhYiwgT2lkIE9JRE5ld0hl YXApCiAJCSAqIG5vdC1udWxsIGNvbnN0cmFpbnRzIG92ZXIgdmlydHVhbCBnZW5lcmF0ZWQgY29s dW1uczsgaW5zdGVhZCwgdGhleQogCQkgKiBhcmUgY29sbGVjdGVkIGluIG5vdG51bGxfdmlydHVh bF9hdHRycyBmb3IgdmVyaWZpY2F0aW9uIGVsc2V3aGVyZS4KIAkJICovCi0JCWZvciAoaSA9IDA7 IGkgPCBuZXdUdXBEZXNjLT5uYXR0czsgaSsrKQorCQlmb3IgKGkgPSAwOyAhbnVsbF92ZXJ0aWZp ZWQgJiYgaSA8IG5ld1R1cERlc2MtPm5hdHRzOyBpKyspCiAJCXsKIAkJCUNvbXBhY3RBdHRyaWJ1 dGUgKmF0dHIgPSBUdXBsZURlc2NDb21wYWN0QXR0cihuZXdUdXBEZXNjLCBpKTsKIApAQCAtNjMw Niw2ICs2Mzg1LDkgQEAgQVRSZXdyaXRlVGFibGUoQWx0ZXJlZFRhYmxlSW5mbyAqdGFiLCBPaWQg T0lETmV3SGVhcCkKIAkJfQogCQlpZiAobm90bnVsbF9hdHRycyB8fCBub3RudWxsX3ZpcnR1YWxf YXR0cnMpCiAJCQluZWVkc2NhbiA9IHRydWU7CisKKwkJaWYgKG51bGxfdmVydGlmaWVkKQorCQkJ QXNzZXJ0KG5lZWRzY2FuID09IGZhbHNlKTsKIAl9CiAKIAlpZiAobmV3cmVsIHx8IG5lZWRzY2Fu KQpAQCAtODAwOSw2ICs4MDkxLDcgQEAgQVRFeGVjU2V0Tm90TnVsbChMaXN0ICoqd3F1ZXVlLCBS ZWxhdGlvbiByZWwsIGNoYXIgKmNvbk5hbWUsIGNoYXIgKmNvbE5hbWUsCiAJQ29va2VkQ29uc3Ry YWludCAqY2NvbjsKIAlMaXN0CSAgICpjb29rZWQ7CiAJYm9vbAkJaXNfbm9faW5oZXJpdCA9IGZh bHNlOworCUFsdGVyZWRUYWJsZUluZm8gKnRhYiA9IEFUR2V0UXVldWVFbnRyeSh3cXVldWUsIHJl bCk7OwogCiAJLyogR3VhcmQgYWdhaW5zdCBzdGFjayBvdmVyZmxvdyBkdWUgdG8gb3Zlcmx5IGRl ZXAgaW5oZXJpdGFuY2UgdHJlZS4gKi8KIAljaGVja19zdGFja19kZXB0aCgpOwpAQCAtODEzNyw2 ICs4MjIwLDI1IEBAIEFURXhlY1NldE5vdE51bGwoTGlzdCAqKndxdWV1ZSwgUmVsYXRpb24gcmVs LCBjaGFyICpjb25OYW1lLCBjaGFyICpjb2xOYW1lLAogCWNvb2tlZCA9IEFkZFJlbGF0aW9uTmV3 Q29uc3RyYWludHMocmVsLCBOSUwsIGxpc3RfbWFrZTEoY29uc3RyYWludCksCiAJCQkJCQkJCQkg ICBmYWxzZSwgIXJlY3Vyc2luZywgZmFsc2UsIE5VTEwpOwogCWNjb24gPSBsaW5pdGlhbChjb29r ZWQpOworCisJQXNzZXJ0KGNjb24tPmNvbnR5cGUgPT0gQ09OU1RSX05PVE5VTEwpOworCisJLyoK KwkgKiBXZSBtYXkgdXNpbmcgaW5kZXhzY2FuIG1lY2hhbmlzbSB0byB2ZXJ0aWZ5IHRoaXMgbm90 LW51bGwgY29uc3RyYWludCBpbgorCSAqIFBoYXNlMy4gIEFkZCB0aGlzIHRvLWJlLXZhbGlkYXRl ZCBub3QtbnVsbCBjb25zdHJhaW50IHRvIFBoYXNlIDMncworCSAqIHF1ZXVlLgorCSAqLworCWlm ICghY2Nvbi0+c2tpcF92YWxpZGF0aW9uKQorCXsKKwkJTmV3Q29uc3RyYWludCAqbmV3Y29uID0g cGFsbG9jMF9vYmplY3QoTmV3Q29uc3RyYWludCk7CisKKwkJbmV3Y29uLT5uYW1lID0gY2Nvbi0+ bmFtZTsKKwkJbmV3Y29uLT5jb250eXBlID0gQ09OU1RSX05PVE5VTEw7CisJCW5ld2Nvbi0+YXR0 bnVtID0gY2Nvbi0+YXR0bnVtOworCisJCXRhYi0+Y29uc3RyYWludHMgPSBsYXBwZW5kKHRhYi0+ Y29uc3RyYWludHMsIG5ld2Nvbik7CisJfQorCiAJT2JqZWN0QWRkcmVzc1NldChhZGRyZXNzLCBD b25zdHJhaW50UmVsYXRpb25JZCwgY2Nvbi0+Y29ub2lkKTsKIAogCS8qIE1hcmsgcGdfYXR0cmli dXRlLmF0dG5vdG51bGwgZm9yIHRoZSBjb2x1bW4gYW5kIHF1ZXVlIHZhbGlkYXRpb24gKi8KQEAg LTEwMDMwLDEzICsxMDEzMiwxNSBAQCBBVEFkZENoZWNrTk5Db25zdHJhaW50KExpc3QgKip3cXVl dWUsIEFsdGVyZWRUYWJsZUluZm8gKnRhYiwgUmVsYXRpb24gcmVsLAogCXsKIAkJQ29va2VkQ29u c3RyYWludCAqY2NvbiA9IChDb29rZWRDb25zdHJhaW50ICopIGxmaXJzdChsY29uKTsKIAotCQlp ZiAoIWNjb24tPnNraXBfdmFsaWRhdGlvbiAmJiBjY29uLT5jb250eXBlICE9IENPTlNUUl9OT1RO VUxMKQorCQlpZiAoIWNjb24tPnNraXBfdmFsaWRhdGlvbikKIAkJewogCQkJTmV3Q29uc3RyYWlu dCAqbmV3Y29uOwogCiAJCQluZXdjb24gPSBwYWxsb2MwX29iamVjdChOZXdDb25zdHJhaW50KTsK IAkJCW5ld2Nvbi0+bmFtZSA9IGNjb24tPm5hbWU7CiAJCQluZXdjb24tPmNvbnR5cGUgPSBjY29u LT5jb250eXBlOworCQkJaWYgKGNjb24tPmNvbnR5cGUgPT0gQ09OU1RSX05PVE5VTEwpCisJCQkJ bmV3Y29uLT5hdHRudW0gPSBjY29uLT5hdHRudW07CiAJCQluZXdjb24tPnF1YWwgPSBjY29uLT5l eHByOwogCiAJCQl0YWItPmNvbnN0cmFpbnRzID0gbGFwcGVuZCh0YWItPmNvbnN0cmFpbnRzLCBu ZXdjb24pOwpAQCAtMTM0NzQsNiArMTM1NzgsNyBAQCBRdWV1ZU5OQ29uc3RyYWludFZhbGlkYXRp b24oTGlzdCAqKndxdWV1ZSwgUmVsYXRpb24gY29ucmVsLCBSZWxhdGlvbiByZWwsCiAJTGlzdAkg ICAqY2hpbGRyZW4gPSBOSUw7CiAJQXR0ck51bWJlcglhdHRudW07CiAJY2hhcgkgICAqY29sbmFt ZTsKKwlOZXdDb25zdHJhaW50ICpuZXdjb247CiAKIAljb24gPSAoRm9ybV9wZ19jb25zdHJhaW50 KSBHRVRTVFJVQ1QoY29udHVwbGUpOwogCUFzc2VydChjb24tPmNvbnR5cGUgPT0gQ09OU1RSQUlO VF9OT1ROVUxMKTsKQEAgLTEzNTM3LDcgKzEzNjQyLDIxIEBAIFF1ZXVlTk5Db25zdHJhaW50VmFs aWRhdGlvbihMaXN0ICoqd3F1ZXVlLCBSZWxhdGlvbiBjb25yZWwsIFJlbGF0aW9uIHJlbCwKIAkv KiBTZXQgYXR0bm90bnVsbCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgcXVldWVpbmcgYW5vdGhlciB2 YWxpZGF0aW9uICovCiAJc2V0X2F0dG5vdG51bGwoTlVMTCwgcmVsLCBhdHRudW0sIHRydWUsIGZh bHNlKTsKIAorCS8qCisJICogUXVldWUgdmFsaWRhdGlvbiBmb3IgcGhhc2UgMy4gQUxURVIgVEFC TEUgU0VUIE5PVCBOVUxMIGFkZHMgYSBOT1QgTlVMTAorCSAqIGNvbnN0cmFpbnQgKE5ld0NvbnN0 cmFpbnQpIHRvIEFsdGVyZWRUYWJsZUluZm8tPmNvbnN0cmFpbnRzOyBmb3IKKwkgKiBjb25zaXN0 ZW5jeSwgd2UgZG8gdGhlIHNhbWUgaGVyZS4gVGhpcyBzZXR1cCBhbGxvd3MgcGhhc2UgMworCSAq IChBVFJld3JpdGVUYWJsZSkgdG8gcXVpY2tseSB2YWxpZGF0ZSB0aGUgY29sdW1uJ3MgTlVMTCBz dGF0dXMgdXNpbmcgYW4KKwkgKiBpbmRleCBzY2FuLCBpZiBhbGwgY29uZGl0aW9ucyBhcmUgbWV0 LgorCSAqLworCW5ld2NvbiA9IHBhbGxvYzBfb2JqZWN0KE5ld0NvbnN0cmFpbnQpOworCW5ld2Nv bi0+bmFtZSA9IGNvbG5hbWU7CisJbmV3Y29uLT5jb250eXBlID0gQ09OU1RSX05PVE5VTEw7CisJ bmV3Y29uLT5hdHRudW0gPSBhdHRudW07CisKKwkvKiBGaW5kIG9yIGNyZWF0ZSB3b3JrIHF1ZXVl IGVudHJ5IGZvciB0aGlzIHRhYmxlICovCiAJdGFiID0gQVRHZXRRdWV1ZUVudHJ5KHdxdWV1ZSwg cmVsKTsKKwl0YWItPmNvbnN0cmFpbnRzID0gbGFwcGVuZCh0YWItPmNvbnN0cmFpbnRzLCBuZXdj b24pOwogCXRhYi0+dmVyaWZ5X25ld19ub3RudWxsID0gdHJ1ZTsKIAogCS8qCkBAIC0yMzYwMiwz ICsyMzcyMSwxNjkgQEAgQVRFeGVjU3BsaXRQYXJ0aXRpb24oTGlzdCAqKndxdWV1ZSwgQWx0ZXJl ZFRhYmxlSW5mbyAqdGFiLCBSZWxhdGlvbiByZWwsCiAJLyogUmVzdG9yZSB0aGUgdXNlcmlkIGFu ZCBzZWN1cml0eSBjb250ZXh0LiAqLwogCVNldFVzZXJJZEFuZFNlY0NvbnRleHQoc2F2ZV91c2Vy aWQsIHNhdmVfc2VjX2NvbnRleHQpOwogfQorCisvKgorICogbm90bnVsbF9hdHRudW1zOiBsaXN0 IG9mIGF0dHJpYnV0ZSBudW1iZXJzIGZvciBhbGwgbmV3bHkgYWRkZWQgTk9UIE5VTEwKKyAqIGNv bnN0cmFpbnRzLgorICoKKyAqIEZvciBlYWNoIE5PVCBOVUxMIGF0dHJpYnV0ZSwgZmlyc3QgY2hl Y2sgd2hldGhlciB0aGUgcmVsYXRpb24gaGFzIGEgc3VpdGFibGUKKyAqIGluZGV4IHRvIGZldGNo IHRoYXQgYXR0cmlidXRlIGNvbnRlbnQuIElmIHNvLCB1c2luZyBpbmRleHNjYW4gdG8gdmVyaWZ5 IHRoYXQKKyAqIGF0dHJpYnV0ZSBjb250YWlucyBubyBOVUxMIHZhbHVlcy4KKyAqCisgKiBSZXR1 cm5pbmcgdHJ1ZSBtZWFucyB0aGUgbmV3IE5PVCBOVUxMIGNvbnN0cmFpbnRzIGFyZSBmdWxseSB2 ZXJpZmllZCBhbmQgbm8KKyAqIGV4dHJhIHRhYmxlIHNjYW5zIGFyZSBuZWNlc3NhcnkuCisgKi8K K3N0YXRpYyBib29sCitpbmRleF9jaGVja19ub3RudWxsKFJlbGF0aW9uIHJlbGF0aW9uLCBMaXN0 ICpub3RudWxsX2F0dG51bXMpCit7CisJU3lzU2NhbkRlc2MgaW5kc2NhbjsKKwlTY2FuS2V5RGF0 YSBza2V5OworCUhlYXBUdXBsZQlodHVwOworCUxpc3QJICAgKmlkeHMgPSBOSUw7CisJTGlzdAkg ICAqYXR0bnVtcyA9IE5JTDsKKwlib29sCQlhbGxfbm90X251bGwgPSB0cnVlOworCUxpc3RDZWxs ICAgKmxjLAorCQkJICAgKmxjMjsKKworCVJlbGF0aW9uCXBnX2luZGV4ID0gdGFibGVfb3BlbihJ bmRleFJlbGF0aW9uSWQsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwlpZiAobm90bnVsbF9hdHRudW1z ID09IE5JTCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogUHJlcGFyZSB0byBzY2FuIHBnX2luZGV4 IGZvciBlbnRyaWVzIGhhdmluZyBpbmRyZWxpZCA9IHRoaXMgcmVsICovCisJU2NhbktleUluaXQo JnNrZXksCisJCQkJQW51bV9wZ19pbmRleF9pbmRyZWxpZCwKKwkJCQlCVEVxdWFsU3RyYXRlZ3lO dW1iZXIsCisJCQkJRl9PSURFUSwKKwkJCQlPYmplY3RJZEdldERhdHVtKFJlbGF0aW9uR2V0UmVs aWQocmVsYXRpb24pKSk7CisKKwlpbmRzY2FuID0gc3lzdGFibGVfYmVnaW5zY2FuKHBnX2luZGV4 LCBJbmRleEluZHJlbGlkSW5kZXhJZCwgdHJ1ZSwKKwkJCQkJCQkJIE5VTEwsIDEsICZza2V5KTsK KworCXdoaWxlIChIZWFwVHVwbGVJc1ZhbGlkKGh0dXAgPSBzeXN0YWJsZV9nZXRuZXh0KGluZHNj YW4pKSkKKwl7CisJCUZvcm1fcGdfYXR0cmlidXRlIGF0dHI7CisJCVJlbGF0aW9uCWluZGV4X3Jl bDsKKworCQlGb3JtX3BnX2luZGV4IGluZGV4ID0gKEZvcm1fcGdfaW5kZXgpIEdFVFNUUlVDVCho dHVwKTsKKworCQkvKgorCQkgKiBXZSBvbmx5IHVzZSBub24tZGVmZXJyZWQsIHZhbGlkLCBhbmQg bGl2ZSBiLXRyZWUgaW5kZXhlcyB0byB2ZXJpZnkKKwkJICogTk9UIE5VTEwgY29uc3RyYWludHMu CisJCSAqLworCQlpZiAoIWluZGV4LT5pbmRpbW1lZGlhdGUgfHwgIWluZGV4LT5pbmRpc3ZhbGlk IHx8ICFpbmRleC0+aW5kaXNsaXZlKQorCQkJY29udGludWU7CisKKwkJLyogY2Fubm90IHVzZSBl eHByZXNzaW9uIGluZGV4IG9yIHBhcnRpYWwgaW5kZXggdG9vICovCisJCWlmICghaGVhcF9hdHRp c251bGwoaHR1cCwgQW51bV9wZ19pbmRleF9pbmRleHBycywgTlVMTCkgfHwKKwkJCSFoZWFwX2F0 dGlzbnVsbChodHVwLCBBbnVtX3BnX2luZGV4X2luZHByZWQsIE5VTEwpKQorCQkJY29udGludWU7 CisKKwkJaW5kZXhfcmVsID0gaW5kZXhfb3BlbihpbmRleC0+aW5kZXhyZWxpZCwgQWNjZXNzU2hh cmVMb2NrKTsKKworCQlpZiAoaW5kZXhfcmVsLT5yZF9yZWwtPnJlbGFtICE9IEJUUkVFX0FNX09J RCkKKwkJeworCQkJaW5kZXhfY2xvc2UoaW5kZXhfcmVsLCBBY2Nlc3NTaGFyZUxvY2spOworCisJ CQljb250aW51ZTsKKwkJfQorCisJCWF0dHIgPSBUdXBsZURlc2NBdHRyKFJlbGF0aW9uR2V0RGVz Y3IocmVsYXRpb24pLCAoaW5kZXgtPmluZGtleS52YWx1ZXNbMF0gLSAxKSk7CisKKwkJaWYgKGxp c3RfbWVtYmVyX2ludChub3RudWxsX2F0dG51bXMsIGF0dHItPmF0dG51bSkgJiYKKwkJCSFsaXN0 X21lbWJlcl9pbnQoYXR0bnVtcywgYXR0ci0+YXR0bnVtKSkKKwkJeworCQkJYXR0bnVtcyA9IGxh cHBlbmRfaW50KGF0dG51bXMsIGF0dHItPmF0dG51bSk7CisJCQlpZHhzID0gbGFwcGVuZF9vaWQo aWR4cywgaW5kZXgtPmluZGV4cmVsaWQpOworCQl9CisKKwkJaW5kZXhfY2xvc2UoaW5kZXhfcmVs LCBOb0xvY2spOworCX0KKwlzeXN0YWJsZV9lbmRzY2FuKGluZHNjYW4pOworCXRhYmxlX2Nsb3Nl KHBnX2luZGV4LCBBY2Nlc3NTaGFyZUxvY2spOworCisJLyoKKwkgKiBWZXJpZnkgTk9UIE5VTEwg Y29uc3RyYWludHMgdXNpbmcgYSBzdWl0YWJsZSBpbmRleCwgZmFsbGluZyBiYWNrIHRvIGEKKwkg KiBmdWxsIHRhYmxlIHNjYW4gaWYgYSBzdWl0YWJsZSBpbmRleCBpcyBub3QgcHJlc2VudC4KKwkg Ki8KKwlpZiAoYXR0bnVtcyA9PSBOSUwgfHwKKwkJbGlzdF9sZW5ndGgobm90bnVsbF9hdHRudW1z KSAhPSBsaXN0X2xlbmd0aChhdHRudW1zKSkKKwkJcmV0dXJuIGZhbHNlOworCisJZm9yZWFjaF9p bnQoYXR0bm8sIG5vdG51bGxfYXR0bnVtcykKKwl7CisJCWlmICghbGlzdF9tZW1iZXJfaW50KGF0 dG51bXMsIGF0dG5vKSkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlmb3Jib3RoKGxjLCBhdHRu dW1zLCBsYzIsIGlkeHMpCisJeworCQlTbmFwc2hvdERhdGEgRGlydHlTbmFwc2hvdDsKKwkJSW5k ZXhTY2FuRGVzYyBpbmRleF9zY2FuOworCQlTY2FuS2V5RGF0YSBzY2Fua2V5c1tJTkRFWF9NQVhf S0VZU107CisJCUF0dHJOdW1iZXIJc2tfYXR0bm8gPSAtMTsKKwkJQXR0ck51bWJlcglhdHRubyA9 IGxmaXJzdF9pbnQobGMpOworCQlPaWQJCQlpbmRleG9pZCA9IGxmaXJzdF9vaWQobGMyKTsKKwor CQlSZWxhdGlvbglpZHhyZWwgPSBpbmRleF9vcGVuKGluZGV4b2lkLCBOb0xvY2spOworCQlJbmRl eEluZm8gICppbmRleEluZm8gPSBCdWlsZEluZGV4SW5mbyhpZHhyZWwpOworCQlpbnQJCQlpbmRu a2V5YXR0cyA9IEluZGV4UmVsYXRpb25HZXROdW1iZXJPZktleUF0dHJpYnV0ZXMoaWR4cmVsKTsK KworCQlUdXBsZVRhYmxlU2xvdCAqZXhpc3Rpbmdfc2xvdCA9IHRhYmxlX3Nsb3RfY3JlYXRlKHJl bGF0aW9uLCBOVUxMKTsKKworCQkvKgorCQkgKiBTZWFyY2ggdGhlIHR1cGxlcyB0aGF0IGFyZSBp biB0aGUgaW5kZXggZm9yIGFueSB2aW9sYXRpb25zLAorCQkgKiBpbmNsdWRpbmcgdHVwbGVzIHRo YXQgYXJlbid0IHZpc2libGUgeWV0LgorCQkgKi8KKwkJSW5pdERpcnR5U25hcHNob3QoRGlydHlT bmFwc2hvdCk7CisKKwkJaWYgKGluZGV4SW5mby0+aWlfSW5kZXhBdHRyTnVtYmVyc1swXSA9PSBh dHRubykKKwkJCXNrX2F0dG5vID0gMTsKKwkJZWxzZQorCQkJZWxvZyhFUlJPUiwgImNhY2hlIGxv b2t1cCBmYWlsZWQgZm9yIGF0dHJpYnV0ZSBudW1iZXIgJWQgb24gaW5kZXggJXUiLAorCQkJCSBp bmRleG9pZCwgYXR0bm8pOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kbmtleWF0dHM7IGkr KykKKwkJeworCQkJLyogc2V0IHVwIGFuIElTIE5VTEwgc2NhbiBrZXkgc28gdGhhdCB3ZSBpZ25v cmUgbm90IG51bGxzICovCisJCQlTY2FuS2V5RW50cnlJbml0aWFsaXplKCZzY2Fua2V5c1tpXSwK KwkJCQkJCQkJICAgU0tfSVNOVUxMIHwgU0tfU0VBUkNITlVMTCwKKwkJCQkJCQkJICAgc2tfYXR0 bm8sCS8qIGluZGV4IGNvbCB0byBzY2FuICovCisJCQkJCQkJCSAgIEludmFsaWRTdHJhdGVneSwg Lyogbm8gc3RyYXRlZ3kgKi8KKwkJCQkJCQkJICAgSW52YWxpZE9pZCwJLyogbm8gc3RyYXRlZ3kg c3VidHlwZSAqLworCQkJCQkJCQkgICBJbnZhbGlkT2lkLAkvKiBubyBjb2xsYXRpb24gKi8KKwkJ CQkJCQkJICAgSW52YWxpZE9pZCwJLyogbm8gcmVnIHByb2MgZm9yIHRoaXMgKi8KKwkJCQkJCQkJ ICAgKERhdHVtKSAwKTsJLyogY29uc3RhbnQgKi8KKwkJfQorCisJCWluZGV4X3NjYW4gPSBpbmRl eF9iZWdpbnNjYW4ocmVsYXRpb24sCisJCQkJCQkJCQkgaWR4cmVsLAorCQkJCQkJCQkJICZEaXJ0 eVNuYXBzaG90LAorCQkJCQkJCQkJIE5VTEwsCisJCQkJCQkJCQkgaW5kbmtleWF0dHMsCisJCQkJ CQkJCQkgMCwKKwkJCQkJCQkJCSBTT19OT05FKTsKKwkJaW5kZXhfcmVzY2FuKGluZGV4X3NjYW4s IHNjYW5rZXlzLCBpbmRua2V5YXR0cywgTlVMTCwgMCk7CisKKwkJd2hpbGUgKGluZGV4X2dldG5l eHRfc2xvdChpbmRleF9zY2FuLCBGb3J3YXJkU2NhbkRpcmVjdGlvbiwgZXhpc3Rpbmdfc2xvdCkp CisJCXsKKwkJCS8qCisJCQkgKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGZvdW5kIHRoYXQgc29t ZSBhdHRyaWJ1dGUgdmFsdWUgaXMgTlVMTC4KKwkJCSAqIGJ0cmVlIGluZGV4ZXMgYXJlIG5ldmVy IGxvc3N5LCB3ZSBkb24ndCBuZWVkIHJlY2hlY2sgdGhlCisJCQkgKiBjb25kaXRpb24uCisJCQkg Ki8KKwkJCWFsbF9ub3RfbnVsbCA9IGZhbHNlOworCQkJYnJlYWs7CisJCX0KKworCQlpbmRleF9l bmRzY2FuKGluZGV4X3NjYW4pOworCQlpbmRleF9jbG9zZShpZHhyZWwsIE5vTG9jayk7CisJCUV4 ZWNEcm9wU2luZ2xlVHVwbGVUYWJsZVNsb3QoZXhpc3Rpbmdfc2xvdCk7CisKKwkJLyogZXhpdCBl YXJsaWVyICovCisJCWlmICghYWxsX25vdF9udWxsKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwor CXJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X21pc2Mv bWVzb24uYnVpbGQgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbWlzYy9tZXNvbi5idWlsZAppbmRl eCAxYjI1ZDk4ZjdmMy4uZTAyYTJjYjBjNDIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L21vZHVsZXMv dGVzdF9taXNjL21lc29uLmJ1aWxkCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9taXNjL21l c29uLmJ1aWxkCkBAIC0yMCw2ICsyMCw3IEBAIHRlc3RzICs9IHsKICAgICAgICd0LzAwOV9sb2df dGVtcF9maWxlcy5wbCcsCiAgICAgICAndC8wMTBfaW5kZXhfY29uY3VycmVudGx5X3Vwc2VydC5w bCcsCiAgICAgICAndC8wMTFfbG9ja19zdGF0cy5wbCcsCisgICAgICAndC8wMTJfaW5kZXhzY2Fu X3ZhbGlkYXRlX25vdG51bGwucGwnLAogICAgIF0sCiAgICAgIyBUaGUgaW5qZWN0aW9uIHBvaW50 cyBhcmUgY2x1c3Rlci13aWRlLCBzbyBkaXNhYmxlIGluc3RhbGxjaGVjawogICAgICdydW5uaW5n Y2hlY2snOiBmYWxzZSwKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9taXNjL3Qv MDEyX2luZGV4c2Nhbl92YWxpZGF0ZV9ub3RudWxsLnBsIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0 X21pc2MvdC8wMTJfaW5kZXhzY2FuX3ZhbGlkYXRlX25vdG51bGwucGwKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjUzZTM4NTg4NzQwCi0tLSAvZGV2L251bGwKKysrIGIv c3JjL3Rlc3QvbW9kdWxlcy90ZXN0X21pc2MvdC8wMTJfaW5kZXhzY2FuX3ZhbGlkYXRlX25vdG51 bGwucGwKQEAgLTAsMCArMSwxMTggQEAKKyMgQ29weXJpZ2h0IChjKSAyMDI2LCBQb3N0Z3JlU1FM IEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorCisjIFZlcmlmeSB0aGF0IGluZGV4c2NhbiBtZWNo YW5pc20gY2FuIHNwZWVkdXAgQUxURVIgVEFCTEUgQUREIE5PVCBOVUxMCisKK3VzZSBzdHJpY3Q7 Cit1c2Ugd2FybmluZ3MgRkFUQUwgPT4gJ2FsbCc7CisKK3VzZSBQb3N0Z3JlU1FMOjpUZXN0OjpD bHVzdGVyOwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OlV0aWxzOwordXNlIFRlc3Q6Ok1vcmU7Cit1 c2UgVGltZTo6SGlSZXMgcXcodXNsZWVwKTsKKworIyBJbml0aWFsaXplIGEgdGVzdCBjbHVzdGVy CitteSAkbm9kZSA9IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXItPm5ldygncHJpbWFyeScpOwor JG5vZGUtPmluaXQoKTsKKyMgVHVybiBtZXNzYWdlIGxldmVsIHVwIHRvIERFQlVHMSBzbyB0aGF0 IHdlIGdldCB0aGUgbWVzc2FnZXMgd2Ugd2FudCB0byBzZWUKKyRub2RlLT5hcHBlbmRfY29uZign cG9zdGdyZXNxbC5jb25mJywgJ2NsaWVudF9taW5fbWVzc2FnZXMgPSBERUJVRzEnKTsKKyRub2Rl LT5zdGFydDsKKworIyBSdW4gYSBTUUwgY29tbWFuZCBhbmQgcmV0dXJuIHBzcWwncyBzdGRlcnIg KGluY2x1ZGluZyBkZWJ1ZyBtZXNzYWdlcykKK3N1YiBydW5fc3FsX2NvbW1hbmQKK3sKKwlteSAk c3FsID0gc2hpZnQ7CisJbXkgJHN0ZGVycjsKKworCSRub2RlLT5wc3FsKAorCQkncG9zdGdyZXMn LAorCQkkc3FsLAorCQlzdGRlcnIgPT4gXCRzdGRlcnIsCisJCW9uX2Vycm9yX2RpZSA9PiAxLAor CQlvbl9lcnJvcl9zdG9wID0+IDEpOworCXJldHVybiAkc3RkZXJyOworfQorCisjIFZlcmlmeSB0 aGF0IHJ1bl9zcWxfY29tbWFuZCBvdXRwdXQgY29uZmlybXMgYW4gaW5kZXggc2NhbiBpcyB1c2Vk IGZvciB0aGUgTk9UIE5VTEwgY2hlY2suCitzdWIgaXNfaW5kZXhzY2FuX3Zlcml0aWZ5X25vdG51 bGwKK3sKKwlteSAkb3V0cHV0ID0gc2hpZnQ7CisJcmV0dXJuIGluZGV4KCRvdXRwdXQsICdERUJV RzogIGFsbCBuZXcgbm90LW51bGwgY29uc3RyYWludHMgb24gcmVsYXRpb24nKSAhPSAtMTsKK30K KworbXkgJG91dHB1dDsKKworbm90ZSAidGVzdCBhbHRlciB0YWJsZSBTRVQgTk9UIE5VTEwgdXNp bmcgaW5kZXhzY2FuIHdpdGggcGFydGl0aW9uZWQgdGFibGUiOworCitydW5fc3FsX2NvbW1hbmQo CisgICAgJ0NSRUFURSBUQUJMRSB0cF9ub3RudWxsIChhIGludCwgYiBpbnQsIGMgaW50LCBkIGlu dCwgZjEgaW50IGRlZmF1bHQgMSwgZjIgaW50IGRlZmF1bHQgMiwgZjMgaW50IGRlZmF1bHQgMykg UEFSVElUSU9OIEJZIHJhbmdlKGEpOworICAgICBDUkVBVEUgVEFCTEUgdHBfbm90bnVsbF8xIHBh cnRpdGlvbiBvZiB0cF9ub3RudWxsIGZvciB2YWx1ZXMgZnJvbSAoIDEgKSB0byAoMTApOworICAg ICBDUkVBVEUgVEFCTEUgdHBfbm90bnVsbF8yIHBhcnRpdGlvbiBvZiB0cF9ub3RudWxsIGZvciB2 YWx1ZXMgZnJvbSAoIDEwICkgdG8gKDIxKTsKKyAgICAgSU5TRVJUIElOVE8gdHBfbm90bnVsbChh LGIsYyxkKSBTRUxFQ1QgZywgZyArIDEwLCBnICsgMTUsIGcgRlJPTSBnZW5lcmF0ZV9zZXJpZXMo MSwxOSkgZzsKKyAgICAgQ1JFQVRFIElOREVYIE9OIHRwX25vdG51bGwoYik7CisgICAgIENSRUFU RSBJTkRFWCBPTiB0cF9ub3RudWxsKGMpOworCSBDUkVBVEUgSU5ERVggT04gdHBfbm90bnVsbChk KTsKKyAgICAgQ1JFQVRFIElOREVYIE9OIHRwX25vdG51bGwoZjEpIElOQ0xVREUgKGYyKTsKKyAg ICAgQ1JFQVRFIElOREVYIE9OIHRwX25vdG51bGwgVVNJTkcgaGFzaCAoZjMgaW50NF9vcHMpOwor ICAgICAnKTsKKworIyBVc2luZyBpbmRleCBzY2FuIGZvciBOT1QgTlVMTCB2ZXJpZmljYXRpb24g cmVxdWlyZXMgZXZlcnkgbm90LW51bGwgY29sdW1uIG11c3QgcG9zc2VzcyBhIHN1aXRhYmxlIGlu ZGV4Ciskb3V0cHV0ID0gcnVuX3NxbF9jb21tYW5kKAorCSdBTFRFUiBUQUJMRSB0cF9ub3RudWxs IEFMVEVSIENPTFVNTiBhIFNFVCBOT1QgTlVMTCwgQUREIENPTlNUUkFJTlQgY19ubiBOT1QgTlVM TCBjJyk7CitvayghaXNfaW5kZXhzY2FuX3Zlcml0aWZ5X25vdG51bGwoJG91dHB1dCksICdjYW5u b3QgdXNlIGluZGV4c2NhbiB0byB2ZXJpZnkgbm90LW51bGwgY29uc3RyYWludHMgb24gdGFibGUg dHBfbm90bnVsbCcpOworCisjIEFsbCBjb2x1bW5zIGhhdmUgaW5kZXggb24gaXQsIE9LCiskb3V0 cHV0ID0gcnVuX3NxbF9jb21tYW5kKAorCSdBTFRFUiBUQUJMRSB0cF9ub3RudWxsIEFMVEVSIENP TFVNTiBkIFNFVCBOT1QgTlVMTCwgQUxURVIgQ09MVU1OIGMgU0VUIE5PVCBOVUxMLCBBTFRFUiBD T0xVTU4gYiBTRVQgTk9UIE5VTEw7Jyk7Citvayhpc19pbmRleHNjYW5fdmVyaXRpZnlfbm90bnVs bCgkb3V0cHV0KSwKKwkndXNpbmcgaW5kZXhzY2FuIHRvIHZlcmlmeSBub3QtbnVsbCBjb25zdHJh aW50cyBvbiBjb2x1bW4gYiwgYywgZCcpOworb2soICRvdXRwdXQgPX4KKwkgIG0vYWxsIG5ldyBu b3QtbnVsbCBjb25zdHJhaW50cyBvbiByZWxhdGlvbiAidHBfbm90bnVsbF8xIiBoYXZlIGJlZW4g dmFsaWRhdGVkIGJ5IHVzaW5nIGluZGV4IHNjYW4vLAorCSdhbGwgbmV3bHkgYWRkZWQgY29uc3Ry YWludHMgcHJvdmVkIGJ5IGluZGV4c2NhbicpOworb2soICRvdXRwdXQgPX4KKwkgIG0vYWxsIG5l dyBub3QtbnVsbCBjb25zdHJhaW50cyBvbiByZWxhdGlvbiAidHBfbm90bnVsbF8yIiBoYXZlIGJl ZW4gdmFsaWRhdGVkIGJ5IHVzaW5nIGluZGV4IHNjYW4vLAorCSdhbGwgbmV3bHkgYWRkZWQgY29u c3RyYWludHMgcHJvdmVkIGJ5IGluZGV4c2NhbicpOworCitydW5fc3FsX2NvbW1hbmQoJ0FMVEVS IFRBQkxFIHRwX25vdG51bGwgQUxURVIgQ09MVU1OIGIgRFJPUCBOT1QgTlVMTDsnKTsKKyMgTm93 IHVzaW5nIGluZGV4IHNjYW5zIG9uIHBhcnRpdGlvbnMgdG8gcXVpY2tseSB2ZXJpZnkgTk9UIE5V TEwgY29uc3RyYWludHMKKyRvdXRwdXQgPSBydW5fc3FsX2NvbW1hbmQoJ0FMVEVSIFRBQkxFIHRw X25vdG51bGxfMSBBTFRFUiBDT0xVTU4gYiBTRVQgTk9UIE5VTEw7Jyk7Citvayhpc19pbmRleHNj YW5fdmVyaXRpZnlfbm90bnVsbCgkb3V0cHV0KSwgJ2luZGV4IHNjYW4gdmVyaWZpZXMgTk9UIE5V TEwgZm9yIGNvbHVtbiBiJyk7CisKK3J1bl9zcWxfY29tbWFuZCgnQUxURVIgVEFCTEUgdHBfbm90 bnVsbCBBTFRFUiBDT0xVTU4gYiBEUk9QIE5PVCBOVUxMOycpOworIyBDYW5ub3QgdXNlIGluZGV4 c2NhbiB0byB2ZXJpZnkgbm90LW51bGwgY29uc3RyYWludCBpZiB0YWJsZSByZXdyaXRlIGhhcHBl bnMKKyRvdXRwdXQgPSBydW5fc3FsX2NvbW1hbmQoCisJJ0FMVEVSIFRBQkxFIHRwX25vdG51bGwg QUxURVIgQ09MVU1OIGIgU0VUIE5PVCBOVUxMLCBBTFRFUiBDT0xVTU4gYiBTRVQgREFUQSBUWVBF IGJpZ2ludDsnCispOworb2soIWlzX2luZGV4c2Nhbl92ZXJpdGlmeV9ub3RudWxsKCRvdXRwdXQp LCAndGFibGUgcmV3cml0ZSBvbiB0cF9ub3RudWxsLCBjYW5ub3QgdXNlIGluZGV4c2NhbiB0byB2 ZXJpZnkgbm90LW51bGwgY29uc3RyYWludHMgb24gaXQnKTsKKworcnVuX3NxbF9jb21tYW5kKCdB TFRFUiBUQUJMRSB0cF9ub3RudWxsIEFMVEVSIENPTFVNTiBkIERST1AgTk9UIE5VTEwnKTsKKwor IyBDYW5ub3QgdXNlIGluZGV4c2NhbiBiZWNhdXNlIEFMVEVSIFRBQkxFIFZBTElEQVRFIENPTlNU UkFJTlQgb25seSBob2xkCisjIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayBsb2NrIG9uIHRoZSB0 YWJsZQorcnVuX3NxbF9jb21tYW5kKCdBTFRFUiBUQUJMRSB0cF9ub3RudWxsIEFERCBDT05TVFJB SU5UIHRwX25vdG51bGxfZCBOT1QgTlVMTCBkIE5PVCBWQUxJRDsnKTsKKyRvdXRwdXQgPSBydW5f c3FsX2NvbW1hbmQoCisJJ0FMVEVSIFRBQkxFIHRwX25vdG51bGwgVkFMSURBVEUgQ09OU1RSQUlO VCB0cF9ub3RudWxsX2Q7JworKTsKK29rKCFpc19pbmRleHNjYW5fdmVyaXRpZnlfbm90bnVsbCgk b3V0cHV0KSwgJ2Nhbm5vdCB1c2UgaW5kZXhzY2FuIGZvciBBTFRFUiBUQUJMRSBWQUxJREFURSBD T05TVFJBSU5UIGNvbW1hbmQnKTsKKworcnVuX3NxbF9jb21tYW5kKCdBTFRFUiBUQUJMRSB0cF9u b3RudWxsIEFMVEVSIENPTFVNTiBkIERST1AgTk9UIE5VTEw7CisJCQkJQUxURVIgVEFCTEUgdHBf bm90bnVsbCBBREQgQ09OU1RSQUlOVCB0cF9ub3RudWxsX2QgTk9UIE5VTEwgZCBOT1QgVkFMSUQ7 Jyk7CisKKyMgSG93ZXZlciB0aGlzIHdpbGwgYmUgT0ssIHNpbmNlIEFMVEVSIENPTFVNTiBTRVQg Tk9UIE5VTEwgd2lsbCBhY3F1aXJlIEFjY2Vzc0V4Y2x1c2l2ZUxvY2sKKyRvdXRwdXQgPSBydW5f c3FsX2NvbW1hbmQoCisJJ0FMVEVSIFRBQkxFIHRwX25vdG51bGwgVkFMSURBVEUgQ09OU1RSQUlO VCB0cF9ub3RudWxsX2QsIEFMVEVSIENPTFVNTiBiIFNFVCBOT1QgTlVMTDsnCispOworb2soaXNf aW5kZXhzY2FuX3Zlcml0aWZ5X25vdG51bGwoJG91dHB1dCksICd1c2luZyBpbmRleHNjYW4gdG8g dmVyaWZ5IG5vdC1udWxsIGNvbnN0cmFpbnRzIG9uIGNvbHVtbiBiLCBjLCBkJyk7CisKKyMgSW5k ZXhzY2FuIG1lY2hhbmlzbSB0byB2ZXJpZnkgTk9UIE5VTEwgY29uc3RyYWludHMgY2Fubm90IGFw cGx5IHRvIGluZGV4IElOQ0xVREUgY29sdW1uCiskb3V0cHV0ID0gcnVuX3NxbF9jb21tYW5kKAor CSdBTFRFUiBUQUJMRSB0cF9ub3RudWxsIEFERCBDT05TVFJBSU5UIG5uZjQgTk9UIE5VTEwgZjI7 JworKTsKK29rKCFpc19pbmRleHNjYW5fdmVyaXRpZnlfbm90bnVsbCgkb3V0cHV0KSwgJ2Nhbm5v dCB1c2UgaW5kZXhzY2FuIHRvIHZhbGlkYXRlIG5vdC1udWxsIGNvbnN0cmFpbnQgb24gdHBfbm90 bnVsbCcpOworCisjIEluZGV4c2NhbiBtZWNoYW5pc20gdG8gdmVyaWZ5IE5PVCBOVUxMIGNvbnN0 cmFpbnRzIGNhbm5vdCBhcHBseSB0byBub24tQnRyZWUgaW5kZXgKKyRvdXRwdXQgPSBydW5fc3Fs X2NvbW1hbmQoJ0FMVEVSIFRBQkxFIHRwX25vdG51bGwgQUxURVIgQ09MVU1OIGYzIFNFVCBOT1Qg TlVMTDsnKTsKK29rKCFpc19pbmRleHNjYW5fdmVyaXRpZnlfbm90bnVsbCgkb3V0cHV0KSwgJ2Nh bm5vdCB1c2UgaW5kZXhzY2FuIHRvIHZhbGlkYXRlIG5vdC1udWxsIGNvbnN0cmFpbnRzIG9uIHRw X25vdG51bGwnKTsKKworJG5vZGUtPnN0b3AoJ2Zhc3QnKTsKKworZG9uZV90ZXN0aW5nKCk7Clwg Tm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQotLSAKMi4zNC4xCgo= --000000000000753453064ee91110--