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 1wA132-001z7h-2u for pgsql-hackers@arkaria.postgresql.org; Tue, 07 Apr 2026 07:40:33 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wA130-00FM0I-3D for pgsql-hackers@arkaria.postgresql.org; Tue, 07 Apr 2026 07:40:31 +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 1wA130-00FM0A-1S for pgsql-hackers@lists.postgresql.org; Tue, 07 Apr 2026 07:40:31 +0000 Received: from mail-vs1-xe34.google.com ([2607:f8b0:4864:20::e34]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wA12x-00000000zd2-32wy for pgsql-hackers@lists.postgresql.org; Tue, 07 Apr 2026 07:40:29 +0000 Received: by mail-vs1-xe34.google.com with SMTP id ada2fe7eead31-604f1bfed92so4461603137.0 for ; Tue, 07 Apr 2026 00:40:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1775547627; cv=none; d=google.com; s=arc-20240605; b=ZwUyqyGGSODf/VNY8/H5r7cUDZCvBxBRSn6KRDxeJq3Womw+jgavD51TmYy3g4EhHd CSZMClIMv3p3I5XyGDTBY21rPvdGynS1pjkknxcE2PdKvtkIluRYahHL6032OsicCaaW kVnCiSOsVPD+zj1FfKWY8JNXZ4O49hjGLoilaSuClhQZ2huLM0uKRU10Ac71ETXkCJlG EVWZjinx3e3ueni5AFn3ObOFTpBhG1fbJhPm2+w/aEp3pFTHSQgmf79C2hd/XlujV5oS CJ84rGD20KklXqwHiIYbZxtL8BpTG1weMv45J/zYrU30VwYMEH8JKJXYHwr298SxOKu7 zJwA== 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=wNAW1nD5ppmvSyA/4w3UkJj1TJ2fiaNiEzzwPHwfER0=; fh=tvS4T4+oR2J2hxK5aNJGfORVVBBvqUJPnvm76ijROZw=; b=R3lIs1KEXmqakk7db0U2EMSqnZvYgrUJprx4+C3WCRIUkZlXMNPYRT4onVU0BWxRXw GwHgYa8khYEdtO89F1q8riYnTgKPVYYLbXmPOkwsfKzFnn4WMs4oPbmxIPaO5eoR9et7 UkqpZ2PNBH0MMMMW0t7ysg513HTnURMtOcw8P8lEvHJunbpB5atud74TDS7PRWvvqVcC nTHe59SzqyIKnSAjp9VAGKfRQca/6CIlGnA1hbQPpih3o8Evktv3esP0lAfh2I2IVOBA Kdxt+ZsrLUUcG5MOVmqTbiiw7OyJnX6FMDvzVFaVF33Pd52By4ZBG8P7UAXkOEbM5BKE 2/Yw==; 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=1775547627; x=1776152427; 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=wNAW1nD5ppmvSyA/4w3UkJj1TJ2fiaNiEzzwPHwfER0=; b=Dzw68JzH4TZACXotZFCcivsQwROlbIV4TV2cCiBlC6jtaan1yiVGjP+jL3TiHsIdqw 7y9BRdDMc/zcL/z3akmU3I2o+VsWZhzlOtlAutbxgkdx8LwHiU8/5E7Qp9YkECJpb2JQ eKbKukR2jgCiwUqBhZEo/Rc2GJcqPCeVenI73/If3KPFOSHfyl6ZbYMEtWg9RBUGX/bi 3I88+lMcL14ZmlfnoQn+MIL3JoGQxY0vjujwQjqGmalj4nbSfPUyIVmGPtCCEjLEj+bu Aw6JA8udVcUIHnYVN29LmUuY98y58UFa5yE2BMHPCCWbaHofONBnyejEv8sbHOKu9gyJ oPbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775547627; x=1776152427; 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=wNAW1nD5ppmvSyA/4w3UkJj1TJ2fiaNiEzzwPHwfER0=; b=eqrTO+mwo4/E6r15EdW2hf57ERw0u8nxbh7lq06lRzEvMbJYtg4MuWxrs2Imgp7b+F 2XnJo8MR7/f9FOg9HnLcfsAp3G6RXfeDgKtocIH1mUVpA/suea8oxmJFpTlGKvt2anEc jExD87gD9dZTCUTJIE9bRp+jaMUwNmn3dbGtBl7UoJYGtxWiDBR58uCmtfwgYucdhokG MLEhfZjmBHLbAajZO3OEhZbWhuZLdOeie+cfcK9r1Sg3y2fqzQjqGO9in2ym51Xyd5nJ dSd1fSjTh3ZOEgAbZicD1a8sk2Y9zlAfi8XTtwFAO5zO1ifzwMIklGyEoXRi/JL3ETSB JqMw== X-Gm-Message-State: AOJu0YyV86atrexKaT9Rui+ki1WEXnHKsIpPjXF5Pq7nVuTvIJiVNhgi jyl3LbkMQu+BeezknhybMH5ZCxqRAQgw/lp4EGAm8FXrJVmMCx2Ju1xOsApqXdoA4aYb1bEwTeJ VsJhit2Hnh5StccrFBn53rMhb51BdtkmesgBuc5iEzQ== X-Gm-Gg: AeBDietGvI/WGOQgn9alKqASsOSCJDbAEFpzwAPO0GZnkNExaXVqUeSwpDweSyzkuSj WhXQ5A5TVU7s7XUOGo/Qnim9w/8ce8ywNC2nq5ESxsJDF8WpGRaUi+VwOLe+h0AoztYJnSsul1P je6breM+SgqVOn88lJPcNmbTTnBqyu8XtFTqDuXkSrCcRkDdDH45ibWmA1yizpMvHF9Imo2sLxA Bl3VSt9Z9oRjNCQ/rnu06KuaZgwhBwYJ9xzDw2Q7FEQAi0ILi4uigsDtC6reGqTowwqNocxnZwn tXBGmdUwpx9KxNE+qIlRKthoRF77IcZMypglAhSFrcitz7gNHFhysxbkhqZ+2hkUfjYYZ8UWyM8 ihDgTP4dwFAxvqUmvJsv19gwCp5h7Ovhdonk1j4K7GbR7iv3W2HUDuFoMARd8PjfiMecSdboOsX wwhQW2nQl3yKSvvWvwuL+COA== X-Received: by 2002:a67:e70e:0:b0:5f1:606f:2a14 with SMTP id ada2fe7eead31-605a50d3d20mr5902209137.23.1775547626775; Tue, 07 Apr 2026 00:40:26 -0700 (PDT) MIME-Version: 1.0 References: <202601311716.jeczqdjsmh57@alvherre.pgsql> In-Reply-To: From: jian he Date: Tue, 7 Apr 2026 15:39:50 +0800 X-Gm-Features: AQROBzCMA3sYyNSG7lqPKgerjuF3cELLxwX7H6taEMAT9TZY_yOIuvBp_HZYJgo 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="000000000000937eb7064ed9e525" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000937eb7064ed9e525 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Fri, Feb 6, 2026 at 12:58=E2=80=AFPM jian he wrote: > +-- should produce a debug message containing "have been validated by using index scan" + ALTER TABLE tp_notnull ALTER COLUMN b SET NOT NULL, ALTER COLUMN b SET DATA TYPE BIGINT; DEBUG: rehashing catalog cache id 64 for pg_class; 257 tups, 128 buckets The above DEBUG message make me realize that +SET client_min_messages TO 'debug1'; +--debug message should contain "have been validated by using index scan" +ALTER TABLE tp_notnull ALTER COLUMN b SET NOT NULL; +DEBUG: all new not-null constraints on relation "tp_notnull_1" have been validated by using index scan +DEBUG: all new not-null constraints on relation "tp_notnull_2" have been validated by using index scan Using the above regression test to check if certain ``ereport(DEBUG1,`` is reached is unstable. Therefore, we fall back to the previously used TAP tests to ensure ereport(DEBUG1, errmsg_internal("all new not-null constraints on relation \"%s\" have been validated by using index scan", RelationGetRelationName(oldrel))); is being reached. Rebased and made some minor comment adjustments; no big change. -- jian https://www.enterprisedb.com/ --000000000000937eb7064ed9e525 Content-Type: text/x-patch; charset="US-ASCII"; name="v13-0001-using-indexscan-to-speedup-add-not-null-constraints.patch" Content-Disposition: attachment; filename="v13-0001-using-indexscan-to-speedup-add-not-null-constraints.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnob6jog0 RnJvbSA1YTA3ZTQ5ZTA2ZWZmMzc1OTY4ZWMxMTFiMzhkNjU4MDE3NGU4Y2NhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBqaWFuIGhlIDxqaWFuLnVuaXZlcnNhbGl0eUBnbWFpbC5jb20+ CkRhdGU6IFR1ZSwgNyBBcHIgMjAyNiAxNToyNjoxNSArMDgwMApTdWJqZWN0OiBbUEFUQ0ggdjEz IDEvMV0gdXNpbmcgaW5kZXhzY2FuIHRvIHNwZWVkdXAgYWRkIG5vdCBudWxsIGNvbnN0cmFpbnRz CgpUaGlzIHBhdGNoIHRyaWVzIHRvIHVzZSBpbmRleF9iZWdpbnNjYW4oKSAvIGluZGV4X2dldG5l eHQoKSAvIGluZGV4X2VuZHNjYW4oKQptZW50aW9uZWQgaW4gWzFdIHRvIHNwZWVkdXAgYWRkaW5n IG5vdC1udWxsIGNvbnN0cmFpbnRzIHRvIHRoZSBleGlzdGluZyB0YWJsZS4KClRoZSBtYWluIGxv Z2ljIGhhcHBlbnMgaW4gcGhhc2UzIEFUUmV3cml0ZVRhYmxlCjEuIGNvbGxlY3QgYWxsIG5vdC1u dWxsIGNvbnN0cmFpbnRzLgoyLiBGb3IgZWFjaCBub3QtbnVsbCBjb25zdHJhaW50LCBjaGVjayB3 aGV0aGVyIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyBpbmRleAphdmFpbGFibGUgZm9yIHZhbGlk YXRpb24uIElmIG5vdCwgdGhlbiBjYW5ub3QgdXNlIGluZGV4c2NhbiBtZWNoYW5pc20gdG8gdmVy aWZ5IG5vdC1udWxsCmNvbnN0cmFpbnRzLgozLiBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25k aXRpb25zIGFyZSB0cnVlCiAgKiB0YWJsZSBzY2FuIG9yIHJld3JpdGUgaXMgcmVxdWlyZWQsCiAg KiB0YWJsZSB3YXNuJ3QgbG9ja2VkIHdpdGggYEFjY2Vzc0V4Y2x1c2l2ZUxvY2tgCiAgKiB0aGUg Tk9UIE5VTEwgY29uc3RyYWludCBhcHBsaWVzIHRvIGEgdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1u CiB0aGVuIGluZGV4IHNjYW4gY2Fubm90IGJlIHVzZWQgZm9yIGZhc3QgdmFsaWRhdGlvbi4KSWYg YWxsIGNvbmRpdGlvbnMgYXJlIHNhdGlzZmllZCwgYXR0ZW1wdCB0byB1c2UgaW5kZXhzY2FuIHRv IHZlcmlmeSB3aGV0aGVyIHRoZQpjb2x1bW4gY29udGFpbnMgYW55IE5VTEwgdmFsdWVzLgoKY29u Y3VycmVuY3kgY29uY2VybjoKQUxURVIgVEFCTEUgU0VUIE5PVCBOVUxMIHdpbGwgdGFrZSBhbiBB Q0NFU1MgRVhDTFVTSVZFIGxvY2ssIHNvIHRoZXJlIGlzIGxlc3MKdmFyaWFudCBvZiByYWNpbmcg aXNzdWUgY2FuIG9jY3VyLiBzZWVbMl0KCnJlZmVyZW5jZXM6ClsxXSBodHRwczovL3Bvc3Rnci5l cy9tL0NBJTJCVGdtb2E1Tkt6OGlHV185djd3eiUzRC0lMkJ6UUZ1JTNERTRTWm9hVGFVMXpuTGFF WFJZcC1RJTQwbWFpbC5nbWFpbC5jb20KWzJdIGh0dHBzOi8vcG9zdGdyLmVzL20vOTAwMDU2RDEt MzJERi00OTI3LTgyNTEtM0UwQzBEQzQwN0ZEJTQwYW5hcmF6ZWwuZGUKCmRpc2N1c3Npb246IGh0 dHBzOi8vcG9zdGdyLmVzL20vQ0FDSnVmeEZpVz00azFpcz1GMUo9ci1DeDFSdUJ5WFFQVXJXQjMz MVU0N3JTbkd6K2h3QG1haWwuZ21haWwuY29tCmNvbW1pdGZlc3QgZW50cnk6IGh0dHBzOi8vY29t bWl0ZmVzdC5wb3N0Z3Jlc3FsLm9yZy9wYXRjaC81NDQ0Ci0tLQogc3JjL2JhY2tlbmQvY29tbWFu ZHMvdGFibGVjbWRzLmMgICAgICAgICAgICAgIHwgMjgyICsrKysrKysrKysrKysrKysrLQogc3Jj L3Rlc3QvbW9kdWxlcy90ZXN0X21pc2MvbWVzb24uYnVpbGQgICAgICAgIHwgICAxICsKIC4uLi90 LzAxMl9pbmRleHNjYW5fdmFsaWRhdGVfbm90bnVsbC5wbCAgICAgICB8IDExOCArKysrKysrKwog MyBmaWxlcyBjaGFuZ2VkLCAzOTYgaW5zZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbWlzYy90LzAxMl9pbmRleHNjYW5f dmFsaWRhdGVfbm90bnVsbC5wbAoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3Rh YmxlY21kcy5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKaW5kZXggZWVjMDli YTFkZWQuLjdiODhkMDg4MmJkIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy90YWJs ZWNtZHMuYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNtZHMuYwpAQCAtMjExLDE2 ICsyMTEsMTkgQEAgdHlwZWRlZiBzdHJ1Y3QgQWx0ZXJlZFRhYmxlSW5mbwogCUxpc3QJICAgKmNo YW5nZWRTdGF0aXN0aWNzRGVmczsJLyogc3RyaW5nIGRlZmluaXRpb25zIG9mIHNhbWUgKi8KIH0g QWx0ZXJlZFRhYmxlSW5mbzsKIAotLyogU3RydWN0IGRlc2NyaWJpbmcgb25lIG5ldyBjb25zdHJh aW50IHRvIGNoZWNrIGluIFBoYXNlIDMgc2NhbiAqLwotLyogTm90ZTogbmV3IG5vdC1udWxsIGNv bnN0cmFpbnRzIGFyZSBoYW5kbGVkIGVsc2V3aGVyZSAqLworLyoKKyAqIFN0cnVjdCBkZXNjcmli aW5nIG9uZSBuZXcgY29uc3RyYWludCB0byBjaGVjayBpbiBQaGFzZSAzIHNjYW4uIE5vdGU6IG5l dworICogbm90LW51bGwgY29uc3RyYWludHMgYXJlIGhhbmRsZWQgaGVyZSB0b28uCisqLwogdHlw ZWRlZiBzdHJ1Y3QgTmV3Q29uc3RyYWludAogewogCWNoYXIJICAgKm5hbWU7CQkJLyogQ29uc3Ry YWludCBuYW1lLCBvciBOVUxMIGlmIG5vbmUgKi8KLQlDb25zdHJUeXBlCWNvbnR5cGU7CQkvKiBD SEVDSyBvciBGT1JFSUdOICovCisJQ29uc3RyVHlwZQljb250eXBlOwkJLyogQ0hFQ0sgb3IgRk9S RUlHTiBvciBOT1QgTlVMTCAqLwogCU9pZAkJCXJlZnJlbGlkOwkJLyogUEsgcmVsLCBpZiBGT1JF SUdOICovCiAJT2lkCQkJcmVmaW5kaWQ7CQkvKiBPSUQgb2YgUEsncyBpbmRleCwgaWYgRk9SRUlH TiAqLwogCWJvb2wJCWNvbndpdGhwZXJpb2Q7CS8qIFdoZXRoZXIgdGhlIG5ldyBGT1JFSUdOIEtF WSB1c2VzIFBFUklPRCAqLwogCU9pZAkJCWNvbmlkOwkJCS8qIE9JRCBvZiBwZ19jb25zdHJhaW50 IGVudHJ5LCBpZiBGT1JFSUdOICovCisJaW50CQkJYXR0bnVtOwkJCS8qIE5PVCBOVUxMIGNvbnN0 cmFpbnQgYXR0cmlidXRlIG51bWJlciAqLwogCU5vZGUJICAgKnF1YWw7CQkJLyogQ2hlY2sgZXhw ciBvciBDT05TVFJfRk9SRUlHTiBDb25zdHJhaW50ICovCiAJRXhwclN0YXRlICAqcXVhbHN0YXRl OwkJLyogRXhlY3V0aW9uIHN0YXRlIGZvciBDSEVDSyBleHByICovCiB9IE5ld0NvbnN0cmFpbnQ7 CkBAIC03NjAsNiArNzYzLDcgQEAgc3RhdGljIHZvaWQgQVRFeGVjTWVyZ2VQYXJ0aXRpb25zKExp c3QgKip3cXVldWUsIEFsdGVyZWRUYWJsZUluZm8gKnRhYiwgUmVsYXRpb24KIHN0YXRpYyB2b2lk IEFURXhlY1NwbGl0UGFydGl0aW9uKExpc3QgKip3cXVldWUsIEFsdGVyZWRUYWJsZUluZm8gKnRh YiwKIAkJCQkJCQkJIFJlbGF0aW9uIHJlbCwgUGFydGl0aW9uQ21kICpjbWQsCiAJCQkJCQkJCSBB bHRlclRhYmxlVXRpbGl0eUNvbnRleHQgKmNvbnRleHQpOworc3RhdGljIGJvb2wgaW5kZXhfY2hl Y2tfbm90bnVsbChSZWxhdGlvbiByZWxhdGlvbiwgTGlzdCAqbm90bnVsbF9hdHRudW1zKTsKIAog LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQogICoJCURlZmluZVJlbGF0aW9uCkBAIC02MjUxLDYgKzYyNTUsOSBAQCBBVFJl d3JpdGVUYWJsZShBbHRlcmVkVGFibGVJbmZvICp0YWIsIE9pZCBPSUROZXdIZWFwKQogCQkJCW5l ZWRzY2FuID0gdHJ1ZTsKIAkJCQljb24tPnF1YWxzdGF0ZSA9IEV4ZWNQcmVwYXJlRXhwcigoRXhw ciAqKSBleHBhbmRfZ2VuZXJhdGVkX2NvbHVtbnNfaW5fZXhwcihjb24tPnF1YWwsIG9sZHJlbCwg MSksIGVzdGF0ZSk7CiAJCQkJYnJlYWs7CisJCQljYXNlIENPTlNUUl9OT1ROVUxMOgorCQkJCS8q IE5vdGhpbmcgdG8gZG8gaGVyZSAqLworCQkJCWJyZWFrOwogCQkJY2FzZSBDT05TVFJfRk9SRUlH TjoKIAkJCQkvKiBOb3RoaW5nIHRvIGRvIGhlcmUgKi8KIAkJCQlicmVhazsKQEAgLTYzMDQsOSAr NjMxMSw3NCBAQCBBVFJld3JpdGVUYWJsZShBbHRlcmVkVGFibGVJbmZvICp0YWIsIE9pZCBPSURO ZXdIZWFwKQogCQkJCQkJCQkJCQkJCQl3aG9sZWF0dC0+YXR0bnVtKTsKIAkJCX0KIAkJfQotCQlp ZiAobm90bnVsbF9hdHRycyB8fCBub3RudWxsX3ZpcnR1YWxfYXR0cnMpCisJfQorCisJLyoKKwkg KiBUaGUgY29uZGl0aW9ucyBmb3IgdXNpbmcgaW5kZXhzY2FuIG1lY2hhbmlzbSBmYXN0IHZlcmlm eWluZyBub3QtbnVsbAorCSAqIGNvbnN0cmFpbnRzIGFyZSBxdWl0ZSBzdHJpY3QuIEFsbCBvZiB0 aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgbXVzdCBiZQorCSAqIG1ldC4KKwkgKgorCSAqIDEuIEFs dGVyZWRUYWJsZUluZm8tPnZlcmlmeV9uZXdfbm90bnVsbCBpcyB0cnVlLgorCSAqCisJICogMi4g Tm8gdGFibGUgc2NhbiAoZS5nLiwgZm9yIENIRUNLIGNvbnN0cmFpbnQgdmVyaWZpY2F0aW9uKSBv ciB0YWJsZQorCSAqIHJld3JpdGUgaXMgZXhwZWN0ZWQgbGF0ZXIsIGlmIG9uZSBpcywgdXNpbmcg aW5kZXhzY2FuIHdvdWxkIGp1c3Qgd2FzdGVzCisJICogY3ljbGVzLgorCSAqCisJICogMy4gSW5k ZXhlcyBjYW5ub3QgYmUgY3JlYXRlZCBvbiB2aXJ0dWFsIGdlbmVyYXRlZCBjb2x1bW5zLCBzbyBm YXN0CisJICogY2hlY2tpbmcgbm90LW51bGwgY29uc3RyYWludHMgaXMgbm90IGFwcGxpY2FibGUg dG8gdGhlbS4KKwkgKgorCSAqIDQuIFRoZSByZWxhdGlvbiBtdXN0IGJlIGEgcGxhaW4gdGFibGUu CisJICoKKwkgKiA1LiBUbyBwcmV2ZW50IHBvc3NpYmxlIGNvbmN1cnJlbmN5IGlzc3VlcywgdGhl IHRhYmxlIG11c3QgYWxyZWFkeSBiZQorCSAqIGxvY2tlZCB3aXRoIGFuIEFjY2Vzc0V4Y2x1c2l2 ZUxvY2ssIHdoaWNoIGlzIHRoZSBsb2NrIG9idGFpbmVkIGR1cmluZworCSAqIEFMVEVSIFRBQkxF IFNFVCBOT1QgTlVMTC4KKwkgKi8KKwlpZiAoIW5lZWRzY2FuICYmCisJCW5ld3JlbCA9PSBOVUxM ICYmCisJCXRhYi0+dmVyaWZ5X25ld19ub3RudWxsICYmCisJCW5vdG51bGxfdmlydHVhbF9hdHRy cyA9PSBOSUwgJiYKKwkJb2xkcmVsLT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9SRUxBVElP TiAmJgorCQlDaGVja1JlbGF0aW9uTG9ja2VkQnlNZShvbGRyZWwsIEFjY2Vzc0V4Y2x1c2l2ZUxv Y2ssIGZhbHNlKSkKKwl7CisJCUxpc3QJICAgKm5vdG51bGxfYXR0bnVtcyA9IE5JTDsKKworCQlB c3NlcnQoIXRhYi0+cmV3cml0ZSk7CisKKwkJZm9yZWFjaChsLCB0YWItPmNvbnN0cmFpbnRzKQor CQl7CisJCQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHRyOworCQkJTmV3Q29uc3RyYWludCAqY29uID0g bGZpcnN0KGwpOworCisJCQkvKgorCQkJICogU2tpcCBhbnkgY29uc3RyYWludCB0aGF0IGlzIG5v dCBhIE5PVCBOVUxMIGNvbnN0cmFpbnQuIFdlCisJCQkgKiBjYW5ub3Qgc2ltcGx5IHJhaXNlIGFu IGVycm9yIGhlcmUsIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhCisJCQkgKiBGT1JFSUdOIEtFWSAo ZXZlbiBpZiBpdCBpc24ndCBhIENIRUNLIGNvbnN0cmFpbnQpLgorCQkJICovCisJCQlpZiAoY29u LT5jb250eXBlICE9IENPTlNUUl9OT1ROVUxMKQorCQkJCWNvbnRpbnVlOworCisJCQlhdHRyID0g VHVwbGVEZXNjQXR0cihuZXdUdXBEZXNjLCBjb24tPmF0dG51bSAtIDEpOworCisJCQlpZiAoYXR0 ci0+YXR0aXNkcm9wcGVkKQorCQkJCWNvbnRpbnVlOworCisJCQlBc3NlcnQoYXR0ci0+YXR0bm90 bnVsbCk7CisJCQlBc3NlcnQoYXR0ci0+YXR0bnVtID09IGNvbi0+YXR0bnVtKTsKKwkJCUFzc2Vy dChhdHRyLT5hdHRnZW5lcmF0ZWQgIT0gQVRUUklCVVRFX0dFTkVSQVRFRF9WSVJUVUFMKTsKKwor CQkJbm90bnVsbF9hdHRudW1zID0gbGlzdF9hcHBlbmRfdW5pcXVlX2ludChub3RudWxsX2F0dG51 bXMsCisJCQkJCQkJCQkJCQkJIGF0dHItPmF0dG51bSk7CisJCX0KKworCQlpZiAobm90bnVsbF9h dHRudW1zICE9IE5JTCAmJiBpbmRleF9jaGVja19ub3RudWxsKG9sZHJlbCwgbm90bnVsbF9hdHRu dW1zKSkKKwkJCWVyZXBvcnQoREVCVUcxLAorCQkJCQllcnJtc2dfaW50ZXJuYWwoImFsbCBuZXcg bm90LW51bGwgY29uc3RyYWludHMgb24gcmVsYXRpb24gXCIlc1wiIGhhdmUgYmVlbiB2YWxpZGF0 ZWQgYnkgdXNpbmcgaW5kZXggc2NhbiIsCisJCQkJCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFt ZShvbGRyZWwpKSk7CisJCWVsc2UKIAkJCW5lZWRzY2FuID0gdHJ1ZTsKIAl9CisJZWxzZSBpZiAo bm90bnVsbF9hdHRycyB8fCBub3RudWxsX3ZpcnR1YWxfYXR0cnMpCisJCW5lZWRzY2FuID0gdHJ1 ZTsKIAogCWlmIChuZXdyZWwgfHwgbmVlZHNjYW4pCiAJewpAQCAtODAwOSw2ICs4MDgxLDcgQEAg QVRFeGVjU2V0Tm90TnVsbChMaXN0ICoqd3F1ZXVlLCBSZWxhdGlvbiByZWwsIGNoYXIgKmNvbk5h bWUsIGNoYXIgKmNvbE5hbWUsCiAJQ29va2VkQ29uc3RyYWludCAqY2NvbjsKIAlMaXN0CSAgICpj b29rZWQ7CiAJYm9vbAkJaXNfbm9faW5oZXJpdCA9IGZhbHNlOworCUFsdGVyZWRUYWJsZUluZm8g KnRhYiA9IEFUR2V0UXVldWVFbnRyeSh3cXVldWUsIHJlbCk7OwogCiAJLyogR3VhcmQgYWdhaW5z dCBzdGFjayBvdmVyZmxvdyBkdWUgdG8gb3Zlcmx5IGRlZXAgaW5oZXJpdGFuY2UgdHJlZS4gKi8K IAljaGVja19zdGFja19kZXB0aCgpOwpAQCAtODEzNyw2ICs4MjEwLDI1IEBAIEFURXhlY1NldE5v dE51bGwoTGlzdCAqKndxdWV1ZSwgUmVsYXRpb24gcmVsLCBjaGFyICpjb25OYW1lLCBjaGFyICpj b2xOYW1lLAogCWNvb2tlZCA9IEFkZFJlbGF0aW9uTmV3Q29uc3RyYWludHMocmVsLCBOSUwsIGxp c3RfbWFrZTEoY29uc3RyYWludCksCiAJCQkJCQkJCQkgICBmYWxzZSwgIXJlY3Vyc2luZywgZmFs c2UsIE5VTEwpOwogCWNjb24gPSBsaW5pdGlhbChjb29rZWQpOworCisJQXNzZXJ0KGNjb24tPmNv bnR5cGUgPT0gQ09OU1RSX05PVE5VTEwpOworCisJLyoKKwkgKiBXZSBtYXkgdXNpbmcgaW5kZXhz Y2FuIG1lY2hhbmlzbSB0byB2ZXJ0aWZ5IHRoaXMgbm90LW51bGwgY29uc3RyYWludCBpbgorCSAq IFBoYXNlMy4gIEFkZCB0aGlzIHRvLWJlLXZhbGlkYXRlZCBub3QtbnVsbCBjb25zdHJhaW50IHRv IFBoYXNlIDMncworCSAqIHF1ZXVlLgorCSAqLworCWlmICghY2Nvbi0+c2tpcF92YWxpZGF0aW9u KQorCXsKKwkJTmV3Q29uc3RyYWludCAqbmV3Y29uID0gcGFsbG9jMF9vYmplY3QoTmV3Q29uc3Ry YWludCk7CisKKwkJbmV3Y29uLT5uYW1lID0gY2Nvbi0+bmFtZTsKKwkJbmV3Y29uLT5jb250eXBl ID0gQ09OU1RSX05PVE5VTEw7CisJCW5ld2Nvbi0+YXR0bnVtID0gY2Nvbi0+YXR0bnVtOworCisJ CXRhYi0+Y29uc3RyYWludHMgPSBsYXBwZW5kKHRhYi0+Y29uc3RyYWludHMsIG5ld2Nvbik7CisJ fQorCiAJT2JqZWN0QWRkcmVzc1NldChhZGRyZXNzLCBDb25zdHJhaW50UmVsYXRpb25JZCwgY2Nv bi0+Y29ub2lkKTsKIAogCS8qIE1hcmsgcGdfYXR0cmlidXRlLmF0dG5vdG51bGwgZm9yIHRoZSBj b2x1bW4gYW5kIHF1ZXVlIHZhbGlkYXRpb24gKi8KQEAgLTEwMDMwLDEzICsxMDEyMiwxNSBAQCBB VEFkZENoZWNrTk5Db25zdHJhaW50KExpc3QgKip3cXVldWUsIEFsdGVyZWRUYWJsZUluZm8gKnRh YiwgUmVsYXRpb24gcmVsLAogCXsKIAkJQ29va2VkQ29uc3RyYWludCAqY2NvbiA9IChDb29rZWRD b25zdHJhaW50ICopIGxmaXJzdChsY29uKTsKIAotCQlpZiAoIWNjb24tPnNraXBfdmFsaWRhdGlv biAmJiBjY29uLT5jb250eXBlICE9IENPTlNUUl9OT1ROVUxMKQorCQlpZiAoIWNjb24tPnNraXBf dmFsaWRhdGlvbikKIAkJewogCQkJTmV3Q29uc3RyYWludCAqbmV3Y29uOwogCiAJCQluZXdjb24g PSBwYWxsb2MwX29iamVjdChOZXdDb25zdHJhaW50KTsKIAkJCW5ld2Nvbi0+bmFtZSA9IGNjb24t Pm5hbWU7CiAJCQluZXdjb24tPmNvbnR5cGUgPSBjY29uLT5jb250eXBlOworCQkJaWYgKGNjb24t PmNvbnR5cGUgPT0gQ09OU1RSX05PVE5VTEwpCisJCQkJbmV3Y29uLT5hdHRudW0gPSBjY29uLT5h dHRudW07CiAJCQluZXdjb24tPnF1YWwgPSBjY29uLT5leHByOwogCiAJCQl0YWItPmNvbnN0cmFp bnRzID0gbGFwcGVuZCh0YWItPmNvbnN0cmFpbnRzLCBuZXdjb24pOwpAQCAtMTM0NzQsNiArMTM1 NjgsNyBAQCBRdWV1ZU5OQ29uc3RyYWludFZhbGlkYXRpb24oTGlzdCAqKndxdWV1ZSwgUmVsYXRp b24gY29ucmVsLCBSZWxhdGlvbiByZWwsCiAJTGlzdAkgICAqY2hpbGRyZW4gPSBOSUw7CiAJQXR0 ck51bWJlcglhdHRudW07CiAJY2hhcgkgICAqY29sbmFtZTsKKwlOZXdDb25zdHJhaW50ICpuZXdj b247CiAKIAljb24gPSAoRm9ybV9wZ19jb25zdHJhaW50KSBHRVRTVFJVQ1QoY29udHVwbGUpOwog CUFzc2VydChjb24tPmNvbnR5cGUgPT0gQ09OU1RSQUlOVF9OT1ROVUxMKTsKQEAgLTEzNTM3LDcg KzEzNjMyLDIxIEBAIFF1ZXVlTk5Db25zdHJhaW50VmFsaWRhdGlvbihMaXN0ICoqd3F1ZXVlLCBS ZWxhdGlvbiBjb25yZWwsIFJlbGF0aW9uIHJlbCwKIAkvKiBTZXQgYXR0bm90bnVsbCBhcHByb3By aWF0ZWx5IHdpdGhvdXQgcXVldWVpbmcgYW5vdGhlciB2YWxpZGF0aW9uICovCiAJc2V0X2F0dG5v dG51bGwoTlVMTCwgcmVsLCBhdHRudW0sIHRydWUsIGZhbHNlKTsKIAorCS8qCisJICogUXVldWUg dmFsaWRhdGlvbiBmb3IgcGhhc2UgMy4gQUxURVIgVEFCTEUgU0VUIE5PVCBOVUxMIGFkZHMgYSBO T1QgTlVMTAorCSAqIGNvbnN0cmFpbnQgKE5ld0NvbnN0cmFpbnQpIHRvIEFsdGVyZWRUYWJsZUlu Zm8tPmNvbnN0cmFpbnRzOyBmb3IKKwkgKiBjb25zaXN0ZW5jeSwgd2UgZG8gdGhlIHNhbWUgaGVy ZS4gVGhpcyBzZXR1cCBhbGxvd3MgcGhhc2UgMworCSAqIChBVFJld3JpdGVUYWJsZSkgdG8gcXVp Y2tseSB2YWxpZGF0ZSB0aGUgY29sdW1uJ3MgTlVMTCBzdGF0dXMgdXNpbmcgYW4KKwkgKiBpbmRl eCBzY2FuLCBpZiBhbGwgY29uZGl0aW9ucyBhcmUgbWV0LgorCSAqLworCW5ld2NvbiA9IHBhbGxv YzBfb2JqZWN0KE5ld0NvbnN0cmFpbnQpOworCW5ld2Nvbi0+bmFtZSA9IGNvbG5hbWU7CisJbmV3 Y29uLT5jb250eXBlID0gQ09OU1RSX05PVE5VTEw7CisJbmV3Y29uLT5hdHRudW0gPSBhdHRudW07 CisKKwkvKiBGaW5kIG9yIGNyZWF0ZSB3b3JrIHF1ZXVlIGVudHJ5IGZvciB0aGlzIHRhYmxlICov CiAJdGFiID0gQVRHZXRRdWV1ZUVudHJ5KHdxdWV1ZSwgcmVsKTsKKwl0YWItPmNvbnN0cmFpbnRz ID0gbGFwcGVuZCh0YWItPmNvbnN0cmFpbnRzLCBuZXdjb24pOwogCXRhYi0+dmVyaWZ5X25ld19u b3RudWxsID0gdHJ1ZTsKIAogCS8qCkBAIC0yMzYwMiwzICsyMzcxMSwxNjYgQEAgQVRFeGVjU3Bs aXRQYXJ0aXRpb24oTGlzdCAqKndxdWV1ZSwgQWx0ZXJlZFRhYmxlSW5mbyAqdGFiLCBSZWxhdGlv biByZWwsCiAJLyogUmVzdG9yZSB0aGUgdXNlcmlkIGFuZCBzZWN1cml0eSBjb250ZXh0LiAqLwog CVNldFVzZXJJZEFuZFNlY0NvbnRleHQoc2F2ZV91c2VyaWQsIHNhdmVfc2VjX2NvbnRleHQpOwog fQorCisvKgorICogbm90bnVsbF9hdHRudW1zOiBsaXN0IG9mIGF0dHJpYnV0ZSBudW1iZXJzIGZv ciBhbGwgbmV3bHkgYWRkZWQgTk9UIE5VTEwKKyAqIGNvbnN0cmFpbnRzLgorICoKKyAqIEZvciBl YWNoIE5PVCBOVUxMIGF0dHJpYnV0ZSwgZmlyc3QgY2hlY2sgd2hldGhlciB0aGUgcmVsYXRpb24g aGFzIGEgc3VpdGFibGUKKyAqIGluZGV4IHRvIGZldGNoIHRoYXQgYXR0cmlidXRlIGNvbnRlbnQu IElmIHNvLCB1c2luZyBpbmRleHNjYW4gdG8gdmVyaWZ5IHRoYXQKKyAqIGF0dHJpYnV0ZSBjb250 YWlucyBubyBOVUxMIHZhbHVlcy4KKyAqCisgKiBSZXR1cm5pbmcgdHJ1ZSBtZWFucyB0aGUgbmV3 IE5PVCBOVUxMIGNvbnN0cmFpbnRzIGFyZSBmdWxseSB2ZXJpZmllZCBhbmQgbm8KKyAqIGV4dHJh IHRhYmxlIHNjYW5zIGFyZSBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyBib29sCitpbmRleF9jaGVj a19ub3RudWxsKFJlbGF0aW9uIHJlbGF0aW9uLCBMaXN0ICpub3RudWxsX2F0dG51bXMpCit7CisJ U3lzU2NhbkRlc2MgaW5kc2NhbjsKKwlTY2FuS2V5RGF0YSBza2V5OworCUhlYXBUdXBsZQlodHVw OworCUxpc3QJICAgKmlkeHMgPSBOSUw7CisJTGlzdAkgICAqYXR0bnVtcyA9IE5JTDsKKwlib29s CQlhbGxfbm90X251bGwgPSB0cnVlOworCUxpc3RDZWxsICAgKmxjLAorCQkJICAgKmxjMjsKKwor CVJlbGF0aW9uCXBnX2luZGV4ID0gdGFibGVfb3BlbihJbmRleFJlbGF0aW9uSWQsIEFjY2Vzc1No YXJlTG9jayk7CisKKwkvKiBQcmVwYXJlIHRvIHNjYW4gcGdfaW5kZXggZm9yIGVudHJpZXMgaGF2 aW5nIGluZHJlbGlkID0gdGhpcyByZWwgKi8KKwlTY2FuS2V5SW5pdCgmc2tleSwKKwkJCQlBbnVt X3BnX2luZGV4X2luZHJlbGlkLAorCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwKKwkJCQlGX09J REVRLAorCQkJCU9iamVjdElkR2V0RGF0dW0oUmVsYXRpb25HZXRSZWxpZChyZWxhdGlvbikpKTsK KworCWluZHNjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4ocGdfaW5kZXgsIEluZGV4SW5kcmVsaWRJ bmRleElkLCB0cnVlLAorCQkJCQkJCQkgTlVMTCwgMSwgJnNrZXkpOworCisJd2hpbGUgKEhlYXBU dXBsZUlzVmFsaWQoaHR1cCA9IHN5c3RhYmxlX2dldG5leHQoaW5kc2NhbikpKQorCXsKKwkJRm9y bV9wZ19hdHRyaWJ1dGUgYXR0cjsKKwkJUmVsYXRpb24JaW5kZXhfcmVsOworCisJCUZvcm1fcGdf aW5kZXggaW5kZXggPSAoRm9ybV9wZ19pbmRleCkgR0VUU1RSVUNUKGh0dXApOworCisJCS8qCisJ CSAqIFdlIG9ubHkgdXNlIG5vbi1kZWZlcnJlZCwgdmFsaWQsIGFuZCBsaXZlIGItdHJlZSBpbmRl eGVzIHRvIHZlcmlmeQorCQkgKiBOT1QgTlVMTCBjb25zdHJhaW50cy4KKwkJICovCisJCWlmICgh aW5kZXgtPmluZGltbWVkaWF0ZSB8fCAhaW5kZXgtPmluZGlzdmFsaWQgfHwgIWluZGV4LT5pbmRp c2xpdmUpCisJCQljb250aW51ZTsKKworCQkvKiBjYW5ub3QgdXNlIGV4cHJlc3Npb24gaW5kZXgg b3IgcGFydGlhbCBpbmRleCB0b28gKi8KKwkJaWYgKCFoZWFwX2F0dGlzbnVsbChodHVwLCBBbnVt X3BnX2luZGV4X2luZGV4cHJzLCBOVUxMKSB8fAorCQkJIWhlYXBfYXR0aXNudWxsKGh0dXAsIEFu dW1fcGdfaW5kZXhfaW5kcHJlZCwgTlVMTCkpCisJCQljb250aW51ZTsKKworCQlpbmRleF9yZWwg PSBpbmRleF9vcGVuKGluZGV4LT5pbmRleHJlbGlkLCBBY2Nlc3NTaGFyZUxvY2spOworCisJCWlm IChpbmRleF9yZWwtPnJkX3JlbC0+cmVsYW0gIT0gQlRSRUVfQU1fT0lEKQorCQl7CisJCQlpbmRl eF9jbG9zZShpbmRleF9yZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwkJCWNvbnRpbnVlOworCQl9 CisKKwkJYXR0ciA9IFR1cGxlRGVzY0F0dHIoUmVsYXRpb25HZXREZXNjcihyZWxhdGlvbiksIChp bmRleC0+aW5ka2V5LnZhbHVlc1swXSAtIDEpKTsKKworCQlpZiAobGlzdF9tZW1iZXJfaW50KG5v dG51bGxfYXR0bnVtcywgYXR0ci0+YXR0bnVtKSAmJgorCQkJIWxpc3RfbWVtYmVyX2ludChhdHRu dW1zLCBhdHRyLT5hdHRudW0pKQorCQl7CisJCQlhdHRudW1zID0gbGFwcGVuZF9pbnQoYXR0bnVt cywgYXR0ci0+YXR0bnVtKTsKKwkJCWlkeHMgPSBsYXBwZW5kX29pZChpZHhzLCBpbmRleC0+aW5k ZXhyZWxpZCk7CisJCX0KKworCQlpbmRleF9jbG9zZShpbmRleF9yZWwsIE5vTG9jayk7CisJfQor CXN5c3RhYmxlX2VuZHNjYW4oaW5kc2Nhbik7CisJdGFibGVfY2xvc2UocGdfaW5kZXgsIEFjY2Vz c1NoYXJlTG9jayk7CisKKwkvKgorCSAqIFZlcmlmeSBOT1QgTlVMTCBjb25zdHJhaW50cyB1c2lu ZyBhIHN1aXRhYmxlIGluZGV4LCBmYWxsaW5nIGJhY2sgdG8gYQorCSAqIGZ1bGwgdGFibGUgc2Nh biBpZiBhIHN1aXRhYmxlIGluZGV4IGlzIG5vdCBwcmVzZW50LgorCSAqLworCWlmIChhdHRudW1z ID09IE5JTCB8fAorCQlsaXN0X2xlbmd0aChub3RudWxsX2F0dG51bXMpICE9IGxpc3RfbGVuZ3Ro KGF0dG51bXMpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3JlYWNoX2ludChhdHRubywgbm90bnVs bF9hdHRudW1zKQorCXsKKwkJaWYgKCFsaXN0X21lbWJlcl9pbnQoYXR0bnVtcywgYXR0bm8pKQor CQkJcmV0dXJuIGZhbHNlOworCX0KKworCWZvcmJvdGgobGMsIGF0dG51bXMsIGxjMiwgaWR4cykK Kwl7CisJCVNuYXBzaG90RGF0YSBEaXJ0eVNuYXBzaG90OworCQlJbmRleFNjYW5EZXNjIGluZGV4 X3NjYW47CisJCVNjYW5LZXlEYXRhIHNjYW5rZXlzW0lOREVYX01BWF9LRVlTXTsKKwkJQXR0ck51 bWJlcglza19hdHRubyA9IC0xOworCQlBdHRyTnVtYmVyCWF0dG5vID0gbGZpcnN0X2ludChsYyk7 CisJCU9pZAkJCWluZGV4b2lkID0gbGZpcnN0X29pZChsYzIpOworCisJCVJlbGF0aW9uCWlkeHJl bCA9IGluZGV4X29wZW4oaW5kZXhvaWQsIE5vTG9jayk7CisJCUluZGV4SW5mbyAgKmluZGV4SW5m byA9IEJ1aWxkSW5kZXhJbmZvKGlkeHJlbCk7CisJCWludAkJCWluZG5rZXlhdHRzID0gSW5kZXhS ZWxhdGlvbkdldE51bWJlck9mS2V5QXR0cmlidXRlcyhpZHhyZWwpOworCisJCVR1cGxlVGFibGVT bG90ICpleGlzdGluZ19zbG90ID0gdGFibGVfc2xvdF9jcmVhdGUocmVsYXRpb24sIE5VTEwpOwor CisJCS8qCisJCSAqIFNlYXJjaCB0aGUgdHVwbGVzIHRoYXQgYXJlIGluIHRoZSBpbmRleCBmb3Ig YW55IHZpb2xhdGlvbnMsCisJCSAqIGluY2x1ZGluZyB0dXBsZXMgdGhhdCBhcmVuJ3QgdmlzaWJs ZSB5ZXQuCisJCSAqLworCQlJbml0RGlydHlTbmFwc2hvdChEaXJ0eVNuYXBzaG90KTsKKworCQlp ZiAoaW5kZXhJbmZvLT5paV9JbmRleEF0dHJOdW1iZXJzWzBdID09IGF0dG5vKQorCQkJc2tfYXR0 bm8gPSAxOworCQllbHNlCisJCQllbG9nKEVSUk9SLCAiY2FjaGUgbG9va3VwIGZhaWxlZCBmb3Ig YXR0cmlidXRlIG51bWJlciAlZCBvbiBpbmRleCAldSIsCisJCQkJIGluZGV4b2lkLCBhdHRubyk7 CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRua2V5YXR0czsgaSsrKQorCQl7CisJCQkvKiBz ZXQgdXAgYW4gSVMgTlVMTCBzY2FuIGtleSBzbyB0aGF0IHdlIGlnbm9yZSBub3QgbnVsbHMgKi8K KwkJCVNjYW5LZXlFbnRyeUluaXRpYWxpemUoJnNjYW5rZXlzW2ldLAorCQkJCQkJCQkgICBTS19J U05VTEwgfCBTS19TRUFSQ0hOVUxMLAorCQkJCQkJCQkgICBza19hdHRubywJLyogaW5kZXggY29s IHRvIHNjYW4gKi8KKwkJCQkJCQkJICAgSW52YWxpZFN0cmF0ZWd5LCAvKiBubyBzdHJhdGVneSAq LworCQkJCQkJCQkgICBJbnZhbGlkT2lkLAkvKiBubyBzdHJhdGVneSBzdWJ0eXBlICovCisJCQkJ CQkJCSAgIEludmFsaWRPaWQsCS8qIG5vIGNvbGxhdGlvbiAqLworCQkJCQkJCQkgICBJbnZhbGlk T2lkLAkvKiBubyByZWcgcHJvYyBmb3IgdGhpcyAqLworCQkJCQkJCQkgICAoRGF0dW0pIDApOwkv KiBjb25zdGFudCAqLworCQl9CisKKwkJaW5kZXhfc2NhbiA9IGluZGV4X2JlZ2luc2NhbihyZWxh dGlvbiwKKwkJCQkJCQkJCSBpZHhyZWwsCisJCQkJCQkJCQkgJkRpcnR5U25hcHNob3QsCisJCQkJ CQkJCQkgTlVMTCwKKwkJCQkJCQkJCSBpbmRua2V5YXR0cywKKwkJCQkJCQkJCSAwLAorCQkJCQkJ CQkJIFNPX05PTkUpOworCQlpbmRleF9yZXNjYW4oaW5kZXhfc2Nhbiwgc2NhbmtleXMsIGluZG5r ZXlhdHRzLCBOVUxMLCAwKTsKKworCQl3aGlsZSAoaW5kZXhfZ2V0bmV4dF9zbG90KGluZGV4X3Nj YW4sIEZvcndhcmRTY2FuRGlyZWN0aW9uLCBleGlzdGluZ19zbG90KSkKKwkJeworCQkJLyoKKwkJ CSAqIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgZm91bmQgdGhhdCBzb21lIGF0dHJpYnV0ZSB2YWx1 ZSBpcyBOVUxMLgorCQkJICogYnRyZWUgaW5kZXhlcyBhcmUgbmV2ZXIgbG9zc3ksIHdlIGRvbid0 IG5lZWQgcmVjaGVjayB0aGUKKwkJCSAqIGNvbmRpdGlvbi4KKwkJCSAqLworCQkJYWxsX25vdF9u dWxsID0gZmFsc2U7CisJCQlicmVhazsKKwkJfQorCisJCWluZGV4X2VuZHNjYW4oaW5kZXhfc2Nh bik7CisJCWluZGV4X2Nsb3NlKGlkeHJlbCwgTm9Mb2NrKTsKKwkJRXhlY0Ryb3BTaW5nbGVUdXBs ZVRhYmxlU2xvdChleGlzdGluZ19zbG90KTsKKworCQkvKiBleGl0IGVhcmxpZXIgKi8KKwkJaWYg KCFhbGxfbm90X251bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9 CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbWlzYy9tZXNvbi5idWlsZCBiL3Ny Yy90ZXN0L21vZHVsZXMvdGVzdF9taXNjL21lc29uLmJ1aWxkCmluZGV4IDFiMjVkOThmN2YzLi5l MDJhMmNiMGM0MiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X21pc2MvbWVzb24u YnVpbGQKKysrIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X21pc2MvbWVzb24uYnVpbGQKQEAgLTIw LDYgKzIwLDcgQEAgdGVzdHMgKz0gewogICAgICAgJ3QvMDA5X2xvZ190ZW1wX2ZpbGVzLnBsJywK ICAgICAgICd0LzAxMF9pbmRleF9jb25jdXJyZW50bHlfdXBzZXJ0LnBsJywKICAgICAgICd0LzAx MV9sb2NrX3N0YXRzLnBsJywKKyAgICAgICd0LzAxMl9pbmRleHNjYW5fdmFsaWRhdGVfbm90bnVs bC5wbCcsCiAgICAgXSwKICAgICAjIFRoZSBpbmplY3Rpb24gcG9pbnRzIGFyZSBjbHVzdGVyLXdp ZGUsIHNvIGRpc2FibGUgaW5zdGFsbGNoZWNrCiAgICAgJ3J1bm5pbmdjaGVjayc6IGZhbHNlLApk aWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X21pc2MvdC8wMTJfaW5kZXhzY2FuX3Zh bGlkYXRlX25vdG51bGwucGwgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbWlzYy90LzAxMl9pbmRl eHNjYW5fdmFsaWRhdGVfbm90bnVsbC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwMDAwMC4uNTNlMzg1ODg3NDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVz L3Rlc3RfbWlzYy90LzAxMl9pbmRleHNjYW5fdmFsaWRhdGVfbm90bnVsbC5wbApAQCAtMCwwICsx LDExOCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMjYsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3Bt ZW50IEdyb3VwCisKKyMgVmVyaWZ5IHRoYXQgaW5kZXhzY2FuIG1lY2hhbmlzbSBjYW4gc3BlZWR1 cCBBTFRFUiBUQUJMRSBBREQgTk9UIE5VTEwKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5ncyBG QVRBTCA9PiAnYWxsJzsKKwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXI7Cit1c2UgUG9z dGdyZVNRTDo6VGVzdDo6VXRpbHM7Cit1c2UgVGVzdDo6TW9yZTsKK3VzZSBUaW1lOjpIaVJlcyBx dyh1c2xlZXApOworCisjIEluaXRpYWxpemUgYSB0ZXN0IGNsdXN0ZXIKK215ICRub2RlID0gUG9z dGdyZVNRTDo6VGVzdDo6Q2x1c3Rlci0+bmV3KCdwcmltYXJ5Jyk7Ciskbm9kZS0+aW5pdCgpOwor IyBUdXJuIG1lc3NhZ2UgbGV2ZWwgdXAgdG8gREVCVUcxIHNvIHRoYXQgd2UgZ2V0IHRoZSBtZXNz YWdlcyB3ZSB3YW50IHRvIHNlZQorJG5vZGUtPmFwcGVuZF9jb25mKCdwb3N0Z3Jlc3FsLmNvbmYn LCAnY2xpZW50X21pbl9tZXNzYWdlcyA9IERFQlVHMScpOworJG5vZGUtPnN0YXJ0OworCisjIFJ1 biBhIFNRTCBjb21tYW5kIGFuZCByZXR1cm4gcHNxbCdzIHN0ZGVyciAoaW5jbHVkaW5nIGRlYnVn IG1lc3NhZ2VzKQorc3ViIHJ1bl9zcWxfY29tbWFuZAoreworCW15ICRzcWwgPSBzaGlmdDsKKwlt eSAkc3RkZXJyOworCisJJG5vZGUtPnBzcWwoCisJCSdwb3N0Z3JlcycsCisJCSRzcWwsCisJCXN0 ZGVyciA9PiBcJHN0ZGVyciwKKwkJb25fZXJyb3JfZGllID0+IDEsCisJCW9uX2Vycm9yX3N0b3Ag PT4gMSk7CisJcmV0dXJuICRzdGRlcnI7Cit9CisKKyMgVmVyaWZ5IHRoYXQgcnVuX3NxbF9jb21t YW5kIG91dHB1dCBjb25maXJtcyBhbiBpbmRleCBzY2FuIGlzIHVzZWQgZm9yIHRoZSBOT1QgTlVM TCBjaGVjay4KK3N1YiBpc19pbmRleHNjYW5fdmVyaXRpZnlfbm90bnVsbAoreworCW15ICRvdXRw dXQgPSBzaGlmdDsKKwlyZXR1cm4gaW5kZXgoJG91dHB1dCwgJ0RFQlVHOiAgYWxsIG5ldyBub3Qt bnVsbCBjb25zdHJhaW50cyBvbiByZWxhdGlvbicpICE9IC0xOworfQorCitteSAkb3V0cHV0Owor Citub3RlICJ0ZXN0IGFsdGVyIHRhYmxlIFNFVCBOT1QgTlVMTCB1c2luZyBpbmRleHNjYW4gd2l0 aCBwYXJ0aXRpb25lZCB0YWJsZSI7CisKK3J1bl9zcWxfY29tbWFuZCgKKyAgICAnQ1JFQVRFIFRB QkxFIHRwX25vdG51bGwgKGEgaW50LCBiIGludCwgYyBpbnQsIGQgaW50LCBmMSBpbnQgZGVmYXVs dCAxLCBmMiBpbnQgZGVmYXVsdCAyLCBmMyBpbnQgZGVmYXVsdCAzKSBQQVJUSVRJT04gQlkgcmFu Z2UoYSk7CisgICAgIENSRUFURSBUQUJMRSB0cF9ub3RudWxsXzEgcGFydGl0aW9uIG9mIHRwX25v dG51bGwgZm9yIHZhbHVlcyBmcm9tICggMSApIHRvICgxMCk7CisgICAgIENSRUFURSBUQUJMRSB0 cF9ub3RudWxsXzIgcGFydGl0aW9uIG9mIHRwX25vdG51bGwgZm9yIHZhbHVlcyBmcm9tICggMTAg KSB0byAoMjEpOworICAgICBJTlNFUlQgSU5UTyB0cF9ub3RudWxsKGEsYixjLGQpIFNFTEVDVCBn LCBnICsgMTAsIGcgKyAxNSwgZyBGUk9NIGdlbmVyYXRlX3NlcmllcygxLDE5KSBnOworICAgICBD UkVBVEUgSU5ERVggT04gdHBfbm90bnVsbChiKTsKKyAgICAgQ1JFQVRFIElOREVYIE9OIHRwX25v dG51bGwoYyk7CisJIENSRUFURSBJTkRFWCBPTiB0cF9ub3RudWxsKGQpOworICAgICBDUkVBVEUg SU5ERVggT04gdHBfbm90bnVsbChmMSkgSU5DTFVERSAoZjIpOworICAgICBDUkVBVEUgSU5ERVgg T04gdHBfbm90bnVsbCBVU0lORyBoYXNoIChmMyBpbnQ0X29wcyk7CisgICAgICcpOworCisjIFVz aW5nIGluZGV4IHNjYW4gZm9yIE5PVCBOVUxMIHZlcmlmaWNhdGlvbiByZXF1aXJlcyBldmVyeSBu b3QtbnVsbCBjb2x1bW4gbXVzdCBwb3NzZXNzIGEgc3VpdGFibGUgaW5kZXgKKyRvdXRwdXQgPSBy dW5fc3FsX2NvbW1hbmQoCisJJ0FMVEVSIFRBQkxFIHRwX25vdG51bGwgQUxURVIgQ09MVU1OIGEg U0VUIE5PVCBOVUxMLCBBREQgQ09OU1RSQUlOVCBjX25uIE5PVCBOVUxMIGMnKTsKK29rKCFpc19p bmRleHNjYW5fdmVyaXRpZnlfbm90bnVsbCgkb3V0cHV0KSwgJ2Nhbm5vdCB1c2UgaW5kZXhzY2Fu IHRvIHZlcmlmeSBub3QtbnVsbCBjb25zdHJhaW50cyBvbiB0YWJsZSB0cF9ub3RudWxsJyk7CisK KyMgQWxsIGNvbHVtbnMgaGF2ZSBpbmRleCBvbiBpdCwgT0sKKyRvdXRwdXQgPSBydW5fc3FsX2Nv bW1hbmQoCisJJ0FMVEVSIFRBQkxFIHRwX25vdG51bGwgQUxURVIgQ09MVU1OIGQgU0VUIE5PVCBO VUxMLCBBTFRFUiBDT0xVTU4gYyBTRVQgTk9UIE5VTEwsIEFMVEVSIENPTFVNTiBiIFNFVCBOT1Qg TlVMTDsnKTsKK29rKGlzX2luZGV4c2Nhbl92ZXJpdGlmeV9ub3RudWxsKCRvdXRwdXQpLAorCSd1 c2luZyBpbmRleHNjYW4gdG8gdmVyaWZ5IG5vdC1udWxsIGNvbnN0cmFpbnRzIG9uIGNvbHVtbiBi LCBjLCBkJyk7CitvayggJG91dHB1dCA9fgorCSAgbS9hbGwgbmV3IG5vdC1udWxsIGNvbnN0cmFp bnRzIG9uIHJlbGF0aW9uICJ0cF9ub3RudWxsXzEiIGhhdmUgYmVlbiB2YWxpZGF0ZWQgYnkgdXNp bmcgaW5kZXggc2Nhbi8sCisJJ2FsbCBuZXdseSBhZGRlZCBjb25zdHJhaW50cyBwcm92ZWQgYnkg aW5kZXhzY2FuJyk7CitvayggJG91dHB1dCA9fgorCSAgbS9hbGwgbmV3IG5vdC1udWxsIGNvbnN0 cmFpbnRzIG9uIHJlbGF0aW9uICJ0cF9ub3RudWxsXzIiIGhhdmUgYmVlbiB2YWxpZGF0ZWQgYnkg dXNpbmcgaW5kZXggc2Nhbi8sCisJJ2FsbCBuZXdseSBhZGRlZCBjb25zdHJhaW50cyBwcm92ZWQg YnkgaW5kZXhzY2FuJyk7CisKK3J1bl9zcWxfY29tbWFuZCgnQUxURVIgVEFCTEUgdHBfbm90bnVs bCBBTFRFUiBDT0xVTU4gYiBEUk9QIE5PVCBOVUxMOycpOworIyBOb3cgdXNpbmcgaW5kZXggc2Nh bnMgb24gcGFydGl0aW9ucyB0byBxdWlja2x5IHZlcmlmeSBOT1QgTlVMTCBjb25zdHJhaW50cwor JG91dHB1dCA9IHJ1bl9zcWxfY29tbWFuZCgnQUxURVIgVEFCTEUgdHBfbm90bnVsbF8xIEFMVEVS IENPTFVNTiBiIFNFVCBOT1QgTlVMTDsnKTsKK29rKGlzX2luZGV4c2Nhbl92ZXJpdGlmeV9ub3Ru dWxsKCRvdXRwdXQpLCAnaW5kZXggc2NhbiB2ZXJpZmllcyBOT1QgTlVMTCBmb3IgY29sdW1uIGIn KTsKKworcnVuX3NxbF9jb21tYW5kKCdBTFRFUiBUQUJMRSB0cF9ub3RudWxsIEFMVEVSIENPTFVN TiBiIERST1AgTk9UIE5VTEw7Jyk7CisjIENhbm5vdCB1c2UgaW5kZXhzY2FuIHRvIHZlcmlmeSBu b3QtbnVsbCBjb25zdHJhaW50IGlmIHRhYmxlIHJld3JpdGUgaGFwcGVucworJG91dHB1dCA9IHJ1 bl9zcWxfY29tbWFuZCgKKwknQUxURVIgVEFCTEUgdHBfbm90bnVsbCBBTFRFUiBDT0xVTU4gYiBT RVQgTk9UIE5VTEwsIEFMVEVSIENPTFVNTiBiIFNFVCBEQVRBIFRZUEUgYmlnaW50OycKKyk7Citv ayghaXNfaW5kZXhzY2FuX3Zlcml0aWZ5X25vdG51bGwoJG91dHB1dCksICd0YWJsZSByZXdyaXRl IG9uIHRwX25vdG51bGwsIGNhbm5vdCB1c2UgaW5kZXhzY2FuIHRvIHZlcmlmeSBub3QtbnVsbCBj b25zdHJhaW50cyBvbiBpdCcpOworCitydW5fc3FsX2NvbW1hbmQoJ0FMVEVSIFRBQkxFIHRwX25v dG51bGwgQUxURVIgQ09MVU1OIGQgRFJPUCBOT1QgTlVMTCcpOworCisjIENhbm5vdCB1c2UgaW5k ZXhzY2FuIGJlY2F1c2UgQUxURVIgVEFCTEUgVkFMSURBVEUgQ09OU1RSQUlOVCBvbmx5IGhvbGQK KyMgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrIGxvY2sgb24gdGhlIHRhYmxlCitydW5fc3FsX2Nv bW1hbmQoJ0FMVEVSIFRBQkxFIHRwX25vdG51bGwgQUREIENPTlNUUkFJTlQgdHBfbm90bnVsbF9k IE5PVCBOVUxMIGQgTk9UIFZBTElEOycpOworJG91dHB1dCA9IHJ1bl9zcWxfY29tbWFuZCgKKwkn QUxURVIgVEFCTEUgdHBfbm90bnVsbCBWQUxJREFURSBDT05TVFJBSU5UIHRwX25vdG51bGxfZDsn CispOworb2soIWlzX2luZGV4c2Nhbl92ZXJpdGlmeV9ub3RudWxsKCRvdXRwdXQpLCAnY2Fubm90 IHVzZSBpbmRleHNjYW4gZm9yIEFMVEVSIFRBQkxFIFZBTElEQVRFIENPTlNUUkFJTlQgY29tbWFu ZCcpOworCitydW5fc3FsX2NvbW1hbmQoJ0FMVEVSIFRBQkxFIHRwX25vdG51bGwgQUxURVIgQ09M VU1OIGQgRFJPUCBOT1QgTlVMTDsKKwkJCQlBTFRFUiBUQUJMRSB0cF9ub3RudWxsIEFERCBDT05T VFJBSU5UIHRwX25vdG51bGxfZCBOT1QgTlVMTCBkIE5PVCBWQUxJRDsnKTsKKworIyBIb3dldmVy IHRoaXMgd2lsbCBiZSBPSywgc2luY2UgQUxURVIgQ09MVU1OIFNFVCBOT1QgTlVMTCB3aWxsIGFj cXVpcmUgQWNjZXNzRXhjbHVzaXZlTG9jaworJG91dHB1dCA9IHJ1bl9zcWxfY29tbWFuZCgKKwkn QUxURVIgVEFCTEUgdHBfbm90bnVsbCBWQUxJREFURSBDT05TVFJBSU5UIHRwX25vdG51bGxfZCwg QUxURVIgQ09MVU1OIGIgU0VUIE5PVCBOVUxMOycKKyk7Citvayhpc19pbmRleHNjYW5fdmVyaXRp Znlfbm90bnVsbCgkb3V0cHV0KSwgJ3VzaW5nIGluZGV4c2NhbiB0byB2ZXJpZnkgbm90LW51bGwg Y29uc3RyYWludHMgb24gY29sdW1uIGIsIGMsIGQnKTsKKworIyBJbmRleHNjYW4gbWVjaGFuaXNt IHRvIHZlcmlmeSBOT1QgTlVMTCBjb25zdHJhaW50cyBjYW5ub3QgYXBwbHkgdG8gaW5kZXggSU5D TFVERSBjb2x1bW4KKyRvdXRwdXQgPSBydW5fc3FsX2NvbW1hbmQoCisJJ0FMVEVSIFRBQkxFIHRw X25vdG51bGwgQUREIENPTlNUUkFJTlQgbm5mNCBOT1QgTlVMTCBmMjsnCispOworb2soIWlzX2lu ZGV4c2Nhbl92ZXJpdGlmeV9ub3RudWxsKCRvdXRwdXQpLCAnY2Fubm90IHVzZSBpbmRleHNjYW4g dG8gdmFsaWRhdGUgbm90LW51bGwgY29uc3RyYWludCBvbiB0cF9ub3RudWxsJyk7CisKKyMgSW5k ZXhzY2FuIG1lY2hhbmlzbSB0byB2ZXJpZnkgTk9UIE5VTEwgY29uc3RyYWludHMgY2Fubm90IGFw cGx5IHRvIG5vbi1CdHJlZSBpbmRleAorJG91dHB1dCA9IHJ1bl9zcWxfY29tbWFuZCgnQUxURVIg VEFCTEUgdHBfbm90bnVsbCBBTFRFUiBDT0xVTU4gZjMgU0VUIE5PVCBOVUxMOycpOworb2soIWlz X2luZGV4c2Nhbl92ZXJpdGlmeV9ub3RudWxsKCRvdXRwdXQpLCAnY2Fubm90IHVzZSBpbmRleHNj YW4gdG8gdmFsaWRhdGUgbm90LW51bGwgY29uc3RyYWludHMgb24gdHBfbm90bnVsbCcpOworCisk bm9kZS0+c3RvcCgnZmFzdCcpOworCitkb25lX3Rlc3RpbmcoKTsKXCBObyBuZXdsaW5lIGF0IGVu ZCBvZiBmaWxlCi0tIAoyLjM0LjEKCg== --000000000000937eb7064ed9e525--