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.94.2) (envelope-from ) id 1qm1R7-005JR0-W7 for pgsql-hackers@arkaria.postgresql.org; Fri, 29 Sep 2023 00:32:54 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1qm1R6-00054P-7Q for pgsql-hackers@arkaria.postgresql.org; Fri, 29 Sep 2023 00:32:52 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qm1R5-00053t-DE for pgsql-hackers@lists.postgresql.org; Fri, 29 Sep 2023 00:32:51 +0000 Received: from mail-vk1-xa31.google.com ([2607:f8b0:4864:20::a31]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1qm1R1-008BQt-Mt for pgsql-hackers@lists.postgresql.org; Fri, 29 Sep 2023 00:32:50 +0000 Received: by mail-vk1-xa31.google.com with SMTP id 71dfb90a1353d-49ab6c1869dso95320e0c.0 for ; Thu, 28 Sep 2023 17:32:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bowt-ie.20230601.gappssmtp.com; s=20230601; t=1695947565; x=1696552365; 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=ABJt9dAGVvKkZZgN/bOMXgJMUwU4a/dFGkg88MObjvM=; b=k8NZ5aSL6uiHNlZ9dLL9nLj7Dc37DmHX+VPVOcJzJ2gTX66QNQjm3/NwALofp+7re+ gWN/ebZ5g2PAgBwlqUQKPNMC22uqcBjZFK3r2AhEhVnsJsYVQIsQJG0NZ4X6kNOcX11r ygR13wnDE80YtE4YlaaBqx75oUEHGs0K4JGolmFc4NBxf5rlyL79an2D1W9IZDqqDzIv mfU3Fc1Ezia8jADGI1mYnmi6Y1uXakPVBfjNO4eAHpCO+QHPK/wDfkGEm9qve1Bt/RCx 3I8eGjvFiAB6F4vxqqu/GIWVNL43WScWsfpLYIqhCTEte2uinpIlW21Ks3QFdWjqyWCT 3u4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695947565; x=1696552365; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ABJt9dAGVvKkZZgN/bOMXgJMUwU4a/dFGkg88MObjvM=; b=qDsKRsmHCg/sf7ELXbh4cilDmBFmu0QSMEkGFxL5QxSSxuGyu0et7vTy3A2GZnxQeo mfgSOJ1kW3YnMe/BXdkoco9Ox0F33OaqRPz0QfFZnT/Opl3yq+8taWNIcRvbdpV6FY5o WK3NyRRrGAZh6sdiMEdZoqiJwXpoiMt5P6cAR5T4KO6n2+1AHRMCEOXb5hBlNFG5Vs9w MpHLm1Q6z/jGJrXdccrtIJL4GWDbW5rPbI4kBOo06jbrtN/+xV2wrPk9fzP2lek6FeB2 UoAnmRq1IhJbNYZe5i6Fae560k9PJiecw0grzU8WgDzcYgBBaUtgwF6M8FoWJzgiDXVC IDEg== X-Gm-Message-State: AOJu0YzRCLEh425eG6ijROvOnrXqpyHISQHyDCnschJITfxNUvwaaXsV 2CnEUty4ezJbN5f9gIvIGfrQ5TEa2JAvgEXGtlS2DA== X-Google-Smtp-Source: AGHT+IE3KZgtldX1gZFmTMQEMbuDQX60k8VX314lI545TToXmEg8Szv4bsdpoiIvJhnT9ETPbfzu2Rw9y3s+FncI1wo= X-Received: by 2002:a1f:c387:0:b0:49a:9855:2fbb with SMTP id t129-20020a1fc387000000b0049a98552fbbmr1239365vkf.5.1695947565546; Thu, 28 Sep 2023 17:32:45 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Peter Geoghegan Date: Thu, 28 Sep 2023 17:32:19 -0700 Message-ID: Subject: Re: Optimizing nbtree ScalarArrayOp execution, allowing multi-column ordered scans, skip scan To: Matthias van de Meent Cc: PostgreSQL Hackers , Tom Lane , Tomas Vondra , Jeff Davis , benoit Content-Type: multipart/mixed; boundary="000000000000342ac7060674908b" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000342ac7060674908b Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sun, Sep 17, 2023 at 4:47=E2=80=AFPM Peter Geoghegan wrote: > Attached is v2, which makes all array key advancement take place using > the "next index tuple" approach (using binary searches to find array > keys using index tuple values). Attached is v3, which fixes bitrot caused by today's bugfix commit 714780dc= . No notable changes here compared to v2. -- Peter Geoghegan --000000000000342ac7060674908b Content-Type: application/x-patch; name="v3-0001-Enhance-nbtree-ScalarArrayOp-execution.patch" Content-Disposition: attachment; filename="v3-0001-Enhance-nbtree-ScalarArrayOp-execution.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ln3uyf6q0 RnJvbSAyY2ZmMWRhZGI3OTAzZDQ5YTIzMzhiNjRiMjcxNzhmYTBiYzUxNDU2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBHZW9naGVnYW4gPHBnQGJvd3QuaWU+CkRhdGU6IFNh dCwgMTcgSnVuIDIwMjMgMTc6MDM6MzYgLTA3MDAKU3ViamVjdDogW1BBVENIIHYzXSBFbmhhbmNl IG5idHJlZSBTY2FsYXJBcnJheU9wIGV4ZWN1dGlvbi4KCkNvbW1pdCA5ZThkYTBmNyB0YXVnaHQg bmJ0cmVlIHRvIGhhbmRsZSBTY2FsYXJBcnJheU9wRXhwciBxdWFscwpuYXRpdmVseS4gIFRoaXMg d29ya3MgYnkgcHVzaGluZyBhZGRpdGlvbmFsIGNvbnRleHQgYWJvdXQgdGhlIGFycmF5cwpkb3du IGludG8gdGhlIG5idHJlZSBpbmRleCBBTSwgYXMgaW5kZXggcXVhbHMuICBUaGlzIGluZm9ybWF0 aW9uIGVuYWJsZWQKbmJ0cmVlIHRvIGV4ZWN1dGUgbXVsdGlwbGUgcHJpbWl0aXZlIGluZGV4IHNj YW5zIGFzIHBhcnQgb2YgYW4gaW5kZXgKc2NhbiBleGVjdXRvciBub2RlIHRoYXQgd2FzIHRyZWF0 ZWQgYXMgb25lIGNvbnRpbnVvdXMgaW5kZXggc2Nhbi4KClRoZSBtb3RpdmF0aW9uIGJlaGluZCB0 aGlzIGVhcmxpZXIgd29yayB3YXMgZW5hYmxpbmcgaW5kZXgtb25seSBzY2Fucwp3aXRoIFNjYWxh ckFycmF5T3BFeHByIGNsYXVzZXMgKFNBT1AgcXVhbHMgYXJlIHRyYWRpdGlvbmFsbHkgZXhlY3V0 ZWQKdmlhIEJpdG1hcE9yIG5vZGVzLCB3aGljaCBpcyBsYXJnZWx5IGluZGV4LUFNLWFnbm9zdGlj LCBidXQgYWx3YXlzCnJlcXVpcmVzIGhlYXAgYWNjZXNzKS4gIFRoZSBnZW5lcmFsIGlkZWEgb2Yg Z2l2aW5nIHRoZSBpbmRleCBBTSB0aGlzCmFkZGl0aW9uYWwgY29udGV4dCBjYW4gYmUgcHVzaGVk IGEgbG90IGZ1cnRoZXIsIHRob3VnaC4KClRlYWNoIG5idHJlZSBTQU9QIGluZGV4IHNjYW5zIHRv IGR5bmFtaWNhbGx5IGFkdmFuY2UgYXJyYXkgc2NhbiBrZXlzCnVzaW5nIGluZm9ybWF0aW9uIGFi b3V0IHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGluZGV4LCBkZXRlcm1pbmVkIGF0CnJ1bnRp bWUuICBUaGUgYXJyYXkga2V5IHN0YXRlIG1hY2hpbmUgYWR2YW5jZXMgdGhlIGN1cnJlbnQgYXJy YXkga2V5cwp1c2luZyB0aGUgbmV4dCBpbmRleCB0dXBsZSBpbiBsaW5lIHRvIGJlIHNjYW5uZWQs IGF0IHRoZSBwb2ludCB3aGVyZSB0aGUKc2NhbiByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGxhc3Qg c2V0IG9mIGFycmF5IGtleXMuICBUaGlzIGFwcHJvYWNoIGlzCmZhciBtb3JlIGZsZXhpYmxlLCBh bmQgY2FuIGJlIGZhciBtb3JlIGVmZmljaWVudC4gIENhc2VzIHRoYXQgcHJldmlvdXNseQpyZXF1 aXJlZCBodW5kcmVkcyAoZXZlbiB0aG91c2FuZHMpIG9mIHByaW1pdGl2ZSBpbmRleCBzY2FucyBu b3cgcmVxdWlyZQphcyBmZXcgYXMgb25lIHNpbmdsZSBwcmltaXRpdmUgaW5kZXggc2Nhbi4KCkFs c28gcmVtb3ZlIGFsbCByZXN0cmljdGlvbnMgb24gZ2VuZXJhdGluZyBwYXRoIGtleXMgZm9yIG5i dHJlZSBpbmRleApzY2FucyB0aGF0IGhhcHBlbiB0byBoYXZlIFNjYWxhckFycmF5T3BFeHByIHF1 YWxzLiAgQnVnZml4IGNvbW1pdAo4MDdhNDBjNSB0YXVnaHQgdGhlIHBsYW5uZXIgdG8gYXZvaWQg Z2VuZXJhdGluZyB1bnNhZmUgcGF0aCBrZXlzOiBwYXRoCmtleXMgb24gYSBtdWx0aWNvbHVtbiBp bmRleCBwYXRoLCB3aXRoIGEgU0FPUCBjbGF1c2Ugb24gYW55IGF0dHJpYnV0ZQpiZXlvbmQgdGhl IGZpcnN0L21vc3Qgc2lnbmlmaWNhbnQgYXR0cmlidXRlLiAgVGhlc2UgY2FzZXMgYXJlIG5vdyBz YWZlLgpOb3cgbmJ0cmVlIGluZGV4IHNjYW5zIHdpdGggYW4gaW5lcXVhbGl0eSBjbGF1c2Ugb24g YSBoaWdoIG9yZGVyIGNvbHVtbgphbmQgYSBTQU9QIGNsYXVzZSBvbiBhIGxvd2VyIG9yZGVyIGNv bHVtbiBhcmUgZXhlY3V0ZWQgYXMgb25lIHNpbmdsZQpwcmltaXRpdmUgaW5kZXggc2Nhbiwgc2lu Y2UgdGhhdCBpcyB0aGUgbW9zdCBlZmZpY2llbnQgd2F5IHRvIGRvIGl0LgpOb24tcmVxdWlyZWQg ZXF1YWxpdHkgdHlwZSBTQU9QIHF1YWxzIGFyZSBleGVjdXRlZCBieSBuYnRyZWUgdXNpbmcKYWxt b3N0IHRoZSBzYW1lIGFwcHJvYWNoIHVzZWQgZm9yIHJlcXVpcmVkIGVxdWFsaXR5IHR5cGUgU0FP UCBxdWFscy4KCm5idHJlZSBpcyBub3cgc3RyaWN0bHkgZ3VhcmFudGVlZCB0byBhdm9pZCBhbGwg cmVwZWF0IGFjY2Vzc2VzIHRvIGFueQppbmRpdmlkdWFsIGxlYWYgcGFnZSwgZXZlbiBpbiBjYXNl cyB3aXRoIGluZXF1YWxpdGllcyBvbiBoaWdoIG9yZGVyCmNvbHVtbnMgKGV4Y2VwdCB3aGVuIHRo ZSBzY2FuIGRpcmVjdGlvbiBjaGFuZ2VzLCBvciB0aGUgc2NhbiByZXN0YXJ0cykuCldlIG5vdyBo YXZlIHN0cm9uZyBndWFyYW50ZWVzIGFib3V0IHRoZSB3b3JzdCBjYXNlLCB3aGljaCBpcyB2ZXJ5 IHVzZWZ1bAp3aGVuIGNvc3RpbmcgaW5kZXggc2NhbnMgd2l0aCBTQU9QIGNsYXVzZXMuICBUaGUg Y29zdCBwcm9maWxlIG9mIGluZGV4CnBhdGhzIHdpdGggbXVsdGlwbGUgU0FPUCBjbGF1c2VzIGlz IG5vdyBhIGxvdCBjbG9zZXIgdG8gb3RoZXIgY2FzZXM7Cm1vcmUgc2VsZWN0aXZlIGluZGV4IHNj YW5zIHdpbGwgbm93IGdlbmVyYWxseSBoYXZlIGxvd2VyIGNvc3RzIHRoYW4gbGVzcwpzZWxlY3Rp dmUgaW5kZXggc2NhbnMuICBUaGUgYWRkZWQgY29zdCBmcm9tIHJlcGVhdGVkbHkgZGVzY2VuZGlu ZyB0aGUKaW5kZXggc3RpbGwgbWF0dGVycywgYnV0IGl0IGNhbiBuZXZlciBkb21pbmF0ZS4KCkFu IGltcG9ydGFudCBnb2FsIG9mIHRoaXMgd29yayBpcyB0byByZW1vdmUgYWxsIFNjYWxhckFycmF5 T3BFeHByIGNsYXVzZQpzcGVjaWFsIGNhc2VzIGZyb20gdGhlIHBsYW5uZXIgLS0gU2NhbGFyQXJy YXlPcEV4cHIgY2xhdXNlcyBjYW4gbm93IGJlCnRob3VnaHQgb2YgYSBnZW5lcmFsaXphdGlvbiBv ZiBzaW1wbGUgZXF1YWxpdHkgY2xhdXNlcyAoZXhjZXB0IHdoZW4KY29zdGluZyBpbmRleCBzY2Fu cywgcGVyaGFwcykuICBUaGUgcGxhbm5lciBubyBsb25nZXIgbmVlZHMgdG8gZ2VuZXJhdGUKYWx0 ZXJuYXRpdmUgaW5kZXggcGF0aHMgd2l0aCBmaWx0ZXIgcXVhbHMvcXBxdWFscy4gIFdlIGFzc3Vt ZSB0aGF0IHRydWUKU0FPUCBpbmRleCBxdWFscyBhcmUgc3RyaWN0bHkgYmV0dGVyIHRoYW4gZmls dGVyL3FwcXVhbHMsIHNpbmNlIHRoZSB3b3JrCmluIG5idHJlZSBndWFyYW50ZWVzIHRoYXQgdGhl eSdsbCBiZSBhdCBsZWFzdCBzbGlnaHRseSBmYXN0ZXIuCgpNYW55IG9mIHRoZSBxdWVyaWVzIHNw ZWQgdXAgYnkgdGhlIHdvcmsgZnJvbSB0aGlzIGNvbW1pdCBkb24ndCBkaXJlY3RseQpiZW5lZml0 IGZyb20gdGhlIG5idHJlZS9leGVjdXRvciBlbmhhbmNlbWVudHMuICBUaGV5IGJlbmVmaXQgaW5k aXJlY3RseS4KVGhlIHBsYW5uZXIgbm8gbG9uZ2VyIHNob3dzIGFueSByZXN0cmFpbnQgYXJvdW5k IG1ha2luZyBTQU9QIGNsYXVzZXMKaW50byB0cnVlIG5idHJlZSBpbmRleCBxdWFscywgd2hpY2gg dGVuZHMgdG8gcmVzdWx0IGluIHNpZ25pZmljYW50CnNhdmluZ3Mgb24gaGVhcCBwYWdlIGFjY2Vz c2VzLiAgSW4gZ2VuZXJhbCB3ZSBuZXZlciBuZWVkIHZpc2liaWxpdHkKY2hlY2tzIHRvIGV2YWx1 YXRlIHRydWUgaW5kZXggcXVhbHMsIHdoZXJlYXMgZmlsdGVyIHF1YWxzIG9mdGVuIG5lZWQgdG8K cGVyZm9ybSBleHRyYSBoZWFwIGFjY2Vzc2VzLCBqdXN0IHRvIGVsaW1pbmF0ZSBub24tbWF0Y2hp bmcgdHVwbGVzCihleHByZXNzaW9uIGV2YWx1YXRpb24gaXMgb25seSBzYWZlIHdpdGgga25vd24g dmlzaWJsZSB0dXBsZXMpLgoKQXV0aG9yOiBQZXRlciBHZW9naGVnYW4gPHBnQGJvd3QuaWU+CkRp c2N1c3Npb246IGh0dHBzOi8vcG9zdGdyLmVzL20vQ0FIMi1Xej1rc3ZOX3NqY25EMStCdC1XdGlm UkE1b2s0OGFEWW5xM3BrS2h4Z01RcGN3QG1haWwuZ21haWwuY29tCi0tLQogc3JjL2luY2x1ZGUv YWNjZXNzL25idHJlZS5oICAgICAgICAgICAgICAgIHwgICAzOSArLQogc3JjL2JhY2tlbmQvYWNj ZXNzL25idHJlZS9uYnRyZWUuYyAgICAgICAgIHwgICA2NSArLQogc3JjL2JhY2tlbmQvYWNjZXNz L25idHJlZS9uYnRzZWFyY2guYyAgICAgIHwgICA2MiArLQogc3JjL2JhY2tlbmQvYWNjZXNzL25i dHJlZS9uYnR1dGlscy5jICAgICAgIHwgMTM2NyArKysrKysrKysrKysrKysrKystLQogc3JjL2Jh Y2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYyAgICAgIHwgICA2NCArLQogc3JjL2JhY2tl bmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMgICAgICAgICAgIHwgIDEyMyArLQogZG9jL3NyYy9zZ21s L21vbml0b3Jpbmcuc2dtbCAgICAgICAgICAgICAgIHwgICAxMyArCiBzcmMvdGVzdC9yZWdyZXNz L2V4cGVjdGVkL2NyZWF0ZV9pbmRleC5vdXQgfCAgIDYxICstCiBzcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL2pvaW4ub3V0ICAgICAgICAgfCAgICA1ICstCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9j cmVhdGVfaW5kZXguc3FsICAgICAgfCAgIDIwICstCiAxMCBmaWxlcyBjaGFuZ2VkLCAxNTA2IGlu c2VydGlvbnMoKyksIDMxMyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9h Y2Nlc3MvbmJ0cmVlLmggYi9zcmMvaW5jbHVkZS9hY2Nlc3MvbmJ0cmVlLmgKaW5kZXggNjM0NWUx NmQ3Li4zM2RiOWI2NDggMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2FjY2Vzcy9uYnRyZWUuaAor KysgYi9zcmMvaW5jbHVkZS9hY2Nlc3MvbmJ0cmVlLmgKQEAgLTEwNDMsMTMgKzEwNDMsMTMgQEAg dHlwZWRlZiBzdHJ1Y3QgQlRTY2FuT3BhcXVlRGF0YQogCiAJLyogd29ya3NwYWNlIGZvciBTS19T RUFSQ0hBUlJBWSBzdXBwb3J0ICovCiAJU2NhbktleQkJYXJyYXlLZXlEYXRhOwkvKiBtb2RpZmll ZCBjb3B5IG9mIHNjYW4tPmtleURhdGEgKi8KLQlib29sCQlhcnJheXNTdGFydGVkOwkvKiBTdGFy dGVkIGFycmF5IGtleXMsIGJ1dCBoYXZlIHlldCB0byAicmVhY2gKLQkJCQkJCQkJICogcGFzdCB0 aGUgZW5kIiBvZiBhbGwgYXJyYXlzPyAqLwogCWludAkJCW51bUFycmF5S2V5czsJLyogbnVtYmVy IG9mIGVxdWFsaXR5LXR5cGUgYXJyYXkga2V5cyAoLTEgaWYKIAkJCQkJCQkJICogdGhlcmUgYXJl IGFueSB1bnNhdGlzZmlhYmxlIGFycmF5IGtleXMpICovCi0JaW50CQkJYXJyYXlLZXlDb3VudDsJ LyogY291bnQgaW5kaWNhdGluZyBudW1iZXIgb2YgYXJyYXkgc2NhbiBrZXlzCi0JCQkJCQkJCSAq IHByb2Nlc3NlZCAqLworCWJvb2wJCW5lZWRQcmltU2NhbjsJLyogUGVyZm9ybSBhbm90aGVyIHBy aW1pdGl2ZSBzY2FuPyAqLwogCUJUQXJyYXlLZXlJbmZvICphcnJheUtleXM7CS8qIGluZm8gYWJv dXQgZWFjaCBlcXVhbGl0eS10eXBlIGFycmF5IGtleSAqLworCUZtZ3JJbmZvICAgKm9yZGVyUHJv Y3M7CQkvKiBPUkRFUiBwcm9jcyBmb3IgZXF1YWxpdHkgY29uc3RyYWludCBrZXlzICovCisJaW50 CQkJbnVtUHJpbVNjYW5zOwkvKiBSdW5uaW5nIHRhbGx5IG9mICMgcHJpbWl0aXZlIGluZGV4IHNj YW5zCisJCQkJCQkJCSAqICh1c2VkIHRvIGNvb3JkaW5hdGUgcGFyYWxsZWwgd29ya2VycykgKi8K IAlNZW1vcnlDb250ZXh0IGFycmF5Q29udGV4dDsgLyogc2Nhbi1saWZlc3BhbiBjb250ZXh0IGZv ciBhcnJheSBkYXRhICovCiAKIAkvKiBpbmZvIGFib3V0IGtpbGxlZCBpdGVtcyBpZiBhbnkgKGtp bGxlZEl0ZW1zIGlzIE5VTEwgaWYgbmV2ZXIgdXNlZCkgKi8KQEAgLTEwODAsNiArMTA4MCwyOSBA QCB0eXBlZGVmIHN0cnVjdCBCVFNjYW5PcGFxdWVEYXRhCiAKIHR5cGVkZWYgQlRTY2FuT3BhcXVl RGF0YSAqQlRTY2FuT3BhcXVlOwogCisvKgorICogX2J0X3JlYWRwYWdlIHN0YXRlIHVzZWQgYWNy b3NzIF9idF9jaGVja2tleXMgY2FsbHMgZm9yIGEgcGFnZQorICoKKyAqIFdoZW4gX2J0X3JlYWRw YWdlIGlzIGNhbGxlZCBkdXJpbmcgYSBmb3J3YXJkIHNjYW4gdGhhdCBoYXMgb25lIG9yIG1vcmUK KyAqIGVxdWFsaXR5LXR5cGUgU0tfU0VBUkNIQVJSQVkgc2NhbiBrZXlzLCBpdCBoYXMgYW4gZXh0 cmEgcmVzcG9uc2liaWxpdHk6IHRvCisgKiBzZXQgdXAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBh Z2UgaGlnaCBrZXkuICBUaGlzIG11c3QgaGFwcGVuIGJlZm9yZSB0aGUKKyAqIGZpcnN0IGNhbGwg dG8gX2J0X2NoZWNra2V5cy4gIF9idF9jaGVja2tleXMgdXNlcyB0aGlzIGluZm9ybWF0aW9uIHRv IG1hbmFnZQorICogYWR2YW5jZW1lbnQgb2YgdGhlIHNjYW4ncyBhcnJheSBrZXlzLgorICovCit0 eXBlZGVmIHN0cnVjdCBCVFJlYWRQYWdlU3RhdGUKK3sKKwkvKiBJbnB1dCBwYXJhbWV0ZXJzLCBz ZXQgYnkgX2J0X3JlYWRwYWdlICovCisJU2NhbkRpcmVjdGlvbiBkaXI7CQkJLyogY3VycmVudCBz Y2FuIGRpcmVjdGlvbiAqLworCUluZGV4VHVwbGUJaGlnaGtleTsJCS8qIHBhZ2UgaGlnaCBrZXks IHNldCBieSBmb3J3YXJkIHNjYW5zICovCisKKwkvKiBPdXRwdXQgcGFyYW1ldGVycywgc2V0IGJ5 IF9idF9jaGVja2tleXMgKi8KKwlib29sCQljb250aW51ZXNjYW47CS8qIFRlcm1pbmF0ZSBvbmdv aW5nIChwcmltaXRpdmUpIGluZGV4IHNjYW4/ICovCisKKwkvKiBQcml2YXRlIF9idF9jaGVja2tl eXMtbWFuYWdlZCBzdGF0ZSAqLworCWJvb2wJCWhpZ2hrZXljaGVja2VkOyAvKiBoaWdoIGtleSBj aGVja2VkIGFnYWluc3QgY3VycmVudAorCQkJCQkJCQkgKiBTS19TRUFSQ0hBUlJBWSBhcnJheSBr ZXlzPyAqLworfSBCVFJlYWRQYWdlU3RhdGU7CisKIC8qCiAgKiBXZSB1c2Ugc29tZSBwcml2YXRl IHNrX2ZsYWdzIGJpdHMgaW4gcHJlcHJvY2Vzc2VkIHNjYW4ga2V5cy4gIFdlJ3JlIGFsbG93ZWQK ICAqIHRvIHVzZSBiaXRzIDE2LTMxIChzZWUgc2tleS5oKS4gIFRoZSB1cHBlcm1vc3QgYml0cyBh cmUgY29waWVkIGZyb20gdGhlCkBAIC0xMTU3LDcgKzExODAsNyBAQCBleHRlcm4gYm9vbCBidGNh bnJldHVybihSZWxhdGlvbiBpbmRleCwgaW50IGF0dG5vKTsKIGV4dGVybiBib29sIF9idF9wYXJh bGxlbF9zZWl6ZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVyICpwYWdlbm8pOwogZXh0 ZXJuIHZvaWQgX2J0X3BhcmFsbGVsX3JlbGVhc2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBCbG9ja051 bWJlciBzY2FuX3BhZ2UpOwogZXh0ZXJuIHZvaWQgX2J0X3BhcmFsbGVsX2RvbmUoSW5kZXhTY2Fu RGVzYyBzY2FuKTsKLWV4dGVybiB2b2lkIF9idF9wYXJhbGxlbF9hZHZhbmNlX2FycmF5X2tleXMo SW5kZXhTY2FuRGVzYyBzY2FuKTsKK2V4dGVybiB2b2lkIF9idF9wYXJhbGxlbF9uZXh0X3ByaW1p dGl2ZV9zY2FuKEluZGV4U2NhbkRlc2Mgc2Nhbik7CiAKIC8qCiAgKiBwcm90b3R5cGVzIGZvciBm dW5jdGlvbnMgaW4gbmJ0ZGVkdXAuYwpAQCAtMTI1MCwxMiArMTI3MywxMiBAQCBleHRlcm4gQlRT Y2FuSW5zZXJ0IF9idF9ta3NjYW5rZXkoUmVsYXRpb24gcmVsLCBJbmRleFR1cGxlIGl0dXApOwog ZXh0ZXJuIHZvaWQgX2J0X2ZyZWVzdGFjayhCVFN0YWNrIHN0YWNrKTsKIGV4dGVybiB2b2lkIF9i dF9wcmVwcm9jZXNzX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKIGV4dGVybiB2b2lk IF9idF9zdGFydF9hcnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBk aXIpOwotZXh0ZXJuIGJvb2wgX2J0X2FkdmFuY2VfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNj YW4sIFNjYW5EaXJlY3Rpb24gZGlyKTsKK2V4dGVybiBib29sIF9idF9hcnJheV9rZXlzX3JlbWFp bihJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKTsKIGV4dGVybiB2b2lkIF9i dF9tYXJrX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKIGV4dGVybiB2b2lkIF9idF9y ZXN0b3JlX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKIGV4dGVybiB2b2lkIF9idF9w cmVwcm9jZXNzX2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKLWV4dGVybiBib29sIF9idF9jaGVj a2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBJbmRleFR1cGxlIHR1cGxlLAotCQkJCQkJICBpbnQg dHVwbmF0dHMsIFNjYW5EaXJlY3Rpb24gZGlyLCBib29sICpjb250aW51ZXNjYW4pOworZXh0ZXJu IGJvb2wgX2J0X2NoZWNra2V5cyhJbmRleFNjYW5EZXNjIHNjYW4sIEJUUmVhZFBhZ2VTdGF0ZSAq cHN0YXRlLAorCQkJCQkJICBJbmRleFR1cGxlIHR1cGxlLCBib29sIGZpbmFsdHVwKTsKIGV4dGVy biB2b2lkIF9idF9raWxsaXRlbXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKIGV4dGVybiBCVEN5Y2xl SWQgX2J0X3ZhY3V1bV9jeWNsZWlkKFJlbGF0aW9uIHJlbCk7CiBleHRlcm4gQlRDeWNsZUlkIF9i dF9zdGFydF92YWN1dW0oUmVsYXRpb24gcmVsKTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2Fj Y2Vzcy9uYnRyZWUvbmJ0cmVlLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHJlZS5j CmluZGV4IDZjNWI1YzY5Yy4uMjdmYmI4NmQwIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nl c3MvbmJ0cmVlL25idHJlZS5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0cmVl LmMKQEAgLTQ4LDggKzQ4LDggQEAKICAqIEJUUEFSQUxMRUxfSURMRSBpbmRpY2F0ZXMgdGhhdCBu byBiYWNrZW5kIGlzIGN1cnJlbnRseSBhZHZhbmNpbmcgdGhlIHNjYW4KICAqIHRvIGEgbmV3IHBh Z2U7IHNvbWUgcHJvY2VzcyBjYW4gc3RhcnQgZG9pbmcgdGhhdC4KICAqCi0gKiBCVFBBUkFMTEVM X0RPTkUgaW5kaWNhdGVzIHRoYXQgdGhlIHNjYW4gaXMgY29tcGxldGUgKGluY2x1ZGluZyBlcnJv ciBleGl0KS4KLSAqIFdlIHJlYWNoIHRoaXMgc3RhdGUgb25jZSBmb3IgZXZlcnkgZGlzdGluY3Qg Y29tYmluYXRpb24gb2YgYXJyYXkga2V5cy4KKyAqIEJUUEFSQUxMRUxfRE9ORSBpbmRpY2F0ZXMg dGhhdCB0aGUgcHJpbWl0aXZlIGluZGV4IHNjYW4gaXMgY29tcGxldGUKKyAqIChpbmNsdWRpbmcg ZXJyb3IgZXhpdCkuICBSZWFjaGVkIG9uY2UgcGVyIHByaW1pdGl2ZSBpbmRleCBzY2FuLgogICov CiB0eXBlZGVmIGVudW0KIHsKQEAgLTY5LDggKzY5LDggQEAgdHlwZWRlZiBzdHJ1Y3QgQlRQYXJh bGxlbFNjYW5EZXNjRGF0YQogCUJUUFNfU3RhdGUJYnRwc19wYWdlU3RhdHVzOwkvKiBpbmRpY2F0 ZXMgd2hldGhlciBuZXh0IHBhZ2UgaXMKIAkJCQkJCQkJCSAqIGF2YWlsYWJsZSBmb3Igc2Nhbi4g c2VlIGFib3ZlIGZvcgogCQkJCQkJCQkJICogcG9zc2libGUgc3RhdGVzIG9mIHBhcmFsbGVsIHNj YW4uICovCi0JaW50CQkJYnRwc19hcnJheUtleUNvdW50OyAvKiBjb3VudCBpbmRpY2F0aW5nIG51 bWJlciBvZiBhcnJheSBzY2FuCi0JCQkJCQkJCQkgKiBrZXlzIHByb2Nlc3NlZCBieSBwYXJhbGxl bCBzY2FuICovCisJaW50CQkJYnRwc19udW1QcmltU2NhbnM7CS8qIGNvdW50IGluZGljYXRpbmcg bnVtYmVyIG9mIHByaW1pdGl2ZQorCQkJCQkJCQkJICogaW5kZXggc2NhbnMgKHVzZWQgd2l0aCBh cnJheSBrZXlzKSAqLwogCXNsb2NrX3QJCWJ0cHNfbXV0ZXg7CQkvKiBwcm90ZWN0cyBhYm92ZSB2 YXJpYWJsZXMgKi8KIAlDb25kaXRpb25WYXJpYWJsZSBidHBzX2N2OwkvKiB1c2VkIHRvIHN5bmNo cm9uaXplIHBhcmFsbGVsIHNjYW4gKi8KIH0JCQlCVFBhcmFsbGVsU2NhbkRlc2NEYXRhOwpAQCAt Mjc2LDcgKzI3Niw3IEBAIGJ0Z2V0dHVwbGUoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0 aW9uIGRpcikKIAkJaWYgKHJlcykKIAkJCWJyZWFrOwogCQkvKiAuLi4gb3RoZXJ3aXNlIHNlZSBp ZiB3ZSBoYXZlIG1vcmUgYXJyYXkga2V5cyB0byBkZWFsIHdpdGggKi8KLQl9IHdoaWxlIChzby0+ bnVtQXJyYXlLZXlzICYmIF9idF9hZHZhbmNlX2FycmF5X2tleXMoc2NhbiwgZGlyKSk7CisJfSB3 aGlsZSAoc28tPm51bUFycmF5S2V5cyAmJiBfYnRfYXJyYXlfa2V5c19yZW1haW4oc2NhbiwgZGly KSk7CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMzM0LDcgKzMzNCw3IEBAIGJ0Z2V0Yml0bWFwKElu ZGV4U2NhbkRlc2Mgc2NhbiwgVElEQml0bWFwICp0Ym0pCiAJCQl9CiAJCX0KIAkJLyogTm93IHNl ZSBpZiB3ZSBoYXZlIG1vcmUgYXJyYXkga2V5cyB0byBkZWFsIHdpdGggKi8KLQl9IHdoaWxlIChz by0+bnVtQXJyYXlLZXlzICYmIF9idF9hZHZhbmNlX2FycmF5X2tleXMoc2NhbiwgRm9yd2FyZFNj YW5EaXJlY3Rpb24pKTsKKwl9IHdoaWxlIChzby0+bnVtQXJyYXlLZXlzICYmIF9idF9hcnJheV9r ZXlzX3JlbWFpbihzY2FuLCBGb3J3YXJkU2NhbkRpcmVjdGlvbikpOwogCiAJcmV0dXJuIG50aWRz OwogfQpAQCAtMzY0LDkgKzM2NCwxMCBAQCBidGJlZ2luc2NhbihSZWxhdGlvbiByZWwsIGludCBu a2V5cywgaW50IG5vcmRlcmJ5cykKIAkJc28tPmtleURhdGEgPSBOVUxMOwogCiAJc28tPmFycmF5 S2V5RGF0YSA9IE5VTEw7CS8qIGFzc3VtZSBubyBhcnJheSBrZXlzIGZvciBub3cgKi8KLQlzby0+ YXJyYXlzU3RhcnRlZCA9IGZhbHNlOwogCXNvLT5udW1BcnJheUtleXMgPSAwOworCXNvLT5uZWVk UHJpbVNjYW4gPSBmYWxzZTsKIAlzby0+YXJyYXlLZXlzID0gTlVMTDsKKwlzby0+b3JkZXJQcm9j cyA9IE5VTEw7CiAJc28tPmFycmF5Q29udGV4dCA9IE5VTEw7CiAKIAlzby0+a2lsbGVkSXRlbXMg PSBOVUxMOwkJLyogdW50aWwgbmVlZGVkICovCkBAIC00MDYsNyArNDA3LDggQEAgYnRyZXNjYW4o SW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuS2V5IHNjYW5rZXksIGludCBuc2NhbmtleXMsCiAJfQog CiAJc28tPm1hcmtJdGVtSW5kZXggPSAtMTsKLQlzby0+YXJyYXlLZXlDb3VudCA9IDA7CisJc28t Pm5lZWRQcmltU2NhbiA9IGZhbHNlOworCXNvLT5udW1QcmltU2NhbnMgPSAwOwogCUJUU2NhblBv c1VucGluSWZQaW5uZWQoc28tPm1hcmtQb3MpOwogCUJUU2NhblBvc0ludmFsaWRhdGUoc28tPm1h cmtQb3MpOwogCkBAIC01ODcsNyArNTg5LDcgQEAgYnRpbml0cGFyYWxsZWxzY2FuKHZvaWQgKnRh cmdldCkKIAlTcGluTG9ja0luaXQoJmJ0X3RhcmdldC0+YnRwc19tdXRleCk7CiAJYnRfdGFyZ2V0 LT5idHBzX3NjYW5QYWdlID0gSW52YWxpZEJsb2NrTnVtYmVyOwogCWJ0X3RhcmdldC0+YnRwc19w YWdlU3RhdHVzID0gQlRQQVJBTExFTF9OT1RfSU5JVElBTElaRUQ7Ci0JYnRfdGFyZ2V0LT5idHBz X2FycmF5S2V5Q291bnQgPSAwOworCWJ0X3RhcmdldC0+YnRwc19udW1QcmltU2NhbnMgPSAwOwog CUNvbmRpdGlvblZhcmlhYmxlSW5pdCgmYnRfdGFyZ2V0LT5idHBzX2N2KTsKIH0KIApAQCAtNjEz LDcgKzYxNSw3IEBAIGJ0cGFyYWxsZWxyZXNjYW4oSW5kZXhTY2FuRGVzYyBzY2FuKQogCVNwaW5M b2NrQWNxdWlyZSgmYnRzY2FuLT5idHBzX211dGV4KTsKIAlidHNjYW4tPmJ0cHNfc2NhblBhZ2Ug PSBJbnZhbGlkQmxvY2tOdW1iZXI7CiAJYnRzY2FuLT5idHBzX3BhZ2VTdGF0dXMgPSBCVFBBUkFM TEVMX05PVF9JTklUSUFMSVpFRDsKLQlidHNjYW4tPmJ0cHNfYXJyYXlLZXlDb3VudCA9IDA7CisJ YnRzY2FuLT5idHBzX251bVByaW1TY2FucyA9IDA7CiAJU3BpbkxvY2tSZWxlYXNlKCZidHNjYW4t PmJ0cHNfbXV0ZXgpOwogfQogCkBAIC02MjQsNyArNjI2LDE3IEBAIGJ0cGFyYWxsZWxyZXNjYW4o SW5kZXhTY2FuRGVzYyBzY2FuKQogICoKICAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSBpZiB3 ZSBzdWNjZXNzZnVsbHkgc2VpemVkIHRoZSBzY2FuIGFuZCBmYWxzZQogICogaWYgd2UgZGlkIG5v dC4gIFRoZSBsYXR0ZXIgY2FzZSBvY2N1cnMgaWYgbm8gcGFnZXMgcmVtYWluIGZvciB0aGUgY3Vy cmVudAotICogc2V0IG9mIHNjYW5rZXlzLgorICogcHJpbWl0aXZlIGluZGV4IHNjYW4uCisgKgor ICogV2hlbiBhcnJheSBzY2FuIGtleXMgYXJlIGluIHVzZSwgZWFjaCB3b3JrZXIgcHJvY2VzcyBp bmRlcGVuZGVudGx5IGFkdmFuY2VzCisgKiBpdHMgYXJyYXkga2V5cy4gIEl0J3MgY3J1Y2lhbCB0 aGF0IGVhY2ggd29ya2VyIHByb2Nlc3MgbmV2ZXIgYmUgYWxsb3dlZCB0bworICogc2NhbiBhIHBh Z2UgZnJvbSBiZWZvcmUgdGhlIGN1cnJlbnQgc2NhbiBwb3NpdGlvbi4KKyAqCisgKiBYWFggVGhp cyBwYXJ0aWN1bGFyIGFzcGVjdCBvZiB0aGUgcGF0Y2ggaXMgc3RpbGwgYXQgdGhlIHByb29mIG9m IGNvbmNlcHQKKyAqIHN0YWdlLiAgSGF2aW5nIHRoaXMgbXVjaCBhdmFpbGFibGUgZm9yIHJldmll dyBhdCBsZWFzdCBzdWdnZXN0cyB0aGF0IGl0J2xsCisgKiBiZSBmZWFzaWJsZSB0byBwb3J0IHRo ZSBleGlzdGluZyBwYXJhbGxlbCBzY2FuIGFycmF5IHNjYW4ga2V5IHN0dWZmIG92ZXIgdG8KKyAq IHVzaW5nIGEgcHJpbWl0aXZlIGluZGV4IHNjYW4gY291bnRlciAoYXMgb3Bwb3NlZCB0byBhbiBh cnJheSBrZXkgY291bnRlcikKKyAqIHRoZSB0b3AtbGV2ZWwgc2Nhbi4gIEkgaGF2ZSB5ZXQgdG8g cmVhbGx5IHB1dCB0aGlzIGNvZGUgdGhyb3VnaCBpdHMgcGFjZXMuCiAgKgogICogSWYgdGhlIHJl dHVybiB2YWx1ZSBpcyB0cnVlLCAqcGFnZW5vIHJldHVybnMgdGhlIG5leHQgb3IgY3VycmVudCBw YWdlCiAgKiBvZiB0aGUgc2NhbiAoZGVwZW5kaW5nIG9uIHRoZSBzY2FuIGRpcmVjdGlvbikuICBB biBpbnZhbGlkIGJsb2NrIG51bWJlcgpAQCAtNjU1LDE2ICs2NjcsMTcgQEAgX2J0X3BhcmFsbGVs X3NlaXplKEluZGV4U2NhbkRlc2Mgc2NhbiwgQmxvY2tOdW1iZXIgKnBhZ2VubykKIAkJU3Bpbkxv Y2tBY3F1aXJlKCZidHNjYW4tPmJ0cHNfbXV0ZXgpOwogCQlwYWdlU3RhdHVzID0gYnRzY2FuLT5i dHBzX3BhZ2VTdGF0dXM7CiAKLQkJaWYgKHNvLT5hcnJheUtleUNvdW50IDwgYnRzY2FuLT5idHBz X2FycmF5S2V5Q291bnQpCisJCWlmIChzby0+bnVtUHJpbVNjYW5zIDwgYnRzY2FuLT5idHBzX251 bVByaW1TY2FucykKIAkJewotCQkJLyogUGFyYWxsZWwgc2NhbiBoYXMgYWxyZWFkeSBhZHZhbmNl ZCB0byBhIG5ldyBzZXQgb2Ygc2NhbmtleXMuICovCisJCQkvKiBUb3AtbGV2ZWwgc2NhbiBhbHJl YWR5IG1vdmVkIG9uIHRvIG5leHQgcHJpbWl0aXZlIGluZGV4IHNjYW4gKi8KIAkJCXN0YXR1cyA9 IGZhbHNlOwogCQl9CiAJCWVsc2UgaWYgKHBhZ2VTdGF0dXMgPT0gQlRQQVJBTExFTF9ET05FKQog CQl7CiAJCQkvKgotCQkJICogV2UncmUgZG9uZSB3aXRoIHRoaXMgc2V0IG9mIHNjYW5rZXlzLiAg VGhpcyBtYXkgYmUgdGhlIGVuZCwgb3IKLQkJCSAqIHRoZXJlIGNvdWxkIGJlIG1vcmUgc2V0cyB0 byB0cnkuCisJCQkgKiBXZSdyZSBkb25lIHdpdGggdGhpcyBwcmltaXRpdmUgaW5kZXggc2Nhbi4g IFRoaXMgbWlnaHQgaGF2ZQorCQkJICogYmVlbiB0aGUgZmluYWwgcHJpbWl0aXZlIGluZGV4IHNj YW4gcmVxdWlyZWQsIG9yIHRoZSB0b3AtbGV2ZWwKKwkJCSAqIGluZGV4IHNjYW4gbWlnaHQgcmVx dWlyZSBhZGRpdGlvbmFsIHByaW1pdGl2ZSBzY2Fucy4KIAkJCSAqLwogCQkJc3RhdHVzID0gZmFs c2U7CiAJCX0KQEAgLTY5Niw5ICs3MDksMTIgQEAgX2J0X3BhcmFsbGVsX3NlaXplKEluZGV4U2Nh bkRlc2Mgc2NhbiwgQmxvY2tOdW1iZXIgKnBhZ2VubykKIHZvaWQKIF9idF9wYXJhbGxlbF9yZWxl YXNlKEluZGV4U2NhbkRlc2Mgc2NhbiwgQmxvY2tOdW1iZXIgc2Nhbl9wYWdlKQogeworCUJUU2Nh bk9wYXF1ZSBzbyBQR19VU0VEX0ZPUl9BU1NFUlRTX09OTFkgPSAoQlRTY2FuT3BhcXVlKSBzY2Fu LT5vcGFxdWU7CiAJUGFyYWxsZWxJbmRleFNjYW5EZXNjIHBhcmFsbGVsX3NjYW4gPSBzY2FuLT5w YXJhbGxlbF9zY2FuOwogCUJUUGFyYWxsZWxTY2FuRGVzYyBidHNjYW47CiAKKwlBc3NlcnQoIXNv LT5uZWVkUHJpbVNjYW4pOworCiAJYnRzY2FuID0gKEJUUGFyYWxsZWxTY2FuRGVzYykgT2Zmc2V0 VG9Qb2ludGVyKCh2b2lkICopIHBhcmFsbGVsX3NjYW4sCiAJCQkJCQkJCQkJCQkgIHBhcmFsbGVs X3NjYW4tPnBzX29mZnNldCk7CiAKQEAgLTczMiwxMiArNzQ4LDExIEBAIF9idF9wYXJhbGxlbF9k b25lKEluZGV4U2NhbkRlc2Mgc2NhbikKIAkJCQkJCQkJCQkJCSAgcGFyYWxsZWxfc2Nhbi0+cHNf b2Zmc2V0KTsKIAogCS8qCi0JICogTWFyayB0aGUgcGFyYWxsZWwgc2NhbiBhcyBkb25lIGZvciB0 aGlzIGNvbWJpbmF0aW9uIG9mIHNjYW4ga2V5cywKLQkgKiB1bmxlc3Mgc29tZSBvdGhlciBwcm9j ZXNzIGFscmVhZHkgZGlkIHNvLiAgU2VlIGFsc28KLQkgKiBfYnRfYWR2YW5jZV9hcnJheV9rZXlz LgorCSAqIE1hcmsgdGhlIHByaW1pdGl2ZSBpbmRleCBzY2FuIGFzIGRvbmUsIHVubGVzcyBzb21l IG90aGVyIHByb2Nlc3MKKwkgKiBhbHJlYWR5IGRpZCBzby4gIFNlZSBhbHNvIF9idF9hcnJheV9r ZXlzX3JlbWFpbi4KIAkgKi8KIAlTcGluTG9ja0FjcXVpcmUoJmJ0c2Nhbi0+YnRwc19tdXRleCk7 Ci0JaWYgKHNvLT5hcnJheUtleUNvdW50ID49IGJ0c2Nhbi0+YnRwc19hcnJheUtleUNvdW50ICYm CisJaWYgKHNvLT5udW1QcmltU2NhbnMgPj0gYnRzY2FuLT5idHBzX251bVByaW1TY2FucyAmJgog CQlidHNjYW4tPmJ0cHNfcGFnZVN0YXR1cyAhPSBCVFBBUkFMTEVMX0RPTkUpCiAJewogCQlidHNj YW4tPmJ0cHNfcGFnZVN0YXR1cyA9IEJUUEFSQUxMRUxfRE9ORTsKQEAgLTc1MSwxNCArNzY2LDE0 IEBAIF9idF9wYXJhbGxlbF9kb25lKEluZGV4U2NhbkRlc2Mgc2NhbikKIH0KIAogLyoKLSAqIF9i dF9wYXJhbGxlbF9hZHZhbmNlX2FycmF5X2tleXMoKSAtLSBBZHZhbmNlcyB0aGUgcGFyYWxsZWwg c2NhbiBmb3IgYXJyYXkKLSAqCQkJa2V5cy4KKyAqIF9idF9wYXJhbGxlbF9uZXh0X3ByaW1pdGl2 ZV9zY2FuKCkgLS0gQWR2YW5jZXMgcGFyYWxsZWwgcHJpbWl0aXZlIHNjYW4KKyAqCQkJY291bnRl ciB3aGVuIGFycmF5IGtleXMgYXJlIGluIHVzZS4KICAqCi0gKiBVcGRhdGVzIHRoZSBjb3VudCBv ZiBhcnJheSBrZXlzIHByb2Nlc3NlZCBmb3IgYm90aCBsb2NhbCBhbmQgcGFyYWxsZWwKKyAqIFVw ZGF0ZXMgdGhlIGNvdW50IG9mIHByaW1pdGl2ZSBpbmRleCBzY2FucyBmb3IgYm90aCBsb2NhbCBh bmQgcGFyYWxsZWwKICAqIHNjYW5zLgogICovCiB2b2lkCi1fYnRfcGFyYWxsZWxfYWR2YW5jZV9h cnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbikKK19idF9wYXJhbGxlbF9uZXh0X3ByaW1pdGl2 ZV9zY2FuKEluZGV4U2NhbkRlc2Mgc2NhbikKIHsKIAlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2Fu T3BhcXVlKSBzY2FuLT5vcGFxdWU7CiAJUGFyYWxsZWxJbmRleFNjYW5EZXNjIHBhcmFsbGVsX3Nj YW4gPSBzY2FuLT5wYXJhbGxlbF9zY2FuOwpAQCAtNzY3LDEzICs3ODIsMTMgQEAgX2J0X3BhcmFs bGVsX2FkdmFuY2VfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4pCiAJYnRzY2FuID0gKEJU UGFyYWxsZWxTY2FuRGVzYykgT2Zmc2V0VG9Qb2ludGVyKCh2b2lkICopIHBhcmFsbGVsX3NjYW4s CiAJCQkJCQkJCQkJCQkgIHBhcmFsbGVsX3NjYW4tPnBzX29mZnNldCk7CiAKLQlzby0+YXJyYXlL ZXlDb3VudCsrOworCXNvLT5udW1QcmltU2NhbnMrKzsKIAlTcGluTG9ja0FjcXVpcmUoJmJ0c2Nh bi0+YnRwc19tdXRleCk7CiAJaWYgKGJ0c2Nhbi0+YnRwc19wYWdlU3RhdHVzID09IEJUUEFSQUxM RUxfRE9ORSkKIAl7CiAJCWJ0c2Nhbi0+YnRwc19zY2FuUGFnZSA9IEludmFsaWRCbG9ja051bWJl cjsKIAkJYnRzY2FuLT5idHBzX3BhZ2VTdGF0dXMgPSBCVFBBUkFMTEVMX05PVF9JTklUSUFMSVpF RDsKLQkJYnRzY2FuLT5idHBzX2FycmF5S2V5Q291bnQrKzsKKwkJYnRzY2FuLT5idHBzX251bVBy aW1TY2FucysrOwogCX0KIAlTcGluTG9ja1JlbGVhc2UoJmJ0c2Nhbi0+YnRwc19tdXRleCk7CiB9 CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHNlYXJjaC5jIGIvc3Jj L2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRzZWFyY2guYwppbmRleCAxN2FkODk3NDkuLmYxNWNk MDg3MCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRzZWFyY2guYwor KysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHNlYXJjaC5jCkBAIC04OTMsNyArODkz LDcgQEAgX2J0X2ZpcnN0KEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCiAJ ICovCiAJaWYgKCFzby0+cXVhbF9vaykKIAl7Ci0JCS8qIE5vdGlmeSBhbnkgb3RoZXIgd29ya2Vy cyB0aGF0IHdlJ3JlIGRvbmUgd2l0aCB0aGlzIHNjYW4ga2V5LiAqLworCQkvKiBOb3RpZnkgYW55 IG90aGVyIHdvcmtlcnMgdGhhdCB0aGlzIHByaW1pdGl2ZSBzY2FuIGlzIGRvbmUgKi8KIAkJX2J0 X3BhcmFsbGVsX2RvbmUoc2Nhbik7CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC05NTIsNiArOTUy LDEwIEBAIF9idF9maXJzdChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKQog CSAqIG9uZSB3ZSB1c2UgLS0tIGJ5IGRlZmluaXRpb24sIHRoZXkgYXJlIGVpdGhlciByZWR1bmRh bnQgb3IKIAkgKiBjb250cmFkaWN0b3J5LgogCSAqCisJICogV2hlbiBTS19TRUFSQ0hBUlJBWSBr ZXlzIGFyZSBpbiB1c2UsIF9idF90dXBsZV9iZWZvcmVfYXJyYXlfa2V5cyBpcworCSAqIHVzZWQg dG8gYXZvaWQgcHJlbWF0dXJlbHkgc3RvcHBpbmcgdGhlIHNjYW4gd2hlbiBhbiBhcnJheSBlcXVh bGl0eSBxdWFsCisJICogaGFzIGl0cyBhcnJheSBrZXlzIGFkdmFuY2VkLgorCSAqCiAJICogQW55 IHJlZ3VsYXIgKG5vdCBTS19TRUFSQ0hOVUxMKSBrZXkgaW1wbGllcyBhIE5PVCBOVUxMIHF1YWxp Zmllci4KIAkgKiBJZiB0aGUgaW5kZXggc3RvcmVzIG51bGxzIGF0IHRoZSBlbmQgb2YgdGhlIGlu ZGV4IHdlJ2xsIGJlIHN0YXJ0aW5nCiAJICogZnJvbSwgYW5kIHdlIGhhdmUgbm8gYm91bmRhcnkg a2V5IGZvciB0aGUgY29sdW1uICh3aGljaCBtZWFucyB0aGUga2V5CkBAIC0xNTM2LDkgKzE1NDAs OCBAQCBfYnRfcmVhZHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpciwg T2Zmc2V0TnVtYmVyIG9mZm51bSkKIAlCVFBhZ2VPcGFxdWUgb3BhcXVlOwogCU9mZnNldE51bWJl ciBtaW5vZmY7CiAJT2Zmc2V0TnVtYmVyIG1heG9mZjsKKwlCVFJlYWRQYWdlU3RhdGUgcHN0YXRl OwogCWludAkJCWl0ZW1JbmRleDsKLQlib29sCQljb250aW51ZXNjYW47Ci0JaW50CQkJaW5kbmF0 dHM7CiAKIAkvKgogCSAqIFdlIG11c3QgaGF2ZSB0aGUgYnVmZmVyIHBpbm5lZCBhbmQgbG9ja2Vk LCBidXQgdGhlIHVzdWFsIG1hY3JvIGNhbid0IGJlCkBAIC0xNTU4LDggKzE1NjEsMTEgQEAgX2J0 X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51 bWJlciBvZmZudW0pCiAJCQlfYnRfcGFyYWxsZWxfcmVsZWFzZShzY2FuLCBCdWZmZXJHZXRCbG9j a051bWJlcihzby0+Y3VyclBvcy5idWYpKTsKIAl9CiAKLQljb250aW51ZXNjYW4gPSB0cnVlOwkJ LyogZGVmYXVsdCBhc3N1bXB0aW9uICovCi0JaW5kbmF0dHMgPSBJbmRleFJlbGF0aW9uR2V0TnVt YmVyT2ZBdHRyaWJ1dGVzKHNjYW4tPmluZGV4UmVsYXRpb24pOworCXBzdGF0ZS5kaXIgPSBkaXI7 CisJcHN0YXRlLmhpZ2hrZXkgPSBOVUxMOworCXBzdGF0ZS5jb250aW51ZXNjYW4gPSB0cnVlOyAv KiBkZWZhdWx0IGFzc3VtcHRpb24gKi8KKwlwc3RhdGUuaGlnaGtleWNoZWNrZWQgPSBmYWxzZTsK KwogCW1pbm9mZiA9IFBfRklSU1REQVRBS0VZKG9wYXF1ZSk7CiAJbWF4b2ZmID0gUGFnZUdldE1h eE9mZnNldE51bWJlcihwYWdlKTsKIApAQCAtMTU5NCw2ICsxNjAwLDE0IEBAIF9idF9yZWFkcGFn ZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIgb2Zm bnVtKQogCiAJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKIAl7CisJCS8qIFNLX1NF QVJDSEFSUkFZIHNjYW5zIG11c3QgcHJvdmlkZSBoaWdoIGtleSB1cCBmcm9udCAqLworCQlpZiAo c28tPm51bUFycmF5S2V5cyAmJiAhUF9SSUdIVE1PU1Qob3BhcXVlKSkKKwkJeworCQkJSXRlbUlk CQlpaWQgPSBQYWdlR2V0SXRlbUlkKHBhZ2UsIFBfSElLRVkpOworCisJCQlwc3RhdGUuaGlnaGtl eSA9IChJbmRleFR1cGxlKSBQYWdlR2V0SXRlbShwYWdlLCBpaWQpOworCQl9CisKIAkJLyogbG9h ZCBpdGVtc1tdIGluIGFzY2VuZGluZyBvcmRlciAqLwogCQlpdGVtSW5kZXggPSAwOwogCkBAIC0x NjE2LDcgKzE2MzAsNyBAQCBfYnRfcmVhZHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGly ZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSkKIAogCQkJaXR1cCA9IChJbmRleFR1cGxl KSBQYWdlR2V0SXRlbShwYWdlLCBpaWQpOwogCi0JCQlpZiAoX2J0X2NoZWNra2V5cyhzY2FuLCBp dHVwLCBpbmRuYXR0cywgZGlyLCAmY29udGludWVzY2FuKSkKKwkJCWlmIChfYnRfY2hlY2trZXlz KHNjYW4sICZwc3RhdGUsIGl0dXAsIGZhbHNlKSkKIAkJCXsKIAkJCQkvKiB0dXBsZSBwYXNzZXMg YWxsIHNjYW4ga2V5IGNvbmRpdGlvbnMgKi8KIAkJCQlpZiAoIUJUcmVlVHVwbGVJc1Bvc3Rpbmco aXR1cCkpCkBAIC0xNjQ5LDcgKzE2NjMsNyBAQCBfYnRfcmVhZHBhZ2UoSW5kZXhTY2FuRGVzYyBz Y2FuLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSkKIAkJCQl9CiAJCQl9 CiAJCQkvKiBXaGVuICFjb250aW51ZXNjYW4sIHRoZXJlIGNhbid0IGJlIGFueSBtb3JlIG1hdGNo ZXMsIHNvIHN0b3AgKi8KLQkJCWlmICghY29udGludWVzY2FuKQorCQkJaWYgKCFwc3RhdGUuY29u dGludWVzY2FuKQogCQkJCWJyZWFrOwogCiAJCQlvZmZudW0gPSBPZmZzZXROdW1iZXJOZXh0KG9m Zm51bSk7CkBAIC0xNjY2LDE3ICsxNjgwLDIzIEBAIF9idF9yZWFkcGFnZShJbmRleFNjYW5EZXNj IHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIgb2ZmbnVtKQogCQkgKiBvbmx5 IGFwcGVhciBvbiBub24tcGl2b3QgdHVwbGVzIG9uIHRoZSByaWdodCBzaWJsaW5nIHBhZ2UgYXJl CiAJCSAqIGNvbW1vbi4KIAkJICovCi0JCWlmIChjb250aW51ZXNjYW4gJiYgIVBfUklHSFRNT1NU KG9wYXF1ZSkpCisJCWlmIChwc3RhdGUuY29udGludWVzY2FuICYmICFQX1JJR0hUTU9TVChvcGFx dWUpKQogCQl7Ci0JCQlJdGVtSWQJCWlpZCA9IFBhZ2VHZXRJdGVtSWQocGFnZSwgUF9ISUtFWSk7 Ci0JCQlJbmRleFR1cGxlCWl0dXAgPSAoSW5kZXhUdXBsZSkgUGFnZUdldEl0ZW0ocGFnZSwgaWlk KTsKLQkJCWludAkJCXRydW5jYXR0OworCQkJSW5kZXhUdXBsZQlpdHVwOwogCi0JCQl0cnVuY2F0 dCA9IEJUcmVlVHVwbGVHZXROQXR0cyhpdHVwLCBzY2FuLT5pbmRleFJlbGF0aW9uKTsKLQkJCV9i dF9jaGVja2tleXMoc2NhbiwgaXR1cCwgdHJ1bmNhdHQsIGRpciwgJmNvbnRpbnVlc2Nhbik7CisJ CQlpZiAocHN0YXRlLmhpZ2hrZXkpCisJCQkJaXR1cCA9IHBzdGF0ZS5oaWdoa2V5OworCQkJZWxz ZQorCQkJeworCQkJCUl0ZW1JZAkJaWlkID0gUGFnZUdldEl0ZW1JZChwYWdlLCBQX0hJS0VZKTsK KworCQkJCWl0dXAgPSAoSW5kZXhUdXBsZSkgUGFnZUdldEl0ZW0ocGFnZSwgaWlkKTsKKwkJCX0K KworCQkJX2J0X2NoZWNra2V5cyhzY2FuLCAmcHN0YXRlLCBpdHVwLCB0cnVlKTsKIAkJfQogCi0J CWlmICghY29udGludWVzY2FuKQorCQlpZiAoIXBzdGF0ZS5jb250aW51ZXNjYW4pCiAJCQlzby0+ Y3VyclBvcy5tb3JlUmlnaHQgPSBmYWxzZTsKIAogCQlBc3NlcnQoaXRlbUluZGV4IDw9IE1heFRJ RHNQZXJCVHJlZVBhZ2UpOwpAQCAtMTY5Nyw2ICsxNzE3LDcgQEAgX2J0X3JlYWRwYWdlKEluZGV4 U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAJ CQlJbmRleFR1cGxlCWl0dXA7CiAJCQlib29sCQl0dXBsZV9hbGl2ZTsKIAkJCWJvb2wJCXBhc3Nl c19xdWFsczsKKwkJCWJvb2wJCWZpbmFsdHVwID0gKG9mZm51bSA9PSBtaW5vZmYpOwogCiAJCQkv KgogCQkJICogSWYgdGhlIHNjYW4gc3BlY2lmaWVzIG5vdCB0byByZXR1cm4ga2lsbGVkIHR1cGxl cywgdGhlbiB3ZQpAQCAtMTcwNywxMiArMTcyOCwxOCBAQCBfYnRfcmVhZHBhZ2UoSW5kZXhTY2Fu RGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSkKIAkJCSAq IHR1cGxlIG9uIHRoZSBwYWdlLCB3ZSBkbyBjaGVjayB0aGUgaW5kZXgga2V5cywgdG8gcHJldmVu dAogCQkJICogdXNlbGVzc2x5IGFkdmFuY2luZyB0byB0aGUgcGFnZSB0byB0aGUgbGVmdC4gIFRo aXMgaXMgc2ltaWxhcgogCQkJICogdG8gdGhlIGhpZ2gga2V5IG9wdGltaXphdGlvbiB1c2VkIGJ5 IGZvcndhcmQgc2NhbnMuCisJCQkgKgorCQkJICogU2VwYXJhdGVseSwgX2J0X2NoZWNra2V5cyBh Y3R1YWxseSByZXF1aXJlcyB0aGF0IHdlIGNhbGwgaXQKKwkJCSAqIHdpdGggdGhlIGZpbmFsIG5v bi1waXZvdCB0dXBsZSBmcm9tIHRoZSBwYWdlLCBpZiB0aGVyZSdzIG9uZQorCQkJICogKGZpbmFs IHByb2Nlc3NlZCB0dXBsZSwgb3IgZmlyc3QgdHVwbGUgaW4gb2Zmc2V0IG51bWJlciB0ZXJtcyku CisJCQkgKiBXZSBtdXN0IGluZGljYXRlIHdoaWNoIHBhcnRpY3VsYXIgdHVwbGUgY29tZXMgbGFz dCwgdG9vLgogCQkJICovCiAJCQlpZiAoc2Nhbi0+aWdub3JlX2tpbGxlZF90dXBsZXMgJiYgSXRl bUlkSXNEZWFkKGlpZCkpCiAJCQl7CiAJCQkJQXNzZXJ0KG9mZm51bSA+PSBQX0ZJUlNUREFUQUtF WShvcGFxdWUpKTsKLQkJCQlpZiAob2ZmbnVtID4gUF9GSVJTVERBVEFLRVkob3BhcXVlKSkKKwkJ CQlpZiAoIWZpbmFsdHVwKQogCQkJCXsKKwkJCQkJQXNzZXJ0KG9mZm51bSA+IG1pbm9mZik7CiAJ CQkJCW9mZm51bSA9IE9mZnNldE51bWJlclByZXYob2ZmbnVtKTsKIAkJCQkJY29udGludWU7CiAJ CQkJfQpAQCAtMTcyNCw4ICsxNzUxLDcgQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2Nh biwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAKIAkJCWl0dXAgPSAo SW5kZXhUdXBsZSkgUGFnZUdldEl0ZW0ocGFnZSwgaWlkKTsKIAotCQkJcGFzc2VzX3F1YWxzID0g X2J0X2NoZWNra2V5cyhzY2FuLCBpdHVwLCBpbmRuYXR0cywgZGlyLAotCQkJCQkJCQkJCSAmY29u dGludWVzY2FuKTsKKwkJCXBhc3Nlc19xdWFscyA9IF9idF9jaGVja2tleXMoc2NhbiwgJnBzdGF0 ZSwgaXR1cCwgZmluYWx0dXApOwogCQkJaWYgKHBhc3Nlc19xdWFscyAmJiB0dXBsZV9hbGl2ZSkK IAkJCXsKIAkJCQkvKiB0dXBsZSBwYXNzZXMgYWxsIHNjYW4ga2V5IGNvbmRpdGlvbnMgKi8KQEAg LTE3NjQsNyArMTc5MCw3IEBAIF9idF9yZWFkcGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5E aXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIgb2ZmbnVtKQogCQkJCQl9CiAJCQkJfQogCQkJfQot CQkJaWYgKCFjb250aW51ZXNjYW4pCisJCQlpZiAoIXBzdGF0ZS5jb250aW51ZXNjYW4pCiAJCQl7 CiAJCQkJLyogdGhlcmUgY2FuJ3QgYmUgYW55IG1vcmUgbWF0Y2hlcywgc28gc3RvcCAqLwogCQkJ CXNvLT5jdXJyUG9zLm1vcmVMZWZ0ID0gZmFsc2U7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9h Y2Nlc3MvbmJ0cmVlL25idHV0aWxzLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHV0 aWxzLmMKaW5kZXggZTQ1MjhkYjQ3Li4yOTJkMmUzMjIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L2FjY2Vzcy9uYnRyZWUvbmJ0dXRpbHMuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVl L25idHV0aWxzLmMKQEAgLTMzLDcgKzMzLDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgQlRTb3J0QXJy YXlDb250ZXh0CiB7Ci0JRm1nckluZm8JZmxpbmZvOworCUZtZ3JJbmZvICAgKm9yZGVycHJvYzsK IAlPaWQJCQljb2xsYXRpb247CiAJYm9vbAkJcmV2ZXJzZTsKIH0gQlRTb3J0QXJyYXlDb250ZXh0 OwpAQCAtNDEsMTUgKzQxLDMzIEBAIHR5cGVkZWYgc3RydWN0IEJUU29ydEFycmF5Q29udGV4dAog c3RhdGljIERhdHVtIF9idF9maW5kX2V4dHJlbWVfZWxlbWVudChJbmRleFNjYW5EZXNjIHNjYW4s IFNjYW5LZXkgc2tleSwKIAkJCQkJCQkJCSAgU3RyYXRlZ3lOdW1iZXIgc3RyYXQsCiAJCQkJCQkJ CQkgIERhdHVtICplbGVtcywgaW50IG5lbGVtcyk7CitzdGF0aWMgdm9pZCBfYnRfc29ydF9jbXBf ZnVuY19zZXR1cChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5LZXkgc2tleSk7CiBzdGF0aWMgaW50 CV9idF9zb3J0X2FycmF5X2VsZW1lbnRzKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbktleSBza2V5 LAogCQkJCQkJCQkJYm9vbCByZXZlcnNlLAogCQkJCQkJCQkJRGF0dW0gKmVsZW1zLCBpbnQgbmVs ZW1zKTsKIHN0YXRpYyBpbnQJX2J0X2NvbXBhcmVfYXJyYXlfZWxlbWVudHMoY29uc3Qgdm9pZCAq YSwgY29uc3Qgdm9pZCAqYiwgdm9pZCAqYXJnKTsKK3N0YXRpYyBpbmxpbmUgaW50MzIgX2J0X2Nv bXBhcmVfYXJyYXlfc2tleShTY2FuS2V5IGN1ciwgRm1nckluZm8gKm9yZGVycHJvYywKKwkJCQkJ CQkJCQkgICBEYXR1bSBkYXR1bSwgYm9vbCBudWxsLAorCQkJCQkJCQkJCSAgIERhdHVtIGFycmRh dHVtKTsKK3N0YXRpYyBpbnQJX2J0X2JpbnNyY2hfYXJyYXlfc2tleShTY2FuRGlyZWN0aW9uIGRp ciwgYm9vbCBjdXJfZWxlbV9zdGFydCwKKwkJCQkJCQkJICAgQlRBcnJheUtleUluZm8gKmFycmF5 LCBTY2FuS2V5IGN1ciwKKwkJCQkJCQkJICAgRm1nckluZm8gKm9yZGVycHJvYywgRGF0dW0gZGF0 dW0sIGJvb2wgbnVsbCwKKwkJCQkJCQkJICAgaW50MzIgKmZpbmFsX3Jlc3VsdCk7CitzdGF0aWMg Ym9vbCBfYnRfdHVwbGVfYmVmb3JlX2FycmF5X3NrZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwKKwkJ CQkJCQkJCQkgQlRSZWFkUGFnZVN0YXRlICpwc3RhdGUsCisJCQkJCQkJCQkJIEluZGV4VHVwbGUg dHVwbGUpOworc3RhdGljIGJvb2wgX2J0X2FkdmFuY2VfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNj IHNjYW4sIEJUUmVhZFBhZ2VTdGF0ZSAqcHN0YXRlLAorCQkJCQkJCQkgICBJbmRleFR1cGxlIHR1 cGxlLCBib29sIHNrcmVxdWlyZWR0cmlnZ2VyKTsKK3N0YXRpYyBib29sIF9idF9hZHZhbmNlX2Fy cmF5X2tleXNfaW5jcmVtZW50KEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIp Oworc3RhdGljIHZvaWQgX2J0X2FkdmFuY2VfYXJyYXlfa2V5c190b19lbmQoSW5kZXhTY2FuRGVz YyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcik7CiBzdGF0aWMgYm9vbCBfYnRfY29tcGFyZV9zY2Fu a2V5X2FyZ3MoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuS2V5IG9wLAogCQkJCQkJCQkJIFNjYW5L ZXkgbGVmdGFyZywgU2NhbktleSByaWdodGFyZywKIAkJCQkJCQkJCSBib29sICpyZXN1bHQpOwog c3RhdGljIGJvb2wgX2J0X2ZpeF9zY2Fua2V5X3N0cmF0ZWd5KFNjYW5LZXkgc2tleSwgaW50MTYg KmluZG9wdGlvbik7CiBzdGF0aWMgdm9pZCBfYnRfbWFya19zY2Fua2V5X3JlcXVpcmVkKFNjYW5L ZXkgc2tleSk7CitzdGF0aWMgYm9vbCBfYnRfY2hlY2tfY29tcGFyZShTY2FuRGlyZWN0aW9uIGRp ciwgU2NhbktleSBrZXlEYXRhLCBpbnQga2V5c3osCisJCQkJCQkJICBJbmRleFR1cGxlIHR1cGxl LCBpbnQgdHVwbmF0dHMsIFR1cGxlRGVzYyB0dXBkZXNjLAorCQkJCQkJCSAgYm9vbCAqY29udGlu dWVzY2FuLCBib29sICpza3JlcXVpcmVkdHJpZ2dlcik7CiBzdGF0aWMgYm9vbCBfYnRfY2hlY2tf cm93Y29tcGFyZShTY2FuS2V5IHNrZXksCiAJCQkJCQkJCSBJbmRleFR1cGxlIHR1cGxlLCBpbnQg dHVwbmF0dHMsIFR1cGxlRGVzYyB0dXBkZXNjLAogCQkJCQkJCQkgU2NhbkRpcmVjdGlvbiBkaXIs IGJvb2wgKmNvbnRpbnVlc2Nhbik7CkBAIC0yMDIsNiArMjIwLDIxIEBAIF9idF9mcmVlc3RhY2so QlRTdGFjayBzdGFjaykKICAqIGFycmF5IGtleXMsIGl0J3Mgc3VmZmljaWVudCB0byBmaW5kIHRo ZSBleHRyZW1lIGVsZW1lbnQgdmFsdWUgYW5kIHJlcGxhY2UKICAqIHRoZSB3aG9sZSBhcnJheSB3 aXRoIHRoYXQgc2NhbGFyIHZhbHVlLgogICoKKyAqIEluIHRoZSB3b3JzdCBjYXNlLCB0aGUgbnVt YmVyIG9mIHByaW1pdGl2ZSBpbmRleCBzY2FucyB3aWxsIGVxdWFsIHRoZQorICogbnVtYmVyIG9m IGFycmF5IGVsZW1lbnRzIChvciB0aGUgcHJvZHVjdCBvZiB0aGUgbnVtYmVyIG9mIGFycmF5IGtl eXMgd2hlbgorICogdGhlcmUgYXJlIG11bHRpcGxlIGFycmF5cy9jb2x1bW5zIGludm9sdmVkKS4g IEl0J3MgYWxzbyBwb3NzaWJsZSB0aGF0IHRoZQorICogdG90YWwgbnVtYmVyIG9mIHByaW1pdGl2 ZSBpbmRleCBzY2FucyB3aWxsIGJlIGZhciBsZXNzIHRoYW4gdGhhdC4KKyAqCisgKiBXZSBhbHdh eXMgc29ydCBhbmQgZGVkdXBsaWNhdGUgYXJyYXlzIHVwLWZyb250IGZvciBlcXVhbGl0eSBhcnJh eSBrZXlzLgorICogU2NhbGFyQXJyYXlPcEV4cHIgZXhlY3V0aW9uIG5lZWQgb25seSB2aXNpdCBs ZWFmIHBhZ2VzIHRoYXQgbWlnaHQgY29udGFpbgorICogbWF0Y2hlcyBleGFjdGx5IG9uY2UsIHdo aWxlIHByZXNlcnZpbmcgdGhlIHNvcnQgb3JkZXIgb2YgdGhlIGluZGV4LiAgVGhpcworICogaXNu J3QganVzdCBhYm91dCBwZXJmb3JtYW5jZTsgaXQgYWxzbyBhdm9pZHMgbmVlZGluZyBkdXBsaWNh dGUgZWxpbWluYXRpb24KKyAqIG9mIG1hdGNoaW5nIFRJRHMgKHdlIHByZWZlciBkZWR1cGxpY2F0 aW5nIHNlYXJjaCBrZXlzIG9uY2UsIHVwLWZyb250KS4KKyAqIEVxdWFsaXR5IFNLX1NFQVJDSEFS UkFZIGtleXMgYXJlIGRpc2p1bmN0cyB0aGF0IHdlIGFsd2F5cyBwcm9jZXNzIGluCisgKiBpbmRl eC9rZXkgc3BhY2Ugb3JkZXIsIHdoaWNoIG1ha2VzIHRoaXMgZ2VuZXJhbCBhcHByb2FjaCBmZWFz aWJsZS4gIEV2ZXJ5CisgKiBpbmRleCB0dXBsZSB3aWxsIG1hdGNoIG5vIG1vcmUgdGhhbiBvbmUg c2luZ2xlIGRpc3RpbmN0IGNvbWJpbmF0aW9uIG9mCisgKiBlcXVhbGl0eS1jb25zdHJhaW5lZCBr ZXlzIChhcnJheSBrZXlzIGFuZCBvdGhlciBlcXVhbGl0eSBrZXlzKS4KKyAqCiAgKiBOb3RlOiB0 aGUgcmVhc29uIHdlIG5lZWQgc28tPmFycmF5S2V5RGF0YSwgcmF0aGVyIHRoYW4ganVzdCBzY3Jp YmJsaW5nCiAgKiBvbiBzY2FuLT5rZXlEYXRhLCBpcyB0aGF0IGNhbGxlcnMgYXJlIHBlcm1pdHRl ZCB0byBjYWxsIGJ0cmVzY2FuIHdpdGhvdXQKICAqIHN1cHBseWluZyBhIG5ldyBzZXQgb2Ygc2Nh bmtleSBkYXRhLgpAQCAtMjEyLDYgKzI0NSw3IEBAIF9idF9wcmVwcm9jZXNzX2FycmF5X2tleXMo SW5kZXhTY2FuRGVzYyBzY2FuKQogCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNj YW4tPm9wYXF1ZTsKIAlpbnQJCQludW1iZXJPZktleXMgPSBzY2FuLT5udW1iZXJPZktleXM7CiAJ aW50MTYJICAgKmluZG9wdGlvbiA9IHNjYW4tPmluZGV4UmVsYXRpb24tPnJkX2luZG9wdGlvbjsK KwlpbnQxNgkJbmtleWF0dHMgPSBJbmRleFJlbGF0aW9uR2V0TnVtYmVyT2ZLZXlBdHRyaWJ1dGVz KHNjYW4tPmluZGV4UmVsYXRpb24pOwogCWludAkJCW51bUFycmF5S2V5czsKIAlTY2FuS2V5CQlj dXI7CiAJaW50CQkJaTsKQEAgLTI2NSw2ICsyOTksNyBAQCBfYnRfcHJlcHJvY2Vzc19hcnJheV9r ZXlzKEluZGV4U2NhbkRlc2Mgc2NhbikKIAogCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBwZXItYXJy YXkgZGF0YSBpbiB0aGUgd29ya3NwYWNlIGNvbnRleHQgKi8KIAlzby0+YXJyYXlLZXlzID0gKEJU QXJyYXlLZXlJbmZvICopIHBhbGxvYzAobnVtQXJyYXlLZXlzICogc2l6ZW9mKEJUQXJyYXlLZXlJ bmZvKSk7CisJc28tPm9yZGVyUHJvY3MgPSAoRm1nckluZm8gKikgcGFsbG9jKG5rZXlhdHRzICog c2l6ZW9mKEZtZ3JJbmZvKSk7CiAKIAkvKiBOb3cgcHJvY2VzcyBlYWNoIGFycmF5IGtleSAqLwog CW51bUFycmF5S2V5cyA9IDA7CkBAIC0yODEsNiArMzE2LDE3IEBAIF9idF9wcmVwcm9jZXNzX2Fy cmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKQogCQlpbnQJCQlqOwogCiAJCWN1ciA9ICZzby0+ YXJyYXlLZXlEYXRhW2ldOworCisJCS8qCisJCSAqIEF0dHJpYnV0ZXMgd2l0aCBlcXVhbGl0eS10 eXBlIHNjYW4ga2V5cyAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZAorCQkgKiB0byBhcnJheSBz Y2FuIGtleXMpIHdpbGwgbmVlZCBhIDMtd2F5IGNvbXBhcmlzb24gZnVuY3Rpb24uCisJCSAqCisJ CSAqIFhYWCBDbGVhbiB0aGlzIHVwIHNvbWUgbW9yZS4gIFRoaXMgcmVwZWF0cyBzb21lIG9mIHRo ZSBzYW1lIHdvcmsKKwkJICogd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgc2NhbiBrZXlzIGZvciB0 aGUgc2FtZSBrZXkgY29sdW1uLgorCQkgKi8KKwkJaWYgKGN1ci0+c2tfc3RyYXRlZ3kgPT0gQlRF cXVhbFN0cmF0ZWd5TnVtYmVyKQorCQkJX2J0X3NvcnRfY21wX2Z1bmNfc2V0dXAoc2NhbiwgY3Vy KTsKKwogCQlpZiAoIShjdXItPnNrX2ZsYWdzICYgU0tfU0VBUkNIQVJSQVkpKQogCQkJY29udGlu dWU7CiAKQEAgLTQzNiw2ICs0ODIsNDIgQEAgX2J0X2ZpbmRfZXh0cmVtZV9lbGVtZW50KEluZGV4 U2NhbkRlc2Mgc2NhbiwgU2NhbktleSBza2V5LAogCXJldHVybiByZXN1bHQ7CiB9CiAKKy8qCisg KiBMb29rIHVwIHRoZSBhcHByb3ByaWF0ZSBjb21wYXJpc29uIGZ1bmN0aW9uIGluIHRoZSBvcGZh bWlseS4KKyAqCisgKiBOb3RlOiBpdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyB3b3VsZCBmYWlsLCBp ZiB0aGUgb3BmYW1pbHkgaXMgaW5jb21wbGV0ZSwKKyAqIGJ1dCBpdCBzZWVtcyBxdWl0ZSB1bmxp a2VseSB0aGF0IGFuIG9wZmFtaWx5IHdvdWxkIG9taXQgbm9uLWNyb3NzLXR5cGUKKyAqIHN1cHBv cnQgZnVuY3Rpb25zIGZvciBhbnkgZGF0YXR5cGUgdGhhdCBpdCBzdXBwb3J0cyBhdCBhbGwuCisg Ki8KK3N0YXRpYyB2b2lkCitfYnRfc29ydF9jbXBfZnVuY19zZXR1cChJbmRleFNjYW5EZXNjIHNj YW4sIFNjYW5LZXkgc2tleSkKK3sKKwlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBz Y2FuLT5vcGFxdWU7CisJUmVsYXRpb24JcmVsID0gc2Nhbi0+aW5kZXhSZWxhdGlvbjsKKwlPaWQJ CQllbGVtdHlwZTsKKwlSZWdQcm9jZWR1cmUgY21wX3Byb2M7CisJRm1nckluZm8gICAqb3JkZXJw cm9jID0gJnNvLT5vcmRlclByb2NzW3NrZXktPnNrX2F0dG5vIC0gMV07CisKKwkvKgorCSAqIERl dGVybWluZSB0aGUgbm9taW5hbCBkYXRhdHlwZSBvZiB0aGUgYXJyYXkgZWxlbWVudHMuICBXZSBo YXZlIHRvCisJICogc3VwcG9ydCB0aGUgY29udmVudGlvbiB0aGF0IHNrX3N1YnR5cGUgPT0gSW52 YWxpZE9pZCBtZWFucyB0aGUgb3BjbGFzcworCSAqIGlucHV0IHR5cGU7IHRoaXMgaXMgYSBoYWNr IHRvIHNpbXBsaWZ5IGxpZmUgZm9yIFNjYW5LZXlJbml0KCkuCisJICovCisJZWxlbXR5cGUgPSBz a2V5LT5za19zdWJ0eXBlOworCWlmIChlbGVtdHlwZSA9PSBJbnZhbGlkT2lkKQorCQllbGVtdHlw ZSA9IHJlbC0+cmRfb3BjaW50eXBlW3NrZXktPnNrX2F0dG5vIC0gMV07CisKKwljbXBfcHJvYyA9 IGdldF9vcGZhbWlseV9wcm9jKHJlbC0+cmRfb3BmYW1pbHlbc2tleS0+c2tfYXR0bm8gLSAxXSwK KwkJCQkJCQkJIHJlbC0+cmRfb3BjaW50eXBlW3NrZXktPnNrX2F0dG5vIC0gMV0sCisJCQkJCQkJ CSBlbGVtdHlwZSwKKwkJCQkJCQkJIEJUT1JERVJfUFJPQyk7CisJaWYgKCFSZWdQcm9jZWR1cmVJ c1ZhbGlkKGNtcF9wcm9jKSkKKwkJZWxvZyhFUlJPUiwgIm1pc3Npbmcgc3VwcG9ydCBmdW5jdGlv biAlZCgldSwldSkgaW4gb3BmYW1pbHkgJXUiLAorCQkJIEJUT1JERVJfUFJPQywgZWxlbXR5cGUs IGVsZW10eXBlLAorCQkJIHJlbC0+cmRfb3BmYW1pbHlbc2tleS0+c2tfYXR0bm8gLSAxXSk7CisJ Zm1ncl9pbmZvX2N4dChjbXBfcHJvYywgb3JkZXJwcm9jLCBzby0+YXJyYXlDb250ZXh0KTsKK30K KwogLyoKICAqIF9idF9zb3J0X2FycmF5X2VsZW1lbnRzKCkgLS0gc29ydCBhbmQgZGUtZHVwIGFy cmF5IGVsZW1lbnRzCiAgKgpAQCAtNDUwLDQyICs1MzIsMTQgQEAgX2J0X3NvcnRfYXJyYXlfZWxl bWVudHMoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuS2V5IHNrZXksCiAJCQkJCQlib29sIHJldmVy c2UsCiAJCQkJCQlEYXR1bSAqZWxlbXMsIGludCBuZWxlbXMpCiB7Ci0JUmVsYXRpb24JcmVsID0g c2Nhbi0+aW5kZXhSZWxhdGlvbjsKLQlPaWQJCQllbGVtdHlwZTsKLQlSZWdQcm9jZWR1cmUgY21w X3Byb2M7CisJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOwog CUJUU29ydEFycmF5Q29udGV4dCBjeHQ7CiAKIAlpZiAobmVsZW1zIDw9IDEpCiAJCXJldHVybiBu ZWxlbXM7CQkJLyogbm8gd29yayB0byBkbyAqLwogCi0JLyoKLQkgKiBEZXRlcm1pbmUgdGhlIG5v bWluYWwgZGF0YXR5cGUgb2YgdGhlIGFycmF5IGVsZW1lbnRzLiAgV2UgaGF2ZSB0bwotCSAqIHN1 cHBvcnQgdGhlIGNvbnZlbnRpb24gdGhhdCBza19zdWJ0eXBlID09IEludmFsaWRPaWQgbWVhbnMg dGhlIG9wY2xhc3MKLQkgKiBpbnB1dCB0eXBlOyB0aGlzIGlzIGEgaGFjayB0byBzaW1wbGlmeSBs aWZlIGZvciBTY2FuS2V5SW5pdCgpLgotCSAqLwotCWVsZW10eXBlID0gc2tleS0+c2tfc3VidHlw ZTsKLQlpZiAoZWxlbXR5cGUgPT0gSW52YWxpZE9pZCkKLQkJZWxlbXR5cGUgPSByZWwtPnJkX29w Y2ludHlwZVtza2V5LT5za19hdHRubyAtIDFdOwotCi0JLyoKLQkgKiBMb29rIHVwIHRoZSBhcHBy b3ByaWF0ZSBjb21wYXJpc29uIGZ1bmN0aW9uIGluIHRoZSBvcGZhbWlseS4KLQkgKgotCSAqIE5v dGU6IGl0J3MgcG9zc2libGUgdGhhdCB0aGlzIHdvdWxkIGZhaWwsIGlmIHRoZSBvcGZhbWlseSBp cwotCSAqIGluY29tcGxldGUsIGJ1dCBpdCBzZWVtcyBxdWl0ZSB1bmxpa2VseSB0aGF0IGFuIG9w ZmFtaWx5IHdvdWxkIG9taXQKLQkgKiBub24tY3Jvc3MtdHlwZSBzdXBwb3J0IGZ1bmN0aW9ucyBm b3IgYW55IGRhdGF0eXBlIHRoYXQgaXQgc3VwcG9ydHMgYXQKLQkgKiBhbGwuCi0JICovCi0JY21w X3Byb2MgPSBnZXRfb3BmYW1pbHlfcHJvYyhyZWwtPnJkX29wZmFtaWx5W3NrZXktPnNrX2F0dG5v IC0gMV0sCi0JCQkJCQkJCSBlbGVtdHlwZSwKLQkJCQkJCQkJIGVsZW10eXBlLAotCQkJCQkJCQkg QlRPUkRFUl9QUk9DKTsKLQlpZiAoIVJlZ1Byb2NlZHVyZUlzVmFsaWQoY21wX3Byb2MpKQotCQll bG9nKEVSUk9SLCAibWlzc2luZyBzdXBwb3J0IGZ1bmN0aW9uICVkKCV1LCV1KSBpbiBvcGZhbWls eSAldSIsCi0JCQkgQlRPUkRFUl9QUk9DLCBlbGVtdHlwZSwgZWxlbXR5cGUsCi0JCQkgcmVsLT5y ZF9vcGZhbWlseVtza2V5LT5za19hdHRubyAtIDFdKTsKLQogCS8qIFNvcnQgdGhlIGFycmF5IGVs ZW1lbnRzICovCi0JZm1ncl9pbmZvKGNtcF9wcm9jLCAmY3h0LmZsaW5mbyk7CisJY3h0Lm9yZGVy cHJvYyA9ICZzby0+b3JkZXJQcm9jc1tza2V5LT5za19hdHRubyAtIDFdOwogCWN4dC5jb2xsYXRp b24gPSBza2V5LT5za19jb2xsYXRpb247CiAJY3h0LnJldmVyc2UgPSByZXZlcnNlOwogCXFzb3J0 X2FyZyhlbGVtcywgbmVsZW1zLCBzaXplb2YoRGF0dW0pLApAQCAtNTA3LDcgKzU2MSw3IEBAIF9i dF9jb21wYXJlX2FycmF5X2VsZW1lbnRzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIsIHZv aWQgKmFyZykKIAlCVFNvcnRBcnJheUNvbnRleHQgKmN4dCA9IChCVFNvcnRBcnJheUNvbnRleHQg KikgYXJnOwogCWludDMyCQljb21wYXJlOwogCi0JY29tcGFyZSA9IERhdHVtR2V0SW50MzIoRnVu Y3Rpb25DYWxsMkNvbGwoJmN4dC0+ZmxpbmZvLAorCWNvbXBhcmUgPSBEYXR1bUdldEludDMyKEZ1 bmN0aW9uQ2FsbDJDb2xsKGN4dC0+b3JkZXJwcm9jLAogCQkJCQkJCQkJCQkgIGN4dC0+Y29sbGF0 aW9uLAogCQkJCQkJCQkJCQkgIGRhLCBkYikpOwogCWlmIChjeHQtPnJldmVyc2UpCkBAIC01MTUs NiArNTY5LDE3MSBAQCBfYnRfY29tcGFyZV9hcnJheV9lbGVtZW50cyhjb25zdCB2b2lkICphLCBj b25zdCB2b2lkICpiLCB2b2lkICphcmcpCiAJcmV0dXJuIGNvbXBhcmU7CiB9CiAKKy8qCisgKiBD b21wYXJhdG9yIHVzZXMgdG8gc2VhcmNoIGZvciB0aGUgbmV4dCBhcnJheSBlbGVtZW50IHdoZW4g YXJyYXkga2V5cyBuZWVkCisgKiB0byBiZSBhZHZhbmNlZCB2aWEgb25lIG9yIG1vcmUgYmluYXJ5 IHNlYXJjaGVzCisgKgorICogVGhpcyBjb2RlIGlzIGxvb3NlbHkgYmFzZWQgb24gX2J0X2NvbXBh cmUuICBIb3dldmVyLCB0aGVyZSBhcmUgc29tZQorICogaW1wb3J0YW50IGRpZmZlcmVuY2VzLgor ICoKKyAqIEl0IGlzIGNvbnZlbmllbnQgdG8gdGhpbmsgb2YgY2FsbGluZyBfYnRfY29tcGFyZSBh cyBjb21wYXJpbmcgY2FsbGVyJ3MKKyAqIGluc2VydGlvbiBzY2Fua2V5IHRvIGFuIGluZGV4IHR1 cGxlLiAgQnV0IG91ciBjYWxsZXJzIGFyZSBub3Qgc2VhcmNoaW5nCisgKiB0aHJvdWdoIHRoZSBp bmRleCBhdCBhbGwgLS0gdGhleSdyZSBzZWFyY2hpbmcgdGhyb3VnaCBhIGxvY2FsIGFycmF5IG9m CisgKiBkYXR1bXMgYXNzb2NpYXRlZCB3aXRoIGEgc2NhbiBrZXkgKHVzaW5nIHZhbHVlcyB0aGV5 J3ZlIHRha2VuIGZyb20gYW4gaW5kZXgKKyAqIHR1cGxlKS4gIFRoaXMgaXMgYSBjb21wbGV0ZSBy ZXZlcnNhbCBvZiBob3cgdGhpbmdzIHVzdWFsbHkgd29yaywgd2hpY2ggY2FuCisgKiBiZSBjb25m dXNpbmcuCisgKgorICogQ2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uIHNob3VsZCB0aGluayBvZiBp dCBhcyBjb21wYXJpbmcgImRhdHVtIiAoYXMgd2VsbAorICogYXMgIm51bGwiKSB0byAiYXJyZGF0 dW0iLiAgVGhpcyBpcyB0aGUgc2FtZSBhcHByb2FjaCB0aGF0IF9idF9jb21wYXJlIHRha2VzCisg KiBpbiB0aGF0IGJvdGggZnVuY3Rpb25zIGNvbXBhcmUgdGhlIHZhbHVlIHRoYXQgdGhleSdyZSBz ZWFyY2hpbmcgZm9yIHRvIG9uZQorICogcGFydGljdWxhciBpdGVtIHVzZWQgYXMgYSBiaW5hcnkg c2VhcmNoIHBpdm90LiAgKEJ1dCBpdCdzIHRoZSB3cm9uZyB3YXkKKyAqIGFyb3VuZCBpZiB5b3Ug dGhpbmsgb2YgaXQgYXMgInR1cGxlIHZhbHVlcyB2cyBzY2FuIGtleSB2YWx1ZXMiLiAgU28gZG9u J3QuKQorKi8KK3N0YXRpYyBpbmxpbmUgaW50MzIKK19idF9jb21wYXJlX2FycmF5X3NrZXkoU2Nh bktleSBjdXIsCisJCQkJCSAgIEZtZ3JJbmZvICpvcmRlcnByb2MsCisJCQkJCSAgIERhdHVtIGRh dHVtLAorCQkJCQkgICBib29sIG51bGwsCisJCQkJCSAgIERhdHVtIGFycmRhdHVtKQoreworCWlu dDMyCQlyZXN1bHQgPSAwOworCisJQXNzZXJ0KGN1ci0+c2tfc3RyYXRlZ3kgPT0gQlRFcXVhbFN0 cmF0ZWd5TnVtYmVyKTsKKworCWlmIChjdXItPnNrX2ZsYWdzICYgU0tfSVNOVUxMKQkvKiBhcnJh eS9zY2FuIGtleSBpcyBOVUxMICovCisJeworCQlpZiAobnVsbCkKKwkJCXJlc3VsdCA9IDA7CQkJ LyogTlVMTCAiPSIgTlVMTCAqLworCQllbHNlIGlmIChjdXItPnNrX2ZsYWdzICYgU0tfQlRfTlVM TFNfRklSU1QpCisJCQlyZXN1bHQgPSAxOwkJCS8qIE5VTEwgIjwiIE5PVF9OVUxMICovCisJCWVs c2UKKwkJCXJlc3VsdCA9IC0xOwkJLyogTlVMTCAiPiIgTk9UX05VTEwgKi8KKwl9CisJZWxzZSBp ZiAobnVsbCkJCQkJLyogYXJyYXkvc2NhbiBrZXkgaXMgTk9UX05VTEwgYW5kIHR1cGxlIGl0ZW0K KwkJCQkJCQkJICogaXMgTlVMTCAqLworCXsKKwkJaWYgKGN1ci0+c2tfZmxhZ3MgJiBTS19CVF9O VUxMU19GSVJTVCkKKwkJCXJlc3VsdCA9IC0xOwkJLyogTk9UX05VTEwgIj4iIE5VTEwgKi8KKwkJ ZWxzZQorCQkJcmVzdWx0ID0gMTsJCQkvKiBOT1RfTlVMTCAiPCIgTlVMTCAqLworCX0KKwllbHNl CisJeworCQkvKgorCQkgKiBMaWtlIF9idF9jb21wYXJlLCB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwg b2YgY3Jvc3MtdHlwZSBjb21wYXJpc29ucywKKwkJICogc28gdGhlIGxlZnQgdmFsdWUgaGFzIHRv IGJlIHRoZSB2YWx1ZSB0aGF0IGNhbWUgZnJvbSBhbiBpbmRleAorCQkgKiB0dXBsZS4gIChBcnJh eSBzY2FuIGtleXMgY2Fubm90IGJlIGNyb3NzLXR5cGUsIGJ1dCBvdGhlciByZXF1aXJlZAorCQkg KiBzY2FuIGtleXMgdGhhdCB1c2UgYW4gZXF1YWwgb3BlcmF0b3IgY2FuIGJlLikKKwkJICovCisJ CXJlc3VsdCA9IERhdHVtR2V0SW50MzIoRnVuY3Rpb25DYWxsMkNvbGwob3JkZXJwcm9jLCBjdXIt PnNrX2NvbGxhdGlvbiwKKwkJCQkJCQkJCQkJCSBkYXR1bSwgYXJyZGF0dW0pKTsKKworCQkvKgor CQkgKiBVbmxpa2UgX2J0X2NvbXBhcmUsIHdlIGZsaXAgdGhlIHNpZ24gd2hlbiBjb2x1bW4gaXMg YSBERVNDIGNvbHVtbgorCQkgKiAoYW5kICpub3QqIHdoZW4gY29sdW1uIGlzIEFTQykuICBUaGlz IG1hdGNoZXMgdGhlIGFwcHJvYWNoIHRha2VuIGJ5CisJCSAqIF9idF9jaGVja19yb3djb21wYXJl LCB3aGljaCBwZXJmb3JtcyBzaW1pbGFyIHRocmVlLXdheSBjb21wYXJpc29ucy4KKwkJICovCisJ CWlmIChjdXItPnNrX2ZsYWdzICYgU0tfQlRfREVTQykKKwkJCUlOVkVSVF9DT01QQVJFX1JFU1VM VChyZXN1bHQpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBfYnRfYmluc3Jj aF9hcnJheV9za2V5KCkgLS0gQmluYXJ5IHNlYXJjaCBmb3IgbmV4dCBtYXRjaGluZyBhcnJheSBr ZXkKKyAqCisgKiBjdXJfZWxlbV9zdGFydCBpbmRpY2F0ZXMgaWYgdGhlIGJpbmFyeSBzZWFyY2gg c2hvdWxkIGJlZ2luIGF0IHRoZSBhcnJheSdzCisgKiBjdXJyZW50IGVsZW1lbnQgKG9yIGhhdmUg dGhlIGN1cnJlbnQgZWxlbWVudCBhcyBhbiB1cHBlciBib3VuZCBpZiBpdCdzIGEKKyAqIGJhY2t3 YXJkIHNjYW4pLiAgVGhpcyBhbGxvd3Mgc2VhcmNoZXMgYWdhaW5zdCByZXF1aXJlZCBzY2FuIGtl eSBhcnJheXMgdG8KKyAqIHJldXNlIHRoZSB3b3JrIG9mIGVhcmxpZXIgc2VhcmNoZXMsIGF0IGxl YXN0IGluIG1hbnkgaW1wb3J0YW50IGNhc2VzLgorICogQXJyYXkga2V5cyBjb3ZlcmluZyBrZXkg c3BhY2UgdGhhdCB0aGUgaW5kZXggc2NhbiBhbHJlYWR5IHByb2Nlc3NlZCBjYW5ub3QKKyAqIHBv c3NpYmx5IGNvbnRhaW4gYW55IG1hdGNoZXMuCisgKgorICogWFhYIFRoZXJlIGFyZSBzZXZlcmFs IGZhaXJseSBvYnZpb3VzIG9wdGltaXphdGlvbnMgdGhhdCB3ZSBjb3VsZCBhcHBseSBoZXJlCisg KiAoZS5nLiwgcHJlY2hlY2sgc2VhcmNoZXMgZm9yIGVhcmxpZXIgc3Vic2V0cyBvZiBhIGxhcmdl ciBhcnJheSB3b3VsZCBoZWxwKS4KKyAqIFJldmlzaXQgdGhpcyBkdXJpbmcgdGhlIG5leHQgcm91 bmQgb2YgcGVyZm9ybWFuY2UgdmFsaWRhdGlvbi4KKyAqCisgKiBSZXR1cm5zIGFuIGluZGV4IHRv IHRoZSBmaXJzdCBhcnJheSBlbGVtZW50ID49IGNhbGxlcidzIGRhdHVtIGFyZ3VtZW50LgorICog QWxzbyBzZXRzICpmaW5hbF9yZXN1bHQgdG8gd2hhdGV2ZXIgX2J0X2NvbXBhcmVfYXJyYXlfc2tl eSByZXR1cm5lZCB3aGVuIHdlCisgKiBkaXJlY3RseSBjb21wYXJlZCB0aGUgcmV0dXJuZWQgYXJy YXkgZWxlbWVudCB0byBzZWFyY2hlZC1mb3IgZGF0dW0uCisgKi8KK3N0YXRpYyBpbnQKK19idF9i aW5zcmNoX2FycmF5X3NrZXkoU2NhbkRpcmVjdGlvbiBkaXIsIGJvb2wgY3VyX2VsZW1fc3RhcnQs CisJCQkJCSAgIEJUQXJyYXlLZXlJbmZvICphcnJheSwgU2NhbktleSBjdXIsCisJCQkJCSAgIEZt Z3JJbmZvICpvcmRlcnByb2MsIERhdHVtIGRhdHVtLCBib29sIG51bGwsCisJCQkJCSAgIGludDMy ICpmaW5hbF9yZXN1bHQpCit7CisJaW50CQkJbG93X2VsZW0sCisJCQkJaGlnaF9lbGVtLAorCQkJ CWZpcnN0X2VsZW1fZGlyLAorCQkJCXJlc3VsdCA9IDA7CisJYm9vbAkJa25vd25lcXVhbCA9IGZh bHNlOworCisJQXNzZXJ0KGN1ci0+c2tfZmxhZ3MgJiBTS19TRUFSQ0hBUlJBWSk7CisJQXNzZXJ0 KGN1ci0+c2tfc3RyYXRlZ3kgPT0gQlRFcXVhbFN0cmF0ZWd5TnVtYmVyKTsKKworCWlmIChTY2Fu RGlyZWN0aW9uSXNGb3J3YXJkKGRpcikpCisJeworCQlmaXJzdF9lbGVtX2RpciA9IDA7CisJCWxv d19lbGVtID0gYXJyYXktPmN1cl9lbGVtOworCQloaWdoX2VsZW0gPSBhcnJheS0+bnVtX2VsZW1z IC0gMTsKKwkJaWYgKGN1cl9lbGVtX3N0YXJ0KQorCQkJbG93X2VsZW0gPSAwOworCX0KKwllbHNl CisJeworCQlmaXJzdF9lbGVtX2RpciA9IGFycmF5LT5udW1fZWxlbXMgLSAxOworCQlsb3dfZWxl bSA9IDA7CisJCWhpZ2hfZWxlbSA9IGFycmF5LT5jdXJfZWxlbTsKKwkJaWYgKGN1cl9lbGVtX3N0 YXJ0KQorCQl7CisJCQlsb3dfZWxlbSA9IDA7CisJCQloaWdoX2VsZW0gPSBmaXJzdF9lbGVtX2Rp cjsKKwkJfQorCX0KKworCXdoaWxlIChoaWdoX2VsZW0gPiBsb3dfZWxlbSkKKwl7CisJCWludAkJ CW1pZF9lbGVtID0gbG93X2VsZW0gKyAoKGhpZ2hfZWxlbSAtIGxvd19lbGVtKSAvIDIpOworCQlE YXR1bQkJYXJyZGF0dW0gPSBhcnJheS0+ZWxlbV92YWx1ZXNbbWlkX2VsZW1dOworCisJCXJlc3Vs dCA9IF9idF9jb21wYXJlX2FycmF5X3NrZXkoY3VyLCBvcmRlcnByb2MsIGRhdHVtLCBudWxsLCBh cnJkYXR1bSk7CisKKwkJaWYgKHJlc3VsdCA9PSAwKQorCQl7CisJCQkvKgorCQkJICogRWFjaCBh cnJheSB3YXMgZGVkdXBsaWNhdGVkIGR1cmluZyBpbml0aWFsIHByZXByb2Nlc3NpbmcsIHNvCisJ CQkgKiB0aGVyZSBlYWNoIGVsZW1lbnQgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUuICBXZSBj YW4gcXVpdCBhcworCQkJICogc29vbiBhcyB3ZSBzZWUgYW4gZXF1YWwgYXJyYXksIHNhdmluZyBv dXJzZWx2ZXMgYW4gZXh0cmEKKwkJCSAqIGNvbXBhcmlzb24gb3IgdHdvLi4uCisJCQkgKi8KKwkJ CWxvd19lbGVtID0gbWlkX2VsZW07CisJCQlrbm93bmVxdWFsID0gdHJ1ZTsKKwkJCWJyZWFrOwor CQl9CisKKwkJaWYgKHJlc3VsdCA+IDApCisJCQlsb3dfZWxlbSA9IG1pZF9lbGVtICsgMTsKKwkJ ZWxzZQorCQkJaGlnaF9lbGVtID0gbWlkX2VsZW07CisJfQorCisJLyoKKwkgKiAuLi4gYnV0IG91 ciBjYWxsZXIgYWxzbyBjYXJlcyBhYm91dCB0aGUgcG9zaXRpb24gb2YgdGhlIHNlYXJjaGVkLWZv cgorCSAqIGRhdHVtIHJlbGF0aXZlIHRvIHRoZSBsb3dfZWxlbSBtYXRjaCB3ZSdsbCByZXR1cm4u ICBNYWtlIHN1cmUgdGhhdCB3ZQorCSAqIHNldCAqZmluYWxfcmVzdWx0IHRvIHRoZSByZXN1bHQg dGhhdCBjb21lcyBmcm9tIGNvbXBhcmluZyBsb3dfZWxlbSdzCisJICoga2V5IHZhbHVlIHRvIHRo ZSBkYXR1bSB0aGF0IGNhbGxlciBoYWQgdXMgc2VhcmNoIGZvci4KKwkgKi8KKwlpZiAoIWtub3du ZXF1YWwpCisJCXJlc3VsdCA9IF9idF9jb21wYXJlX2FycmF5X3NrZXkoY3VyLCBvcmRlcnByb2Ms IGRhdHVtLCBudWxsLAorCQkJCQkJCQkJCWFycmF5LT5lbGVtX3ZhbHVlc1tsb3dfZWxlbV0pOwor CisJKmZpbmFsX3Jlc3VsdCA9IHJlc3VsdDsKKworCXJldHVybiBsb3dfZWxlbTsKK30KKwogLyoK ICAqIF9idF9zdGFydF9hcnJheV9rZXlzKCkgLS0gSW5pdGlhbGl6ZSBhcnJheSBrZXlzIGF0IHN0 YXJ0IG9mIGEgc2NhbgogICoKQEAgLTUzOSw4MiArNzU4LDIyIEBAIF9idF9zdGFydF9hcnJheV9r ZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCiAJCQljdXJBcnJheUtl eS0+Y3VyX2VsZW0gPSAwOwogCQlza2V5LT5za19hcmd1bWVudCA9IGN1ckFycmF5S2V5LT5lbGVt X3ZhbHVlc1tjdXJBcnJheUtleS0+Y3VyX2VsZW1dOwogCX0KLQotCXNvLT5hcnJheXNTdGFydGVk ID0gdHJ1ZTsKLX0KLQotLyoKLSAqIF9idF9hZHZhbmNlX2FycmF5X2tleXMoKSAtLSBBZHZhbmNl IHRvIG5leHQgc2V0IG9mIGFycmF5IGVsZW1lbnRzCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRo ZXJlIGlzIGFub3RoZXIgc2V0IG9mIHZhbHVlcyB0byBjb25zaWRlciwgZmFsc2UgaWYgbm90Lgot ICogT24gdHJ1ZSByZXN1bHQsIHRoZSBzY2Fua2V5cyBhcmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUg bmV4dCBzZXQgb2YgdmFsdWVzLgotICovCi1ib29sCi1fYnRfYWR2YW5jZV9hcnJheV9rZXlzKElu ZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCi17Ci0JQlRTY2FuT3BhcXVlIHNv ID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOwotCWJvb2wJCWZvdW5kID0gZmFsc2U7Ci0J aW50CQkJaTsKLQotCS8qCi0JICogV2UgbXVzdCBhZHZhbmNlIHRoZSBsYXN0IGFycmF5IGtleSBt b3N0IHF1aWNrbHksIHNpbmNlIGl0IHdpbGwKLQkgKiBjb3JyZXNwb25kIHRvIHRoZSBsb3dlc3Qt b3JkZXIgaW5kZXggY29sdW1uIGFtb25nIHRoZSBhdmFpbGFibGUKLQkgKiBxdWFsaWZpY2F0aW9u cy4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIGNvcnJlY3Qgb3JkZXJpbmcgb2Ygb3V0cHV0 Ci0JICogd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgYXJyYXkga2V5cy4KLQkgKi8KLQlmb3IgKGkg PSBzby0+bnVtQXJyYXlLZXlzIC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCQlCVEFycmF5S2V5SW5m byAqY3VyQXJyYXlLZXkgPSAmc28tPmFycmF5S2V5c1tpXTsKLQkJU2NhbktleQkJc2tleSA9ICZz by0+YXJyYXlLZXlEYXRhW2N1ckFycmF5S2V5LT5zY2FuX2tleV07Ci0JCWludAkJCWN1cl9lbGVt ID0gY3VyQXJyYXlLZXktPmN1cl9lbGVtOwotCQlpbnQJCQludW1fZWxlbXMgPSBjdXJBcnJheUtl eS0+bnVtX2VsZW1zOwotCi0JCWlmIChTY2FuRGlyZWN0aW9uSXNCYWNrd2FyZChkaXIpKQotCQl7 Ci0JCQlpZiAoLS1jdXJfZWxlbSA8IDApCi0JCQl7Ci0JCQkJY3VyX2VsZW0gPSBudW1fZWxlbXMg LSAxOwotCQkJCWZvdW5kID0gZmFsc2U7CS8qIG5lZWQgdG8gYWR2YW5jZSBuZXh0IGFycmF5IGtl eSAqLwotCQkJfQotCQkJZWxzZQotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJfQotCQllbHNlCi0JCXsK LQkJCWlmICgrK2N1cl9lbGVtID49IG51bV9lbGVtcykKLQkJCXsKLQkJCQljdXJfZWxlbSA9IDA7 Ci0JCQkJZm91bmQgPSBmYWxzZTsJLyogbmVlZCB0byBhZHZhbmNlIG5leHQgYXJyYXkga2V5ICov Ci0JCQl9Ci0JCQllbHNlCi0JCQkJZm91bmQgPSB0cnVlOwotCQl9Ci0KLQkJY3VyQXJyYXlLZXkt PmN1cl9lbGVtID0gY3VyX2VsZW07Ci0JCXNrZXktPnNrX2FyZ3VtZW50ID0gY3VyQXJyYXlLZXkt PmVsZW1fdmFsdWVzW2N1cl9lbGVtXTsKLQkJaWYgKGZvdW5kKQotCQkJYnJlYWs7Ci0JfQotCi0J LyogYWR2YW5jZSBwYXJhbGxlbCBzY2FuICovCi0JaWYgKHNjYW4tPnBhcmFsbGVsX3NjYW4gIT0g TlVMTCkKLQkJX2J0X3BhcmFsbGVsX2FkdmFuY2VfYXJyYXlfa2V5cyhzY2FuKTsKLQotCS8qCi0J ICogV2hlbiBubyBuZXcgYXJyYXkga2V5cyB3ZXJlIGZvdW5kLCB0aGUgc2NhbiBpcyAicGFzdCB0 aGUgZW5kIiBvZiB0aGUKLQkgKiBhcnJheSBrZXlzLiAgX2J0X3N0YXJ0X2FycmF5X2tleXMgY2Fu IHN0aWxsICJyZXN0YXJ0IiB0aGUgYXJyYXkga2V5cyBpZgotCSAqIGEgcmVzY2FuIGlzIHJlcXVp cmVkLgotCSAqLwotCWlmICghZm91bmQpCi0JCXNvLT5hcnJheXNTdGFydGVkID0gZmFsc2U7Ci0K LQlyZXR1cm4gZm91bmQ7CiB9CiAKIC8qCiAgKiBfYnRfbWFya19hcnJheV9rZXlzKCkgLS0gSGFu ZGxlIGFycmF5IGtleXMgZHVyaW5nIGJ0bWFya3BvcwogICoKICAqIFNhdmUgdGhlIGN1cnJlbnQg c3RhdGUgb2YgdGhlIGFycmF5IGtleXMgYXMgdGhlICJtYXJrIiBwb3NpdGlvbi4KKyAqCisgKiBY WFggVGhlIGN1cnJlbnQgc2V0IG9mIGFycmF5IGtleXMgYXJlIG5vdCBpbmRlcGVuZGVudCBvZiB0 aGUgY3VycmVudCBzY2FuCisgKiBwb3NpdGlvbiwgc28gd2h5IHRyZWF0IHRoZW0gdGhhdCB3YXk/ CisgKgorICogV2Ugc2hvdWxkbid0IGV2ZW4gYm90aGVyIHJlbWVtYmVyaW5nIHRoZSBjdXJyZW50 IGFycmF5IGtleXMgd2hlbiBidG1hcmtwb3MKKyAqIGlzIGNhbGxlZC4gIFRoZSBhcnJheSBrZXlz IHNob3VsZCBiZSBoYW5kbGVkIGxhemlseSBpbnN0ZWFkLiAgSWYgYW5kIHdoZW4KKyAqIGJ0cmVz dHJwb3MgaXMgY2FsbGVkLCBpdCBjYW4ganVzdCBzZXQgZXZlcnkgYXJyYXkncyBjdXJfZWxlbSB0 byB0aGUgZmlyc3QKKyAqIGVsZW1lbnQgZm9yIHRoZSBjdXJyZW50IHNjYW4gZGlyZWN0aW9uLiAg V2hlbiBfYnRfYWR2YW5jZV9hcnJheV9rZXlzIGlzCisgKiByZWFjaGVkIChkdXJpbmcgdGhlIGZp cnN0IGNhbGwgdG8gX2J0X2NoZWNra2V5cyB0aGF0IGZvbGxvd3MpLCBpdCB3aWxsCisgKiBhdXRv bWF0aWNhbGx5IHNlYXJjaCBmb3IgdGhlIHJlbGV2YW50IGFycmF5IGtleXMgdXNpbmcgY2FsbGVy J3MgdHVwbGUuCiAgKi8KIHZvaWQKIF9idF9tYXJrX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBz Y2FuKQpAQCAtNjYxLDEzICs4MjAsOCBAQCBfYnRfcmVzdG9yZV9hcnJheV9rZXlzKEluZGV4U2Nh bkRlc2Mgc2NhbikKIAkgKiBJZiB3ZSBjaGFuZ2VkIGFueSBrZXlzLCB3ZSBtdXN0IHJlZG8gX2J0 X3ByZXByb2Nlc3Nfa2V5cy4gIFRoYXQgbWlnaHQKIAkgKiBzb3VuZCBsaWtlIG92ZXJraWxsLCBi dXQgaW4gY2FzZXMgd2l0aCBtdWx0aXBsZSBrZXlzIHBlciBpbmRleCBjb2x1bW4KIAkgKiBpdCBz ZWVtcyBuZWNlc3NhcnkgdG8gZG8gdGhlIGZ1bGwgc2V0IG9mIHB1c2h1cHMuCi0JICoKLQkgKiBB bHNvIGRvIHRoaXMgd2hlbmV2ZXIgdGhlIHNjYW4ncyBzZXQgb2YgYXJyYXkga2V5cyAid3JhcHBl ZCBhcm91bmQiIGF0Ci0JICogdGhlIGVuZCBvZiB0aGUgbGFzdCBwcmltaXRpdmUgaW5kZXggc2Nh bi4gIFRoZXJlIHdvbid0IGhhdmUgYmVlbiBhIGNhbGwKLQkgKiB0byBfYnRfcHJlcHJvY2Vzc19r ZXlzIGZyb20gc29tZSBvdGhlciBwbGFjZSBmb2xsb3dpbmcgd3JhcCBhcm91bmQsIHNvCi0JICog d2UgZG8gaXQgZm9yIG91cnNlbHZlcy4KIAkgKi8KLQlpZiAoY2hhbmdlZCB8fCAhc28tPmFycmF5 c1N0YXJ0ZWQpCisJaWYgKGNoYW5nZWQpCiAJewogCQlfYnRfcHJlcHJvY2Vzc19rZXlzKHNjYW4p OwogCQkvKiBUaGUgbWFyayBzaG91bGQgaGF2ZSBiZWVuIHNldCBvbiBhIGNvbnNpc3RlbnQgc2V0 IG9mIGtleXMuLi4gKi8KQEAgLTY3NSw2ICs4MjksNzg1IEBAIF9idF9yZXN0b3JlX2FycmF5X2tl eXMoSW5kZXhTY2FuRGVzYyBzY2FuKQogCX0KIH0KIAorLyoKKyAqIFJvdXRpbmUgdG8gZGV0ZXJt aW5lIGlmIGEgY29udGludWVzY2FuPWZhbHNlIHR1cGxlIChzZXQgdGhhdCB3YXkgYnkgYW4KKyAq IGluaXRpYWwgY2FsbCB0byBfYnRfY2hlY2tfY29tcGFyZSkgbWlnaHQgbmVlZCB0byBhZHZhbmNl IHRoZSBzY2FuJ3MgYXJyYXkKKyAqIGtleXMuCisgKgorICogUmV0dXJucyB0cnVlIHdoZW4gY2Fs bGVyIHBhc3NlcyBhIHR1cGxlIHRoYXQgaXMgPCB0aGUgY3VycmVudCBzZXQgb2YgYXJyYXkKKyAq IGtleXMgZm9yIHRoZSBtb3N0IHNpZ25pZmljYW50IG5vbi1lcXVhbCBjb2x1bW4vc2NhbiBrZXkg KG9yID4gZm9yIGJhY2t3YXJkcworICogc2NhbnMpLiAgVGhpcyBtZWFucyB0aGF0IGl0IGNhbm5v dCBwb3NzaWJseSBiZSB0aW1lIHRvIGFkdmFuY2UgdGhlIGFycmF5CisgKiBrZXlzIGp1c3QgeWV0 LiAgX2J0X2NoZWNra2V5cyBjYWxsZXIgc2hvdWxkIHN1cHByZXNzIGl0cyBfYnRfY2hlY2tfY29t cGFyZQorICogY2FsbCwgYW5kIHJldHVybiAtLSB0aGUgdHVwbGUgaXMgdHJlYXRlZCBhcyBub3Qg c2F0aXNmeSBvdXIgaW5kZXhxdWFscy4KKyAqCisgKiBSZXR1cm5zIGZhbHNlIHdoZW4gY2FsbGVy J3MgdHVwbGUgaXMgPj0gdGhlIGN1cnJlbnQgYXJyYXkga2V5cyAob3IgPD0sIGluCisgKiB0aGUg Y2FzZSBvZiBiYWNrd2FyZHMgc2NhbnMpLiAgVGhpcyBtZWFucyB0aGF0IGl0IG1pZ2h0IGJlIHRp bWUgZm9yIG91cgorICogY2FsbGVyIHRvIGFkdmFuY2UgdGhlIGFycmF5IGtleXMgdG8gdGhlIG5l eHQgc2V0LgorICoKKyAqIE5vdGU6IGFkdmFuY2luZyB0aGUgYXJyYXkga2V5cyBtYXkgYmUgcmVx dWlyZWQgd2hlbiBldmVyeSBhdHRyaWJ1dGUgdmFsdWUKKyAqIGZyb20gY2FsbGVyJ3MgdHVwbGUg aXMgZXF1YWwgdG8gY29ycmVzcG9uZGluZyBzY2FuIGtleS9hcnJheSBkYXR1bXMuICBTZWUKKyAq IGNvbW1lbnRzIGF0IHRoZSBzdGFydCBvZiBfYnRfYWR2YW5jZV9hcnJheV9rZXlzIGZvciBtb3Jl LgorICovCitzdGF0aWMgYm9vbAorX2J0X3R1cGxlX2JlZm9yZV9hcnJheV9za2V5cyhJbmRleFNj YW5EZXNjIHNjYW4sIEJUUmVhZFBhZ2VTdGF0ZSAqcHN0YXRlLAorCQkJCQkJCSBJbmRleFR1cGxl IHR1cGxlKQoreworCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1 ZTsKKwlSZWxhdGlvbglyZWwgPSBzY2FuLT5pbmRleFJlbGF0aW9uOworCVNjYW5EaXJlY3Rpb24g ZGlyID0gcHN0YXRlLT5kaXI7CisJVHVwbGVEZXNjCWl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNj cihyZWwpOworCWJvb2wJCXR1cGxlX2JlZm9yZV9hcnJheV9rZXlzID0gZmFsc2U7CisJU2Nhbktl eQkJY3VyOworCWludAkJCW50dXBhdHRzID0gQlRyZWVUdXBsZUdldE5BdHRzKHR1cGxlLCByZWwp LAorCQkJCWlrZXk7CisKKwlBc3NlcnQoc28tPnF1YWxfb2spOworCUFzc2VydChzby0+bnVtQXJy YXlLZXlzID4gMCk7CisJQXNzZXJ0KHNvLT5udW1iZXJPZktleXMgPiAwKTsKKwlBc3NlcnQoIXNv LT5uZWVkUHJpbVNjYW4pOworCisJZm9yIChjdXIgPSBzby0+a2V5RGF0YSwgaWtleSA9IDA7IGlr ZXkgPCBzby0+bnVtYmVyT2ZLZXlzOyBjdXIrKywgaWtleSsrKQorCXsKKwkJaW50CQkJYXR0bnVt ID0gY3VyLT5za19hdHRubzsKKwkJRm1nckluZm8gICAqb3JkZXJwcm9jOworCQlEYXR1bQkJZGF0 dW07CisJCWJvb2wJCW51bGwsCisJCQkJCXNrcmVxdWlyZWQ7CisJCWludDMyCQlyZXN1bHQ7CisK KwkJLyoKKwkJICogV2Ugb25seSBkZWFsIHdpdGggZXF1YWxpdHkgc3RyYXRlZ3kgc2NhbiBrZXlz LiAgV2UgbGVhdmUgaGFuZGxpbmcKKwkJICogb2YgaW5lcXVhbGl0aWVzIHVwIHRvIF9idF9jaGVj a19jb21wYXJlLgorCQkgKi8KKwkJaWYgKGN1ci0+c2tfc3RyYXRlZ3kgIT0gQlRFcXVhbFN0cmF0 ZWd5TnVtYmVyKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogRGV0ZXJtaW5lIGlmIHRoaXMg c2NhbiBrZXkgaXMgcmVxdWlyZWQgaW4gdGhlIGN1cnJlbnQgc2NhbgorCQkgKiBkaXJlY3Rpb24K KwkJICovCisJCXNrcmVxdWlyZWQgPSAoKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSAmJgor CQkJCQkgICAoY3VyLT5za19mbGFncyAmIFNLX0JUX1JFUUZXRCkpIHx8CisJCQkJCSAgKFNjYW5E aXJlY3Rpb25Jc0JhY2t3YXJkKGRpcikgJiYKKwkJCQkJICAgKGN1ci0+c2tfZmxhZ3MgJiBTS19C VF9SRVFCS1dEKSkpOworCisJCS8qCisJCSAqIFVubGlrZSBfYnRfYWR2YW5jZV9hcnJheV9rZXlz LCB3ZSBuZXZlciBkZWFsIHdpdGggYW55IG5vbi1yZXF1aXJlZAorCQkgKiBhcnJheSBrZXlzLiAg Q2FzZXMgd2hlcmUgc2tyZXF1aXJlZHRyaWdnZXIgaXMgc2V0IHRvIGZhbHNlIGJ5CisJCSAqIF9i dF9jaGVja19jb21wYXJlIHNob3VsZCBuZXZlciBjYWxsIGhlcmUuICBXZSBhcmUgb25seSBjYWxs ZWQgYWZ0ZXIKKwkJICogX2J0X2NoZWNrX2NvbXBhcmUgcHJvdmlzaW9uYWxseSBpbmRpY2F0ZWQg dGhhdCB0aGUgc2NhbiBzaG91bGQgYmUKKwkJICogdGVybWluYXRlZCBkdWUgdG8gYSBfcmVxdWly ZWRfIHNjYW4ga2V5IG5vdCBiZWluZyBzYXRpc2ZpZWQuCisJCSAqCisJCSAqIFdlIGV4cGVjdCBf YnRfY2hlY2tfY29tcGFyZSB0byBub3RpY2UgYW5kIHJlcG9ydCByZXF1aXJlZCBzY2FuIGtleXMK KwkJICogYmVmb3JlIG5vbi1yZXF1aXJlZCBvbmVzLiAgX2J0X2FkdmFuY2VfYXJyYXlfa2V5cyBt aWdodCBzdGlsbCBoYXZlCisJCSAqIHRvIGFkdmFuY2Ugbm9uLXJlcXVpcmVkIGFycmF5IGtleXMg aW4gcGFzc2luZyBmb3IgYSB0dXBsZSB0aGF0IHdlCisJCSAqIHdlcmUgY2FsbGVkIGZvciwgYnV0 IF9idF9hZHZhbmNlX2FycmF5X2tleXMgZG9lc24ndCByZWx5IG9uIHVzIHRvCisJCSAqIGdpdmUg aXQgYWR2YW5jZWQgbm90aWNlIG9mIHRoYXQuCisJCSAqLworCQlpZiAoIXNrcmVxdWlyZWQpCisJ CQlicmVhazsKKworCQlpZiAoYXR0bnVtID4gbnR1cGF0dHMpCisJCXsKKwkJCS8qCisJCQkgKiBX aGVuIHdlIHJlYWNoIGEgaGlnaCBrZXkncyB0cnVuY2F0ZWQgYXR0cmlidXRlLCBhc3N1bWUgdGhh dCB0aGUKKwkJCSAqIHR1cGxlIGF0dHJpYnV0ZSdzIHZhbHVlIGlzID49IHRoZSBzY2FuJ3Mgc2Vh cmNoLXR5cGUgc2NhbiBrZXlzCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJZGF0dW0gPSBp bmRleF9nZXRhdHRyKHR1cGxlLCBhdHRudW0sIGl0dXBkZXNjLCAmbnVsbCk7CisKKwkJb3JkZXJw cm9jID0gJnNvLT5vcmRlclByb2NzW2F0dG51bSAtIDFdOworCQlyZXN1bHQgPSBfYnRfY29tcGFy ZV9hcnJheV9za2V5KGN1ciwgb3JkZXJwcm9jLAorCQkJCQkJCQkJCWRhdHVtLCBudWxsLAorCQkJ CQkJCQkJCWN1ci0+c2tfYXJndW1lbnQpOworCisJCWlmIChyZXN1bHQgIT0gMCkKKwkJeworCQkJ aWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKKwkJCQl0dXBsZV9iZWZvcmVfYXJyYXlf a2V5cyA9IHJlc3VsdCA8IDA7CisJCQllbHNlCisJCQkJdHVwbGVfYmVmb3JlX2FycmF5X2tleXMg PSByZXN1bHQgPiAwOworCisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiB0dXBsZV9iZWZv cmVfYXJyYXlfa2V5czsKK30KKworLyoKKyAqIF9idF9hcnJheV9rZXlzX3JlbWFpbigpIC0tIFN0 YXJ0IGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4/CisgKgorICogUmV0dXJucyB0cnVlIGlm IF9idF9jaGVja2tleXMgZGV0ZXJtaW5lZCB0aGF0IGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNj YW4KKyAqIG11c3QgdGFrZSBwbGFjZSBieSBjYWxsaW5nIF9idF9maXJzdC4gIE90aGVyd2lzZSBy ZXR1cm5zIGZhbHNlLCBpbmRpY2F0aW5nCisgKiB0aGF0IGNhbGxlcidzIHRvcC1sZXZlbCBzY2Fu IGlzIG5vdyBwYXN0IHRoZSBwb2ludCB3aGVyZSBmdXJ0aGVyIG1hdGNoaW5nCisgKiBpbmRleCB0 dXBsZXMgY2FuIGJlIGZvdW5kIChmb3IgdGhlIGN1cnJlbnQgc2NhbiBkaXJlY3Rpb24pLgorICoK KyAqIE9ubHkgY2FsbCBoZXJlIGR1cmluZyBzY2FucyB3aXRoIG9uZSBvciBtb3JlIGVxdWFsaXR5 IHR5cGUgYXJyYXkgc2NhbiBrZXlzLgorICogQWxsIG90aGVyIHNjYW5zIHNob3VsZCBqdXN0IGNh bGwgX2J0X2ZpcnN0IG9uY2UsIG5vIG1hdHRlciB3aGF0LgorICoKKyAqIFRvcC1sZXZlbCBpbmRl eCBzY2FucyBleGVjdXRlZCB2aWEgbXVsdGlwbGUgcHJpbWl0aXZlIGluZGV4IHNjYW5zIG11c3Qg bm90CisgKiBmYWlsIHRvIG91dHB1dCBpbmRleCB0dXBsZXMgaW4gdGhlIHVzdWFsIG9yZGVyIGZv ciB0aGUgaW5kZXggLS0ganVzdCBsaWtlCisgKiBhbnkgb3RoZXIgaW5kZXggc2NhbiB3b3VsZC4g IFRoZSBzdGF0ZSBtYWNoaW5lIHRoYXQgbWFuYWdlcyB0aGUgc2NhbidzCisgKiBhcnJheSBrZXlz IG11c3Qgb25seSBzdGFydCBwcmltaXRpdmUgaW5kZXggc2NhbnMgd2hlbiB0aGV5IGNvdmVyIGtl eSBzcGFjZQorICogc3RyaWN0bHkgZ3JlYXRlciB0aGFuIHRoZSBrZXkgc3BhY2UgZm9yIHR1cGxl cyB0aGF0IHRoZSBzY2FuIGhhcyBhbHJlYWR5CisgKiByZXR1cm5lZCAob3Igc3RyaWN0bHkgbGVz cyBpbiB0aGUgYmFja3dhcmRzIHNjYW4gY2FzZSkuICBPdGhlcndpc2UgdGhlIHNjYW4KKyAqIGNv dWxkIG91dHB1dCB0aGUgc2FtZSBpbmRleCB0dXBsZXMgbW9yZSB0aGFuIG9uY2UsIG9yIGluIHRo ZSB3cm9uZyBvcmRlci4KKyAqCisgKiBUaGlzIGlzIG1hbmFnZWQgYnkgbGltaXRpbmcgdGhlIGNh c2VzIHRoYXQgY2FuIHRyaWdnZXIgbmV3IHByaW1pdGl2ZSBpbmRleAorICogc2NhbnMgdG8gdGhv c2UgaW52b2x2aW5nIHJlcXVpcmVkIGFycmF5IHNjYW4ga2V5cyBhbmQvb3Igb3RoZXIgcmVxdWly ZWQKKyAqIHNjYW4ga2V5cyB0aGF0IHVzZSB0aGUgZXF1YWxpdHkgc3RyYXRlZ3kuICBJbiBwYXJ0 aWN1bGFyLCB0aGUgc3RhdGUgbWFjaGluZQorICogbXVzdCBub3QgYWxsb3cgaGlnaCBvcmRlciBy ZXF1aXJlZCBzY2FuIGtleXMgdXNpbmcgYW4gaW5lcXVhbGl0eSBzdHJhdGVneQorICogKHdoaWNo IGFyZSBvbmx5IHJlcXVpcmVkIGluIG9uZSBzY2FuIGRpcmVjdGlvbikgdG8gZGlyZWN0bHkgdHJp Z2dlciBhIG5ldworICogcHJpbWl0aXZlIGluZGV4IHNjYW4gdGhhdCBhZHZhbmNlcyBsb3cgb3Jk ZXIgbm9uLXJlcXVpcmVkIGFycmF5IHNjYW4ga2V5cy4KKyAqIEZvciBleGFtcGxlLCBhIHF1ZXJ5 IHN1Y2ggYXMgIlNFTEVDVCB0aG91c2FuZCwgdGVudGhvdXMgRlJPTSB0ZW5rMSBXSEVSRQorICog dGhvdXNhbmQgPCAyIEFORCB0ZW50aG91cyBJTiAoMTAwMSwzMDAwKSBPUkRFUiBCWSB0aG91c2Fu ZCIgd2hvc2UgZXhlY3V0aW9uCisgKiBpbnZvbHZlcyBhIHNjYW4gb2YgYW4gaW5kZXggb24gIih0 aG91c2FuZCwgdGVudGhvdXMpIiBtdXN0IHBlcmZvcm0gbm8gbW9yZQorICogdGhhbiBhIHNpbmds ZSBwcmltaXRpdmUgaW5kZXggc2Nhbi4gIE90aGVyd2lzZSB3ZSByaXNrIG91dHB1dHRpbmcgdHVw bGVzIGluCisgKiB0aGUgd3Jvbmcgb3JkZXIuICBBcnJheSBrZXkgdmFsdWVzIGZvciB0aGUgbm9u LXJlcXVpcmVkIHNjYW4ga2V5IG9uIHRoZQorICogInRlbnRob3VzIiBjb2x1bW4gbXVzdCBub3Qg ZGljdGF0ZSB0b3AtbGV2ZWwgc2NhbiBvcmRlci4gIFByaW1pdGl2ZSBpbmRleAorICogc2NhbnMg bXVzdG4ndCBzY2FuIHR1cGxlcyBhbHJlYWR5IHNjYW5uZWQgYnkgc29tZSBlYXJsaWVyIHByaW1p dGl2ZSBzY2FuLgorICoKKyAqIEluIGZhY3QsIG5idHJlZSBtYWtlcyBhIHN0cm9uZ2VyIGd1YXJh bnRlZSB0aGFuIGlzIHN0cmljdGx5IG5lY2Vzc2FyeSBoZXJlOgorICogaXQgZ3VhcmFudGVlcyB0 aGF0IHRoZSB0b3AtbGV2ZWwgc2NhbiB3b24ndCByZXBlYXQgYW55IGxlYWYgcGFnZSByZWFkcy4K KyAqIChBY3R1YWxseSwgdGhhdCBjYW4gc3RpbGwgaGFwcGVuIHdoZW4gdGhlIHNjYW4gaXMgcmVw b3NpdGlvbmVkLCBvciB0aGUgc2NhbgorICogZGlyZWN0aW9uIGNoYW5nZXMgLS0gYnV0IHRoYXQn cyBqdXN0IGFzIHRydWUgd2l0aCBvdGhlciB0eXBlcyBvZiBzY2Fucy4pCisgKi8KK2Jvb2wKK19i dF9hcnJheV9rZXlzX3JlbWFpbihJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGly KQoreworCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKKwor CUFzc2VydChzby0+bnVtQXJyYXlLZXlzKTsKKworCS8qCisJICogQXJyYXkga2V5cyBhcmUgYWR2 YW5jZWQgd2l0aGluIF9idF9jaGVja2tleXMgd2hlbiB0aGUgc2NhbiByZWFjaGVzIHRoZQorCSAq IGxlYWYgbGV2ZWwgKG1vcmUgcHJlY2lzZWx5LCB0aGV5J3JlIGFkdmFuY2VkIHdoZW4gdGhlIHNj YW4gcmVhY2hlcyB0aGUKKwkgKiBlbmQgb2YgZWFjaCBkaXN0aW5jdCBzZXQgb2YgYXJyYXkgZWxl bWVudHMpLiAgVGhpcyBwcm9jZXNzIGF2b2lkcworCSAqIHJlcGVhdCBhY2Nlc3MgdG8gbGVhZiBw YWdlcyAoYWNyb3NzIG11bHRpcGxlIHByaW1pdGl2ZSBpbmRleCBzY2FucykgYnkKKwkgKiBvcHBv cnR1bmlzdGljYWxseSBhZHZhbmNpbmcgdGhlIHNjYW4ncyBhcnJheSBrZXlzIHdoZW4gaXQgYWxs b3dzIHRoZQorCSAqIHByaW1pdGl2ZSBpbmRleCBzY2FuIHRvIGZpbmQgbmVhcmJ5IG1hdGNoaW5n IHR1cGxlcyAob3IgdG8gZWxpbWluYXRlCisJICogYXJyYXkga2V5cyB3aXRoIG5vIG1hdGNoaW5n IHR1cGxlcyBmcm9tIGZ1cnRoZXIgY29uc2lkZXJhdGlvbikuCisJICoKKwkgKiBfYnRfY2hlY2tr ZXlzIHNldHMgYSBzaW1wbGUgZmxhZyB2YXJpYWJsZSB0aGF0IHdlIGNoZWNrIGhlcmUuICBUaGlz CisJICogdGVsbHMgdXMgaWYgd2UgbmVlZCB0byBwZXJmb3JtIGFub3RoZXIgcHJpbWl0aXZlIGlu ZGV4IHNjYW4gZm9yIHRoZQorCSAqIG5vdy1jdXJyZW50IGFycmF5IGtleXMgb3Igbm90LiAgV2Un bGwgdW5zZXQgdGhlIGZsYWcgb25jZSBhZ2FpbiB0bworCSAqIGFja25vd2xlZGdlIGhhdmluZyBz dGFydGVkIGEgbmV3IHByaW1pdGl2ZSBzY2FuIChvciB3ZSdsbCBzZWUgdGhhdCBpdAorCSAqIGlz bid0IHNldCBhbmQgZW5kIHRoZSB0b3AtbGV2ZWwgc2NhbiByaWdodCBhd2F5KS4KKwkgKgorCSAq IFdlIGNhbm5vdCByZWx5IG9uIF9idF9maXJzdCBhbHdheXMgcmVhY2hpbmcgX2J0X2NoZWNra2V5 cyBoZXJlLiAgVGhlcmUKKwkgKiBhcmUgdmFyaW91cyBzY2VuYXJpb3Mgd2hlcmUgdGhhdCB3b24n dCBoYXBwZW4uICBGb3IgZXhhbXBsZSwgaWYgdGhlCisJICogaW5kZXggaXMgY29tcGxldGVseSBl bXB0eSwgdGhlbiBfYnRfZmlyc3Qgd29uJ3QgZ2V0IGFzIGZhciBhcyBjYWxsaW5nCisJICogX2J0 X3JlYWRwYWdlL19idF9jaGVja2tleXMuCisJICoKKwkgKiBXZSBhbHNvIGRvbid0IGV4cGVjdCBf YnRfY2hlY2trZXlzIHRvIGJlIHJlYWNoZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGEKKwkgKiBub24t ZXhpc3RlbnQgdmFsdWUgdGhhdCBoYXBwZW5zIHRvIGJlIGhpZ2hlciB0aGFuIGFueSBleGlzdGlu ZyB2YWx1ZSBpbgorCSAqIHRoZSBpbmRleC4gIE5vIF9idF9jaGVja2tleXMgYXJlIGV4cGVjdGVk IHdoZW4gX2J0X3JlYWRwYWdlIHJlYWRzIHRoZQorCSAqIHJpZ2h0bW9zdCBwYWdlIGR1cmluZyBz dWNoIGEgc2NhbiAtLSBldmVuIGEgX2J0X2NoZWNra2V5cyBjYWxsIGFnYWluc3QKKwkgKiB0aGUg aGlnaCBrZXkgd29uJ3QgaGFwcGVuLiAgVGhlcmUgaXMgYW4gYW5hbG9nb3VzIGlzc3VlIGZvciBi YWNrd2FyZHMKKwkgKiBzY2FucyB0aGF0IHNlYXJjaCBmb3IgYSB2YWx1ZSBsb3dlciB0aGFuIGFs bCBleGlzdGluZyBpbmRleCB0dXBsZXMuCisJICoKKwkgKiBXZSBkb24ndCBhY3R1YWxseSByZXF1 aXJlIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZXNlIGNhc2VzIC0tIHdlIGRvbid0CisJICogbmVl ZCB0byBiZSBleHBsaWNpdGx5IGluc3RydWN0ZWQgdG8gX25vdF8gcGVyZm9ybSBhbm90aGVyIHBy aW1pdGl2ZQorCSAqIGluZGV4IHNjYW4uICBUaGlzIGlzIGNvcnJlY3QgZm9yIGFsbCBvZiB0aGUg Y2FzZXMgd2UndmUgbGlzdGVkIHNvIGZhciwKKwkgKiB3aGljaCBhbGwgaW52b2x2ZSBwcmltaXRp dmUgaW5kZXggc2NhbnMgdGhhdCBhY2Nlc3MgcGFnZXMgIm5lYXIgdGhlCisJICogYm91bmRhcmll cyBvZiB0aGUga2V5IHNwYWNlIiAodGhlIGxlZnRtb3N0IHBhZ2UsIHRoZSByaWdodG1vc3QgcGFn ZSwgb3IKKwkgKiBhbiBpbWFnaW5hcnkgZW1wdHkgbGVhZiByb290IHBhZ2UpLiAgSWYgX2J0X2No ZWNra2V5cyBjYW5ub3QgYmUgcmVhY2hlZAorCSAqIGJ5IGEgcHJpbWl0aXZlIGluZGV4IHNjYW4g Zm9yIG9uZSBzZXQgb2YgYXJyYXkga2V5cywgaXQgZm9sbG93cyB0aGF0IGl0CisJICogYWxzbyB3 b24ndCBiZSByZWFjaGVkIGZvciBhbnkgbGF0ZXIgc2V0IG9mIGFycmF5IGtleXMuCisJICoKKwkg KiBUaGVyZSBpcyBvbmUgZXhjZXB0aW9uOiB0aGUgY2FzZSB3aGVyZSBfYnRfZmlyc3QncyBfYnRf cHJlcHJvY2Vzc19rZXlzCisJICogY2FsbCBkZXRlcm1pbmVkIHRoYXQgdGhlIHNjYW4ncyBpbnB1 dCBzY2FuIGtleXMgY2FuIG5ldmVyIGJlIHNhdGlzZmllZC4KKwkgKiBUaGF0IG1pZ2h0IGJlIHRy dWUgZm9yIG9uZSBzZXQgb2YgYXJyYXkga2V5cywgYnV0IG5vdCB0aGUgbmV4dCBzZXQuCisJICov CisJaWYgKCFzby0+cXVhbF9vaykKKwl7CisJCS8qCisJCSAqIFF1YWwgY2FuIG5ldmVyIGJlIHNh dGlzZmllZC4gIEFkdmFuY2Ugb3VyIGFycmF5IGtleXMgaW5jcmVtZW50YWxseS4KKwkJICovCisJ CXNvLT5uZWVkUHJpbVNjYW4gPSBmYWxzZTsKKwkJaWYgKF9idF9hZHZhbmNlX2FycmF5X2tleXNf aW5jcmVtZW50KHNjYW4sIGRpcikpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiBUaW1lIGZv ciBhbm90aGVyIHByaW1pdGl2ZSBpbmRleCBzY2FuPyAqLworCWlmIChzby0+bmVlZFByaW1TY2Fu KQorCXsKKwkJLyogQmVnaW4gcHJpbWl0aXZlIGluZGV4IHNjYW4gKi8KKwkJc28tPm5lZWRQcmlt U2NhbiA9IGZhbHNlOworCisJCWlmIChzY2FuLT5wYXJhbGxlbF9zY2FuICE9IE5VTEwpCisJCQlf YnRfcGFyYWxsZWxfbmV4dF9wcmltaXRpdmVfc2NhbihzY2FuKTsKKworCQlyZXR1cm4gdHJ1ZTsK Kwl9CisKKwkvKgorCSAqIE5vIG1vcmUgcHJpbWl0aXZlIGluZGV4IHNjYW5zLiAgSnVzdCB0ZXJt aW5hdGUgdGhlIHRvcC1sZXZlbCBzY2FuLgorCSAqLworCV9idF9hZHZhbmNlX2FycmF5X2tleXNf dG9fZW5kKHNjYW4sIGRpcik7CisKKwlpZiAoc2Nhbi0+cGFyYWxsZWxfc2NhbiAhPSBOVUxMKQor CQlfYnRfcGFyYWxsZWxfZG9uZShzY2FuKTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAq IF9idF9hZHZhbmNlX2FycmF5X2tleXMoKSAtLSBBZHZhbmNlIGFycmF5IGVsZW1lbnRzIHVzaW5n IGEgdHVwbGUKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgYWxsIHJlcXVpcmVkIGVxdWFsaXR5LXR5 cGUgc2NhbiBrZXlzIChpbiBwYXJ0aWN1bGFyLCB0aG9zZQorICogdGhhdCBhcmUgYXJyYXkga2V5 cykgbm93IGhhdmUgZXhhY3QgbWF0Y2hpbmcgdmFsdWVzIHRvIHRob3NlIGZyb20gdHVwbGUuCisg KiBSZXR1cm5zIGZhbHNlIHdoZW4gdGhlIHR1cGxlIGlzbid0IGFuIGV4YWN0IG1hdGNoIGluIHRo aXMgc2Vuc2UuCisgKgorICogU2V0cyBwc3RhdGUuY29udGludWVzY2FuIGZvciBjYWxsZXIgd2hl biB3ZSByZXR1cm4gZmFsc2UuICBXaGVuIHdlIHJldHVybgorICogdHJ1ZSBpdCdzIHVwIHRvIGNh bGxlciB0byBjYWxsIF9idF9jaGVja19jb21wYXJlIHRvIHJlY2hlY2sgdGhlIHR1cGxlLiAgSXQK KyAqIGlzIG9rYXkgdG8gbGV0IHRoZSBzZWNvbmQgY2FsbCBzZXQgcHN0YXRlLmNvbnRpbnVlc2Nh bj1mYWxzZSB3aXRob3V0CisgKiBmdXJ0aGVyIGludGVydmVudGlvbiwgc2luY2Ugd2Uga25vdyB0 aGF0IGl0IGNhbiBvbmx5IGJlIGZvciBhIHNjYW4ga2V5IHRoYXQKKyAqIGlzIHJlcXVpcmVkIGlu IG9uZSBkaXJlY3Rpb24uCisgKgorICogV2hlbiBjYWxsZWQgd2l0aCBza3JlcXVpcmVkdHJpZ2dl ciwgd2UgZG9uJ3QgZXhwZWN0IHRvIGhhdmUgdG8gYWR2YW5jZSBhbnkKKyAqIG5vbi1yZXF1aXJl ZCBzY2FuIGtleXMuICBXZSdsbCBhbHdheXMgc2V0IHBzdGF0ZS5jb250aW51ZXNjYW4gYmVjYXVz ZSBhCisgKiBub24tcmVxdWlyZWQgc2NhbiBrZXkgY2FuIG5ldmVyIHRlcm1pbmF0ZSB0aGUgc2Nh bi4KKyAqCisgKiBSZXF1aXJlZCBhcnJheSBrZXlzIGFyZSBhbHdheXMgYWR2YW5jZWQgdG8gdGhl IGhpZ2hlc3QgZWxlbWVudCA+PSB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgdHVwbGUgYXR0cmlidXRl IHZhbHVlcyBmb3IgaXRzIG1vc3Qgc2lnbmlmaWNhbnQgbm9uLWVxdWFsCisgKiBjb2x1bW4gKG9y IHRoZSBuZXh0IGxvd2VzdCBzZXQgPD0gdGhlIHR1cGxlIHZhbHVlIGR1cmluZyBiYWNrd2FyZHMg c2NhbnMpLgorICogSWYgd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgYXJyYXkga2V5cyBmb3IgdGhl IGN1cnJlbnQgc2NhbiBkaXJlY3Rpb24sIHdlCisgKiBlbmQgdGhlIHRvcC1sZXZlbCBpbmRleCBz Y2FuLgorICoKKyAqIF9idF90dXBsZV9iZWZvcmVfYXJyYXlfc2tleXMgaXMgcmVzcG9uc2libGUg Zm9yIGRldGVybWluaW5nIGlmIHRoZSBjdXJyZW50CisgKiBwbGFjZSBpbiB0aGUgc2NhbiBpcyA+ PSB0aGUgY3VycmVudCBhcnJheSBrZXlzIChvciA8PSBkdXJpbmcgYmFja3dhcmQKKyAqIHNjYW5z KS4gIFRoaXMgbXVzdCBiZSBlc3RhYmxpc2hlZCBmaXJzdCwgYmVmb3JlIGNhbGxpbmcgaGVyZS4K KyAqCisgKiBOb3RlIHRoYXQgd2UgbWF5IHNvbWV0aW1lcyBuZWVkIHRvIGFkdmFuY2UgdGhlIGFy cmF5IGtleXMgaW4gc3BpdGUgb2YgdGhlCisgKiBleGlzdGluZyBhcnJheSBrZXlzIGFscmVhZHkg YmVpbmcgYW4gZXhhY3QgbWF0Y2ggZm9yIGV2ZXJ5IGNvcnJlc3BvbmRpbmcKKyAqIHZhbHVlIGZy b20gY2FsbGVyJ3MgdHVwbGUuICBXZSBmYWxsIGJhY2sgb24gImluY3JlbWVudGFsbHkiIGFkdmFu Y2luZyB0aGUKKyAqIGFycmF5IGtleXMgaW4gdGhlc2UgY2FzZXMsIHdoaWNoIGludm9sdmUgaW5l cXVhbGl0eSBzdHJhdGVneSBzY2FuIGtleXMuCisgKiBGb3IgZXhhbXBsZSwgd2l0aCBhIGNvbXBv c2l0ZSBpbmRleCBvbiAoYSwgYikgYW5kIGEgcXVhbCAiV0hFUkUgYSBJTiAoMyw1KQorICogQU5E IGIgPCA0MiIsIHdlJ2xsIGJlIGNhbGxlZCBmb3IgYm90aCAiYSIgYXJyeSBrZXlzIChrZXlzIDMg YW5kIDUpIHdoZW4gdGhlCisgKiBzY2FuIHJlYWNoZXMgdHVwbGVzIHdoZXJlICJiID49IDQyIi4g IEV2ZW4gdGhvdWdoICJhIiBhcnJheSBrZXlzIGNvbnRpbnVlCisgKiB0byBoYXZlIGV4YWN0IG1h dGNoZXMgZm9yIHR1cGxlcyAiYiA+PSA0MiIgKGZvciBib3RoIGFycmF5IGtleSBncm91cGluZ3Mp LAorICogd2Ugd2lsbCBzdGlsbCBhZHZhbmNlIHRoZSBhcnJheSBmb3IgImEiIHZpYSBvdXIgZmFs bGJhY2sgb24gaW5jcmVtZW50YWwKKyAqIGFkdmFuY2VtZW50IGVhY2ggdGltZSB3ZSdyZSBjYWxs ZWQuICBUaGUgZmlyc3QgdGltZSB3ZSdyZSBjYWxsZWQgKHdoZW4gdGhlCisgKiBzY2FuIHJlYWNo ZXMgYSB0dXBsZSA+PSAiKDMsIDQyKSIpLCB3ZSBhZHZhbmNlIHRoZSBhcnJheSBrZXkgKGZyb20g MyB0byA1KS4KKyAqIFRoaXMgZ2l2ZXMgb3VyIGNhbGxlciB0aGUgb3B0aW9uIG9mIHN0YXJ0aW5n IGEgbmV3IHByaW1pdGl2ZSBpbmRleCBzY2FuCisgKiB0aGF0IHF1aWNrbHkgbG9jYXRlcyB0aGUg c3RhcnQgb2YgdHVwbGVzID4gIig1LCAtaW5mKSIuICBUaGUgc2Vjb25kIHRpbWUKKyAqIHdlJ3Jl IGNhbGxlZCAod2hlbiB0aGUgc2NhbiByZWFjaGVzIGEgdHVwbGUgPj0gIig1LCA0MikiKSwgd2Ug aW5jcmVtZW50YWxseQorICogYWR2YW5jZSB0aGUga2V5cyBhIHNlY29uZCB0aW1lLiAgVGhpcyBz ZWNvbmQgY2FsbCBlbmRzIHRoZSB0b3AtbGV2ZWwgc2Nhbi4KKyAqCisgKiBOb3RlIGFsc28gdGhh dCB3ZSBkZWFsIHdpdGggYWxsIHJlcXVpcmVkIGVxdWFsaXR5LXR5cGUgc2NhbiBrZXlzIGhlcmU7 IGl0J3MKKyAqIG5vdCBsaW1pdGVkIHRvIGFycmF5IHNjYW4ga2V5cy4gIFdlIG5lZWQgdG8gaGFu ZGxlIG5vbi1hcnJheSBlcXVhbGl0eSBjYXNlcworICogaGVyZSBiZWNhdXNlIHRoZXkncmUgZXF1 YWxpdHkgY29uc3RyYWludHMgZm9yIHRoZSBzY2FuLCBpbiB0aGUgc2FtZSB3YXkKKyAqIHRoYXQg YXJyYXkgc2NhbiBrZXlzIGFyZS4gIFdlIG11c3Qgbm90IHN1cHByZXNzIGNhc2VzIHdoZXJlIGEg Y2FsbCB0bworICogX2J0X2NoZWNrX2NvbXBhcmUgc2V0cyBjb250aW51ZXNjYW49ZmFsc2UgZm9y IGEgcmVxdWlyZWQgc2NhbiBrZXkgdGhhdCB1c2VzCisgKiB0aGUgZXF1YWxpdHkgc3RyYXRlZ3kg KG9ubHkgaW5lcXVhbGl0eS10eXBlIHNjYW4ga2V5cyBnZXQgdGhhdCB0cmVhdG1lbnQpLgorICog V2UgZG9uJ3Qgd2FudCB0byBzdXBwcmVzcyB0aGUgc2NhbidzIHRlcm1pbmF0aW9uIHdoZW4gaXQn cyBpbmFwcHJvcHJpYXRlLgorICovCitzdGF0aWMgYm9vbAorX2J0X2FkdmFuY2VfYXJyYXlfa2V5 cyhJbmRleFNjYW5EZXNjIHNjYW4sIEJUUmVhZFBhZ2VTdGF0ZSAqcHN0YXRlLAorCQkJCQkgICBJ bmRleFR1cGxlIHR1cGxlLCBib29sIHNrcmVxdWlyZWR0cmlnZ2VyKQoreworCUJUU2Nhbk9wYXF1 ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKKwlSZWxhdGlvbglyZWwgPSBzY2Fu LT5pbmRleFJlbGF0aW9uOworCVNjYW5EaXJlY3Rpb24gZGlyID0gcHN0YXRlLT5kaXI7CisJVHVw bGVEZXNjCWl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihyZWwpOworCVNjYW5LZXkJCWN1cjsK KwlpbnQJCQlpa2V5LAorCQkJCWFycmF5aWR4ID0gMCwKKwkJCQludHVwYXR0cyA9IEJUcmVlVHVw bGVHZXROQXR0cyh0dXBsZSwgcmVsKTsKKwlib29sCQlhcnJheXNfYWR2YW5jZWQgPSBmYWxzZSwK KwkJCQlhcnJheXNfZG9uZSA9IGZhbHNlLAorCQkJCWFsbF9za3JlcXVpcmVkX2F0dHNfd3JhcHBl ZCA9IHNrcmVxdWlyZWR0cmlnZ2VyLAorCQkJCWFsbF9hdHRzX2VxdWFsID0gdHJ1ZTsKKworCUFz c2VydChzby0+bnVtYmVyT2ZLZXlzID4gMCk7CisJQXNzZXJ0KHNvLT5udW1BcnJheUtleXMgPiAw KTsKKwlBc3NlcnQoc28tPnF1YWxfb2spOworCisJLyoKKwkgKiBUcnkgdG8gYWR2YW5jZSBhcnJh eSBrZXlzIHZpYSBhIHNlcmllcyBvZiBiaW5hcnkgc2VhcmNoZXMuCisJICoKKwkgKiBMb29wIGl0 ZXJhdGVzIHRocm91Z2ggdGhlIGN1cnJlbnQgc2NhbmtleXMgKHNvLT5rZXlEYXRhLCB3aGljaCB3 ZXJlCisJICogb3V0cHV0IGJ5IF9idF9wcmVwcm9jZXNzX2tleXMgZWFybGllcikgYW5kIHRoZW4g c2V0cyBpbnB1dCBzY2FuIGtleXMKKwkgKiAoc28tPmFycmF5S2V5RGF0YSBzY2FuIGtleXMpIHRv IG5ldyBhcnJheSB2YWx1ZXMuICBUaGlzIHNldHMgdGhpbmdzIHVwCisJICogZm9yIG91ciBjYWxs IHRvIF9idF9wcmVwcm9jZXNzX2tleXMsIHdoaWNoIGlzIHdoZXJlIHRoZSBjdXJyZW50IHNjYW4K KwkgKiBrZXlzIGFjdHVhbGx5IGNoYW5nZS4KKwkgKgorCSAqIFdlIG5lZWQgdG8gZG8gdGhpbmdz IHRoaXMgd2F5IGJlY2F1c2Ugb25seSBjdXJyZW50L3ByZXByb2Nlc3NlZCBzY2FuCisJICoga2V5 cyB3aWxsIGJlIG1hcmtlZCBhcyByZXF1aXJlZC4gIEl0J3MgYWxzbyBwb3NzaWJsZSB0aGF0IHRo ZSBwcmV2aW91cworCSAqIGNhbGwgdG8gX2J0X3ByZXByb2Nlc3Nfa2V5cyBlbGltaW5hdGVkIG9u ZSBvciBtb3JlIGlucHV0IHNjYW4ga2V5cworCSAqIChwb3NzaWJseSBhcnJheSB0eXBlIHNjYW4g a2V5cykgdGhhdCB3ZXJlIGRlZW1lZCB0byBiZSByZWR1bmRhbnQuCisJICovCisJZm9yIChjdXIg PSBzby0+a2V5RGF0YSwgaWtleSA9IDA7IGlrZXkgPCBzby0+bnVtYmVyT2ZLZXlzOyBjdXIrKywg aWtleSsrKQorCXsKKwkJQlRBcnJheUtleUluZm8gKmFycmF5ID0gTlVMTDsKKwkJU2NhbktleQkJ c2tleWFycmF5ID0gTlVMTDsKKwkJRm1nckluZm8gICAqb3JkZXJwcm9jOworCQlpbnQJCQlhdHRu dW0gPSBjdXItPnNrX2F0dG5vLAorCQkJCQlmaXJzdF9lbGVtX2RpciwKKwkJCQkJZmluYWxfZWxl bV9kaXIsCisJCQkJCXNldF9lbGVtOworCQlEYXR1bQkJZGF0dW07CisJCWJvb2wJCXNrcmVxdWly ZWQsCisJCQkJCW51bGw7CisJCWludDMyCQlyZXN1bHQ7CisKKwkJLyoKKwkJICogV2Ugb25seSBk ZWFsIHdpdGggZXF1YWxpdHkgc3RyYXRlZ3kgc2NhbiBrZXlzLiAgV2UgbGVhdmUgaGFuZGxpbmcK KwkJICogb2YgaW5lcXVhbGl0aWVzIHVwIHRvIF9idF9jaGVja19jb21wYXJlLgorCQkgKi8KKwkJ aWYgKGN1ci0+c2tfc3RyYXRlZ3kgIT0gQlRFcXVhbFN0cmF0ZWd5TnVtYmVyKQorCQkJY29udGlu dWU7CisKKwkJLyoKKwkJICogRGV0ZXJtaW5lIGlmIHRoaXMgc2NhbiBrZXkgaXMgcmVxdWlyZWQg aW4gdGhlIGN1cnJlbnQgc2NhbgorCQkgKiBkaXJlY3Rpb24KKwkJICovCisJCXNrcmVxdWlyZWQg PSAoKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSAmJgorCQkJCQkgICAoY3VyLT5za19mbGFn cyAmIFNLX0JUX1JFUUZXRCkpIHx8CisJCQkJCSAgKFNjYW5EaXJlY3Rpb25Jc0JhY2t3YXJkKGRp cikgJiYKKwkJCQkJICAgKGN1ci0+c2tfZmxhZ3MgJiBTS19CVF9SRVFCS1dEKSkpOworCisJCS8q CisJCSAqIE9wdGltaXphdGlvbjogd2UgZG9uJ3QgaGF2ZSB0byBhZHZhbmNlIHJlbWFpbmluZyBu b24tcmVxdWlyZWQgYXJyYXkKKwkJICoga2V5cyB3aGVuIHdlIGFscmVhZHkga25vdyB0aGF0IHR1 cGxlIHdvbid0IGJlIHJldHVybmVkIGJ5IHRoZSBzY2FuLgorCQkgKgorCQkgKiBEZWxpYmVyYXRl bHkgY2hlY2sgdGhpcyBib3RoIGhlcmUgYW5kIGFmdGVyIHRoZSBiaW5hcnkgc2VhcmNoLgorCQkg Ki8KKwkJaWYgKCFza3JlcXVpcmVkICYmICFhbGxfYXR0c19lcXVhbCkKKwkJCWJyZWFrOworCisJ CS8qCisJCSAqIFdlIG5lZWQgdG8gY2hlY2sgcmVxdWlyZWQgbm9uLWFycmF5IHNjYW4ga2V5cyAo dGhhdCB1c2UgdGhlIGVxdWFsCisJCSAqIHN0cmF0ZWd5KSwgYXMgd2VsbCBhcyByZXF1aXJlZCBh bmQgbm9uLXJlcXVpcmVkIGFycmF5IHNjYW4ga2V5cworCQkgKiAoYWxzbyBsaW1pdGVkIHRvIHRo b3NlIHRoYXQgdXNlIHRoZSBlcXVhbCBzdHJhdGVneSwgc2luY2UgYXJyYXkKKwkJICogaW5lcXVh bGl0aWVzIGRlZ2VuZXJhdGUgaW50byBhIHNpbXBsZSBjb21wYXJpc29uKS4KKwkJICoKKwkJICog UGVyZm9ybSBpbml0aWFsIHNldCB1cCBmb3IgdGhpcyBzY2FuIGtleS4gIElmIGl0IGlzIGJhY2tl ZCBieSBhbgorCQkgKiBhcnJheSB0aGVuIHdlIG5lZWQgdG8gc2V0IHZhcmlhYmxlcyBkZXNjcmli aW5nIHRoZSBjdXJyZW50IHBvc2l0aW9uCisJCSAqIGluIHRoZSBhcnJheS4KKwkJICovCisJCW9y ZGVycHJvYyA9ICZzby0+b3JkZXJQcm9jc1thdHRudW0gLSAxXTsKKwkJZmlyc3RfZWxlbV9kaXIg PSBmaW5hbF9lbGVtX2RpciA9IDA7CQkvKiBrZWVwIGNvbXBpbGVyIHF1aWV0ICovCisJCWlmIChj dXItPnNrX2ZsYWdzICYgU0tfU0VBUkNIQVJSQVkpCisJCXsKKwkJCS8qIFNldCB1cCBhcnJheSBj b21wYXJpc29uIGZ1bmN0aW9uICovCisJCQlBc3NlcnQoYXJyYXlpZHggPCBzby0+bnVtQXJyYXlL ZXlzKTsKKwkJCWFycmF5ID0gJnNvLT5hcnJheUtleXNbYXJyYXlpZHgrK107CisJCQlza2V5YXJy YXkgPSAmc28tPmFycmF5S2V5RGF0YVthcnJheS0+c2Nhbl9rZXldOworCisJCQkvKgorCQkJICog SXQncyBwb3NzaWJsZSB0aGF0IF9idF9wcmVwcm9jZXNzX2tleXMgZGV0ZXJtaW5lZCB0aGF0IGFu CisJCQkgKiBpbmRpdmlkdWFsIGFycmF5IHNjYW4ga2V5IHdhc24ndCByZXF1aXJlZCBpbiBzby0+ a2V5RGF0YSBmb3IKKwkJCSAqIHRoZSBvbmdvaW5nIHByaW1pdGl2ZSBpbmRleCBzY2FuIGR1ZSB0 byBpdCBiZWluZyByZWR1bmRhbnQgb3IKKwkJCSAqIGNvbnRyYWRpY3RvcnkgKHRoZSBjdXJyZW50 IGFycmF5IHZhbHVlIG1pZ2h0IGJlIHJlZHVuZGFudCBuZXh0CisJCQkgKiB0byBzb21lIG90aGVy IHNjYW4ga2V5IG9uIHRoZSBzYW1lIGF0dHJpYnV0ZSkuICBEZWFsIHdpdGggdGhhdC4KKwkJCSAq LworCQkJaWYgKHVubGlrZWx5KHNrZXlhcnJheS0+c2tfYXR0bm8gIT0gYXR0bnVtKSkKKwkJCXsK KwkJCQlib29sCQlmb3VuZCBQR19VU0VEX0ZPUl9BU1NFUlRTX09OTFkgPSBmYWxzZTsKKworCQkJ CWZvciAoOyBhcnJheWlkeCA8IHNvLT5udW1BcnJheUtleXM7IGFycmF5aWR4KyspCisJCQkJewor CQkJCQlhcnJheSA9ICZzby0+YXJyYXlLZXlzW2FycmF5aWR4XTsKKwkJCQkJc2tleWFycmF5ID0g JnNvLT5hcnJheUtleURhdGFbYXJyYXktPnNjYW5fa2V5XTsKKwkJCQkJaWYgKHNrZXlhcnJheS0+ c2tfYXR0bm8gPT0gYXR0bnVtKQorCQkJCQl7CisJCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCQli cmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCUFzc2VydChmb3VuZCk7CisJCQl9CisKKwkJCS8q IFByb2FjdGl2ZWx5IHNldCB1cCBzdGF0ZSB1c2VkIHRvIGhhbmRsZSBhcnJheSB3cmFwYXJvdW5k ICovCisJCQlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIpKQorCQkJeworCQkJCWZpcnN0 X2VsZW1fZGlyID0gMDsKKwkJCQlmaW5hbF9lbGVtX2RpciA9IGFycmF5LT5udW1fZWxlbXMgLSAx OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWZpcnN0X2VsZW1fZGlyID0gYXJyYXktPm51bV9l bGVtcyAtIDE7CisJCQkJZmluYWxfZWxlbV9kaXIgPSAwOworCQkJfQorCQl9CisJCWVsc2UgaWYg KGF0dG51bSA+IG50dXBhdHRzKQorCQl7CisJCQkvKgorCQkJICogTm90aGluZyBuZWVkcyB0byBi ZSBkb25lIHdoZW4gd2UgaGF2ZSBhIHRydW5jYXRlZCBhdHRyaWJ1dGUKKwkJCSAqIChwb3NzaWJs ZSB3aGVuIGNhbGxlcidzIHR1cGxlIGlzIGEgcGFnZSBoaWdoIGtleSkgYW5kIGEKKwkJCSAqIG5v bi1hcnJheSBzY2FuIGtleQorCQkJICovCisJCQlBc3NlcnQoU2NhbkRpcmVjdGlvbklzRm9yd2Fy ZChkaXIpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogSGVyZSB3ZSBwZXJmb3Jt IHN0ZXBzIGZvciBhbnkgcmVxdWlyZWQgc2NhbiBrZXlzIGFmdGVyIHRoZSBmaXJzdAorCQkgKiBu b24tZXF1YWwgcmVxdWlyZWQgc2NhbiBrZXkuICBUaGUgZmlyc3Qgc2NhbiBrZXkgbXVzdCBoYXZl IGJlZW4gc2V0CisJCSAqIHRvIGEgdmFsdWUgPiB0aGUgdmFsdWUgZnJvbSB0aGUgdHVwbGUgYmFj ayB3aGVuIHdlIGRlYWx0IHdpdGggaXQKKwkJICogKG9yLCBmb3IgYSBiYWNrd2FyZHMgc2Nhbiwg dG8gYSB2YWx1ZSA8IHRoZSB2YWx1ZSBmcm9tIHRoZSB0dXBsZSkuCisJCSAqIFRoYXQgbmVlZHMg dG8gImNhc2NhZGUiIHRvIGxvd2VyLW9yZGVyIGFycmF5IHNjYW4ga2V5cy4gIFRoZXkgbXVzdAor CQkgKiBiZSBzZXQgdG8gdGhlIGZpcnN0IGFycmF5IGVsZW1lbnQgZm9yIHRoZSBjdXJyZW50IHNj YW4gZGlyZWN0aW9uLgorCQkgKgorCQkgKiBXZSdyZSBzdGlsbCBzZXR0aW5nIHRoZSBrZXlzIHRv IHZhbHVlcyA+PSB0aGUgdHVwbGUgaGVyZSAtLSBpdCBqdXN0CisJCSAqIG5lZWRzIHRvIHdvcmsg Zm9yIHRoZSB0dXBsZSBhcyBhIHdob2xlLiAgRm9yIGV4YW1wbGUsIHdoZW4gYSB0dXBsZQorCQkg KiAiKGEsIGIpID0gKDQyLCA1KSIgYWR2YW5jZXMgdGhlIGFycmF5IGtleXMgb24gImEiIGZyb20g NDAgdG8gNDUsIHdlCisJCSAqIG11c3QgYWxzbyBzZXQgImIiIHRvIHdoYXRldmVyIHRoZSBmaXJz dCBhcnJheSBlbGVtZW50IGZvciAiYiIgaXMuCisJCSAqIEl0IHdvdWxkIGJlIHdyb25nIHRvIGFs bG93ICJiIiB0byBiZSBzZXQgdG8gYSB2YWx1ZSBmcm9tIHRoZSB0dXBsZSwKKwkJICogc2luY2Ug dGhlIHZhbHVlIGlzIGFjdHVhbGx5IGZyb20gYSBkaWZmZXJlbnQgcGFydCBvZiB0aGUga2V5IHNw YWNlLgorCQkgKgorCQkgKiBBbHNvIGRlZmVuc2l2ZWx5IGRvIHRoaXMgd2l0aCB0cnVuY2F0ZWQg YXR0cmlidXRlcyB3aGVuIGNhbGxlcidzCisJCSAqIHR1cGxlIGlzIGEgcGFnZSBoaWdoIGtleS4K KwkJICovCisJCWlmIChhcnJheSAmJiAoKGFycmF5c19hZHZhbmNlZCAmJiAhYWxsX2F0dHNfZXF1 YWwpIHx8CisJCQkJCSAgYXR0bnVtID4gbnR1cGF0dHMpKQorCQl7CisJCQkvKiBTaG91bGRuJ3Qg cmVhY2ggdGhpcyBmYXIgZm9yIGEgbm9uLXJlcXVpcmVkIHNjYW4ga2V5ICovCisJCQlBc3NlcnQo c2tyZXF1aXJlZCAmJiBza3JlcXVpcmVkdHJpZ2dlciAmJiBhdHRudW0gPiAxKTsKKworCQkJLyoK KwkJCSAqIFdlIHNldCB0aGUgYXJyYXkgdG8gdGhlIGZpcnN0IGVsZW1lbnQgKGlmIG5lZWRlZCkg aGVyZSwgYW5kIHdlCisJCQkgKiBkb24ndCB1bnNldCBhbGxfcmVxdWlyZWRfYXR0c193cmFwcGVk LiAgVGhpcyBhcnJheSB0aGVyZWZvcmUKKwkJCSAqIGNvdW50cyBhcyBhIHdyYXBwZWQgYXJyYXkg d2hlbiB3ZSBnbyBvbiB0byBkZXRlcm1pbmUgaWYgYWxsIG9mCisJCQkgKiB0aGUgcmVxdWlyZWQg YXJyYXlzIGhhdmUgd3JhcHBlZCAoYWZ0ZXIgdGhpcyBsb29wKS4KKwkJCSAqLworCQkJaWYgKGFy cmF5LT5jdXJfZWxlbSAhPSBmaXJzdF9lbGVtX2RpcikKKwkJCXsKKwkJCQlhcnJheS0+Y3VyX2Vs ZW0gPSBmaXJzdF9lbGVtX2RpcjsKKwkJCQlza2V5YXJyYXktPnNrX2FyZ3VtZW50ID0gYXJyYXkt PmVsZW1fdmFsdWVzW2ZpcnN0X2VsZW1fZGlyXTsKKwkJCQlhcnJheXNfYWR2YW5jZWQgPSB0cnVl OworCQkJfQorCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIEdvaW5nIHRvIGNvbXBh cmUgc2NhbiBrZXkgdG8gY29ycmVzcG9uZGluZyB0dXBsZSBhdHRyaWJ1dGUgdmFsdWUKKwkJICov CisJCWRhdHVtID0gaW5kZXhfZ2V0YXR0cih0dXBsZSwgYXR0bnVtLCBpdHVwZGVzYywgJm51bGwp OworCisJCWlmICghYXJyYXkpCisJCXsKKwkJCWlmICghc2tyZXF1aXJlZCB8fCAhYWxsX2F0dHNf ZXF1YWwpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGEgcmVxdWlyZWQg bm9uLWFycmF5IHNjYW4ga2V5IHRoYXQgdXNlcyB0aGUgZXF1YWwKKwkJCSAqIHN0cmF0ZWd5LiAg U2VlIGhlYWRlciBjb21tZW50cyBmb3IgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHdlCisJCQkgKiBu ZWVkIHRvIGRvIHRoaXMuCisJCQkgKi8KKwkJCXJlc3VsdCA9IF9idF9jb21wYXJlX2FycmF5X3Nr ZXkoY3VyLCBvcmRlcnByb2MsIGRhdHVtLCBudWxsLAorCQkJCQkJCQkJCQljdXItPnNrX2FyZ3Vt ZW50KTsKKworCQkJaWYgKHJlc3VsdCAhPSAwKQorCQkJeworCQkJCS8qCisJCQkJICogdHVwbGUg YXR0cmlidXRlIHZhbHVlIGlzID4gc2NhbiBrZXkgdmFsdWUgKG9yIDwgc2NhbiBrZXkKKwkJCQkg KiB2YWx1ZSBpbiB0aGUgYmFja3dhcmQgc2NhbiBjYXNlKS4KKwkJCQkgKi8KKwkJCQlhbGxfYXR0 c19lcXVhbCA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCisJCQljb250aW51ZTsKKwkJfQor CisJCS8qCisJCSAqIEJpbmFyeSBzZWFyY2ggZm9yIGFuIGFycmF5IGtleSA+PSB0aGUgdHVwbGUg dmFsdWUsIHdoaWNoIHdlJ2xsIHRoZW4KKwkJICogc2V0IGFzIG91ciBjdXJyZW50IGFycmF5IGtl eSAob3IgPD0gdGhlIHR1cGxlIHZhbHVlIGlmIHRoaXMgaXMgYQorCQkgKiBiYWNrd2FyZCBzY2Fu KS4KKwkJICoKKwkJICogVGhlIGJpbmFyeSBzZWFyY2ggZXhjbHVkZXMgYXJyYXkga2V5cyB0aGF0 IHdlJ3ZlIGFscmVhZHkgcHJvY2Vzc2VkCisJCSAqIGZyb20gY29uc2lkZXJhdGlvbiwgZXhjZXB0 IHdpdGggYSBub24tcmVxdWlyZWQgc2NhbiBrZXkncyBhcnJheS4KKwkJICogVGhpcyBpcyBub3Qg anVzdCBhbiBvcHRpbWl6YXRpb24gLS0gaXQncyBpbXBvcnRhbnQgZm9yIGNvcnJlY3RuZXNzLgor CQkgKiBJdCBpcyBjcnVjaWFsIHRoYXQgcmVxdWlyZWQgYXJyYXkgc2NhbiBrZXlzIG9ubHkgaGF2 ZSB0aGVpciBhcnJheQorCQkgKiBrZXlzIGFkdmFuY2VkIGluIHRoZSBjdXJyZW50IHNjYW4gZGly ZWN0aW9uLiAgV2UgbmVlZCB0byBhZHZhbmNlCisJCSAqIHJlcXVpcmVkIGFycmF5IGtleXMgaW4g bG9jayBzdGVwIHdpdGggdGhlIGluZGV4IHNjYW4uCisJCSAqCisJCSAqIE5vdGUgaW4gcGFydGlj dWxhciB0aGF0IGFycmF5c19hZHZhbmNlZCBtdXN0IG9ubHkgYmUgc2V0IHdoZW4gdGhlCisJCSAq IGFycmF5IGlzIGFkdmFuY2VkIHRvIGEga2V5ID49IHRoZSBleGlzdGluZyBrZXksIG9yIDw9IGZv ciBhCisJCSAqIGJhY2t3YXJkcyBzY2FuLiAgKFRob3VnaCBzZWUgbm90ZXMgYWJvdXQgd3JhcGFy b3VuZCBiZWxvdy4pCisJCSAqLworCQlzZXRfZWxlbSA9IF9idF9iaW5zcmNoX2FycmF5X3NrZXko ZGlyLCAoIXNrcmVxdWlyZWQgfHwgYXJyYXlzX2FkdmFuY2VkKSwKKwkJCQkJCQkJCQkgIGFycmF5 LCBjdXIsIG9yZGVycHJvYywgZGF0dW0sIG51bGwsCisJCQkJCQkJCQkJICAmcmVzdWx0KTsKKwor CQkvKgorCQkgKiBNYWludGFpbiB0aGUgc3RhdGUgdGhhdCB0cmFja3Mgd2hldGhlciBhbGwgYXR0 cmlidXRlIGZyb20gdGhlIHR1cGxlCisJCSAqIGFyZSBlcXVhbCB0byB0aGUgYXJyYXkga2V5cyB0 aGF0IHdlJ3ZlIHNldCBhcyBjdXJyZW50IChvciBleGlzdGluZworCQkgKiBhcnJheSBrZXlzIHNl dCBkdXJpbmcgZWFybGllciBjYWxscyBoZXJlKS4KKwkJICovCisJCWlmIChyZXN1bHQgIT0gMCkK KwkJCWFsbF9hdHRzX2VxdWFsID0gZmFsc2U7CisKKwkJLyoKKwkJICogT3B0aW1pemF0aW9uOiB3 ZSBkb24ndCBoYXZlIHRvIGFkdmFuY2UgcmVtYWluaW5nIG5vbi1yZXF1aXJlZCBhcnJheQorCQkg KiBrZXlzIHdoZW4gd2UgYWxyZWFkeSBrbm93IHRoYXQgdHVwbGUgd29uJ3QgYmUgcmV0dXJuZWQg YnkgdGhlIHNjYW4uCisJCSAqIFF1aXQgYmVmb3JlIHNldHRpbmcgdGhlIGFycmF5IGtleXMgdG8g YXZvaWQgX2J0X3ByZXByb2Nlc3Nfa2V5cy4KKwkJICoKKwkJICogRGVsaWJlcmF0ZWx5IGNoZWNr IHRoaXMgYm90aCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBiaW5hcnkgc2VhcmNoLgorCQkgKi8KKwkJ aWYgKCFza3JlcXVpcmVkICYmICFhbGxfYXR0c19lcXVhbCkKKwkJCWJyZWFrOworCisJCS8qCisJ CSAqIElmIHRoZSBiaW5hcnkgc2VhcmNoIGluZGljYXRlcyB0aGF0IHRoZSBrZXkgc3BhY2UgZm9y IHRoaXMgdHVwbGUKKwkJICogYXR0cmlidXRlIHZhbHVlIGlzID4gdGhlIGtleSB2YWx1ZSBmcm9t IHRoZSBmaW5hbCBlbGVtZW50IGluIHRoZQorCQkgKiBhcnJheSAoZmluYWwgZm9yIHRoZSBjdXJy ZW50IHNjYW4gZGlyZWN0aW9uKSwgd2UgaGFuZGxlIGl0IGJ5CisJCSAqIHdyYXBwaW5nIGFyb3Vu ZCB0byB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkuCisJCSAqCisJCSAqIFdyYXBwaW5n IGFyb3VuZCBzaW1wbGlmaWVzIGFkdmFuY2VtZW50IHdpdGggYSBtdWx0aS1jb2x1bW4gaW5kZXgg YnkKKwkJICogYWxsb3dpbmcgdXMgdG8gdHJlYXQgd3JhcHBpbmcgYSBjb2x1bW4gYXMgYWR2YW5j aW5nIHRoZSBjb2x1bW4uICBXZQorCQkgKiBwcmVzZXJ2ZSB0aGUgaW52YXJpYW50IHRoYXQgYSBy ZXF1aXJlZCBzY2FuIGtleSdzIGFycmF5IG1heSBvbmx5IGJlCisJCSAqIHJhdGNoZXRlZCBmb3J3 YXJkIChiYWNrd2FyZHMgd2hlbiB0aGUgc2NhbiBkaXJlY3Rpb24gaXMgYmFja3dhcmRzKSwKKwkJ ICogd2hpbGUgc3RpbGwgYWx3YXlzIGJlaW5nIGFibGUgdG8gImFkdmFuY2UiIHRoZSBhcnJheSBh dCB0aGlzIHBvaW50LgorCQkgKi8KKwkJaWYgKHNldF9lbGVtID09IGZpbmFsX2VsZW1fZGlyICYm CisJCQkoKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSAmJiByZXN1bHQgPiAwKSB8fAorCQkJ IChTY2FuRGlyZWN0aW9uSXNCYWNrd2FyZChkaXIpICYmIHJlc3VsdCA8IDApKSkKKwkJeworCQkJ LyogUGVyZm9ybSB3cmFwYXJvdW5kICovCisJCQlzZXRfZWxlbSA9IGZpcnN0X2VsZW1fZGlyOwor CQl9CisJCWVsc2UgaWYgKHNrcmVxdWlyZWQpCisJCXsKKwkJCS8qIFdvbid0IGNhbGwgX2J0X2Fk dmFuY2VfYXJyYXlfa2V5c190b19lbmQgbGF0ZXIgKi8KKwkJCWFsbF9za3JlcXVpcmVkX2F0dHNf d3JhcHBlZCA9IGZhbHNlOworCQl9CisKKwkJQXNzZXJ0KHNldF9lbGVtID49IDAgJiYgc2V0X2Vs ZW0gPCBhcnJheS0+bnVtX2VsZW1zKTsKKwkJaWYgKGFycmF5LT5jdXJfZWxlbSAhPSBzZXRfZWxl bSkKKwkJeworCQkJYXJyYXktPmN1cl9lbGVtID0gc2V0X2VsZW07CisJCQlza2V5YXJyYXktPnNr X2FyZ3VtZW50ID0gYXJyYXktPmVsZW1fdmFsdWVzW3NldF9lbGVtXTsKKwkJCWFycmF5c19hZHZh bmNlZCA9IHRydWU7CisKKwkJCS8qCisJCQkgKiBXZSBzaG91bGRuJ3QgaGF2ZSB0byBhZHZhbmNl IGEgcmVxdWlyZWQgYXJyYXkgd2hlbiBjYWxsZWQgZHVlCisJCQkgKiB0byBfYnRfY2hlY2tfY29t cGFyZSBkZXRlcm1pbmluZyB0aGF0IGEgbm9uLXJlcXVpcmVkIGFycmF5CisJCQkgKiBuZWVkcyB0 byBiZSBhZHZhbmNlZC4gIFdlIGV4cGVjdCBfYnRfY2hlY2tfY29tcGFyZSB0byBub3RpY2UKKwkJ CSAqIGFuZCByZXBvcnQgcmVxdWlyZWQgc2NhbiBrZXlzIGJlZm9yZSBub24tcmVxdWlyZWQgb25l cy4KKwkJCSAqLworCQkJQXNzZXJ0KHNrcmVxdWlyZWR0cmlnZ2VyIHx8ICFza3JlcXVpcmVkKTsK KwkJfQorCX0KKworCWlmICghc2tyZXF1aXJlZHRyaWdnZXIpCisJeworCQkvKgorCQkgKiBGYWls aW5nIHRvIHNhdGlzZnkgYSBub24tcmVxdWlyZWQgYXJyYXkgc2NhbiBrZXkgc2hvdWxkbid0IGV2 ZXIKKwkJICogcmVzdWx0IGluIHRlcm1pbmF0aW5nIHRoZSAocHJpbWl0aXZlKSBpbmRleCBzY2Fu CisJCSAqLworCX0KKwllbHNlIGlmIChhbGxfc2tyZXF1aXJlZF9hdHRzX3dyYXBwZWQpCisJewor CQkvKgorCQkgKiBUaGUgYmluYXJ5IHNlYXJjaGVzIGZvciBlYWNoIHR1cGxlJ3MgYXR0cmlidXRl IHZhbHVlIGluIHRoZSBzY2FuCisJCSAqIGtleSdzIGNvcnJlc3BvbmRpbmcgU0tfU0VBUkNIQVJS QVkgYXJyYXkgYWxsIGZvdW5kIHRoYXQgdGhlIHR1cGxlJ3MKKwkJICogdmFsdWUgYXJlICJwYXN0 IHRoZSBlbmQiIG9mIHRoZSBrZXkgc3BhY2UgY292ZXJlZCBieSBlYWNoIGFycmF5CisJCSAqLwor CQlfYnRfYWR2YW5jZV9hcnJheV9rZXlzX3RvX2VuZChzY2FuLCBkaXIpOworCQlhcnJheXNfZG9u ZSA9IHRydWU7CisJCWFsbF9hdHRzX2VxdWFsID0gZmFsc2U7IC8qIGF0IGxlYXN0IG5vdCBub3cg Ki8KKwl9CisJZWxzZSBpZiAoIWFycmF5c19hZHZhbmNlZCkKKwl7CisJCS8qCisJCSAqIFdlIG11 c3QgYWx3YXlzIGFkdmFuY2UgdGhlIGFycmF5IGtleXMgYnkgYXQgbGVhc3Qgb25lIGluY3JlbWVu dAorCQkgKiAoZXhjZXB0IHdoZW4gY2FsbGVkIHRvIGFkdmFuY2UgYSBub24tcmVxdWlyZWQgc2Nh biBrZXkncyBhcnJheSkuCisJCSAqCisJCSAqIFdlIG5lZWQgdGhpcyBmYWxsYmFjayBmb3IgY2Fz ZXMgd2hlcmUgdGhlIGV4aXN0aW5nIGFycmF5IGtleXMgYW5kCisJCSAqIGV4aXN0aW5nIHJlcXVp cmVkIGVxdWFsLXN0cmF0ZWd5IHNjYW4ga2V5cyB3ZXJlIGZ1bGx5IGVxdWFsIHRvIHRoZQorCQkg KiB0dXBsZS4gIF9idF9jaGVja19jb21wYXJlIG1heSBoYXZlIHNldCBjb250aW51ZXNjYW49ZmFs c2UgZHVlIHRvIGFuCisJCSAqIGluZXF1YWxpdHkgdGVybWluYXRpbmcgdGhlIHNjYW4sIHdoaWNo IHdlIGRvbid0IGRlYWwgd2l0aCBkaXJlY3RseS4KKwkJICogKFNlZSBmdW5jdGlvbidzIGhlYWRl ciBjb21tZW50cyBmb3IgYW4gZXhhbXBsZS4pCisJCSAqLworCQlpZiAoX2J0X2FkdmFuY2VfYXJy YXlfa2V5c19pbmNyZW1lbnQoc2NhbiwgZGlyKSkKKwkJCWFycmF5c19hZHZhbmNlZCA9IHRydWU7 CisJCWVsc2UKKwkJCWFycmF5c19kb25lID0gdHJ1ZTsKKwkJYWxsX2F0dHNfZXF1YWwgPSBmYWxz ZTsgLyogYXQgbGVhc3Qgbm90IG5vdyAqLworCX0KKworCS8qCisJICogTWlnaHQgbWFrZSBzZW5z ZSB0byByZWNoZWNrIHRoZSBoaWdoIGtleSBsYXRlciBvbiBpbiBjYXNlcyB3aGVyZSB3ZQorCSAq IGp1c3QgYWR2YW5jZWQgdGhlIGtleXMgKHVubGVzcyB3ZSB3ZXJlIGp1c3QgY2FsbGVkIHRvIGFk dmFuY2UgdGhlCisJICogc2NhbidzIG5vbi1yZXF1aXJlZCBhcnJheSBrZXlzKQorCSAqLworCWlm IChhcnJheXNfYWR2YW5jZWQgJiYgc2tyZXF1aXJlZHRyaWdnZXIpCisJCXBzdGF0ZS0+aGlnaGtl eWNoZWNrZWQgPSBmYWxzZTsKKworCS8qCisJICogSWYgd2UgY2hhbmdlZCB0aGUgYXJyYXkga2V5 cyB3aXRob3V0IGV4aGF1c3RpbmcgYWxsIGFycmF5IGtleXMgdGhlbiB3ZQorCSAqIG5lZWQgdG8g cHJlcHJvY2VzcyBvdXIgc2VhcmNoLXR5cGUgc2NhbiBrZXlzIG9uY2UgbW9yZQorCSAqLworCUFz c2VydChza3JlcXVpcmVkdHJpZ2dlciB8fCAhYXJyYXlzX2RvbmUpOworCWlmIChhcnJheXNfYWR2 YW5jZWQgJiYgIWFycmF5c19kb25lKQorCXsKKwkJLyoKKwkJICogWFhYIFRoaW5rIGFib3V0IGJ1 ZmZlci1sb2NrLWhlbGQgaGF6YXJkcyBoZXJlIHNvbWUgbW9yZS4KKwkJICoKKwkJICogSW4gYWxt b3N0IGFsbCBpbnRlcmVzdGluZyBjYXNlcyB3ZSBvbmx5IHJlYWxseSBuZWVkIHRvIGNvcHkgb3Zl cgorCQkgKiB0aGUgYXJyYXkgdmFsdWVzIChmcm9tICJzby0+YXJyYXlLZXlEYXRhIiB0byAic28t PmtleURhdGEiKS4gIEJ1dAorCQkgKiB0aGVyZSBhcmUgYXQgbGVhc3Qgc29tZSBjYXNlcyB3aGVy ZSBwZXJmb3JtaW5nIHRoZSBmdWxsIHNldCBvZiBwdXNoCisJCSAqIHVwcyBoZXJlIChvciBjbG9z ZSB0byBpdCkgbWlnaHQgYWRkIHZhbHVlIG92ZXIganVzdCBkb2luZyBpdCBmb3IKKwkJICogdGhl IG1haW4gX2J0X2ZpcnN0IGNhbGwuCisJCSAqLworCQlfYnRfcHJlcHJvY2Vzc19rZXlzKHNjYW4p OworCX0KKworCS8qIEFyZSB3ZSBub3cgZG9uZSB3aXRoIHRoZSB0b3AtbGV2ZWwgc2NhbiAoYmFy cmluZyBhIGJ0cmVzY2FuKT8gKi8KKwlBc3NlcnQoIXNvLT5uZWVkUHJpbVNjYW4pOworCWlmICgh c28tPnF1YWxfb2spCisJeworCQkvKgorCQkgKiBJbmNyZW1lbnQgYXJyYXkga2V5cyBhbmQgc3Rh cnQgYSBuZXcgcHJpbWl0aXZlIGluZGV4IHNjYW4gaWYKKwkJICogX2J0X3ByZXByb2Nlc3Nfa2V5 cygpIGRpc2NvdmVyZWQgdGhhdCB0aGUgc2NhbiBrZXlzIGNhbiBuZXZlciBiZQorCQkgKiBzYXRp c2ZpZWQgKGVnLCB4ID09IDIgQU5EIHggaW4gKDEsIDIsIDMpIGZvciBhcnJheSBrZXlzIDEgYW5k IDIpLgorCQkgKgorCQkgKiBOb3RlOiBUaGVyZSBpcyBzaW1pbGFyIGhhbmRsaW5nIGluIF9idF9h cnJheV9rZXlzX3JlbWFpbiwgd2hpY2gKKwkJICogbXVzdCBhZHZhbmNlIHRoZSBhcnJheSBrZXlz IHdpdGhvdXQgY29uc3VsdGluZyB1cyBpbiB0aGlzIG9uZSBjYXNlLgorCQkgKi8KKwkJQXNzZXJ0 KHNrcmVxdWlyZWR0cmlnZ2VyKTsKKworCQlwc3RhdGUtPmNvbnRpbnVlc2NhbiA9IGZhbHNlOwor CQlwc3RhdGUtPmhpZ2hrZXljaGVja2VkID0gdHJ1ZTsKKwkJYWxsX2F0dHNfZXF1YWwgPSBmYWxz ZTsgLyogYXQgbGVhc3Qgbm90IG5vdyAqLworCisJCWlmIChfYnRfYWR2YW5jZV9hcnJheV9rZXlz X2luY3JlbWVudChzY2FuLCBkaXIpKQorCQkJc28tPm5lZWRQcmltU2NhbiA9IHRydWU7CisJfQor CWVsc2UgaWYgKCFza3JlcXVpcmVkdHJpZ2dlcikKKwl7CisJCS8qIE5vdCB3aGVuIHdlIGZhaWxl ZCB0byBzYXRpc2Z5IGEgbm9uLXJlcXVpcmVkIHNjYW4ga2V5LCBldmVyICovCisJCUFzc2VydCgh YXJyYXlzX2RvbmUpOworCQlwc3RhdGUtPmNvbnRpbnVlc2NhbiA9IHRydWU7CisJfQorCWVsc2Ug aWYgKGFycmF5c19kb25lKQorCXsKKwkJLyoKKwkJICogWWVwIC0tIHRoaXMgcHJpbWl0aXZlIHNj YW4gd2FzIG91ciBsYXN0CisJCSAqLworCQlBc3NlcnQoIWFsbF9hdHRzX2VxdWFsKTsKKwkJcHN0 YXRlLT5jb250aW51ZXNjYW4gPSBmYWxzZTsKKwl9CisJZWxzZSBpZiAoIWFsbF9hdHRzX2VxdWFs KQorCXsKKwkJLyoKKwkJICogTm90IGRvbmUuICBUaGUgdG9wLWxldmVsIGluZGV4IHNjYW4gKGFu ZCBwcmltaXRpdmUgaW5kZXggc2Nhbikgd2lsbAorCQkgKiBjb250aW51ZSwgc2luY2UgdGhlIGFy cmF5IGtleXMgYWR2YW5jZWQuCisJCSAqLworCQlBc3NlcnQoYXJyYXlzX2FkdmFuY2VkKTsKKwkJ cHN0YXRlLT5jb250aW51ZXNjYW4gPSB0cnVlOworCisJCS8qCisJCSAqIFNvbWUgcmVxdWlyZWQg YXJyYXkga2V5cyBtaWdodCBoYXZlIHdyYXBwZWQgYXJvdW5kIGR1cmluZyB0aGlzCisJCSAqIGNh bGwsIGJ1dCBpdCBjYW4ndCBoYXZlIGJlZW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYXJyYXkgc2Nh biBrZXkuCisJCSAqLworCQlBc3NlcnQoIWFsbF9za3JlcXVpcmVkX2F0dHNfd3JhcHBlZCk7CisJ fQorCWVsc2UKKwl7CisJCS8qCisJCSAqIE5vdCBkb25lLiAgQSBzZWNvbmQgY2FsbCB0byBfYnRf Y2hlY2tfY29tcGFyZSBtdXN0IG5vdyB0YWtlIHBsYWNlLgorCQkgKiBJdCB3aWxsIG1ha2UgdGhl IGZpbmFsIGRlY2lzaW9uIG9uIHNldHRpbmcgY29udGludWVzY2FuLgorCQkgKi8KKwl9CisKKwly ZXR1cm4gYWxsX2F0dHNfZXF1YWw7Cit9CisKKy8qCisgKiBBZHZhbmNlIHRoZSBhcnJheSBrZXlz IGJ5IGEgc2luZ2xlIGluY3JlbWVudCBpbiB0aGUgY3VycmVudCBzY2FuIGRpcmVjdGlvbgorICov CitzdGF0aWMgYm9vbAorX2J0X2FkdmFuY2VfYXJyYXlfa2V5c19pbmNyZW1lbnQoSW5kZXhTY2Fu RGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKK3sKKwlCVFNjYW5PcGFxdWUgc28gPSAoQlRT Y2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisJYm9vbAkJZm91bmQgPSBmYWxzZTsKKwlpbnQJCQlp OworCisJQXNzZXJ0KCFzby0+bmVlZFByaW1TY2FuKTsKKworCS8qCisJICogV2UgbXVzdCBhZHZh bmNlIHRoZSBsYXN0IGFycmF5IGtleSBtb3N0IHF1aWNrbHksIHNpbmNlIGl0IHdpbGwKKwkgKiBj b3JyZXNwb25kIHRvIHRoZSBsb3dlc3Qtb3JkZXIgaW5kZXggY29sdW1uIGFtb25nIHRoZSBhdmFp bGFibGUKKwkgKiBxdWFsaWZpY2F0aW9ucy4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIGNv cnJlY3Qgb3JkZXJpbmcgb2Ygb3V0cHV0CisJICogd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgYXJy YXkga2V5cy4KKwkgKi8KKwlmb3IgKGkgPSBzby0+bnVtQXJyYXlLZXlzIC0gMTsgaSA+PSAwOyBp LS0pCisJeworCQlCVEFycmF5S2V5SW5mbyAqY3VyQXJyYXlLZXkgPSAmc28tPmFycmF5S2V5c1tp XTsKKwkJU2NhbktleQkJc2tleSA9ICZzby0+YXJyYXlLZXlEYXRhW2N1ckFycmF5S2V5LT5zY2Fu X2tleV07CisJCWludAkJCWN1cl9lbGVtID0gY3VyQXJyYXlLZXktPmN1cl9lbGVtOworCQlpbnQJ CQludW1fZWxlbXMgPSBjdXJBcnJheUtleS0+bnVtX2VsZW1zOworCisJCWlmIChTY2FuRGlyZWN0 aW9uSXNCYWNrd2FyZChkaXIpKQorCQl7CisJCQlpZiAoLS1jdXJfZWxlbSA8IDApCisJCQl7CisJ CQkJY3VyX2VsZW0gPSBudW1fZWxlbXMgLSAxOworCQkJCWZvdW5kID0gZmFsc2U7CS8qIG5lZWQg dG8gYWR2YW5jZSBuZXh0IGFycmF5IGtleSAqLworCQkJfQorCQkJZWxzZQorCQkJCWZvdW5kID0g dHJ1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICgrK2N1cl9lbGVtID49IG51bV9lbGVtcykK KwkJCXsKKwkJCQljdXJfZWxlbSA9IDA7CisJCQkJZm91bmQgPSBmYWxzZTsJLyogbmVlZCB0byBh ZHZhbmNlIG5leHQgYXJyYXkga2V5ICovCisJCQl9CisJCQllbHNlCisJCQkJZm91bmQgPSB0cnVl OworCQl9CisKKwkJY3VyQXJyYXlLZXktPmN1cl9lbGVtID0gY3VyX2VsZW07CisJCXNrZXktPnNr X2FyZ3VtZW50ID0gY3VyQXJyYXlLZXktPmVsZW1fdmFsdWVzW2N1cl9lbGVtXTsKKwkJaWYgKGZv dW5kKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGZvdW5kOworfQorCisvKgorICogUGVyZm9y bSBmaW5hbCBzdGVwcyB3aGVuIHRoZSAiZW5kIHBvaW50IiBpcyByZWFjaGVkIG9uIHRoZSBsZWFm IGxldmVsCisgKiB3aXRob3V0IGFueSBjYWxsIHRvIF9idF9jaGVja2tleXMgc2V0dGluZyAqY29u dGludWVzY2FuIHRvIGZhbHNlLgorICovCitzdGF0aWMgdm9pZAorX2J0X2FkdmFuY2VfYXJyYXlf a2V5c190b19lbmQoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKK3sKKwlC VFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisKKwlBc3NlcnQo c28tPm51bUFycmF5S2V5cyk7CisJQXNzZXJ0KCFzby0+bmVlZFByaW1TY2FuKTsKKworCWZvciAo aW50IGkgPSAwOyBpIDwgc28tPm51bUFycmF5S2V5czsgaSsrKQorCXsKKwkJQlRBcnJheUtleUlu Zm8gKmN1ckFycmF5S2V5ID0gJnNvLT5hcnJheUtleXNbaV07CisJCVNjYW5LZXkJCXNrZXkgPSAm c28tPmFycmF5S2V5RGF0YVtjdXJBcnJheUtleS0+c2Nhbl9rZXldOworCQlpbnQJCQlyZXNldF9l bGVtOworCisJCWlmIChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikpCisJCQlyZXNldF9lbGVt ID0gY3VyQXJyYXlLZXktPm51bV9lbGVtcyAtIDE7CisJCWVsc2UKKwkJCXJlc2V0X2VsZW0gPSAw OworCisJCWlmIChjdXJBcnJheUtleS0+Y3VyX2VsZW0gIT0gcmVzZXRfZWxlbSkKKwkJeworCQkJ Y3VyQXJyYXlLZXktPmN1cl9lbGVtID0gcmVzZXRfZWxlbTsKKwkJCXNrZXktPnNrX2FyZ3VtZW50 ID0gY3VyQXJyYXlLZXktPmVsZW1fdmFsdWVzW3Jlc2V0X2VsZW1dOworCQl9CisJfQorfQogCiAv KgogICoJX2J0X3ByZXByb2Nlc3Nfa2V5cygpIC0tIFByZXByb2Nlc3Mgc2NhbiBrZXlzCkBAIC0x MzYwLDM4ICsyMjkzLDIwNCBAQCBfYnRfbWFya19zY2Fua2V5X3JlcXVpcmVkKFNjYW5LZXkgc2tl eSkKICAqCiAgKiBSZXR1cm4gdHJ1ZSBpZiBzbywgZmFsc2UgaWYgbm90LiAgSWYgdGhlIHR1cGxl IGZhaWxzIHRvIHBhc3MgdGhlIHF1YWwsCiAgKiB3ZSBhbHNvIGRldGVybWluZSB3aGV0aGVyIHRo ZXJlJ3MgYW55IG5lZWQgdG8gY29udGludWUgdGhlIHNjYW4gYmV5b25kCi0gKiB0aGlzIHR1cGxl LCBhbmQgc2V0ICpjb250aW51ZXNjYW4gYWNjb3JkaW5nbHkuICBTZWUgY29tbWVudHMgZm9yCisg KiB0aGlzIHR1cGxlLCBhbmQgc2V0IHBzdGF0ZS5jb250aW51ZXNjYW4gYWNjb3JkaW5nbHkuICBT ZWUgY29tbWVudHMgZm9yCiAgKiBfYnRfcHJlcHJvY2Vzc19rZXlzKCksIGFib3ZlLCBhYm91dCBo b3cgdGhpcyBpcyBkb25lLgogICoKLSAqIEZvcndhcmQgc2NhbiBjYWxsZXJzIGNhbiBwYXNzIGEg aGlnaCBrZXkgdHVwbGUgaW4gdGhlIGhvcGVzIG9mIGhhdmluZwotICogdXMgc2V0ICpjb250aW51 ZXNjYW4gdG8gZmFsc2UsIGFuZCBhdm9pZGluZyBhbiB1bm5lY2Vzc2FyeSB2aXNpdCB0bwotICog dGhlIHBhZ2UgdG8gdGhlIHJpZ2h0LgorICogRm9yd2FyZCBzY2FuIGNhbGxlcnMgY2FuIHBhc3Mg YSBoaWdoIGtleSB0dXBsZSBpbiB0aGUgaG9wZXMgb2YgaGF2aW5nIHVzCisgKiBzZXQgcHN0YXRl LmNvbnRpbnVlc2NhbiB0byBmYWxzZSwgYW5kIGF2b2lkaW5nIGFuIHVubmVjZXNzYXJ5IHZpc2l0 IHRvIHRoZQorICogcGFnZSB0byB0aGUgcmlnaHQuCisgKgorICogRm9yd2FyZHMgc2NhbiBjYWxs ZXJzIHdpdGggZXF1YWxpdHkgdHlwZSBhcnJheSBzY2FuIGtleXMgYXJlIG9ibGlnYXRlZCB0bwor ICogc2V0IHVwIHBhZ2Ugc3RhdGUgaW4gYSB3YXkgdGhhdCBtYWtlcyBpdCBwb3NzaWJsZSBmb3Ig dXMgdG8gY2hlY2sgdGhlIGhpZ2gKKyAqIGtleSBlYXJseSwgYmVmb3JlIHdlJ3ZlIGV4cGVuZGVk IHRvbyBtdWNoIGVmZm9ydCBvbiBjb21wYXJpbmcgdHVwbGVzIHRoYXQKKyAqIGNhbm5vdCBwb3Nz aWJseSBiZSBtYXRjaGVzIGZvciBhbnkgc2V0IG9mIGFycmF5IGtleXMuICBUaGlzIGlzIGp1c3Qg YW4KKyAqIG9wdGltaXphdGlvbi4KKyAqCisgKiBBZHZhbmNlcyB0aGUgY3VycmVudCBzZXQgb2Yg YXJyYXkga2V5cyBmb3IgU0tfU0VBUkNIQVJSQVkgc2NhbnMgd2hlcmUKKyAqIGFwcHJvcHJpYXRl LiAgVGhlc2UgY2FsbGVycyBhcmUgcmVxdWlyZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFnZSBsZXZl bCBoaWdoCisgKiBrZXkgaW4gcHN0YXRlIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCBoZXJlIGZvciB0 aGUgcGFnZSAod2hlbiB0aGUgc2NhbgorICogZGlyZWN0aW9uIGlzIGZvcndhcmRzKS4gIE5vdGUg dGhhdCB3ZSByZWx5IG9uIF9idF9yZWFkcGFnZSBjYWxsaW5nIGhlcmUgaW4KKyAqIHBhZ2Ugb2Zm c2V0IG51bWJlciBvcmRlciAoZm9yIGl0cyBzY2FuIGRpcmVjdGlvbikuICBBbnkgb3RoZXIgb3Jk ZXIgd2lsbAorICogbGVhZCB0byBpbmNvbnNpc3RlbnQgYXJyYXkga2V5IHN0YXRlLgogICoKICAq IHNjYW46IGluZGV4IHNjYW4gZGVzY3JpcHRvciAoY29udGFpbmluZyBhIHNlYXJjaC10eXBlIHNj YW5rZXkpCisgKiBwc3RhdGU6IFBhZ2UgbGV2ZWwgaW5wdXQgYW5kIG91dHB1dCBwYXJhbWV0ZXJz CiAgKiB0dXBsZTogaW5kZXggdHVwbGUgdG8gdGVzdAotICogdHVwbmF0dHM6IG51bWJlciBvZiBh dHRyaWJ1dGVzIGluIHR1cG5hdHRzIChoaWdoIGtleSBtYXkgYmUgdHJ1bmNhdGVkKQotICogZGly OiBkaXJlY3Rpb24gd2UgYXJlIHNjYW5uaW5nIGluCi0gKiBjb250aW51ZXNjYW46IG91dHB1dCBw YXJhbWV0ZXIgKHdpbGwgYmUgc2V0IGNvcnJlY3RseSBpbiBhbGwgY2FzZXMpCisgKiBmaW5hbHR1 cDogSXMgdHVwbGUgdGhlIGZpbmFsIG9uZSB3ZSdsbCBiZSBjYWxsZWQgd2l0aCBmb3IgdGhpcyBw YWdlPwogICovCiBib29sCi1fYnRfY2hlY2trZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgSW5kZXhU dXBsZSB0dXBsZSwgaW50IHR1cG5hdHRzLAotCQkJICBTY2FuRGlyZWN0aW9uIGRpciwgYm9vbCAq Y29udGludWVzY2FuKQorX2J0X2NoZWNra2V5cyhJbmRleFNjYW5EZXNjIHNjYW4sIEJUUmVhZFBh Z2VTdGF0ZSAqcHN0YXRlLAorCQkJICBJbmRleFR1cGxlIHR1cGxlLCBib29sIGZpbmFsdHVwKQor eworCVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihzY2FuLT5pbmRleFJlbGF0 aW9uKTsKKwlpbnQJCQluYXR0cyA9IEJUcmVlVHVwbGVHZXROQXR0cyh0dXBsZSwgc2Nhbi0+aW5k ZXhSZWxhdGlvbik7CisJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3Bh cXVlOworCWJvb2wJCXJlczsKKwlib29sCQlza3JlcXVpcmVkdHJpZ2dlcjsKKworCUFzc2VydChz by0+cXVhbF9vayk7CisJQXNzZXJ0KHBzdGF0ZS0+Y29udGludWVzY2FuKTsKKwlBc3NlcnQoIXNv LT5uZWVkUHJpbVNjYW4pOworCisJcmVzID0gX2J0X2NoZWNrX2NvbXBhcmUocHN0YXRlLT5kaXIs IHNvLT5rZXlEYXRhLCBzby0+bnVtYmVyT2ZLZXlzLAorCQkJCQkJCXR1cGxlLCBuYXR0cywgdHVw ZGVzYywKKwkJCQkJCQkmcHN0YXRlLT5jb250aW51ZXNjYW4sICZza3JlcXVpcmVkdHJpZ2dlcik7 CisKKwkvKgorCSAqIE9ubHkgb25lIF9idF9jaGVja19jb21wYXJlIGNhbGwgaXMgcmVxdWlyZWQg aW4gdGhlIGNvbW1vbiBjYXNlIHdoZXJlCisJICogdGhlcmUgYXJlIG5vIGVxdWFsaXR5LXR5cGUg YXJyYXkgc2NhbiBrZXlzLgorCSAqCisJICogV2hlbiB0aGVyZSBhcmUgYXJyYXkgc2NhbiBrZXlz IHRoZW4gd2UgY2FuIHN0aWxsIGFjY2VwdCB0aGUgZmlyc3QKKwkgKiBhbnN3ZXIgd2UgZ2V0IGZy b20gX2J0X2NoZWNrX2NvbXBhcmUgd2hlbiBjb250aW51ZXNjYW4gd2Fzbid0IHVuc2V0LgorCSAq LworCWlmICghc28tPm51bUFycmF5S2V5cyB8fCBwc3RhdGUtPmNvbnRpbnVlc2NhbikKKwkJcmV0 dXJuIHJlczsKKworCS8qCisJICogX2J0X2NoZWNrX2NvbXBhcmUgc2V0IGNvbnRpbnVlc2Nhbj1m YWxzZSBpbiB0aGUgcHJlc2VuY2Ugb2YgZXF1YWxpdHkKKwkgKiB0eXBlIGFycmF5IGtleXMuICBJ dCdzIHBvc3NpYmxlIHRoYXQgd2UgaGF2ZW4ndCByZWFjaGVkIHRoZSBzdGFydCBvZgorCSAqIHRo ZSBhcnJheSBrZXlzIGp1c3QgeWV0LiAgSXQncyBhbHNvIHBvc3NpYmxlIHRoYXQgd2UgbmVlZCB0 byBhZHZhbmNlCisJICogdGhlIGFycmF5IGtleXMgbm93LiAgKE9yIHBlcmhhcHMgd2UgcmVhbGx5 IGRvIG5lZWQgdG8gdGVybWluYXRlIHRoZQorCSAqIHRvcC1sZXZlbCBzY2FuLikKKwkgKi8KKwlw c3RhdGUtPmNvbnRpbnVlc2NhbiA9IHRydWU7CS8qIG5ldyBpbml0aWFsIGFzc3VtcHRpb24gKi8K KworCWlmIChza3JlcXVpcmVkdHJpZ2dlciAmJiBfYnRfdHVwbGVfYmVmb3JlX2FycmF5X3NrZXlz KHNjYW4sIHBzdGF0ZSwgdHVwbGUpKQorCXsKKwkJLyoKKwkJICogVHVwbGUgaXMgc3RpbGwgPCB0 aGUgY3VycmVudCBhcnJheSBzY2FuIGtleSB2YWx1ZXMgKGFzIHdlbGwgYXMKKwkJICogb3RoZXIg ZXF1YWxpdHkgdHlwZSBzY2FuIGtleXMpIGlmIHRoaXMgaXMgYSBmb3J3YXJkIHNjYW4uCisJCSAq IChCYWNrd2FyZHMgc2NhbnMgcmVhY2ggaGVyZSB3aXRoIGEgdHVwbGUgPiBlcXVhbGl0eSBjb25z dHJhaW50cy4pCisJCSAqIFdlIG11c3Qgbm93IGNvbnNpZGVyIGhvdyB0byBwcm9jZWVkIHdpdGgg dGhlIG9uZ29pbmcgcHJpbWl0aXZlCisJCSAqIGluZGV4IHNjYW4uCisJCSAqCisJCSAqIFNob3Vs ZCBfYnRfcmVhZHBhZ2UgY29udGludWUgd2l0aCB0aGlzIHBhZ2UgZm9yIG5vdywgaW4gdGhlIGhv cGUgb2YKKwkJICogZmluZGluZyB0dXBsZXMgd2hvc2Uga2V5IHNwYWNlIGlzIGNvdmVyZWQgYnkg dGhlIGN1cnJlbnQgYXJyYXkga2V5cworCQkgKiBiZWZvcmUgdG9vIGxvbmc/ICBPciwgc2hvdWxk IGl0IGdpdmUgdXAgYW5kIHN0YXJ0IGEgbmV3IHByaW1pdGl2ZQorCQkgKiBpbmRleCBzY2FuIGlu c3RlYWQ/CisJCSAqCisJCSAqIE91ciBwb2xpY3kgaXMgdG8gdGVybWluYXRlIHRoZSBwcmltaXRp dmUgaW5kZXggc2NhbiBhdCB0aGUgZW5kIG9mCisJCSAqIHRoZSBjdXJyZW50IHBhZ2UgaWYgdGhl IGN1cnJlbnQgKG1vc3QgcmVjZW50bHkgYWR2YW5jZWQpIGFycmF5IGtleXMKKwkJICogZG9uJ3Qg Y292ZXIgdGhlIGZpbmFsIHR1cGxlIGZyb20gdGhlIHBhZ2UuICBUaGlzIHBvbGljeSBpcyBmYWly bHkKKwkJICogY29uc2VydmF0aXZlLgorCQkgKgorCQkgKiBOb3RlOiBJbiBzb21lIGNhc2VzIHdl J3JlIGVmZmVjdGl2ZWx5IHNwZWN1bGF0aW5nIHRoYXQgdGhlIG5leHQKKwkJICogc2libGluZyBs ZWFmIHBhZ2Ugd2lsbCBoYXZlIHR1cGxlcyB0aGF0IGFyZSBjb3ZlcmVkIGJ5IHRoZSBrZXkKKwkJ ICogc3BhY2Ugb2Ygb3VyIGFycmF5IGtleXMgKHRoZSBjdXJyZW50IHNldCBvciBzb21lIG5lYXJi eSBzZXQpLCBiYXNlZAorCQkgKiBvbiBhIGN1ZSBmcm9tIHRoZSBjdXJyZW50IHBhZ2UncyBmaW5h bCB0dXBsZS4gIFRoZXJlIGlzIGF0IGxlYXN0IGEKKwkJICogbm9uLXplcm8gcmlzayBvZiB3YXN0 aW5nIGEgcGFnZSBhY2Nlc3MgLS0gd2UgY291bGQgZ2FtYmxlIGFuZCBsb3NlLgorCQkgKiBUaGUg ZGV0YWlscyBvZiBhbGwgdGhpcyBhcmUgaGFuZGxlZCB3aXRoaW4gX2J0X2FkdmFuY2VfYXJyYXlf a2V5cy4KKwkJICovCisJCWlmIChmaW5hbHR1cCB8fCAoIXBzdGF0ZS0+aGlnaGtleWNoZWNrZWQg JiYgcHN0YXRlLT5oaWdoa2V5ICYmCisJCQkJCQkgX2J0X3R1cGxlX2JlZm9yZV9hcnJheV9za2V5 cyhzY2FuLCBwc3RhdGUsCisJCQkJCQkJCQkJCQkJICBwc3RhdGUtPmhpZ2hrZXkpKSkKKwkJewor CQkJLyoKKwkJCSAqIFRoaXMgaXMgdGhlIGZpbmFsIHR1cGxlICh0aGUgaGlnaCBrZXkgZm9yIGZv cndhcmQgc2NhbnMsIG9yIHRoZQorCQkJICogdHVwbGUgYXQgdGhlIGZpcnN0IG9mZnNldCBudW1i ZXIgZm9yIGJhY2t3YXJkIHNjYW5zKSwgYnV0IGl0IGlzCisJCQkgKiBzdGlsbCBiZWZvcmUgdGhl IGN1cnJlbnQgYXJyYXkga2V5cy4gIEFzIHN1Y2gsIHdlJ3JlIHVud2lsbGluZworCQkJICogdG8g YWxsb3cgdGhlIGN1cnJlbnQgcHJpbWl0aXZlIGluZGV4IHNjYW4gdG8gY29udGludWUgdG8gdGhl CisJCQkgKiBuZXh0IGxlYWYgcGFnZS4KKwkJCSAqCisJCQkgKiBTdGFydCBhIG5ldyBwcmltaXRp dmUgaW5kZXggc2Nhbi4gIFRoZSBuZXh0IHByaW1pdGl2ZSBpbmRleAorCQkJICogc2NhbiAoaW4g dGhlIG5leHQgX2J0X2ZpcnN0IGNhbGwpIGlzIGV4cGVjdGVkIHRvIHJlcG9zaXRpb24gdGhlCisJ CQkgKiBzY2FuIHRvIHNvbWUgbXVjaCBsYXRlciBsZWFmIHBhZ2UuICAoSWYgd2UgaGFkIGEgZ29v ZCByZWFzb24gdG8KKwkJCSAqIHRoaW5rIHRoYXQgdGhlIG5leHQgbGVhZiBwYWdlIHRoYXQgd2ls bCBiZSBzY2FubmVkIHdpbGwgdHVybgorCQkJICogb3V0IHRvIGJlIGNsb3NlIHRvIG91ciBjdXJy ZW50IHBvc2l0aW9uLCB0aGVuIHdlIHdvdWxkbid0IGJlCisJCQkgKiBzdGFydGluZyBhbm90aGVy IHByaW1pdGl2ZSBpbmRleCBzY2FuLikKKwkJCSAqCisJCQkgKiBOb3RlOiBfYnRfcmVhZHBhZ2Ug c3Rhc2hlcyB0aGUgcGFnZSBoaWdoIGtleSwgd2hpY2ggYWxsb3dzIHVzCisJCQkgKiB0byBtYWtl IHRoaXMgY2hlY2sgZWFybHkgKGZvciBmb3J3YXJkIHNjYW5zKS4gIFdlIHRoZXJlYnkgYXZvaWQK KwkJCSAqIHNjYW5uaW5nIHZlcnkgbWFueSBleHRyYSB0dXBsZXMgb24gdGhlIHBhZ2UuICBUaGlz IGlzIGp1c3QgYW4KKwkJCSAqIG9wdGltaXphdGlvbjsgc2tpcHBpbmcgdGhlc2UgdXNlbGVzcyBj b21wYXJpc29ucyBzaG91bGQgbmV2ZXIKKwkJCSAqIGNoYW5nZSBvdXIgZmluYWwgY29uY2x1c2lv biBhYm91dCB3aGF0IHRoZSBzY2FuIHNob3VsZCBkbyBuZXh0LgorCQkJICovCisJCQlwc3RhdGUt PmNvbnRpbnVlc2NhbiA9IGZhbHNlOworCQkJc28tPm5lZWRQcmltU2NhbiA9IHRydWU7CisJCX0K KwkJZWxzZSBpZiAoIWZpbmFsdHVwICYmIHBzdGF0ZS0+aGlnaGtleSkKKwkJeworCQkJLyoKKwkJ CSAqIFJlbWVtYmVyIHRoYXQgdGhlIGhpZ2gga2V5IGhhcyBiZWVuIGNoZWNrZWQgd2l0aCB0aGlz CisJCQkgKiBwYXJ0aWN1bGFyIHNldCBvZiBhcnJheSBrZXlzLgorCQkJICoKKwkJCSAqIEl0IG1p Z2h0IG1ha2Ugc2Vuc2UgdG8gY2hlY2sgdGhlIHNhbWUgaGlnaCBrZXkgYWdhaW4gYXQgc29tZQor CQkJICogcG9pbnQgZHVyaW5nIHRoZSBvbmdvaW5nIF9idF9yZWFkcGFnZS13aXNlIHNjYW4gb2Yg dGhpcyBwYWdlLgorCQkJICogQnV0IGl0IGlzIGRlZmluaXRlbHkgd2FzdGVmdWwgdG8gcmVwZWF0 IHRoZSBzYW1lIGhpZ2gga2V5IGNoZWNrCisJCQkgKiBiZWZvcmUgdGhlIGFycmF5IGtleXMgYXJl IGFkdmFuY2VkIGJ5IHNvbWUgbGF0ZXIgdHVwbGUuCisJCQkgKi8KKwkJCXBzdGF0ZS0+aGlnaGtl eWNoZWNrZWQgPSB0cnVlOworCQl9CisKKwkJLyoKKwkJICogSW4gYW55IGNhc2UsIHRoaXMgaW5k ZXh0dXBsZSBkb2Vzbid0IG1hdGNoIHRoZSBxdWFsCisJCSAqLworCQlyZXR1cm4gZmFsc2U7CisJ fQorCisJLyoKKwkgKiBDYWxsZXIncyB0dXBsZSBpcyA+PSB0aGUgY3VycmVudCBzZXQgb2YgYXJy YXkga2V5cyBhbmQgb3RoZXIgZXF1YWxpdHkKKwkgKiBjb25zdHJhaW50IHNjYW4ga2V5cyAob3Ig PD0gaWYgdGhpcyBpcyBhIGJhY2t3YXJkcyBzY2FucykuCisJICoKKwkgKiBJdCBtaWdodCBiZSB0 aW1lIHRvIGFkdmFuY2UgdGhlIGFycmF5IGtleXMgdG8gdGhlIG5leHQgc2V0LiAgVHJ5IGRvaW5n CisJICogdGhhdCBub3csIHdoaWxlIGRldGVybWluaW5nIGluIHBhc3NpbmcgaWYgdGhlIHR1cGxl IG1hdGNoZXMgdGhlIG5ld2x5CisJICogYWR2YW5jZWQgc2V0IG9mIGFycmF5IGtleXMgKGlmIHdl J3ZlIGFueSBsZWZ0KS4KKwkgKgorCSAqIFRoaXMgY2FsbCB3aWxsIGFsc28gc2V0IGNvbnRpbnVl c2NhbiBmb3IgdXMgKG9yIHRlbGxzIHVzIHRvIHBlcmZvcm0KKwkgKiBhbm90aGVyIF9idF9jaGVj a19jb21wYXJlIGNhbGwsIHdoaWNoIHRoZW4gc2V0cyBjb250aW51ZXNjYW4gZm9yIHVzKS4KKwkg Ki8KKwlpZiAoIV9idF9hZHZhbmNlX2FycmF5X2tleXMoc2NhbiwgcHN0YXRlLCB0dXBsZSwgc2ty ZXF1aXJlZHRyaWdnZXIpKQorCXsKKwkJLyoKKwkJICogVHVwbGUgZG9lc24ndCBtYXRjaCBhbnkg bGF0ZXIgYXJyYXkga2V5cywgZWl0aGVyIChmb3Igb25lIG9yIG1vcmUKKwkJICogYXJyYXkgdHlw ZSBzY2FuIGtleXMgbWFya2VkIGFzIHJlcXVpcmVkKS4gIEdpdmUgdXAgb24gdGhpcyB0dXBsZQor CQkgKiBiZWluZyBhIG1hdGNoLiAgKENhbGwgbWF5IGhhdmUgYWxzbyB0ZXJtaW5hdGVkIHRoZSBw cmltaXRpdmUgc2NhbiwKKwkJICogb3IgdGhlIHRvcC1sZXZlbCBzY2FuLikKKwkJICovCisJCXJl dHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEFkdmFuY2VkIGFycmF5IGtleXMgdG8gdmFsdWVz IHRoYXQgYXJlIGV4YWN0IG1hdGNoZXMgZm9yIGNvcnJlc3BvbmRpbmcKKwkgKiBhdHRyaWJ1dGUg dmFsdWVzIGZyb20gdGhlIHR1cGxlLgorCSAqCisJICogSXQncyBmYWlybHkgbGlrZWx5IHRoYXQg dGhlIHR1cGxlIHNhdGlzZmllcyBhbGwgaW5kZXggc2NhbiBjb25kaXRpb25zCisJICogYXQgdGhp cyBwb2ludCwgYnV0IHdlIG5lZWQgY29uZmlybWF0aW9uIG9mIHRoYXQuICBXZSBhbHNvIG5lZWQg dG8gZ2l2ZQorCSAqIF9idF9jaGVja19jb21wYXJlIGEgcmVhbCBvcHBvcnR1bml0eSB0byBlbmQg dGhlIHRvcC1sZXZlbCBpbmRleCBzY2FuIGJ5CisJICogc2V0dGluZyBjb250aW51ZXNjYW49ZmFs c2UuICAoX2J0X2FkdmFuY2VfYXJyYXlfa2V5cyBjYW5ub3QgZGVhbCB3aXRoCisJICogaW5lcXVh bGl0eSBzdHJhdGVneSBzY2FuIGtleXM7IHdlIG5lZWQgX2J0X2NoZWNrX2NvbXBhcmUgZm9yIHRo b3NlLikKKwkgKi8KKwlyZXR1cm4gX2J0X2NoZWNrX2NvbXBhcmUocHN0YXRlLT5kaXIsIHNvLT5r ZXlEYXRhLCBzby0+bnVtYmVyT2ZLZXlzLAorCQkJCQkJCSB0dXBsZSwgbmF0dHMsIHR1cGRlc2Ms CisJCQkJCQkJICZwc3RhdGUtPmNvbnRpbnVlc2NhbiwgJnNrcmVxdWlyZWR0cmlnZ2VyKTsKK30K KworLyoKKyAqIFRlc3Qgd2hldGhlciBhbiBpbmRleHR1cGxlIHNhdGlzZmllcyBjdXJyZW50IHNj YW4gY29uZGl0aW9uLgorICoKKyAqIFJldHVybiB0cnVlIGlmIHNvLCBmYWxzZSBpZiBub3QuICBJ ZiBub3QsIGFsc28gY2xlYXIgKmNvbnRpbnVlc2NhbiBpZgorICogaXQncyBub3QgcG9zc2libGUg Zm9yIGFueSBmdXR1cmUgdHVwbGVzIGluIHRoZSBjdXJyZW50IHNjYW4gZGlyZWN0aW9uIHRvCisg KiBwYXNzIHRoZSBxdWFsIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9mIGFycmF5IGtleXMuCisgKgor ICogVGhpcyBpcyBhIHN1YnJvdXRpbmUgZm9yIF9idF9jaGVja2tleXMuICBJdCBpcyB3cml0dGVu IHdpdGggdGhlIGFzc3VtcHRpb24KKyAqIHRoYXQgcmVhY2hpbmcgdGhlIGVuZCBvZiBlYWNoIGRp c3RpbmN0IHNldCBvZiBhcnJheSBrZXlzIHRlcm1pbmF0ZXMgdGhlCisgKiBvbmdvaW5nIHByaW1p dGl2ZSBpbmRleCBzY2FuLiAgSXQgaXMgdXAgdG8gb3VyIGNhbGxlciAodGhhdCBoYXMgbW9yZQor ICogY29udGV4dCB0aGFuIHdlIGhhdmUgYXZhaWxhYmxlIGhlcmUpIHRvIG92ZXJyaWRlIHRoYXQg aW5pdGlhbCBkZXRlcm1pbmF0aW9uCisgKiB3aGVuIGl0IG1ha2VzIG1vcmUgc2Vuc2UgdG8gYWR2 YW5jZSB0aGUgYXJyYXkga2V5cyBhbmQgY29udGludWUgd2l0aAorICogZnVydGhlciB0dXBsZXMg ZnJvbSB0aGUgc2FtZSBsZWFmIHBhZ2UuCisgKi8KK3N0YXRpYyBib29sCitfYnRfY2hlY2tfY29t cGFyZShTY2FuRGlyZWN0aW9uIGRpciwgU2NhbktleSBrZXlEYXRhLCBpbnQga2V5c3osCisJCQkJ ICBJbmRleFR1cGxlIHR1cGxlLCBpbnQgdHVwbmF0dHMsIFR1cGxlRGVzYyB0dXBkZXNjLAorCQkJ CSAgYm9vbCAqY29udGludWVzY2FuLCBib29sICpza3JlcXVpcmVkdHJpZ2dlcikKIHsKLQlUdXBs ZURlc2MJdHVwZGVzYzsKLQlCVFNjYW5PcGFxdWUgc287Ci0JaW50CQkJa2V5c3o7CiAJaW50CQkJ aWtleTsKIAlTY2FuS2V5CQlrZXk7CiAKLQlBc3NlcnQoQlRyZWVUdXBsZUdldE5BdHRzKHR1cGxl LCBzY2FuLT5pbmRleFJlbGF0aW9uKSA9PSB0dXBuYXR0cyk7Ci0KIAkqY29udGludWVzY2FuID0g dHJ1ZTsJCS8qIGRlZmF1bHQgYXNzdW1wdGlvbiAqLworCSpza3JlcXVpcmVkdHJpZ2dlciA9IHRy dWU7CS8qIGRlZmF1bHQgYXNzdW1wdGlvbiAqLwogCi0JdHVwZGVzYyA9IFJlbGF0aW9uR2V0RGVz Y3Ioc2Nhbi0+aW5kZXhSZWxhdGlvbik7Ci0Jc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFx dWU7Ci0Ja2V5c3ogPSBzby0+bnVtYmVyT2ZLZXlzOwotCi0JZm9yIChrZXkgPSBzby0+a2V5RGF0 YSwgaWtleSA9IDA7IGlrZXkgPCBrZXlzejsga2V5KyssIGlrZXkrKykKKwlmb3IgKGtleSA9IGtl eURhdGEsIGlrZXkgPSAwOyBpa2V5IDwga2V5c3o7IGtleSsrLCBpa2V5KyspCiAJewogCQlEYXR1 bQkJZGF0dW07CiAJCWJvb2wJCWlzTnVsbDsKQEAgLTE1MTIsNiArMjYxMSwxMCBAQCBfYnRfY2hl Y2trZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgSW5kZXhUdXBsZSB0dXBsZSwgaW50IHR1cG5hdHRz LAogCQkJICogcXVhbCBmYWlscywgaXQgaXMgY3JpdGljYWwgdGhhdCBlcXVhbGl0eSBxdWFscyBi ZSB1c2VkIGZvciB0aGUKIAkJCSAqIGluaXRpYWwgcG9zaXRpb25pbmcgaW4gX2J0X2ZpcnN0KCkg d2hlbiB0aGV5IGFyZSBhdmFpbGFibGUuIFNlZQogCQkJICogY29tbWVudHMgaW4gX2J0X2ZpcnN0 KCkuCisJCQkgKgorCQkJICogU2NhbnMgd2l0aCBlcXVhbGl0eS10eXBlIGFycmF5IHNjYW4ga2V5 cyBydW4gaW50byBhIHNpbWlsYXIKKwkJCSAqIHByb2JsZW0gd2hlbmV2ZXIgdGhleSBhZHZhbmNl IHRoZSBhcnJheSBrZXlzLiAgT3VyIGNhbGxlciB1c2VzCisJCQkgKiBfYnRfdHVwbGVfYmVmb3Jl X2FycmF5X3NrZXlzIHRvIGF2b2lkIHRoZSBwcm9ibGVtIHRoZXJlLgogCQkJICovCiAJCQlpZiAo KGtleS0+c2tfZmxhZ3MgJiBTS19CVF9SRVFGV0QpICYmCiAJCQkJU2NhbkRpcmVjdGlvbklzRm9y d2FyZChkaXIpKQpAQCAtMTUyMCw2ICsyNjIzLDE0IEBAIF9idF9jaGVja2tleXMoSW5kZXhTY2Fu RGVzYyBzY2FuLCBJbmRleFR1cGxlIHR1cGxlLCBpbnQgdHVwbmF0dHMsCiAJCQkJCSBTY2FuRGly ZWN0aW9uSXNCYWNrd2FyZChkaXIpKQogCQkJCSpjb250aW51ZXNjYW4gPSBmYWxzZTsKIAorCQkJ aWYgKChrZXktPnNrX2ZsYWdzICYgU0tfU0VBUkNIQVJSQVkpICYmCisJCQkJa2V5LT5za19zdHJh dGVneSA9PSBCVEVxdWFsU3RyYXRlZ3lOdW1iZXIpCisJCQl7CisJCQkJaWYgKCpjb250aW51ZXNj YW4pCisJCQkJCSpza3JlcXVpcmVkdHJpZ2dlciA9IGZhbHNlOworCQkJCSpjb250aW51ZXNjYW4g PSBmYWxzZTsKKwkJCX0KKwogCQkJLyoKIAkJCSAqIEluIGFueSBjYXNlLCB0aGlzIGluZGV4dHVw bGUgZG9lc24ndCBtYXRjaCB0aGUgcXVhbC4KIAkJCSAqLwpAQCAtMTUzOCw3ICsyNjQ5LDcgQEAg X2J0X2NoZWNra2V5cyhJbmRleFNjYW5EZXNjIHNjYW4sIEluZGV4VHVwbGUgdHVwbGUsIGludCB0 dXBuYXR0cywKICAqIGl0J3Mgbm90IHBvc3NpYmxlIGZvciBhbnkgZnV0dXJlIHR1cGxlcyBpbiB0 aGUgY3VycmVudCBzY2FuIGRpcmVjdGlvbgogICogdG8gcGFzcyB0aGUgcXVhbC4KICAqCi0gKiBU aGlzIGlzIGEgc3Vicm91dGluZSBmb3IgX2J0X2NoZWNra2V5cywgd2hpY2ggc2VlIGZvciBtb3Jl IGluZm8uCisgKiBUaGlzIGlzIGEgc3Vicm91dGluZSBmb3IgX2J0X2NoZWNrX2NvbXBhcmUvX2J0 X2NoZWNra2V5c19jb21wYXJlLgogICovCiBzdGF0aWMgYm9vbAogX2J0X2NoZWNrX3Jvd2NvbXBh cmUoU2NhbktleSBza2V5LCBJbmRleFR1cGxlIHR1cGxlLCBpbnQgdHVwbmF0dHMsCmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jIGIvc3JjL2JhY2tlbmQv b3B0aW1pemVyL3BhdGgvaW5keHBhdGguYwppbmRleCA2YTkzZDc2N2EuLmYwNGNhMWVlOSAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYworKysgYi9zcmMv YmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jCkBAIC0xMDYsOCArMTA2LDcgQEAgc3Rh dGljIExpc3QgKmJ1aWxkX2luZGV4X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZv ICpyZWwsCiAJCQkJCQkJICAgSW5kZXhPcHRJbmZvICppbmRleCwgSW5kZXhDbGF1c2VTZXQgKmNs YXVzZXMsCiAJCQkJCQkJICAgYm9vbCB1c2VmdWxfcHJlZGljYXRlLAogCQkJCQkJCSAgIFNjYW5U eXBlQ29udHJvbCBzY2FudHlwZSwKLQkJCQkJCQkgICBib29sICpza2lwX25vbm5hdGl2ZV9zYW9w LAotCQkJCQkJCSAgIGJvb2wgKnNraXBfbG93ZXJfc2FvcCk7CisJCQkJCQkJICAgYm9vbCAqc2tp cF9ub25uYXRpdmVfc2FvcCk7CiBzdGF0aWMgTGlzdCAqYnVpbGRfcGF0aHNfZm9yX09SKFBsYW5u ZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJCQkJCQkJCUxpc3QgKmNsYXVzZXMsIExp c3QgKm90aGVyX2NsYXVzZXMpOwogc3RhdGljIExpc3QgKmdlbmVyYXRlX2JpdG1hcF9vcl9wYXRo cyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLApAQCAtNzA2LDggKzcwNSw2IEBA IGVjbGFzc19hbHJlYWR5X3VzZWQoRXF1aXZhbGVuY2VDbGFzcyAqcGFyZW50X2VjLCBSZWxpZHMg b2xkcmVsaWRzLAogICogaW5kZXggQU0gc3VwcG9ydHMgdGhlbSBuYXRpdmVseSwgd2Ugc2hvdWxk IGp1c3QgaW5jbHVkZSB0aGVtIGluIHNpbXBsZQogICogaW5kZXggcGF0aHMuICBJZiBub3QsIHdl IHNob3VsZCBleGNsdWRlIHRoZW0gd2hpbGUgYnVpbGRpbmcgc2ltcGxlIGluZGV4CiAgKiBwYXRo cywgYW5kIHRoZW4gbWFrZSBhIHNlcGFyYXRlIGF0dGVtcHQgdG8gaW5jbHVkZSB0aGVtIGluIGJp dG1hcCBwYXRocy4KLSAqIEZ1cnRoZXJtb3JlLCB3ZSBzaG91bGQgY29uc2lkZXIgZXhjbHVkaW5n IGxvd2VyLW9yZGVyIFNjYWxhckFycmF5T3BFeHByCi0gKiBxdWFscyBzbyBhcyB0byBjcmVhdGUg b3JkZXJlZCBwYXRocy4KICAqLwogc3RhdGljIHZvaWQKIGdldF9pbmRleF9wYXRocyhQbGFubmVy SW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLApAQCAtNzE2LDM3ICs3MTMsMTcgQEAgZ2V0X2lu ZGV4X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiB7CiAJTGlzdAkg ICAqaW5kZXhwYXRoczsKIAlib29sCQlza2lwX25vbm5hdGl2ZV9zYW9wID0gZmFsc2U7Ci0JYm9v bAkJc2tpcF9sb3dlcl9zYW9wID0gZmFsc2U7CiAJTGlzdENlbGwgICAqbGM7CiAKIAkvKgogCSAq IEJ1aWxkIHNpbXBsZSBpbmRleCBwYXRocyB1c2luZyB0aGUgY2xhdXNlcy4gIEFsbG93IFNjYWxh ckFycmF5T3BFeHByCi0JICogY2xhdXNlcyBvbmx5IGlmIHRoZSBpbmRleCBBTSBzdXBwb3J0cyB0 aGVtIG5hdGl2ZWx5LCBhbmQgc2tpcCBhbnkgc3VjaAotCSAqIGNsYXVzZXMgZm9yIGluZGV4IGNv bHVtbnMgYWZ0ZXIgdGhlIGZpcnN0IChzbyB0aGF0IHdlIHByb2R1Y2Ugb3JkZXJlZAotCSAqIHBh dGhzIGlmIHBvc3NpYmxlKS4KKwkgKiBjbGF1c2VzIG9ubHkgaWYgdGhlIGluZGV4IEFNIHN1cHBv cnRzIHRoZW0gbmF0aXZlbHkuCiAJICovCiAJaW5kZXhwYXRocyA9IGJ1aWxkX2luZGV4X3BhdGhz KHJvb3QsIHJlbCwKIAkJCQkJCQkJICAgaW5kZXgsIGNsYXVzZXMsCiAJCQkJCQkJCSAgIGluZGV4 LT5wcmVkT0ssCiAJCQkJCQkJCSAgIFNUX0FOWVNDQU4sCi0JCQkJCQkJCSAgICZza2lwX25vbm5h dGl2ZV9zYW9wLAotCQkJCQkJCQkgICAmc2tpcF9sb3dlcl9zYW9wKTsKLQotCS8qCi0JICogSWYg d2Ugc2tpcHBlZCBhbnkgbG93ZXItb3JkZXIgU2NhbGFyQXJyYXlPcEV4cHJzIG9uIGFuIGluZGV4 IHdpdGggYW4gQU0KLQkgKiB0aGF0IHN1cHBvcnRzIHRoZW0sIHRoZW4gdHJ5IGFnYWluIGluY2x1 ZGluZyB0aG9zZSBjbGF1c2VzLiAgVGhpcyB3aWxsCi0JICogcHJvZHVjZSBwYXRocyB3aXRoIG1v cmUgc2VsZWN0aXZpdHkgYnV0IG5vIG9yZGVyaW5nLgotCSAqLwotCWlmIChza2lwX2xvd2VyX3Nh b3ApCi0JewotCQlpbmRleHBhdGhzID0gbGlzdF9jb25jYXQoaW5kZXhwYXRocywKLQkJCQkJCQkJ IGJ1aWxkX2luZGV4X3BhdGhzKHJvb3QsIHJlbCwKLQkJCQkJCQkJCQkJCSAgIGluZGV4LCBjbGF1 c2VzLAotCQkJCQkJCQkJCQkJICAgaW5kZXgtPnByZWRPSywKLQkJCQkJCQkJCQkJCSAgIFNUX0FO WVNDQU4sCi0JCQkJCQkJCQkJCQkgICAmc2tpcF9ub25uYXRpdmVfc2FvcCwKLQkJCQkJCQkJCQkJ CSAgIE5VTEwpKTsKLQl9CisJCQkJCQkJCSAgICZza2lwX25vbm5hdGl2ZV9zYW9wKTsKIAogCS8q CiAJICogU3VibWl0IGFsbCB0aGUgb25lcyB0aGF0IGNhbiBmb3JtIHBsYWluIEluZGV4U2NhbiBw bGFucyB0byBhZGRfcGF0aC4gKEEKQEAgLTc4NCw3ICs3NjEsNiBAQCBnZXRfaW5kZXhfcGF0aHMo UGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCQkJCQkJCSAgIGluZGV4LCBj bGF1c2VzLAogCQkJCQkJCQkJICAgZmFsc2UsCiAJCQkJCQkJCQkgICBTVF9CSVRNQVBTQ0FOLAot CQkJCQkJCQkJICAgTlVMTCwKIAkJCQkJCQkJCSAgIE5VTEwpOwogCQkqYml0aW5kZXhwYXRocyA9 IGxpc3RfY29uY2F0KCpiaXRpbmRleHBhdGhzLCBpbmRleHBhdGhzKTsKIAl9CkBAIC04MTcsMjcg Kzc5MywxOSBAQCBnZXRfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8g KnJlbCwKICAqIHRvIHRydWUgaWYgd2UgZm91bmQgYW55IHN1Y2ggY2xhdXNlcyAoY2FsbGVyIG11 c3QgaW5pdGlhbGl6ZSB0aGUgdmFyaWFibGUKICAqIHRvIGZhbHNlKS4gIElmIGl0J3MgTlVMTCwg d2UgZG8gbm90IGlnbm9yZSBTY2FsYXJBcnJheU9wRXhwciBjbGF1c2VzLgogICoKLSAqIElmIHNr aXBfbG93ZXJfc2FvcCBpcyBub24tTlVMTCwgd2UgaWdub3JlIFNjYWxhckFycmF5T3BFeHByIGNs YXVzZXMgZm9yCi0gKiBub24tZmlyc3QgaW5kZXggY29sdW1ucywgYW5kIHdlIHNldCAqc2tpcF9s b3dlcl9zYW9wIHRvIHRydWUgaWYgd2UgZm91bmQKLSAqIGFueSBzdWNoIGNsYXVzZXMgKGNhbGxl ciBtdXN0IGluaXRpYWxpemUgdGhlIHZhcmlhYmxlIHRvIGZhbHNlKS4gIElmIGl0J3MKLSAqIE5V TEwsIHdlIGRvIG5vdCBpZ25vcmUgbm9uLWZpcnN0IFNjYWxhckFycmF5T3BFeHByIGNsYXVzZXMs IGJ1dCB0aGV5IHdpbGwKLSAqIHJlc3VsdCBpbiBjb25zaWRlcmluZyB0aGUgc2NhbidzIG91dHB1 dCB0byBiZSB1bm9yZGVyZWQuCi0gKgogICogJ3JlbCcgaXMgdGhlIGluZGV4J3MgaGVhcCByZWxh dGlvbgogICogJ2luZGV4JyBpcyB0aGUgaW5kZXggZm9yIHdoaWNoIHdlIHdhbnQgdG8gZ2VuZXJh dGUgcGF0aHMKICAqICdjbGF1c2VzJyBpcyB0aGUgY29sbGVjdGlvbiBvZiBpbmRleGFibGUgY2xh dXNlcyAoSW5kZXhDbGF1c2Ugbm9kZXMpCiAgKiAndXNlZnVsX3ByZWRpY2F0ZScgaW5kaWNhdGVz IHdoZXRoZXIgdGhlIGluZGV4IGhhcyBhIHVzZWZ1bCBwcmVkaWNhdGUKICAqICdzY2FudHlwZScg aW5kaWNhdGVzIHdoZXRoZXIgd2UgbmVlZCBwbGFpbiBvciBiaXRtYXAgc2NhbiBzdXBwb3J0CiAg KiAnc2tpcF9ub25uYXRpdmVfc2FvcCcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gYWNjZXB0IFNBT1Ag aWYgaW5kZXggQU0gZG9lc24ndAotICogJ3NraXBfbG93ZXJfc2FvcCcgaW5kaWNhdGVzIHdoZXRo ZXIgdG8gYWNjZXB0IG5vbi1maXJzdC1jb2x1bW4gU0FPUAogICovCiBzdGF0aWMgTGlzdCAqCiBi dWlsZF9pbmRleF9wYXRocyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJ CSAgSW5kZXhPcHRJbmZvICppbmRleCwgSW5kZXhDbGF1c2VTZXQgKmNsYXVzZXMsCiAJCQkJICBi b29sIHVzZWZ1bF9wcmVkaWNhdGUsCiAJCQkJICBTY2FuVHlwZUNvbnRyb2wgc2NhbnR5cGUsCi0J CQkJICBib29sICpza2lwX25vbm5hdGl2ZV9zYW9wLAotCQkJCSAgYm9vbCAqc2tpcF9sb3dlcl9z YW9wKQorCQkJCSAgYm9vbCAqc2tpcF9ub25uYXRpdmVfc2FvcCkKIHsKIAlMaXN0CSAgICpyZXN1 bHQgPSBOSUw7CiAJSW5kZXhQYXRoICAqaXBhdGg7CkBAIC04NDgsNyArODE2LDYgQEAgYnVpbGRf aW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAlMaXN0CSAg ICpvcmRlcmJ5Y2xhdXNlY29sczsKIAlMaXN0CSAgICppbmRleF9wYXRoa2V5czsKIAlMaXN0CSAg ICp1c2VmdWxfcGF0aGtleXM7Ci0JYm9vbAkJZm91bmRfbG93ZXJfc2FvcF9jbGF1c2U7CiAJYm9v bAkJcGF0aGtleXNfcG9zc2libHlfdXNlZnVsOwogCWJvb2wJCWluZGV4X2lzX29yZGVyZWQ7CiAJ Ym9vbAkJaW5kZXhfb25seV9zY2FuOwpAQCAtODgwLDE5ICs4NDcsMTEgQEAgYnVpbGRfaW5kZXhf cGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkgKiBvbiBieSBidHJl ZSBhbmQgcG9zc2libHkgb3RoZXIgcGxhY2VzLikgIFRoZSBsaXN0IGNhbiBiZSBlbXB0eSwgaWYg dGhlCiAJICogaW5kZXggQU0gYWxsb3dzIHRoYXQuCiAJICoKLQkgKiBmb3VuZF9sb3dlcl9zYW9w X2NsYXVzZSBpcyBzZXQgdHJ1ZSBpZiB3ZSBhY2NlcHQgYSBTY2FsYXJBcnJheU9wRXhwcgotCSAq IGluZGV4IGNsYXVzZSBmb3IgYSBub24tZmlyc3QgaW5kZXggY29sdW1uLiAgVGhpcyBwcmV2ZW50 cyB1cyBmcm9tCi0JICogYXNzdW1pbmcgdGhhdCB0aGUgc2NhbiByZXN1bHQgaXMgb3JkZXJlZC4g IChBY3R1YWxseSwgdGhlIHJlc3VsdCBpcwotCSAqIHN0aWxsIG9yZGVyZWQgaWYgdGhlcmUgYXJl IGVxdWFsaXR5IGNvbnN0cmFpbnRzIGZvciBhbGwgZWFybGllcgotCSAqIGNvbHVtbnMsIGJ1dCBp dCBzZWVtcyB0b28gZXhwZW5zaXZlIGFuZCBub24tbW9kdWxhciBmb3IgdGhpcyBjb2RlIHRvIGJl Ci0JICogYXdhcmUgb2YgdGhhdCByZWZpbmVtZW50LikKLQkgKgogCSAqIFdlIGFsc28gYnVpbGQg YSBSZWxpZHMgc2V0IHNob3dpbmcgd2hpY2ggb3V0ZXIgcmVscyBhcmUgcmVxdWlyZWQgYnkgdGhl CiAJICogc2VsZWN0ZWQgY2xhdXNlcy4gIEFueSBsYXRlcmFsX3JlbGlkcyBhcmUgaW5jbHVkZWQg aW4gdGhhdCwgYnV0IG5vdAogCSAqIG90aGVyd2lzZSBhY2NvdW50ZWQgZm9yLgogCSAqLwogCWlu ZGV4X2NsYXVzZXMgPSBOSUw7Ci0JZm91bmRfbG93ZXJfc2FvcF9jbGF1c2UgPSBmYWxzZTsKIAlv dXRlcl9yZWxpZHMgPSBibXNfY29weShyZWwtPmxhdGVyYWxfcmVsaWRzKTsKIAlmb3IgKGluZGV4 Y29sID0gMDsgaW5kZXhjb2wgPCBpbmRleC0+bmtleWNvbHVtbnM7IGluZGV4Y29sKyspCiAJewpA QCAtOTE3LDE2ICs4NzYsNiBAQCBidWlsZF9pbmRleF9wYXRocyhQbGFubmVySW5mbyAqcm9vdCwg UmVsT3B0SW5mbyAqcmVsLAogCQkJCQkvKiBDYWxsZXIgaGFkIGJldHRlciBpbnRlbmQgdGhpcyBv bmx5IGZvciBiaXRtYXAgc2NhbiAqLwogCQkJCQlBc3NlcnQoc2NhbnR5cGUgPT0gU1RfQklUTUFQ U0NBTik7CiAJCQkJfQotCQkJCWlmIChpbmRleGNvbCA+IDApCi0JCQkJewotCQkJCQlpZiAoc2tp cF9sb3dlcl9zYW9wKQotCQkJCQl7Ci0JCQkJCQkvKiBDYWxsZXIgZG9lc24ndCB3YW50IHRvIGxv c2UgaW5kZXggb3JkZXJpbmcgKi8KLQkJCQkJCSpza2lwX2xvd2VyX3Nhb3AgPSB0cnVlOwotCQkJ CQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJZm91bmRfbG93ZXJfc2FvcF9jbGF1c2UgPSB0cnVl OwotCQkJCX0KIAkJCX0KIAogCQkJLyogT0sgdG8gaW5jbHVkZSB0aGlzIGNsYXVzZSAqLwpAQCAt OTU2LDExICs5MDUsOSBAQCBidWlsZF9pbmRleF9wYXRocyhQbGFubmVySW5mbyAqcm9vdCwgUmVs T3B0SW5mbyAqcmVsLAogCS8qCiAJICogMi4gQ29tcHV0ZSBwYXRoa2V5cyBkZXNjcmliaW5nIGlu ZGV4J3Mgb3JkZXJpbmcsIGlmIGFueSwgdGhlbiBzZWUgaG93CiAJICogbWFueSBvZiB0aGVtIGFy ZSBhY3R1YWxseSB1c2VmdWwgZm9yIHRoaXMgcXVlcnkuICBUaGlzIGlzIG5vdCByZWxldmFudAot CSAqIGlmIHdlIGFyZSBvbmx5IHRyeWluZyB0byBidWlsZCBiaXRtYXAgaW5kZXhzY2Fucywgbm9y IGlmIHdlIGhhdmUgdG8KLQkgKiBhc3N1bWUgdGhlIHNjYW4gaXMgdW5vcmRlcmVkLgorCSAqIGlm IHdlIGFyZSBvbmx5IHRyeWluZyB0byBidWlsZCBiaXRtYXAgaW5kZXhzY2Fucy4KIAkgKi8KIAlw YXRoa2V5c19wb3NzaWJseV91c2VmdWwgPSAoc2NhbnR5cGUgIT0gU1RfQklUTUFQU0NBTiAmJgot CQkJCQkJCQkhZm91bmRfbG93ZXJfc2FvcF9jbGF1c2UgJiYKIAkJCQkJCQkJaGFzX3VzZWZ1bF9w YXRoa2V5cyhyb290LCByZWwpKTsKIAlpbmRleF9pc19vcmRlcmVkID0gKGluZGV4LT5zb3J0b3Bm YW1pbHkgIT0gTlVMTCk7CiAJaWYgKGluZGV4X2lzX29yZGVyZWQgJiYgcGF0aGtleXNfcG9zc2li bHlfdXNlZnVsKQpAQCAtMTIxMiw3ICsxMTU5LDYgQEAgYnVpbGRfcGF0aHNfZm9yX09SKFBsYW5u ZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJCQkJCQkJCQkgICBpbmRleCwgJmNsYXVz ZXNldCwKIAkJCQkJCQkJCSAgIHVzZWZ1bF9wcmVkaWNhdGUsCiAJCQkJCQkJCQkgICBTVF9CSVRN QVBTQ0FOLAotCQkJCQkJCQkJICAgTlVMTCwKIAkJCQkJCQkJCSAgIE5VTEwpOwogCQlyZXN1bHQg PSBsaXN0X2NvbmNhdChyZXN1bHQsIGluZGV4cGF0aHMpOwogCX0KZGlmZiAtLWdpdCBhL3NyYy9i YWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1 bmNzLmMKaW5kZXggYzRmY2QwMDc2Li5jNzk2YjUzYTYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L3V0aWxzL2FkdC9zZWxmdW5jcy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5j cy5jCkBAIC02NDQ0LDggKzY0NDQsNiBAQCBnZW5lcmljY29zdGVzdGltYXRlKFBsYW5uZXJJbmZv ICpyb290LAogCWRvdWJsZQkJbnVtSW5kZXhUdXBsZXM7CiAJZG91YmxlCQlzcGNfcmFuZG9tX3Bh Z2VfY29zdDsKIAlkb3VibGUJCW51bV9zYV9zY2FuczsKLQlkb3VibGUJCW51bV9vdXRlcl9zY2Fu czsKLQlkb3VibGUJCW51bV9zY2FuczsKIAlkb3VibGUJCXF1YWxfb3BfY29zdDsKIAlkb3VibGUJ CXF1YWxfYXJnX2Nvc3Q7CiAJTGlzdAkgICAqc2VsZWN0aXZpdHlRdWFsczsKQEAgLTY0NjAsNyAr NjQ1OCw3IEBAIGdlbmVyaWNjb3N0ZXN0aW1hdGUoUGxhbm5lckluZm8gKnJvb3QsCiAKIAkvKgog CSAqIENoZWNrIGZvciBTY2FsYXJBcnJheU9wRXhwciBpbmRleCBxdWFscywgYW5kIGVzdGltYXRl IHRoZSBudW1iZXIgb2YKLQkgKiBpbmRleCBzY2FucyB0aGF0IHdpbGwgYmUgcGVyZm9ybWVkLgor CSAqIHByaW1pdGl2ZSBpbmRleCBzY2FucyB0aGF0IHdpbGwgYmUgcGVyZm9ybWVkIGZvciBjYWxs ZXIKIAkgKi8KIAludW1fc2Ffc2NhbnMgPSAxOwogCWZvcmVhY2gobCwgaW5kZXhRdWFscykKQEAg LTY0OTAsMTkgKzY0ODgsOCBAQCBnZW5lcmljY29zdGVzdGltYXRlKFBsYW5uZXJJbmZvICpyb290 LAogCSAqLwogCW51bUluZGV4VHVwbGVzID0gY29zdHMtPm51bUluZGV4VHVwbGVzOwogCWlmIChu dW1JbmRleFR1cGxlcyA8PSAwLjApCi0JewogCQludW1JbmRleFR1cGxlcyA9IGluZGV4U2VsZWN0 aXZpdHkgKiBpbmRleC0+cmVsLT50dXBsZXM7CiAKLQkJLyoKLQkJICogVGhlIGFib3ZlIGNhbGN1 bGF0aW9uIGNvdW50cyBhbGwgdGhlIHR1cGxlcyB2aXNpdGVkIGFjcm9zcyBhbGwKLQkJICogc2Nh bnMgaW5kdWNlZCBieSBTY2FsYXJBcnJheU9wRXhwciBub2Rlcy4gIFdlIHdhbnQgdG8gY29uc2lk ZXIgdGhlCi0JCSAqIGF2ZXJhZ2UgcGVyLWluZGV4c2NhbiBudW1iZXIsIHNvIGFkanVzdC4gIFRo aXMgaXMgYSBoYW5keSBwbGFjZSB0bwotCQkgKiByb3VuZCB0byBpbnRlZ2VyLCB0b28uICAoSWYg Y2FsbGVyIHN1cHBsaWVkIHR1cGxlIGVzdGltYXRlLCBpdCdzCi0JCSAqIHJlc3BvbnNpYmxlIGZv ciBoYW5kbGluZyB0aGVzZSBjb25zaWRlcmF0aW9ucy4pCi0JCSAqLwotCQludW1JbmRleFR1cGxl cyA9IHJpbnQobnVtSW5kZXhUdXBsZXMgLyBudW1fc2Ffc2NhbnMpOwotCX0KLQogCS8qCiAJICog V2UgY2FuIGJvdW5kIHRoZSBudW1iZXIgb2YgdHVwbGVzIGJ5IHRoZSBpbmRleCBzaXplIGluIGFu eSBjYXNlLiBBbHNvLAogCSAqIGFsd2F5cyBlc3RpbWF0ZSBhdCBsZWFzdCBvbmUgdHVwbGUgaXMg dG91Y2hlZCwgZXZlbiB3aGVuCkBAIC02NTQwLDI3ICs2NTI3LDMxIEBAIGdlbmVyaWNjb3N0ZXN0 aW1hdGUoUGxhbm5lckluZm8gKnJvb3QsCiAJICoKIAkgKiBUaGUgYWJvdmUgY2FsY3VsYXRpb25z IGFyZSBhbGwgcGVyLWluZGV4LXNjYW4uICBIb3dldmVyLCBpZiB3ZSBhcmUgaW4gYQogCSAqIG5l c3Rsb29wIGlubmVyIHNjYW4sIHdlIGNhbiBleHBlY3QgdGhlIHNjYW4gdG8gYmUgcmVwZWF0ZWQg KHdpdGgKLQkgKiBkaWZmZXJlbnQgc2VhcmNoIGtleXMpIGZvciBlYWNoIHJvdyBvZiB0aGUgb3V0 ZXIgcmVsYXRpb24uICBMaWtld2lzZSwKLQkgKiBTY2FsYXJBcnJheU9wRXhwciBxdWFscyByZXN1 bHQgaW4gbXVsdGlwbGUgaW5kZXggc2NhbnMuICBUaGlzIGNyZWF0ZXMKLQkgKiB0aGUgcG90ZW50 aWFsIGZvciBjYWNoZSBlZmZlY3RzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGRpc2sgcGFnZQot CSAqIGZldGNoZXMgbmVlZGVkLiAgV2Ugd2FudCB0byBlc3RpbWF0ZSB0aGUgYXZlcmFnZSBwZXIt c2NhbiBJL08gY29zdCBpbgotCSAqIHRoZSBwcmVzZW5jZSBvZiBjYWNoaW5nLgorCSAqIGRpZmZl cmVudCBzZWFyY2gga2V5cykgZm9yIGVhY2ggcm93IG9mIHRoZSBvdXRlciByZWxhdGlvbi4gIFRo aXMKKwkgKiBjcmVhdGVzIHRoZSBwb3RlbnRpYWwgZm9yIGNhY2hlIGVmZmVjdHMgdG8gcmVkdWNl IHRoZSBudW1iZXIgb2YgZGlzaworCSAqIHBhZ2UgZmV0Y2hlcyBuZWVkZWQuICBXZSB3YW50IHRv IGVzdGltYXRlIHRoZSBhdmVyYWdlIHBlci1zY2FuIEkvTyBjb3N0CisJICogaW4gdGhlIHByZXNl bmNlIG9mIGNhY2hpbmcuCiAJICoKIAkgKiBXZSB1c2UgdGhlIE1hY2tlcnQtTG9obWFuIGZvcm11 bGEgKHNlZSBjb3N0c2l6ZS5jIGZvciBkZXRhaWxzKSB0bwogCSAqIGVzdGltYXRlIHRoZSB0b3Rh bCBudW1iZXIgb2YgcGFnZSBmZXRjaGVzIHRoYXQgb2NjdXIuICBXaGlsZSB0aGlzCiAJICogd2Fz bid0IHdoYXQgaXQgd2FzIGRlc2lnbmVkIGZvciwgaXQgc2VlbXMgYSByZWFzb25hYmxlIG1vZGVs IGFueXdheS4KIAkgKiBOb3RlIHRoYXQgd2UgYXJlIGNvdW50aW5nIHBhZ2VzIG5vdCB0dXBsZXMg YW55bW9yZSwgc28gd2UgdGFrZSBOID0gVCA9CiAJICogaW5kZXggc2l6ZSwgYXMgaWYgdGhlcmUg d2VyZSBvbmUgInR1cGxlIiBwZXIgcGFnZS4KKwkgKgorCSAqIE5vdGU6IHdlIGFzc3VtZSB0aGF0 IHRoZXJlIHdpbGwgYmUgbm8gcmVwZWF0IGluZGV4IHBhZ2UgZmV0Y2hlcyBhY3Jvc3MKKwkgKiBT Y2FsYXJBcnJheU9wRXhwciBwcmltaXRpdmUgc2NhbnMgZnJvbSB0aGUgc2FtZSBsb2dpY2FsIGlu ZGV4IHNjYW4uCisJICogVGhpcyBpcyBndWFyYW50ZWVkIHRvIGJlIHRydWUgZm9yIGJ0cmVlIGlu ZGV4ZXMsIGJ1dCBpcyB2ZXJ5IG9wdGltaXN0aWMKKwkgKiB3aXRoIGluZGV4IEFNcyB0aGF0IGNh bm5vdCBuYXRpdmVseSBleGVjdXRlIFNjYWxhckFycmF5T3BFeHByIHF1YWxzLgorCSAqIEhvd2V2 ZXIsIHRoZXNlIHNhbWUgaW5kZXggQU1zIGFsc28gYWNjZXB0IG91ciBkZWZhdWx0IHBlc3NpbWlz dGljCisJICogYXBwcm9hY2ggdG8gY291bnRpbmcgbnVtX3NhX3NjYW5zIChidHJlZSBjYWxsZXIg Y2FwcyB0aGlzKSwgc28gd2UgZG9uJ3QKKwkgKiBleHBlY3QgdGhlIGZpbmFsIGluZGV4VG90YWxD b3N0IHRvIGJlIHdpbGRseSBvdmVyLW9wdGltaXN0aWMuCiAJICovCi0JbnVtX291dGVyX3NjYW5z ID0gbG9vcF9jb3VudDsKLQludW1fc2NhbnMgPSBudW1fc2Ffc2NhbnMgKiBudW1fb3V0ZXJfc2Nh bnM7Ci0KLQlpZiAobnVtX3NjYW5zID4gMSkKKwlpZiAobG9vcF9jb3VudCA+IDEpCiAJewogCQlk b3VibGUJCXBhZ2VzX2ZldGNoZWQ7CiAKIAkJLyogdG90YWwgcGFnZSBmZXRjaGVzIGlnbm9yaW5n IGNhY2hlIGVmZmVjdHMgKi8KLQkJcGFnZXNfZmV0Y2hlZCA9IG51bUluZGV4UGFnZXMgKiBudW1f c2NhbnM7CisJCXBhZ2VzX2ZldGNoZWQgPSBudW1JbmRleFBhZ2VzICogbG9vcF9jb3VudDsKIAog CQkvKiB1c2UgTWFja2VydCBhbmQgTG9obWFuIGZvcm11bGEgdG8gYWRqdXN0IGZvciBjYWNoZSBl ZmZlY3RzICovCiAJCXBhZ2VzX2ZldGNoZWQgPSBpbmRleF9wYWdlc19mZXRjaGVkKHBhZ2VzX2Zl dGNoZWQsCkBAIC02NTcwLDExICs2NTYxLDkgQEAgZ2VuZXJpY2Nvc3Rlc3RpbWF0ZShQbGFubmVy SW5mbyAqcm9vdCwKIAogCQkvKgogCQkgKiBOb3cgY29tcHV0ZSB0aGUgdG90YWwgZGlzayBhY2Nl c3MgY29zdCwgYW5kIHRoZW4gcmVwb3J0IGEgcHJvLXJhdGVkCi0JCSAqIHNoYXJlIGZvciBlYWNo IG91dGVyIHNjYW4uICAoRG9uJ3QgcHJvLXJhdGUgZm9yIFNjYWxhckFycmF5T3BFeHByLAotCQkg KiBzaW5jZSB0aGF0J3MgaW50ZXJuYWwgdG8gdGhlIGluZGV4c2Nhbi4pCisJCSAqIHNoYXJlIGZv ciBlYWNoIG91dGVyIHNjYW4KIAkJICovCi0JCWluZGV4VG90YWxDb3N0ID0gKHBhZ2VzX2ZldGNo ZWQgKiBzcGNfcmFuZG9tX3BhZ2VfY29zdCkKLQkJCS8gbnVtX291dGVyX3NjYW5zOworCQlpbmRl eFRvdGFsQ29zdCA9IChwYWdlc19mZXRjaGVkICogc3BjX3JhbmRvbV9wYWdlX2Nvc3QpIC8gbG9v cF9jb3VudDsKIAl9CiAJZWxzZQogCXsKQEAgLTY1OTAsMTAgKzY1NzksOCBAQCBnZW5lcmljY29z dGVzdGltYXRlKFBsYW5uZXJJbmZvICpyb290LAogCSAqIGV2YWx1YXRlZCBvbmNlIGF0IHRoZSBz dGFydCBvZiB0aGUgc2NhbiB0byByZWR1Y2UgdGhlbSB0byBydW50aW1lIGtleXMKIAkgKiB0byBw YXNzIHRvIHRoZSBpbmRleCBBTSAoc2VlIG5vZGVJbmRleHNjYW4uYykuICBXZSBtb2RlbCB0aGUg cGVyLXR1cGxlCiAJICogQ1BVIGNvc3RzIGFzIGNwdV9pbmRleF90dXBsZV9jb3N0IHBsdXMgb25l IGNwdV9vcGVyYXRvcl9jb3N0IHBlcgotCSAqIGluZGV4cXVhbCBvcGVyYXRvci4gIEJlY2F1c2Ug d2UgaGF2ZSBudW1JbmRleFR1cGxlcyBhcyBhIHBlci1zY2FuCi0JICogbnVtYmVyLCB3ZSBoYXZl IHRvIG11bHRpcGx5IGJ5IG51bV9zYV9zY2FucyB0byBnZXQgdGhlIGNvcnJlY3QgcmVzdWx0Ci0J ICogZm9yIFNjYWxhckFycmF5T3BFeHByIGNhc2VzLiAgU2ltaWxhcmx5IGFkZCBpbiBjb3N0cyBm b3IgYW55IGluZGV4Ci0JICogT1JERVIgQlkgZXhwcmVzc2lvbnMuCisJICogaW5kZXhxdWFsIG9w ZXJhdG9yLiAgU2ltaWxhcmx5IGFkZCBpbiBjb3N0cyBmb3IgYW55IGluZGV4IE9SREVSIEJZCisJ ICogZXhwcmVzc2lvbnMuCiAJICoKIAkgKiBOb3RlOiB0aGlzIG5lZ2xlY3RzIHRoZSBwb3NzaWJs ZSBjb3N0cyBvZiByZWNoZWNraW5nIGxvc3N5IG9wZXJhdG9ycy4KIAkgKiBEZXRlY3RpbmcgdGhh dCB0aGF0IG1pZ2h0IGJlIG5lZWRlZCBzZWVtcyBtb3JlIGV4cGVuc2l2ZSB0aGFuIGl0J3MKQEAg LTY2MDYsNyArNjU5Myw3IEBAIGdlbmVyaWNjb3N0ZXN0aW1hdGUoUGxhbm5lckluZm8gKnJvb3Qs CiAKIAlpbmRleFN0YXJ0dXBDb3N0ID0gcXVhbF9hcmdfY29zdDsKIAlpbmRleFRvdGFsQ29zdCAr PSBxdWFsX2FyZ19jb3N0OwotCWluZGV4VG90YWxDb3N0ICs9IG51bUluZGV4VHVwbGVzICogbnVt X3NhX3NjYW5zICogKGNwdV9pbmRleF90dXBsZV9jb3N0ICsgcXVhbF9vcF9jb3N0KTsKKwlpbmRl eFRvdGFsQ29zdCArPSBudW1JbmRleFR1cGxlcyAqIChjcHVfaW5kZXhfdHVwbGVfY29zdCArIHF1 YWxfb3BfY29zdCk7CiAKIAkvKgogCSAqIEdlbmVyaWMgYXNzdW1wdGlvbiBhYm91dCBpbmRleCBj b3JyZWxhdGlvbjogdGhlcmUgaXNuJ3QgYW55LgpAQCAtNjY4NCw3ICs2NjcxLDYgQEAgYnRjb3N0 ZXN0aW1hdGUoUGxhbm5lckluZm8gKnJvb3QsIEluZGV4UGF0aCAqcGF0aCwgZG91YmxlIGxvb3Bf Y291bnQsCiAJYm9vbAkJZXFRdWFsSGVyZTsKIAlib29sCQlmb3VuZF9zYW9wOwogCWJvb2wJCWZv dW5kX2lzX251bGxfb3A7Ci0JZG91YmxlCQludW1fc2Ffc2NhbnM7CiAJTGlzdENlbGwgICAqbGM7 CiAKIAkvKgpAQCAtNjY5OSwxNyArNjY4NSwxMiBAQCBidGNvc3Rlc3RpbWF0ZShQbGFubmVySW5m byAqcm9vdCwgSW5kZXhQYXRoICpwYXRoLCBkb3VibGUgbG9vcF9jb3VudCwKIAkgKgogCSAqIEZv ciBhIFJvd0NvbXBhcmVFeHByLCB3ZSBjb25zaWRlciBvbmx5IHRoZSBmaXJzdCBjb2x1bW4sIGp1 c3QgYXMKIAkgKiByb3djb21wYXJlc2VsKCkgZG9lcy4KLQkgKgotCSAqIElmIHRoZXJlJ3MgYSBT Y2FsYXJBcnJheU9wRXhwciBpbiB0aGUgcXVhbHMsIHdlJ2xsIGFjdHVhbGx5IHBlcmZvcm0gTgot CSAqIGluZGV4IHNjYW5zIG5vdCBvbmUsIGJ1dCB0aGUgU2NhbGFyQXJyYXlPcEV4cHIncyBvcGVy YXRvciBjYW4gYmUKLQkgKiBjb25zaWRlcmVkIHRvIGFjdCB0aGUgc2FtZSBhcyBpdCBub3JtYWxs eSBkb2VzLgogCSAqLwogCWluZGV4Qm91bmRRdWFscyA9IE5JTDsKIAlpbmRleGNvbCA9IDA7CiAJ ZXFRdWFsSGVyZSA9IGZhbHNlOwogCWZvdW5kX3Nhb3AgPSBmYWxzZTsKIAlmb3VuZF9pc19udWxs X29wID0gZmFsc2U7Ci0JbnVtX3NhX3NjYW5zID0gMTsKIAlmb3JlYWNoKGxjLCBwYXRoLT5pbmRl eGNsYXVzZXMpCiAJewogCQlJbmRleENsYXVzZSAqaWNsYXVzZSA9IGxmaXJzdF9ub2RlKEluZGV4 Q2xhdXNlLCBsYyk7CkBAIC02NzQ5LDE0ICs2NzMwLDkgQEAgYnRjb3N0ZXN0aW1hdGUoUGxhbm5l ckluZm8gKnJvb3QsIEluZGV4UGF0aCAqcGF0aCwgZG91YmxlIGxvb3BfY291bnQsCiAJCQllbHNl IGlmIChJc0EoY2xhdXNlLCBTY2FsYXJBcnJheU9wRXhwcikpCiAJCQl7CiAJCQkJU2NhbGFyQXJy YXlPcEV4cHIgKnNhb3AgPSAoU2NhbGFyQXJyYXlPcEV4cHIgKikgY2xhdXNlOwotCQkJCU5vZGUJ ICAgKm90aGVyX29wZXJhbmQgPSAoTm9kZSAqKSBsc2Vjb25kKHNhb3AtPmFyZ3MpOwotCQkJCWlu dAkJCWFsZW5ndGggPSBlc3RpbWF0ZV9hcnJheV9sZW5ndGgob3RoZXJfb3BlcmFuZCk7CiAKIAkJ CQljbGF1c2Vfb3AgPSBzYW9wLT5vcG5vOwogCQkJCWZvdW5kX3Nhb3AgPSB0cnVlOwotCQkJCS8q IGNvdW50IG51bWJlciBvZiBTQSBzY2FucyBpbmR1Y2VkIGJ5IGluZGV4Qm91bmRRdWFscyBvbmx5 ICovCi0JCQkJaWYgKGFsZW5ndGggPiAxKQotCQkJCQludW1fc2Ffc2NhbnMgKj0gYWxlbmd0aDsK IAkJCX0KIAkJCWVsc2UgaWYgKElzQShjbGF1c2UsIE51bGxUZXN0KSkKIAkJCXsKQEAgLTY4MDUs OSArNjc4MSw5IEBAIGJ0Y29zdGVzdGltYXRlKFBsYW5uZXJJbmZvICpyb290LCBJbmRleFBhdGgg KnBhdGgsIGRvdWJsZSBsb29wX2NvdW50LAogCQlTZWxlY3Rpdml0eSBidHJlZVNlbGVjdGl2aXR5 OwogCiAJCS8qCi0JCSAqIElmIHRoZSBpbmRleCBpcyBwYXJ0aWFsLCBBTkQgdGhlIGluZGV4IHBy ZWRpY2F0ZSB3aXRoIHRoZQotCQkgKiBpbmRleC1ib3VuZCBxdWFscyB0byBwcm9kdWNlIGEgbW9y ZSBhY2N1cmF0ZSBpZGVhIG9mIHRoZSBudW1iZXIgb2YKLQkJICogcm93cyBjb3ZlcmVkIGJ5IHRo ZSBib3VuZCBjb25kaXRpb25zLgorCQkgKiBBTkQgdGhlIGluZGV4IHByZWRpY2F0ZSB3aXRoIHRo ZSBpbmRleC1ib3VuZCBxdWFscyB0byBwcm9kdWNlIGEKKwkJICogbW9yZSBhY2N1cmF0ZSBpZGVh IG9mIHRoZSBudW1iZXIgb2Ygcm93cyBjb3ZlcmVkIGJ5IHRoZSBib3VuZAorCQkgKiBjb25kaXRp b25zCiAJCSAqLwogCQlzZWxlY3Rpdml0eVF1YWxzID0gYWRkX3ByZWRpY2F0ZV90b19pbmRleF9x dWFscyhpbmRleCwgaW5kZXhCb3VuZFF1YWxzKTsKIApAQCAtNjgxNiwxMyArNjc5Miw2IEBAIGJ0 Y29zdGVzdGltYXRlKFBsYW5uZXJJbmZvICpyb290LCBJbmRleFBhdGggKnBhdGgsIGRvdWJsZSBs b29wX2NvdW50LAogCQkJCQkJCQkJCQkJICBKT0lOX0lOTkVSLAogCQkJCQkJCQkJCQkJICBOVUxM KTsKIAkJbnVtSW5kZXhUdXBsZXMgPSBidHJlZVNlbGVjdGl2aXR5ICogaW5kZXgtPnJlbC0+dHVw bGVzOwotCi0JCS8qCi0JCSAqIEFzIGluIGdlbmVyaWNjb3N0ZXN0aW1hdGUoKSwgd2UgaGF2ZSB0 byBhZGp1c3QgZm9yIGFueQotCQkgKiBTY2FsYXJBcnJheU9wRXhwciBxdWFscyBpbmNsdWRlZCBp biBpbmRleEJvdW5kUXVhbHMsIGFuZCB0aGVuIHJvdW5kCi0JCSAqIHRvIGludGVnZXIuCi0JCSAq LwotCQludW1JbmRleFR1cGxlcyA9IHJpbnQobnVtSW5kZXhUdXBsZXMgLyBudW1fc2Ffc2NhbnMp OwogCX0KIAogCS8qCkBAIC02ODMyLDYgKzY4MDEsNDMgQEAgYnRjb3N0ZXN0aW1hdGUoUGxhbm5l ckluZm8gKnJvb3QsIEluZGV4UGF0aCAqcGF0aCwgZG91YmxlIGxvb3BfY291bnQsCiAKIAlnZW5l cmljY29zdGVzdGltYXRlKHJvb3QsIHBhdGgsIGxvb3BfY291bnQsICZjb3N0cyk7CiAKKwkvKgor CSAqIE5vdyBjb21wZW5zYXRlIGZvciBidHJlZSdzIGFiaWxpdHkgdG8gZWZmaWNpZW50bHkgZXhl Y3V0ZSBzY2FucyB3aXRoCisJICogU0FPUCBjbGF1c2VzLgorCSAqCisJICogYnRyZWUgYXV0b21h dGljYWxseSBjb21iaW5lcyBpbmRpdmlkdWFsIFNjYWxhckFycmF5T3BFeHByIHByaW1pdGl2ZQor CSAqIGluZGV4IHNjYW5zIHdoZW5ldmVyIHRoZSB0dXBsZXMgY292ZXJlZCBieSB0aGUgbmV4dCBz ZXQgb2YgYXJyYXkga2V5cworCSAqIGFyZSBjbG9zZSB0byB0dXBsZXMgY292ZXJlZCBieSB0aGUg Y3VycmVudCBzZXQuICBUaGlzIG1ha2VzIHRoZSBmaW5hbAorCSAqIG51bWJlciBvZiBkZXNjZW50 cyBwYXJ0aWN1bGFybHkgZGlmZmljdWx0IHRvIGVzdGltYXRlLiAgSG93ZXZlciwgYnRyZWUKKwkg KiBzY2FucyBuZXZlciB2aXNpdCBhbnkgc2luZ2xlIGxlYWYgcGFnZSBtb3JlIHRoYW4gb25jZS4g IFRoYXQgcHV0cyBhCisJICogbmF0dXJhbCBmbG9vciB1bmRlciB0aGUgd29yc3QgY2FzZSBudW1i ZXIgb2YgZGVzY2VudHMuCisJICoKKwkgKiBJdCdzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgdGhh dCB3ZSBub3Qgd2lsZGx5IG92ZXJlc3RpbWF0ZSB0aGUgbnVtYmVyCisJICogb2YgZGVzY2VudHMg bmVlZGVkIGZvciBhIGNsYXVzZSBsaXN0IHdpdGggc2V2ZXJhbCBTQU9QcyAtLSB0aGUgY29zdHMK KwkgKiByZWFsbHkgYXJlbid0IG11bHRpcGxpY2F0aXZlIGluIHRoZSB3YXkgZ2VuZXJpY2Nvc3Rl c3RpbWF0ZSBleHBlY3RzLiBJbgorCSAqIGdlbmVyYWwsIG1vc3QgZGlzdGluY3QgY29tYmluYXRp b25zIG9mIFNBT1Aga2V5cyB3aWxsIHRlbmQgdG8gbm90IGZpbmQKKwkgKiBhbnkgbWF0Y2hpbmcg dHVwbGVzLiAgRnVydGhlcm1vcmUsIGJ0cmVlIHNjYW5zIHNlYXJjaCBmb3IgdGhlIG5leHQgc2V0 CisJICogb2YgYXJyYXkga2V5cyB1c2luZyB0aGUgbmV4dCB0dXBsZSBpbiBsaW5lLCBhbmQgc28g d29uJ3QgZXZlbiBuZWVkIGEKKwkgKiBkaXJlY3QgY29tcGFyaXNvbiB0byBlbGltaW5hdGUgbW9z dCBub24tbWF0Y2hpbmcgc2V0cyBvZiBhcnJheSBrZXlzLgorCSAqCisJICogQ2xhbXAgdGhlIG51 bWJlciBvZiBkZXNjZW50cyB0byB0aGUgZXN0aW1hdGVkIG51bWJlciBvZiBsZWFmIHBhZ2UKKwkg KiB2aXNpdHMuICBUaGlzIGlzIHN0aWxsIGZhaXJseSBwZXNzaW1pc3RpYywgYnV0IHRlbmRzIHRv IHJlc3VsdCBpbiBtb3JlCisJICogYWNjdXJhdGUgY29zdGluZyBvZiBzY2FucyB3aXRoIHNldmVy YWwgU0FPUCBjbGF1c2VzIC0tIGVzcGVjaWFsbHkgd2hlbgorCSAqIGVhY2ggYXJyYXkgaGFzIG1v cmUgdGhhbiBhIGZldyBlbGVtZW50cy4gIFRoZSBjb3N0IG9mIGFkZGluZyBhZGRpdGlvbmFsCisJ ICogYXJyYXkgY29uc3RhbnRzIHRvIGEgbG93LW9yZGVyIFNBT1AgY29sdW1uIHNob3VsZCBzYXR1 cmF0ZSBwYXN0IGEKKwkgKiBjZXJ0YWluIHBvaW50IChleGNlcHQgd2hlcmUgc2VsZWN0aXZpdHkg ZXN0aW1hdGVzIGNvbnRpbnVlIHRvIHNoaWZ0KS4KKwkgKgorCSAqIEFsc28gY2xhbXAgdGhlIG51 bWJlciBvZiBkZXNjZW50cyB0byAxLzMgdGhlIG51bWJlciBvZiBpbmRleCBwYWdlcy4KKwkgKiBU aGlzIGF2b2lkcyBpbXBsYXVzaWJseSBoaWdoIGVzdGltYXRlcyB3aXRoIGxvdyBzZWxlY3Rpdml0 eSBwYXRocywKKwkgKiB3aGVyZSBzY2FucyBmcmVxdWVudGx5IHJlcXVpcmUgbm8gbW9yZSB0aGFu IG9uZSBvciB0d28gZGVzY2VudHMuCisJICovCisJaWYgKGNvc3RzLm51bV9zYV9zY2FucyA+IDEp CisJeworCQljb3N0cy5udW1fc2Ffc2NhbnMgPSBNaW4oY29zdHMubnVtX3NhX3NjYW5zLCBjb3N0 cy5udW1JbmRleFBhZ2VzKTsKKwkJY29zdHMubnVtX3NhX3NjYW5zID0gTWluKGNvc3RzLm51bV9z YV9zY2FucywgaW5kZXgtPnBhZ2VzIC8gMyk7CisJCWNvc3RzLm51bV9zYV9zY2FucyA9IE1heChj b3N0cy5udW1fc2Ffc2NhbnMsIDEpOworCX0KKwogCS8qCiAJICogQWRkIGEgQ1BVLWNvc3QgY29t cG9uZW50IHRvIHJlcHJlc2VudCB0aGUgY29zdHMgb2YgaW5pdGlhbCBidHJlZQogCSAqIGRlc2Nl bnQuICBXZSBkb24ndCBjaGFyZ2UgYW55IEkvTyBjb3N0IGZvciB0b3VjaGluZyB1cHBlciBidHJl ZSBsZXZlbHMsCkBAIC02ODM5LDkgKzY4NDUsOSBAQCBidGNvc3Rlc3RpbWF0ZShQbGFubmVySW5m byAqcm9vdCwgSW5kZXhQYXRoICpwYXRoLCBkb3VibGUgbG9vcF9jb3VudCwKIAkgKiBjb21wYXJp c29ucyB0byBkZXNjZW5kIGEgYnRyZWUgb2YgTiBsZWFmIHR1cGxlcy4gIFdlIGNoYXJnZSBvbmUK IAkgKiBjcHVfb3BlcmF0b3JfY29zdCBwZXIgY29tcGFyaXNvbi4KIAkgKgotCSAqIElmIHRoZXJl IGFyZSBTY2FsYXJBcnJheU9wRXhwcnMsIGNoYXJnZSB0aGlzIG9uY2UgcGVyIFNBIHNjYW4uICBU aGUKLQkgKiBvbmVzIGFmdGVyIHRoZSBmaXJzdCBvbmUgYXJlIG5vdCBzdGFydHVwIGNvc3Qgc28g ZmFyIGFzIHRoZSBvdmVyYWxsCi0JICogcGxhbiBpcyBjb25jZXJuZWQsIHNvIGFkZCB0aGVtIG9u bHkgdG8gInRvdGFsIiBjb3N0LgorCSAqIElmIHRoZXJlIGFyZSBTY2FsYXJBcnJheU9wRXhwcnMs IGNoYXJnZSB0aGlzIG9uY2UgcGVyIGVzdGltYXRlZAorCSAqIHByaW1pdGl2ZSBTQSBzY2FuLiAg VGhlIG9uZXMgYWZ0ZXIgdGhlIGZpcnN0IG9uZSBhcmUgbm90IHN0YXJ0dXAgY29zdAorCSAqIHNv IGZhciBhcyB0aGUgb3ZlcmFsbCBwbGFuIGdvZXMsIHNvIGp1c3QgYWRkIHRoZW0gdG8gInRvdGFs IiBjb3N0LgogCSAqLwogCWlmIChpbmRleC0+dHVwbGVzID4gMSkJCS8qIGF2b2lkIGNvbXB1dGlu ZyBsb2coMCkgKi8KIAl7CkBAIC02ODU4LDcgKzY4NjQsOCBAQCBidGNvc3Rlc3RpbWF0ZShQbGFu bmVySW5mbyAqcm9vdCwgSW5kZXhQYXRoICpwYXRoLCBkb3VibGUgbG9vcF9jb3VudCwKIAkgKiBp biBjYXNlcyB3aGVyZSBvbmx5IGEgc2luZ2xlIGxlYWYgcGFnZSBpcyBleHBlY3RlZCB0byBiZSB2 aXNpdGVkLiAgVGhpcwogCSAqIGNvc3QgaXMgc29tZXdoYXQgYXJiaXRyYXJpbHkgc2V0IGF0IDUw eCBjcHVfb3BlcmF0b3JfY29zdCBwZXIgcGFnZQogCSAqIHRvdWNoZWQuICBUaGUgbnVtYmVyIG9m IHN1Y2ggcGFnZXMgaXMgYnRyZWUgdHJlZSBoZWlnaHQgcGx1cyBvbmUgKGllLAotCSAqIHdlIGNo YXJnZSBmb3IgdGhlIGxlYWYgcGFnZSB0b28pLiAgQXMgYWJvdmUsIGNoYXJnZSBvbmNlIHBlciBT QSBzY2FuLgorCSAqIHdlIGNoYXJnZSBmb3IgdGhlIGxlYWYgcGFnZSB0b28pLiAgQXMgYWJvdmUs IGNoYXJnZSBvbmNlIHBlciBlc3RpbWF0ZWQKKwkgKiBwcmltaXRpdmUgU0Egc2Nhbi4KIAkgKi8K IAlkZXNjZW50Q29zdCA9IChpbmRleC0+dHJlZV9oZWlnaHQgKyAxKSAqIERFRkFVTFRfUEFHRV9D UFVfTVVMVElQTElFUiAqIGNwdV9vcGVyYXRvcl9jb3N0OwogCWNvc3RzLmluZGV4U3RhcnR1cENv c3QgKz0gZGVzY2VudENvc3Q7CmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvbW9uaXRvcmluZy5z Z21sIGIvZG9jL3NyYy9zZ21sL21vbml0b3Jpbmcuc2dtbAppbmRleCA5YzQ5MzBlOWEuLmE0MzFh NzU0MyAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL21vbml0b3Jpbmcuc2dtbAorKysgYi9kb2Mv c3JjL3NnbWwvbW9uaXRvcmluZy5zZ21sCkBAIC00MDA1LDYgKzQwMDUsMTkgQEAgZGVzY3JpcHRp b24gfCBXYWl0aW5nIGZvciBhIG5ld2x5IGluaXRpYWxpemVkIFdBTCBmaWxlIHRvIHJlYWNoIGR1 cmFibGUgc3RvcmFnZQogICAgPC9wYXJhPgogICA8L25vdGU+CiAKKyAgPG5vdGU+CisgICA8cGFy YT4KKyAgICBFdmVyeSB0aW1lIGFuIGluZGV4IGlzIHNlYXJjaGVkLCB0aGUgaW5kZXgncworICAg IDxzdHJ1Y3RuYW1lPnBnX3N0YXRfYWxsX2luZGV4ZXM8L3N0cnVjdG5hbWU+LjxzdHJ1Y3RmaWVs ZD5pZHhfc2Nhbjwvc3RydWN0ZmllbGQ+CisgICAgZmllbGQgaXMgaW5jcmVtZW50ZWQuICBUaGlz IHVzdWFsbHkgaGFwcGVucyBvbmNlIHBlciBpbmRleCBzY2FuIG5vZGUKKyAgICBleGVjdXRpb24s IGJ1dCBtaWdodCB0YWtlIHBsYWNlIHNldmVyYWwgdGltZXMgZHVyaW5nIGV4ZWN1dGlvbiBvZiBh IHNjYW4KKyAgICB0aGF0IHNlYXJjaGVzIGZvciBtdWx0aXBsZSB2YWx1ZXMgdG9nZXRoZXIuICBP bmx5IHF1ZXJpZXMgdGhhdCB1c2UgY2VydGFpbgorICAgIDxhY3JvbnltPlNRTDwvYWNyb255bT4g Y29uc3RydWN0cyB0byBzZWFyY2ggZm9yIHJvd3MgbWF0Y2hpbmcgYW55IHZhbHVlCisgICAgb3V0 IG9mIGEgbGlzdCAob3IgYW4gYXJyYXkpIG9mIG11bHRpcGxlIHNjYWxhciB2YWx1ZXMgYXJlIGFm ZmVjdGVkLiAgU2VlCisgICAgPHhyZWYgbGlua2VuZD0iZnVuY3Rpb25zLWNvbXBhcmlzb25zIi8+ IGZvciBkZXRhaWxzLgorICAgPC9wYXJhPgorICA8L25vdGU+CisKICA8L3NlY3QyPgogCiAgPHNl Y3QyIGlkPSJtb25pdG9yaW5nLXBnLXN0YXRpby1hbGwtdGFibGVzLXZpZXciPgpkaWZmIC0tZ2l0 IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jcmVhdGVfaW5kZXgub3V0IGIvc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9jcmVhdGVfaW5kZXgub3V0CmluZGV4IGFjZmQ5ZDFmNC4uODRjMDY4 YWUzIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NyZWF0ZV9pbmRleC5v dXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jcmVhdGVfaW5kZXgub3V0CkBAIC0x OTEwLDcgKzE5MTAsNyBAQCBTRUxFQ1QgY291bnQoKikgRlJPTSBkdXBpbmRleGNvbHMKICgxIHJv dykKIAogLS0KLS0tIENoZWNrIG9yZGVyaW5nIG9mID1BTlkgaW5kZXhxdWFsIHJlc3VsdHMgKGJ1 ZyBpbiA5LjIuMCkKKy0tIENoZWNrIHRoYXQgaW5kZXggc2NhbnMgd2l0aCA9QU5ZIGluZGV4cXVh bHMgcmV0dXJuIHJvd3MgaW4gaW5kZXggb3JkZXIKIC0tCiBleHBsYWluIChjb3N0cyBvZmYpCiBT RUxFQ1QgdW5pcXVlMSBGUk9NIHRlbmsxCkBAIC0xOTM2LDEyICsxOTM2LDExIEBAIGV4cGxhaW4g KGNvc3RzIG9mZikKIFNFTEVDVCB0aG91c2FuZCwgdGVudGhvdXMgRlJPTSB0ZW5rMQogV0hFUkUg dGhvdXNhbmQgPCAyIEFORCB0ZW50aG91cyBJTiAoMTAwMSwzMDAwKQogT1JERVIgQlkgdGhvdXNh bmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAg ICAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBJ bmRleCBPbmx5IFNjYW4gdXNpbmcgdGVuazFfdGhvdXNfdGVudGhvdXMgb24gdGVuazEKLSAgIElu ZGV4IENvbmQ6ICh0aG91c2FuZCA8IDIpCi0gICBGaWx0ZXI6ICh0ZW50aG91cyA9IEFOWSAoJ3sx MDAxLDMwMDB9Jzo6aW50ZWdlcltdKSkKLSgzIHJvd3MpCisgICBJbmRleCBDb25kOiAoKHRob3Vz YW5kIDwgMikgQU5EICh0ZW50aG91cyA9IEFOWSAoJ3sxMDAxLDMwMDB9Jzo6aW50ZWdlcltdKSkp CisoMiByb3dzKQogCiBTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEKIFdIRVJF IHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKQEAgLTE5NTIsMTggKzE5 NTEsMzUgQEAgT1JERVIgQlkgdGhvdXNhbmQ7CiAgICAgICAgIDEgfCAgICAgMTAwMQogKDIgcm93 cykKIAorZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBGUk9N IHRlbmsxCitXSEVSRSB0aG91c2FuZCA8IDIgQU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDApCitP UkRFUiBCWSB0aG91c2FuZCBERVNDLCB0ZW50aG91cyBERVNDOworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgSW5kZXggT25seSBTY2FuIEJhY2t3YXJk IHVzaW5nIHRlbmsxX3Rob3VzX3RlbnRob3VzIG9uIHRlbmsxCisgICBJbmRleCBDb25kOiAoKHRo b3VzYW5kIDwgMikgQU5EICh0ZW50aG91cyA9IEFOWSAoJ3sxMDAxLDMwMDB9Jzo6aW50ZWdlcltd KSkpCisoMiByb3dzKQorCitTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEKK1dI RVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKK09SREVSIEJZIHRo b3VzYW5kIERFU0MsIHRlbnRob3VzIERFU0M7CisgdGhvdXNhbmQgfCB0ZW50aG91cyAKKy0tLS0t LS0tLS0rLS0tLS0tLS0tLQorICAgICAgICAxIHwgICAgIDEwMDEKKyAgICAgICAgMCB8ICAgICAz MDAwCisoMiByb3dzKQorCiBTRVQgZW5hYmxlX2luZGV4b25seXNjYW4gPSBPRkY7CiBleHBsYWlu IChjb3N0cyBvZmYpCiBTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEKIFdIRVJF IHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKIE9SREVSIEJZIHRob3Vz YW5kOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCi0gU29ydAotICAgU29ydCBLZXk6IHRob3VzYW5kCi0gICAtPiAgSW5kZXggU2Nh biB1c2luZyB0ZW5rMV90aG91c190ZW50aG91cyBvbiB0ZW5rMQotICAgICAgICAgSW5kZXggQ29u ZDogKCh0aG91c2FuZCA8IDIpIEFORCAodGVudGhvdXMgPSBBTlkgKCd7MTAwMSwzMDAwfSc6Omlu dGVnZXJbXSkpKQotKDQgcm93cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg UVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIEluZGV4IFNjYW4gdXNpbmcgdGVuazFfdGhvdXNfdGVudGhvdXMgb24g dGVuazEKKyAgIEluZGV4IENvbmQ6ICgodGhvdXNhbmQgPCAyKSBBTkQgKHRlbnRob3VzID0gQU5Z ICgnezEwMDEsMzAwMH0nOjppbnRlZ2VyW10pKSkKKygyIHJvd3MpCiAKIFNFTEVDVCB0aG91c2Fu ZCwgdGVudGhvdXMgRlJPTSB0ZW5rMQogV0hFUkUgdGhvdXNhbmQgPCAyIEFORCB0ZW50aG91cyBJ TiAoMTAwMSwzMDAwKQpAQCAtMTk3NCw2ICsxOTkwLDI1IEBAIE9SREVSIEJZIHRob3VzYW5kOwog ICAgICAgICAxIHwgICAgIDEwMDEKICgyIHJvd3MpCiAKK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NF TEVDVCB0aG91c2FuZCwgdGVudGhvdXMgRlJPTSB0ZW5rMQorV0hFUkUgdGhvdXNhbmQgPCAyIEFO RCB0ZW50aG91cyBJTiAoMTAwMSwzMDAwKQorT1JERVIgQlkgdGhvdXNhbmQgREVTQywgdGVudGhv dXMgREVTQzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIEluZGV4IFNjYW4gQmFja3dhcmQgdXNpbmcgdGVuazFfdGhvdXNfdGVudGhvdXMgb24gdGVu azEKKyAgIEluZGV4IENvbmQ6ICgodGhvdXNhbmQgPCAyKSBBTkQgKHRlbnRob3VzID0gQU5ZICgn ezEwMDEsMzAwMH0nOjppbnRlZ2VyW10pKSkKKygyIHJvd3MpCisKK1NFTEVDVCB0aG91c2FuZCwg dGVudGhvdXMgRlJPTSB0ZW5rMQorV0hFUkUgdGhvdXNhbmQgPCAyIEFORCB0ZW50aG91cyBJTiAo MTAwMSwzMDAwKQorT1JERVIgQlkgdGhvdXNhbmQgREVTQywgdGVudGhvdXMgREVTQzsKKyB0aG91 c2FuZCB8IHRlbnRob3VzIAorLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgICAgICAgIDEgfCAgICAg MTAwMQorICAgICAgICAwIHwgICAgIDMwMDAKKygyIHJvd3MpCisKIFJFU0VUIGVuYWJsZV9pbmRl eG9ubHlzY2FuOwogLS0KIC0tIENoZWNrIGVsaW1pbmF0aW9uIG9mIGNvbnN0YW50LU5VTEwgc3Vi ZXhwcmVzc2lvbnMKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5v dXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0CmluZGV4IDliODYzOGYyOC4u MjBiNjlmZjg3IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0 CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQKQEAgLTc3OTcsMTAgKzc3 OTcsOSBAQCB3aGVyZSBqMS5pZDEgJSAxMDAwID0gMSBhbmQgajIuaWQxICUgMTAwMCA9IDEgYW5k IGoyLmlkMSA+PSBhbnkgKGFycmF5WzEsNV0pOwogICAgTWVyZ2UgQ29uZDogKGoxLmlkMSA9IGoy LmlkMSkKICAgIEpvaW4gRmlsdGVyOiAoajIuaWQyID0gajEuaWQyKQogICAgLT4gIEluZGV4IFNj YW4gdXNpbmcgajFfaWQxX2lkeCBvbiBqMQotICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyBq Ml9wa2V5IG9uIGoyCisgICAtPiAgSW5kZXggU2NhbiB1c2luZyBqMl9pZDFfaWR4IG9uIGoyCiAg ICAgICAgICBJbmRleCBDb25kOiAoaWQxID49IEFOWSAoJ3sxLDV9Jzo6aW50ZWdlcltdKSkKLSAg ICAgICAgIEZpbHRlcjogKChpZDEgJSAxMDAwKSA9IDEpCi0oNyByb3dzKQorKDYgcm93cykKIAog c2VsZWN0ICogZnJvbSBqMQogaW5uZXIgam9pbiBqMiBvbiBqMS5pZDEgPSBqMi5pZDEgYW5kIGox LmlkMiA9IGoyLmlkMgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY3JlYXRlX2lu ZGV4LnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NyZWF0ZV9pbmRleC5zcWwKaW5kZXggZDQ5 Y2U5ZjMwLi40MWI5NTVhMjcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NyZWF0 ZV9pbmRleC5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY3JlYXRlX2luZGV4LnNxbApA QCAtNzUzLDcgKzc1Myw3IEBAIFNFTEVDVCBjb3VudCgqKSBGUk9NIGR1cGluZGV4Y29scwogICBX SEVSRSBmMSBCRVRXRUVOICdXQScgQU5EICdaWlonIGFuZCBpZCA8IDEwMDAgYW5kIGYxIH48fiAn WVgnOwogCiAtLQotLS0gQ2hlY2sgb3JkZXJpbmcgb2YgPUFOWSBpbmRleHF1YWwgcmVzdWx0cyAo YnVnIGluIDkuMi4wKQorLS0gQ2hlY2sgdGhhdCBpbmRleCBzY2FucyB3aXRoID1BTlkgaW5kZXhx dWFscyByZXR1cm4gcm93cyBpbiBpbmRleCBvcmRlcgogLS0KIAogZXhwbGFpbiAoY29zdHMgb2Zm KQpAQCAtNzc0LDYgKzc3NCwxNSBAQCBTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVu azEKIFdIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKIE9SREVS IEJZIHRob3VzYW5kOwogCitleHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1QgdGhvdXNhbmQsIHRl bnRob3VzIEZST00gdGVuazEKK1dIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEw MDEsMzAwMCkKK09SREVSIEJZIHRob3VzYW5kIERFU0MsIHRlbnRob3VzIERFU0M7CisKK1NFTEVD VCB0aG91c2FuZCwgdGVudGhvdXMgRlJPTSB0ZW5rMQorV0hFUkUgdGhvdXNhbmQgPCAyIEFORCB0 ZW50aG91cyBJTiAoMTAwMSwzMDAwKQorT1JERVIgQlkgdGhvdXNhbmQgREVTQywgdGVudGhvdXMg REVTQzsKKwogU0VUIGVuYWJsZV9pbmRleG9ubHlzY2FuID0gT0ZGOwogCiBleHBsYWluIChjb3N0 cyBvZmYpCkBAIC03ODUsNiArNzk0LDE1IEBAIFNFTEVDVCB0aG91c2FuZCwgdGVudGhvdXMgRlJP TSB0ZW5rMQogV0hFUkUgdGhvdXNhbmQgPCAyIEFORCB0ZW50aG91cyBJTiAoMTAwMSwzMDAwKQog T1JERVIgQlkgdGhvdXNhbmQ7CiAKK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NFTEVDVCB0aG91c2Fu ZCwgdGVudGhvdXMgRlJPTSB0ZW5rMQorV0hFUkUgdGhvdXNhbmQgPCAyIEFORCB0ZW50aG91cyBJ TiAoMTAwMSwzMDAwKQorT1JERVIgQlkgdGhvdXNhbmQgREVTQywgdGVudGhvdXMgREVTQzsKKwor U0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBGUk9NIHRlbmsxCitXSEVSRSB0aG91c2FuZCA8IDIg QU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDApCitPUkRFUiBCWSB0aG91c2FuZCBERVNDLCB0ZW50 aG91cyBERVNDOworCiBSRVNFVCBlbmFibGVfaW5kZXhvbmx5c2NhbjsKIAogLS0KLS0gCjIuNDAu MQoK --000000000000342ac7060674908b--