From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7ECC4C10F15 for ; Thu, 25 Apr 2024 08:04:51 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rzu4a-0005nI-G6; Thu, 25 Apr 2024 04:03:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rzu4C-0005BM-PH for grub-devel@gnu.org; Thu, 25 Apr 2024 04:02:54 -0400 Received: from mail-lj1-x234.google.com ([2a00:1450:4864:20::234]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1rzu47-0003GT-NP for grub-devel@gnu.org; Thu, 25 Apr 2024 04:02:52 -0400 Received: by mail-lj1-x234.google.com with SMTP id 38308e7fff4ca-2def8e5ae60so2708561fa.2 for ; Thu, 25 Apr 2024 01:02:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1714032165; x=1714636965; darn=gnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kHEJFiUOAOUpmcpNXp00y+sfJAuC8XBKcbHeANGX0V0=; b=NLrNppAqgBIrSdQxdqXJQp+MwBLEgtUObz55bsbWdyvUzneiO3YobH3SBceYzU7ex4 rNW9UsleoMPDI12joXWdSaT++z/TBcWN3NcgYhfW9qWNxJRuHaQUCSIuxg7ADvMmnJ3c lCMpy9CVwDNaaAq+NsE2SbIE0WfSjKM7YGzuykA4615ANMGuDLx5dD/HwrKgYhqEDMcw uevvPhTZu+dK4NGVKKp4jjHAs6NZsJmtgXl6k98ktoVr90qvAsZBSI6iQvnSIlPMGKhD 1jRAHZbYubhBQROwITtk/mDOkaKT0sWqEgEJ2yexOJwV4hmC5y35vgFSEOnr/LEPfxk7 c/NQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714032165; x=1714636965; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kHEJFiUOAOUpmcpNXp00y+sfJAuC8XBKcbHeANGX0V0=; b=OCW4APgHwlUPJCKHSdKP7rR4DElf9fMdHYD6Hm4xOGFjVi/Jwq89W+67laxn/ZH4nX 21BLjvBS845HvDxNmd+LpMLubliMeHsO2TQRsgnRWmqduGSygOAAJ9IKG1Flv9BTIUAU wruQNX767wPCVXn/JI8c12ISpOUGUg6h619FtLq5mm/UGRs+g1dAwr6qCcO+z3tivv/0 xZaaN3qD2S20l6cn4ueNNfQvJ+eogAK87xBPkyBQAKZZEs+uU9kK0kdkV3OvctWo+D4a LmaTah9Sya+i+l/rP+TZ0V1Fo8MoWd1CCxGP2/I78SbYbt7rTEZnuZFd+ZMQTj44pWka Y/HQ== X-Gm-Message-State: AOJu0YyIcgOE8Dxgvs+FzY9vaGdICs+Nw9jo4O++jaMofcT0sjfJgMEj DvlamtlrR08xOT18Ds/8F7/K7wV+DfReHuwhyi0CpFO2Ln52kZqPp4MGH6zQToseec6BVA2x97p o X-Google-Smtp-Source: AGHT+IG+iuEhupZbEZE9awswzMsYlyuzpncisftLH9PmjWkfLejfUslAKKDsOgjrQE8kgQA4uTFIbg== X-Received: by 2002:a2e:87d4:0:b0:2da:50f8:dfab with SMTP id v20-20020a2e87d4000000b002da50f8dfabmr3198822ljj.7.1714032165262; Thu, 25 Apr 2024 01:02:45 -0700 (PDT) Received: from localhost (111-240-145-108.dynamic-ip.hinet.net. [111.240.145.108]) by smtp.gmail.com with ESMTPSA id o13-20020a056a001b4d00b006e6c733bde9sm12603172pfv.155.2024.04.25.01.02.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Apr 2024 01:02:44 -0700 (PDT) To: The development of GNU GRUB Subject: [PATCH v13 11/20] key_protector: Add TPM2 Key Protector Date: Thu, 25 Apr 2024 16:01:57 +0800 Message-Id: <20240425080206.23902-12-glin@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20240425080206.23902-1-glin@suse.com> References: <20240425080206.23902-1-glin@suse.com> MIME-Version: 1.0 Received-SPF: permerror client-ip=2a00:1450:4864:20::234; envelope-from=glin@suse.com; helo=mail-lj1-x234.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Gary Lin via Grub-devel Reply-To: The development of GNU GRUB Cc: Gary Lin , Hernan Gatta , Daniel Axtens , Daniel Kiper , shkhisti@microsoft.com, jaskaran.khurana@microsoft.com, christopher.co@microsoft.com, daniel.mihai@microsoft.com, jaredz@redhat.com, development@efficientek.com, jejb@linux.ibm.com, mchang@suse.com, patrick.colp@oracle.com, Stefan Berger Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: grub-devel-bounces+grub-devel=archiver.kernel.org@gnu.org Sender: grub-devel-bounces+grub-devel=archiver.kernel.org@gnu.org RnJvbTogSGVybmFuIEdhdHRhIDxoZWdhdHRhQGxpbnV4Lm1pY3Jvc29mdC5jb20+CgpUaGUgVFBN MiBrZXkgcHJvdGVjdG9yIGlzIGEgbW9kdWxlIHRoYXQgZW5hYmxlcyB0aGUgYXV0b21hdGljIHJl dHJpZXZhbApvZiBhIGZ1bGx5LWVuY3J5cHRlZCBkaXNrJ3MgdW5sb2NraW5nIGtleSBmcm9tIGEg VFBNIDIuMC4KClRoZSB0aGVvcnkgb2Ygb3BlcmF0aW9uIGlzIHN1Y2ggdGhhdCB0aGUgbW9kdWxl IGFjY2VwdHMgdmFyaW91cwphcmd1bWVudHMsIG1vc3Qgb2Ygd2hpY2ggYXJlIG9wdGlvbmFsIGFu ZCB0aGVyZWZvcmUgcG9zc2VzcyByZWFzb25hYmxlCmRlZmF1bHRzLiBPbmUgb2YgdGhlc2UgYXJn dW1lbnRzIGlzIHRoZSBrZXlmaWxlL3RwbTJrZXkgcGFyYW1ldGVyLCB3aGljaAppcyBtYW5kYXRv cnkuIFRoZXJlIGFyZSB0d28gc3VwcG9ydGVkIGtleSBmb3JtYXRzOgoKMS4gUmF3IFNlYWxlZCBL ZXkgKC0ta2V5ZmlsZSkKICAgV2hlbiBzZWFsaW5nIGEga2V5IHdpdGggVFBNMl9DcmVhdGUsIHRo ZSBwdWJsaWMgcG9ydGlvbiBvZiB0aGUgc2VhbGVkCiAgIGtleSBpcyBzdG9yZWQgaW4gVFBNMkJf UFVCTElDLCBhbmQgdGhlIHByaXZhdGUgcG9ydGlvbiBpcyBpbgogICBUUE0yQl9QUklWQVRFLiBU aGUgcmF3IHNlYWxlZCBrZXkgZ2x1ZXMgdGhlIGZ1bGx5IG1hcnNoYWxsZWQKICAgVFBNMkJfUFVC TElDIGFuZCBUUE0yQl9QUklWQVRFIGludG8gb25lIGZpbGUuCgoyLiBUUE0gMi4wIEtleSAoLS10 cG0ya2V5KQogICBUaGUgZm9sbG93aW5nIGlzIHRoZSBBU04uMSBkZWZpbml0aW9uIG9mIFRQTSAy LjAgS2V5IEZpbGU6CgogICBUUE1Qb2xpY3kgOjo9IFNFUVVFTkNFIHsKICAgICBDb21tYW5kQ29k ZSAgIFswXSBFWFBMSUNJVCBJTlRFR0VSCiAgICAgQ29tbWFuZFBvbGljeSBbMV0gRVhQTElDSVQg T0NURVQgU1RSSU5HCiAgIH0KCiAgIFRQTUF1dGhQb2xpY3kgOjo9IFNFUVVFTkNFIHsKICAgICBO YW1lICAgIFswXSBFWFBMSUNJVCBVVEY4U1RSSU5HIE9QVElPTkFMCiAgICAgUG9saWN5ICBbMV0g RVhQTElDSVQgU0VRVUVOQ0UgT0YgVFBNUG9saWN5CiAgIH0KCiAgIFRQTUtleSA6Oj0gU0VRVUVO Q0UgewogICAgIHR5cGUgICAgICAgIE9CSkVDVCBJREVOVElGSUVSCiAgICAgZW1wdHlBdXRoICAg WzBdIEVYUExJQ0lUIEJPT0xFQU4gT1BUSU9OQUwKICAgICBwb2xpY3kgICAgICBbMV0gRVhQTElD SVQgU0VRVUVOQ0UgT0YgVFBNUG9saWN5IE9QVElPTkFMCiAgICAgc2VjcmV0ICAgICAgWzJdIEVY UExJQ0lUIE9DVEVUIFNUUklORyBPUFRJT05BTAogICAgIGF1dGhQb2xpY3kgIFszXSBFWFBMSUNJ VCBTRVFVRU5DRSBPRiBUUE1BdXRoUG9saWN5IE9QVElPTkFMCiAgICAgZGVzY3JpcHRpb24gWzRd IEVYUExJQ0lUIFVURjhTdHJpbmcgT1BUSU9OQUwsCiAgICAgcnNhUGFyZW50ICAgWzVdIEVYUExJ Q0lUIEJPT0xFQU4gT1BUSU9OQUwsCiAgICAgcGFyZW50ICAgICAgSU5URUdFUgogICAgIHB1Ymtl eSAgICAgIE9DVEVUIFNUUklORwogICAgIHByaXZrZXkgICAgIE9DVEVUIFNUUklORwogICB9Cgog IFRoZSBUUE0yIGtleSBwcm90ZWN0b3Igb25seSBleHBlY3RzIGEgInNlYWxlZCIga2V5IGluIERF UiBlbmNvZGluZywKICBzbyAndHlwZScgaXMgYWx3YXlzIDIuMjMuMTMzLjEwLjEuNSwgJ2VtcHR5 QXV0aCcgaXMgJ1RSVUUnLCBhbmQKICAnc2VjcmV0JyBpcyBlbXB0eS4gJ3BvbGljeScgYW5kICdh dXRoUG9saWN5JyBhcmUgdGhlIHBvc3NpYmxlIHBvbGljeQogIGNvbW1hbmQgc2VxdWVuY2VzIHRv IGNvbnN0cnVzdCB0aGUgcG9saWN5IGRpZ2VzdCB0byB1bnNlYWwgdGhlIGtleS4KICBTaW1pbGFy IHRvIHRoZSByYXcgc2VhbGVkIGtleSwgdGhlIHB1YmxpYyBwb3J0aW9uIChUUE0yQl9QVUJMSUMp IG9mCiAgdGhlIHNlYWxlZCBrZXkgaXMgc3RvcmVkIGluICdwdWJrZXknLCBhbmQgdGhlIHByaXZh dGUgcG9ydGlvbgogIChUUE0yQl9QUklWQVRFKSBpcyBpbiAncHJpdmtleScuCgogIEZvciBtb3Jl IGRldGFpbHM6IGh0dHBzOi8vd3d3LmhhbnNlbnBhcnRuZXJzaGlwLmNvbS9kcmFmdC1ib3R0b21s ZXktdHBtMi1rZXlzLmh0bWwKClRoaXMgc2VhbGVkIGtleSBmaWxlIGlzIGNyZWF0ZWQgdmlhIHRo ZSBncnViLXByb3RlY3QgdG9vbC4gVGhlIHRvb2wKdXRpbGl6ZXMgdGhlIFRQTSdzIHNlYWxpbmcg ZnVuY3Rpb25hbGl0eSB0byBzZWFsIChpLmUuLCBlbmNyeXB0KSBhbgp1bmxvY2tpbmcga2V5IHVz aW5nIGEgU3RvcmFnZSBSb290IEtleSAoU1JLKSB0byB0aGUgdmFsdWVzIG9mIHZhcmlvdXMKUGxh dGZvcm0gQ29uZmlndXJhdGlvbiBSZWdpc3RlcnMgKFBDUnMpLiBUaGVzZSBQQ1JzIHJlZmxlY3Qg dGhlIHN0YXRlCm9mIHRoZSBzeXN0ZW0gYXMgaXQgYm9vdHMuIElmIHRoZSB2YWx1ZXMgYXJlIGFz IGV4cGVjdGVkLCB0aGUgc3lzdGVtCm1heSBiZSBjb25zaWRlcmVkIHRydXN0d29ydGh5LCBhdCB3 aGljaCBwb2ludCB0aGUgVFBNIGFsbG93cyBmb3IgYQpjYWxsZXIgdG8gdXRpbGl6ZSB0aGUgcHJp dmF0ZSBjb21wb25lbnQgb2YgdGhlIFNSSyB0byB1bnNlYWwgKGkuZS4sCmRlY3J5cHQpIHRoZSBz ZWFsZWQga2V5IGZpbGUuIFRoZSBjYWxsZXIsIGluIHRoaXMgY2FzZSwgaXMgdGhpcyBrZXkKcHJv dGVjdG9yLgoKVGhlIFRQTTIga2V5IHByb3RlY3RvciByZWdpc3RlcnMgdHdvIGNvbW1hbmRzOgoK LSB0cG0yX2tleV9wcm90ZWN0b3JfaW5pdDogSW5pdGlhbGl6ZXMgdGhlIHN0YXRlIG9mIHRoZSBU UE0yIGtleQogICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0b3IgZm9yIGxhdGVyIHVz YWdlLCBjbGVhcmluZyBhbnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgc3Rh dGUsIHRvbywgaWYgYW55LgoKLSB0cG0yX2tleV9wcm90ZWN0b3JfY2xlYXI6IENsZWFycyBhbnkg c3RhdGUgc2V0IGJ5IHRwbTJfa2V5X3Byb3RlY3Rvcl9pbml0LgoKVGhlIHdheSB0aGlzIGlzIGV4 cGVjdGVkIHRvIGJlIHVzZWQgcmVxdWlyZXMgdGhlIHVzZXIgdG8sIGVpdGhlcgppbnRlcmFjdGl2 ZWx5IG9yLCBub3JtYWxseSwgdmlhIGEgYm9vdCBzY3JpcHQsIGluaXRpYWxpemUvY29uZmlndXJl CnRoZSBrZXkgcHJvdGVjdG9yIGFuZCB0aGVuIHNwZWNpZnkgdGhhdCBpdCBiZSB1c2VkIGJ5IHRo ZSAnY3J5cHRvbW91bnQnCmNvbW1hbmQgKG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBjb21tYW5kIGFy ZSBpbiBhIGRpZmZlcmVudCBwYXRjaCkuCgpGb3IgaW5zdGFuY2UsIHRvIHVuc2VhbCB0aGUgcmF3 IHNlYWxlZCBrZXkgZmlsZToKCnRwbTJfa2V5X3Byb3RlY3Rvcl9pbml0IC0ta2V5ZmlsZT0oaGQw LGdwdDEpL2VmaS9ncnViMi9zZWFsZWQtMS5rZXkKY3J5cHRvbW91bnQgLXUgPFBBUlQxX1VVSUQ+ IC1QIHRwbTIKCnRwbTJfa2V5X3Byb3RlY3Rvcl9pbml0IC0ta2V5ZmlsZT0oaGQwLGdwdDEpL2Vm aS9ncnViMi9zZWFsZWQtMi5rZXkgLS1wY3JzPTcsMTEKY3J5cHRvbW91bnQgLXUgPFBBUlQyX1VV SUQ+IC1QIHRwbTIKCk9yLCB0byB1bnNlYWwgdGhlIFRQTSAyLjAgS2V5IGZpbGU6Cgp0cG0yX2tl eV9wcm90ZWN0b3JfaW5pdCAtLXRwbTJrZXk9KGhkMCxncHQxKS9lZmkvZ3J1YjIvc2VhbGVkLTEu dHBtCmNyeXB0b21vdW50IC11IDxQQVJUMV9VVUlEPiAtUCB0cG0yCgp0cG0yX2tleV9wcm90ZWN0 b3JfaW5pdCAtLXRwbTJrZXk9KGhkMCxncHQxKS9lZmkvZ3J1YjIvc2VhbGVkLTIudHBtIC0tcGNy cz03LDExCmNyeXB0b21vdW50IC11IDxQQVJUMl9VVUlEPiAtUCB0cG0yCgpJZiBhIHVzZXIgZG9l cyBub3QgaW5pdGlhbGl6ZSB0aGUga2V5IHByb3RlY3RvciBhbmQgYXR0ZW1wdHMgdG8gdXNlIGl0 CmFueXdheSwgdGhlIHByb3RlY3RvciByZXR1cm5zIGFuIGVycm9yLgoKQmVmb3JlIHVuc2VhbGlu ZyB0aGUga2V5LCB0aGUgVFBNMiBrZXkgcHJvdGVjdG9yIGZvbGxvd3MgdGhlICJUUE1Qb2xpY3ki CnNlcXVlbmNlcyB0byBlbmZvcmNlIHRoZSBUUE0gcG9saWN5IGNvbW1hbmRzIHRvIGNvbnN0cnVj dCBhIHZhbGlkIHBvbGljeQpkaWdlc3QgdG8gdW5zZWFsIHRoZSBrZXkuCgpGb3IgdGhlIFRQTSAy LjAgS2V5IGZpbGVzLCAnYXV0aFBvbGljeScgbWF5IGNvbnRhaW4gbXVsdGlwbGUgIlRQTVBvbGlj eSIKc2VxdWVuY2VzLCB0aGUgVFBNMiBrZXkgcHJvdGVjdG9yIGl0ZXJhdGVzICdhdXRoUG9saWN5 JyB0byBmaW5kIGEgdmFsaWQKc2VxdWVuY2UgdG8gdW5zZWFsIGtleS4gSWYgJ2F1dGhQb2xpY3kn IGlzIGVtcHR5IG9yIGFsbCBzZXF1ZW5jZXMgaW4KJ2F1dGhQb2xpY3knIGZhaWwsIHRoZSBwcm90 ZWN0b3IgdHJpZXMgdGhlIG9uZSBmcm9tICdwb2xpY3knLiBJbiBjYXNlCidwb2xpY3knIGlzIGFs c28gZW1wdHksIHRoZSBwcm90ZWN0b3IgY3JlYXRlcyBhICJUUE1Qb2xpY3kiIHNlcXVlbmNlCmJh c2VkIG9uIHRoZSBnaXZlbiBQQ1Igc2VsZWN0aW9uLgoKRm9yIHRoZSByYXcgc2VhbGVkIGtleSwg dGhlIFRQTTIga2V5IHByb3RlY3RvciB0cmVhdHMgdGhlIGtleSBmaWxlIGFzIGEKVFBNIDIuMCBL ZXkgZmlsZSB3aXRob3V0ICdhdXRoUG9saWN5JyBhbmQgJ3BvbGljeScsIHNvIHRoZSAiVFBNUG9s aWN5IgpzZXF1ZW5jZSBpcyBhbHdheXMgYmFzZWQgb24gdGhlIFBDUiBzZWxlY3Rpb24gZnJvbSB0 aGUgY29tbWFuZApwYXJhbWV0ZXJzLgoKVGhpcyBjb21taXQgb25seSBzdXBwb3J0cyBvbmUgcG9s aWN5IGNvbW1hbmQ6IFRQTTJfUG9saWN5UENSLiBUaGUKY29tbWFuZCBzZXQgd2lsbCBiZSBleHRl bmRlZCB0byBzdXBwb3J0IGFkdmFuY2VkIGZlYXR1cmVzLCBzdWNoIGFzCmF1dGhvcml6ZWQgcG9s aWN5LCBpbiB0aGUgbGF0ZXIgY29tbWl0cy4KCkNjOiBTdGVmYW4gQmVyZ2VyIDxzdGVmYW5iQGxp bnV4LmlibS5jb20+CkNjOiBKYW1lcyBCb3R0b21sZXkgPGplamJAbGludXguaWJtLmNvbT4KU2ln bmVkLW9mZi1ieTogSGVybmFuIEdhdHRhIDxoZWdhdHRhQGxpbnV4Lm1pY3Jvc29mdC5jb20+ClNp Z25lZC1vZmYtYnk6IEdhcnkgTGluIDxnbGluQHN1c2UuY29tPgotLS0KIGdydWItY29yZS9NYWtl ZmlsZS5jb3JlLmRlZiAgICAgICB8ICAgMTMgKwogZ3J1Yi1jb3JlL3RwbTIvYXJncy5jICAgICAg ICAgICAgIHwgIDE0MCArKysrCiBncnViLWNvcmUvdHBtMi9tb2R1bGUuYyAgICAgICAgICAgfCAx MjI2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBncnViLWNvcmUvdHBtMi90cG0ya2V5 LmFzbiAgICAgICAgfCAgIDMzICsKIGdydWItY29yZS90cG0yL3RwbTJrZXkuYyAgICAgICAgICB8 ICA0NzYgKysrKysrKysrKysKIGdydWItY29yZS90cG0yL3RwbTJrZXlfYXNuMV90YWIuYyB8ICAg NDUgKysKIGluY2x1ZGUvZ3J1Yi90cG0yL2ludGVybmFsL2FyZ3MuaCB8ICAgNDkgKysKIGluY2x1 ZGUvZ3J1Yi90cG0yL3RwbTJrZXkuaCAgICAgICB8ICAgODYgKysKIDggZmlsZXMgY2hhbmdlZCwg MjA2OCBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ3J1Yi1jb3JlL3RwbTIvYXJn cy5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ3J1Yi1jb3JlL3RwbTIvbW9kdWxlLmMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBncnViLWNvcmUvdHBtMi90cG0ya2V5LmFzbgogY3JlYXRlIG1vZGUgMTAwNjQ0 IGdydWItY29yZS90cG0yL3RwbTJrZXkuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdydWItY29yZS90 cG0yL3RwbTJrZXlfYXNuMV90YWIuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvZ3J1Yi90 cG0yL2ludGVybmFsL2FyZ3MuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvZ3J1Yi90cG0y L3RwbTJrZXkuaAoKZGlmZiAtLWdpdCBhL2dydWItY29yZS9NYWtlZmlsZS5jb3JlLmRlZiBiL2dy dWItY29yZS9NYWtlZmlsZS5jb3JlLmRlZgppbmRleCBmZTU4ZWM3NDAuLjg1YWFhZGY2OCAxMDA2 NDQKLS0tIGEvZ3J1Yi1jb3JlL01ha2VmaWxlLmNvcmUuZGVmCisrKyBiL2dydWItY29yZS9NYWtl ZmlsZS5jb3JlLmRlZgpAQCAtMjU2MSw2ICsyNTYxLDE5IEBAIG1vZHVsZSA9IHsKICAgZW5hYmxl ID0gZWZpOwogfTsKIAorbW9kdWxlID0geworICBuYW1lID0gdHBtMjsKKyAgY29tbW9uID0gdHBt Mi9hcmdzLmM7CisgIGNvbW1vbiA9IHRwbTIvYnVmZmVyLmM7CisgIGNvbW1vbiA9IHRwbTIvbW9k dWxlLmM7CisgIGNvbW1vbiA9IHRwbTIvbXUuYzsKKyAgY29tbW9uID0gdHBtMi90cG0yLmM7Cisg IGNvbW1vbiA9IHRwbTIvdHBtMmtleS5jOworICBjb21tb24gPSB0cG0yL3RwbTJrZXlfYXNuMV90 YWIuYzsKKyAgZWZpID0gdHBtMi90Y2cyLmM7CisgIGVuYWJsZSA9IGVmaTsKK307CisKIG1vZHVs ZSA9IHsKICAgbmFtZSA9IHRyOwogICBjb21tb24gPSBjb21tYW5kcy90ci5jOwpkaWZmIC0tZ2l0 IGEvZ3J1Yi1jb3JlL3RwbTIvYXJncy5jIGIvZ3J1Yi1jb3JlL3RwbTIvYXJncy5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMC4uYzExMjgwYWI5Ci0tLSAvZGV2L251bGwKKysr IGIvZ3J1Yi1jb3JlL3RwbTIvYXJncy5jCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogIEdSVUIg IC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMjIgTWlj cm9zb2Z0IENvcnBvcmF0aW9uCisgKgorICogIEdSVUIgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNh biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhl IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5z ZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBH UlVCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg KiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy cmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS IFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v cmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIEdSVUIuICBJZiBu b3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUg PGdydWIvZXJyLmg+CisjaW5jbHVkZSA8Z3J1Yi9tbS5oPgorI2luY2x1ZGUgPGdydWIvbWlzYy5o PgorI2luY2x1ZGUgPGdydWIvdHBtMi9pbnRlcm5hbC9hcmdzLmg+CisKK2dydWJfZXJyX3QKK2dy dWJfdHBtMl9wcm90ZWN0b3JfcGFyc2VfcGNycyAoY2hhciAqdmFsdWUsIGdydWJfdWludDhfdCAq cGNycywKKwkJCQlncnViX3VpbnQ4X3QgKnBjcl9jb3VudCkKK3sKKyAgY2hhciAqY3VycmVudF9w Y3IgPSB2YWx1ZTsKKyAgY2hhciAqbmV4dF9wY3I7CisgIHVuc2lnbmVkIGxvbmcgcGNyOworICBn cnViX3VpbnQ4X3QgaTsKKworICBpZiAoZ3J1Yl9zdHJsZW4gKHZhbHVlKSA9PSAwKQorICAgIHJl dHVybiBHUlVCX0VSUl9CQURfQVJHVU1FTlQ7CisKKyAgKnBjcl9jb3VudCA9IDA7CisgIGZvciAo aSA9IDA7IGkgPCBUUE1fTUFYX1BDUlM7IGkrKykKKyAgICB7CisgICAgICBuZXh0X3BjciA9IGdy dWJfc3RyY2hyIChjdXJyZW50X3BjciwgJywnKTsKKyAgICAgIGlmIChuZXh0X3BjciA9PSBjdXJy ZW50X3BjcikKKwlyZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0FSR1VNRU5ULAorCQkJ ICAgTl8oIkVtcHR5IGVudHJ5IGluIFBDUiBsaXN0IikpOworICAgICAgaWYgKG5leHRfcGNyKQor CSpuZXh0X3BjciA9ICdcMCc7CisKKyAgICAgIGdydWJfZXJybm8gPSBHUlVCX0VSUl9OT05FOwor ICAgICAgcGNyID0gZ3J1Yl9zdHJ0b3VsIChjdXJyZW50X3BjciwgTlVMTCwgMTApOworICAgICAg aWYgKGdydWJfZXJybm8gIT0gR1JVQl9FUlJfTk9ORSkKKwlyZXR1cm4gZ3J1Yl9lcnJvciAoZ3J1 Yl9lcnJubywKKwkJCSAgIE5fKCJFbnRyeSAnJXMnIGluIFBDUiBsaXN0IGlzIG5vdCBhIG51bWJl ciIpLAorCQkJICAgY3VycmVudF9wY3IpOworCisgICAgICBpZiAocGNyID4gVFBNX01BWF9QQ1JT KQorCXJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9PVVRfT0ZfUkFOR0UsCisJCQkgICBOXygi RW50cnkgJWx1IGluIFBDUiBsaXN0IGlzIHRvbyBsYXJnZSB0byBiZSBhIFBDUiAiCisJCQkgICAg ICAibnVtYmVyLCBQQ1IgbnVtYmVycyByYW5nZSBmcm9tIDAgdG8gJXUiKSwKKwkJCSAgIHBjciwg VFBNX01BWF9QQ1JTKTsKKworICAgICAgcGNyc1tpXSA9IChncnViX3VpbnQ4X3QpcGNyOworICAg ICAgKnBjcl9jb3VudCArPSAxOworCisgICAgICBpZiAobmV4dF9wY3IgPT0gTlVMTCkKKwlicmVh azsKKworICAgICAgY3VycmVudF9wY3IgPSBuZXh0X3BjciArIDE7CisgICAgICBpZiAoKmN1cnJl bnRfcGNyID09ICdcMCcpCisJcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9BUkdVTUVO VCwKKwkJCSAgIE5fKCJUcmFpbGluZyBjb21tYSBhdCB0aGUgZW5kIG9mIFBDUiBsaXN0IikpOwor ICAgIH0KKworICBpZiAoaSA9PSBUUE1fTUFYX1BDUlMpCisgICAgcmV0dXJuIGdydWJfZXJyb3Ig KEdSVUJfRVJSX09VVF9PRl9SQU5HRSwKKwkJICAgICAgIE5fKCJUb28gbWFueSBQQ1JzIGluIFBD UiBsaXN0LCB0aGUgbWF4aW11bSBudW1iZXIgb2YgIgorCQkJICAiUENScyBpcyAldSIpLCBUUE1f TUFYX1BDUlMpOworCisgIHJldHVybiBHUlVCX0VSUl9OT05FOworfQorCitncnViX2Vycl90Citn cnViX3RwbTJfcHJvdGVjdG9yX3BhcnNlX2FzeW1tZXRyaWMgKGNvbnN0IGNoYXIgKnZhbHVlLAor CQkJCSAgICAgIGdydWJfc3JrX3R5cGVfdCAqc3JrX3R5cGUpCit7CisgIGlmIChncnViX3N0cmNh c2VjbXAgKHZhbHVlLCAiRUNDIikgPT0gMCB8fAorICAgICAgZ3J1Yl9zdHJjYXNlY21wICh2YWx1 ZSwgIkVDQ19OSVNUX1AyNTYiKSA9PSAwKQorICAgIHsKKyAgICAgIHNya190eXBlLT50eXBlID0g VFBNX0FMR19FQ0M7CisgICAgICBzcmtfdHlwZS0+ZGV0YWlsLmVjY19jdXJ2ZSA9IFRQTV9FQ0Nf TklTVF9QMjU2OworICAgIH0KKyAgZWxzZSBpZiAoZ3J1Yl9zdHJjYXNlY21wICh2YWx1ZSwgIlJT QSIpID09IDAgfHwKKwkgICBncnViX3N0cmNhc2VjbXAgKHZhbHVlLCAiUlNBMjA0OCIpID09IDAp CisgICAgeworICAgICAgc3JrX3R5cGUtPnR5cGUgPSBUUE1fQUxHX1JTQTsKKyAgICAgIHNya190 eXBlLT5kZXRhaWwucnNhX2JpdHMgPSAyMDQ4OworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBn cnViX2Vycm9yIChHUlVCX0VSUl9PVVRfT0ZfUkFOR0UsCisJCSAgICAgICBOXygiVmFsdWUgJyVz JyBpcyBub3QgYSB2YWxpZCBhc3ltbWV0cmljIGtleSB0eXBlIiksCisJCSAgICAgICB2YWx1ZSk7 CisKKyAgcmV0dXJuIEdSVUJfRVJSX05PTkU7Cit9CisKK2dydWJfZXJyX3QKK2dydWJfdHBtMl9w cm90ZWN0b3JfcGFyc2VfYmFuayAoY29uc3QgY2hhciAqdmFsdWUsIFRQTV9BTEdfSUQgKmJhbmsp Cit7CisgIGlmIChncnViX3N0cmNhc2VjbXAgKHZhbHVlLCAiU0hBMSIpID09IDApCisgICAgKmJh bmsgPSBUUE1fQUxHX1NIQTE7CisgIGVsc2UgaWYgKGdydWJfc3RyY2FzZWNtcCAodmFsdWUsICJT SEEyNTYiKSA9PSAwKQorICAgICpiYW5rID0gVFBNX0FMR19TSEEyNTY7CisgIGVsc2UgaWYgKGdy dWJfc3RyY2FzZWNtcCAodmFsdWUsICJTSEEzODQiKSA9PSAwKQorICAgICpiYW5rID0gVFBNX0FM R19TSEEzODQ7CisgIGVsc2UgaWYgKGdydWJfc3RyY2FzZWNtcCAodmFsdWUsICJTSEE1MTIiKSA9 PSAwKQorICAgICpiYW5rID0gVFBNX0FMR19TSEE1MTI7CisgIGVsc2UKKyAgICByZXR1cm4gZ3J1 Yl9lcnJvciAoR1JVQl9FUlJfT1VUX09GX1JBTkdFLAorCQkgICAgICAgTl8oIlZhbHVlICclcycg aXMgbm90IGEgdmFsaWQgUENSIGJhbmsiKSwgdmFsdWUpOworCisgIHJldHVybiBHUlVCX0VSUl9O T05FOworfQorCitncnViX2Vycl90CitncnViX3RwbTJfcHJvdGVjdG9yX3BhcnNlX3RwbV9oYW5k bGUgKGNvbnN0IGNoYXIgKnZhbHVlLCBUUE1fSEFORExFICpoYW5kbGUpCit7CisgIHVuc2lnbmVk IGxvbmcgbnVtOworCisgIGdydWJfZXJybm8gPSBHUlVCX0VSUl9OT05FOworICBudW0gPSBncnVi X3N0cnRvdWwgKHZhbHVlLCBOVUxMLCAwKTsKKyAgaWYgKGdydWJfZXJybm8gIT0gR1JVQl9FUlJf Tk9ORSkKKyAgICByZXR1cm4gZ3J1Yl9lcnJvciAoZ3J1Yl9lcnJubywgTl8oIlRQTSBoYW5kbGUg dmFsdWUgJyVzJyBpcyBub3QgYSBudW1iZXIiKSwKKwkJICAgICAgIHZhbHVlKTsKKworICBpZiAo bnVtID4gR1JVQl9VSU5UX01BWCkKKyAgICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfT1VU X09GX1JBTkdFLAorCQkgICAgICAgTl8oIlZhbHVlICVsdSBpcyB0b28gbGFyZ2UgdG8gYmUgYSBU UE0gaGFuZGxlLCBUUE0gIgorCQkJICAiaGFuZGxlcyBhcmUgdW5zaWduZWQgMzItYml0IGludGVn ZXJzIiksIG51bSk7CisKKyAgKmhhbmRsZSA9IChUUE1fSEFORExFKW51bTsKKworICByZXR1cm4g R1JVQl9FUlJfTk9ORTsKK30KZGlmZiAtLWdpdCBhL2dydWItY29yZS90cG0yL21vZHVsZS5jIGIv Z3J1Yi1jb3JlL3RwbTIvbW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwLi4zZGIyNWNlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9ncnViLWNvcmUvdHBtMi9tb2R1bGUu YwpAQCAtMCwwICsxLDEyMjYgQEAKKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9v dGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMjAyMiBNaWNyb3NvZnQgQ29ycG9yYXRpb24KKyAq CisgKiAgR1JVQiBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv b3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9w dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIEdSVUIgaXMgZGlzdHJpYnV0ZWQgaW4g dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FS UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5U QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAq ICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZ b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZQorICogIGFsb25nIHdpdGggR1JVQi4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3Lmdu dS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8Z3J1Yi9kbC5oPgorI2luY2x1ZGUg PGdydWIvZXh0Y21kLmg+CisjaW5jbHVkZSA8Z3J1Yi9maWxlLmg+CisjaW5jbHVkZSA8Z3J1Yi9s aWJ0YXNuMS5oPgorI2luY2x1ZGUgPGdydWIvbGlzdC5oPgorI2luY2x1ZGUgPGdydWIvbWlzYy5o PgorI2luY2x1ZGUgPGdydWIvbW0uaD4KKyNpbmNsdWRlIDxncnViL2tleV9wcm90ZWN0b3IuaD4K KyNpbmNsdWRlIDxncnViL3RwbTIvYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3J1Yi90cG0yL2ludGVy bmFsL2FyZ3MuaD4KKyNpbmNsdWRlIDxncnViL3RwbTIvaW50ZXJuYWwvdHlwZXMuaD4KKyNpbmNs dWRlIDxncnViL3RwbTIvbXUuaD4KKyNpbmNsdWRlIDxncnViL3RwbTIvdHBtMi5oPgorI2luY2x1 ZGUgPGdydWIvdHBtMi90cG0ya2V5Lmg+CisKK0dSVUJfTU9EX0xJQ0VOU0UgKCJHUEx2MysiKTsK KwordHlwZWRlZiBlbnVtIGdydWJfdHBtMl9wcm90ZWN0b3JfbW9kZQoreworICBHUlVCX1RQTTJf UFJPVEVDVE9SX01PREVfVU5TRVQsCisgIEdSVUJfVFBNMl9QUk9URUNUT1JfTU9ERV9TUkssCisg IEdSVUJfVFBNMl9QUk9URUNUT1JfTU9ERV9OVgorfSBncnViX3RwbTJfcHJvdGVjdG9yX21vZGVf dDsKKworZW51bSBncnViX3RwbTJfcHJvdGVjdG9yX29wdGlvbnMKK3sKKyAgT1BUSU9OX01PREUs CisgIE9QVElPTl9QQ1JTLAorICBPUFRJT05fQkFOSywKKyAgT1BUSU9OX1RQTTJLRVksCisgIE9Q VElPTl9LRVlGSUxFLAorICBPUFRJT05fU1JLLAorICBPUFRJT05fQVNZTU1FVFJJQywKKyAgT1BU SU9OX05WSU5ERVgKK307CisKK3N0cnVjdCBncnViX3RwbTJfcHJvdGVjdG9yX2NvbnRleHQKK3sK KyAgZ3J1Yl90cG0yX3Byb3RlY3Rvcl9tb2RlX3QgbW9kZTsKKyAgZ3J1Yl91aW50OF90IHBjcnNb VFBNX01BWF9QQ1JTXTsKKyAgZ3J1Yl91aW50OF90IHBjcl9jb3VudDsKKyAgZ3J1Yl9zcmtfdHlw ZV90IHNya190eXBlOworICBUUE1fQUxHX0lEIGJhbms7CisgIGNvbnN0IGNoYXIgKnRwbTJrZXk7 CisgIGNvbnN0IGNoYXIgKmtleWZpbGU7CisgIFRQTV9IQU5ETEUgc3JrOworICBUUE1fSEFORExF IG52OworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncnViX2FyZ19vcHRpb24gZ3J1Yl90cG0y X3Byb3RlY3Rvcl9pbml0X2NtZF9vcHRpb25zW10gPQorICB7CisgICAgLyogT3B0aW9ucyBmb3Ig YWxsIG1vZGVzICovCisgICAgeworICAgICAgLmxvbmdhcmcgID0gIm1vZGUiLAorICAgICAgLnNo b3J0YXJnID0gJ20nLAorICAgICAgLmZsYWdzICAgID0gMCwKKyAgICAgIC5hcmcgICAgICA9IE5V TEwsCisgICAgICAudHlwZSAgICAgPSBBUkdfVFlQRV9TVFJJTkcsCisgICAgICAuZG9jICAgICAg PQorCU5fKCJVbnNlYWwga2V5IHVzaW5nIFNSSyAoJ3NyaycpIChkZWZhdWx0KSBvciByZXRyaWV2 ZSBpdCBmcm9tIGFuIE5WICIKKwkgICAiSW5kZXggKCdudicpLiIpLAorICAgIH0sCisgICAgewor ICAgICAgLmxvbmdhcmcgID0gInBjcnMiLAorICAgICAgLnNob3J0YXJnID0gJ3AnLAorICAgICAg LmZsYWdzICAgID0gMCwKKyAgICAgIC5hcmcgICAgICA9IE5VTEwsCisgICAgICAudHlwZSAgICAg PSBBUkdfVFlQRV9TVFJJTkcsCisgICAgICAuZG9jICAgICAgPQorCU5fKCJDb21tYS1zZXBhcmF0 ZWQgbGlzdCBvZiBQQ1JzIHVzZWQgdG8gYXV0aG9yaXplIGtleSByZWxlYXNlICIKKwkgICAiZS5n LiwgJzcsMTEnLiAoZGVmYXVsdDogNykiKSwKKyAgICB9LAorICAgIHsKKyAgICAgIC5sb25nYXJn ICA9ICJiYW5rIiwKKyAgICAgIC5zaG9ydGFyZyA9ICdiJywKKyAgICAgIC5mbGFncyAgICA9IDAs CisgICAgICAuYXJnICAgICAgPSBOVUxMLAorICAgICAgLnR5cGUgICAgID0gQVJHX1RZUEVfU1RS SU5HLAorICAgICAgLmRvYyAgICAgID0KKwlOXygiQmFuayBvZiBQQ1JzIHVzZWQgdG8gYXV0aG9y aXplIGtleSByZWxlYXNlOiAiCisJICAgIlNIQTEsIFNIQTI1NiwgU0hBMzg0IG9yIFNIQTUxMi4g KGRlZmF1bHQ6IFNIQTI1NikiKSwKKyAgICB9LAorICAgIC8qIFNSSy1tb2RlIG9wdGlvbnMgKi8K KyAgICB7CisgICAgICAubG9uZ2FyZyAgPSAidHBtMmtleSIsCisgICAgICAuc2hvcnRhcmcgPSAn VCcsCisgICAgICAuZmxhZ3MgICAgPSAwLAorICAgICAgLmFyZyAgICAgID0gTlVMTCwKKyAgICAg IC50eXBlICAgICA9IEFSR19UWVBFX1NUUklORywKKyAgICAgIC5kb2MgICAgICA9CisJTl8oIklu IFNSSyBtb2RlLCBwYXRoIHRvIHRoZSBrZXkgZmlsZSBpbiB0aGUgVFBNIDIuMCBLZXkgRmlsZSBm b3JtYXQgIgorCSAgICJ0byB1bnNlYWwgdXNpbmcgdGhlIFRQTSAoZS5nLiwgKGhkMCxncHQxKS9i b290L2dydWIyL3NlYWxlZC50cG0pLiIpLAorICAgIH0sCisgICAgeworICAgICAgLmxvbmdhcmcg ID0gImtleWZpbGUiLAorICAgICAgLnNob3J0YXJnID0gJ2snLAorICAgICAgLmZsYWdzICAgID0g MCwKKyAgICAgIC5hcmcgICAgICA9IE5VTEwsCisgICAgICAudHlwZSAgICAgPSBBUkdfVFlQRV9T VFJJTkcsCisgICAgICAuZG9jICAgICAgPQorCU5fKCJJbiBTUksgbW9kZSwgcGF0aCB0byB0aGUg a2V5IGZpbGUgaW4gdGhlIHJhdyBmb3JtYXQgdG8gdW5zZWFsICIKKwkgICAidXNpbmcgdGhlIFRQ TSAoZS5nLiwgKGhkMCxncHQxKS9ib290L2dydWIyL3NlYWxlZC5rZXkpLiAiCisJICAgIihNYWlu bHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFBsZWFzZSB1c2UgJy0tdHBtMmtleScuKSIp LAorICAgIH0sCisgICAgeworICAgICAgLmxvbmdhcmcgID0gInNyayIsCisgICAgICAuc2hvcnRh cmcgPSAncycsCisgICAgICAuZmxhZ3MgICAgPSAwLAorICAgICAgLmFyZyAgICAgID0gTlVMTCwK KyAgICAgIC50eXBlICAgICA9IEFSR19UWVBFX1NUUklORywKKyAgICAgIC5kb2MgICAgICA9CisJ Tl8oIkluIFNSSyBtb2RlLCB0aGUgU1JLIGhhbmRsZSBpZiB0aGUgU1JLIGlzIHBlcnNpc3RlbnQu IiksCisgICAgfSwKKyAgICB7CisgICAgICAubG9uZ2FyZyAgPSAiYXN5bW1ldHJpYyIsCisgICAg ICAuc2hvcnRhcmcgPSAnYScsCisgICAgICAuZmxhZ3MgICAgPSAwLAorICAgICAgLmFyZyAgICAg ID0gTlVMTCwKKyAgICAgIC50eXBlICAgICA9IEFSR19UWVBFX1NUUklORywKKyAgICAgIC5kb2Mg ICAgICA9CisJTl8oIkluIFNSSyBtb2RlLCB0aGUgdHlwZSBvZiBTUks6IFJTQSAoUlNBMjA0OCkg YW5kIEVDQyAoRUNDX05JU1RfUDI1NikiCisJICAgIihkZWZhdWx0OiBFQ0MpIiksCisgICAgfSwK KyAgICAvKiBOViBJbmRleC1tb2RlIG9wdGlvbnMgKi8KKyAgICB7CisgICAgICAubG9uZ2FyZyAg PSAibnZpbmRleCIsCisgICAgICAuc2hvcnRhcmcgPSAnbicsCisgICAgICAuZmxhZ3MgICAgPSAw LAorICAgICAgLmFyZyAgICAgID0gTlVMTCwKKyAgICAgIC50eXBlICAgICA9IEFSR19UWVBFX1NU UklORywKKyAgICAgIC5kb2MgICAgICA9CisJTl8oIlJlcXVpcmVkIGluIE5WIEluZGV4IG1vZGUs IHRoZSBOViBoYW5kbGUgdG8gcmVhZCB3aGljaCBtdXN0ICIKKwkgICAicmVhZGlseSBleGlzdCBv biB0aGUgVFBNIGFuZCB3aGljaCBjb250YWlucyB0aGUga2V5LiIpLAorICAgIH0sCisgICAgLyog RW5kIG9mIGxpc3QgKi8KKyAgICB7MCwgMCwgMCwgMCwgMCwgMH0KKyAgfTsKKworc3RhdGljIGdy dWJfZXh0Y21kX3QgZ3J1Yl90cG0yX3Byb3RlY3Rvcl9pbml0X2NtZDsKK3N0YXRpYyBncnViX2V4 dGNtZF90IGdydWJfdHBtMl9wcm90ZWN0b3JfY2xlYXJfY21kOworc3RhdGljIHN0cnVjdCBncnVi X3RwbTJfcHJvdGVjdG9yX2NvbnRleHQgZ3J1Yl90cG0yX3Byb3RlY3Rvcl9jdHggPSB7IDAgfTsK Kworc3RhdGljIGdydWJfZXJyX3QKK2dydWJfdHBtMl9wcm90ZWN0b3Jfc3JrX3JlYWRfZmlsZSAo Y29uc3QgY2hhciAqZmlsZXBhdGgsIHZvaWQgKipidWZmZXIsCisJCQkJICAgZ3J1Yl9zaXplX3Qg KmJ1ZmZlcl9zaXplKQoreworICBncnViX2ZpbGVfdCBmaWxlOworICBncnViX29mZl90IGZpbGVf c2l6ZTsKKyAgdm9pZCAqcmVhZF9idWZmZXI7CisgIGdydWJfb2ZmX3QgcmVhZF9uOworICBncnVi X2Vycl90IGVycjsKKworICAvKiBVc2luZyBHUlVCX0ZJTEVfVFlQRV9TSUdOQVRVUkUgZW5zdXJl cyB3ZSBkbyBub3QgaGFzaCB0aGUga2V5ZmlsZSBpbnRvIFBDUjkKKyAgICogb3RoZXJ3aXNlIHdl J2xsIG5ldmVyIGJlIGFibGUgdG8gcHJlZGljdCB0aGUgdmFsdWUgb2YgUENSOSBhdCB1bnNlYWwg dGltZSAqLworICBmaWxlID0gZ3J1Yl9maWxlX29wZW4gKGZpbGVwYXRoLCBHUlVCX0ZJTEVfVFlQ RV9TSUdOQVRVUkUpOworICBpZiAoZmlsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFB1c2gg ZXJybm8gZnJvbSBncnViX2ZpbGVfb3BlbigpIGludG8gdGhlIGVycm9yIG1lc3NhZ2Ugc3RhY2sg Ki8KKyAgICAgIGdydWJfZXJyb3JfcHVzaCgpOworICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JV Ql9FUlJfRklMRV9OT1RfRk9VTkQsCisJCQlOXygiQ291bGQgbm90IG9wZW4gZmlsZTogJXNcbiIp LAorCQkJZmlsZXBhdGgpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgZmlsZV9zaXpl ID0gZ3J1Yl9maWxlX3NpemUgKGZpbGUpOworICBpZiAoZmlsZV9zaXplID09IDApCisgICAgewor ICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfT1VUX09GX1JBTkdFLAorCQkJTl8oIkNv dWxkIG5vdCByZWFkIGZpbGUgc2l6ZTogJXMiKSwKKwkJCWZpbGVwYXRoKTsKKyAgICAgIGdvdG8g ZXJyb3I7CisgICAgfQorCisgIHJlYWRfYnVmZmVyID0gZ3J1Yl9tYWxsb2MgKGZpbGVfc2l6ZSk7 CisgIGlmIChyZWFkX2J1ZmZlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGVyciA9IGdydWJfZXJy b3IgKEdSVUJfRVJSX09VVF9PRl9NRU1PUlksCisJCQlOXygiQ291bGQgbm90IGFsbG9jYXRlIGJ1 ZmZlciBmb3IgJXMiKSwKKwkJCWZpbGVwYXRoKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQor CisgIHJlYWRfbiA9IGdydWJfZmlsZV9yZWFkIChmaWxlLCByZWFkX2J1ZmZlciwgZmlsZV9zaXpl KTsKKyAgaWYgKHJlYWRfbiAhPSBmaWxlX3NpemUpCisgICAgeworICAgICAgZ3J1Yl9mcmVlIChy ZWFkX2J1ZmZlcik7CisgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9GSUxFX1JFQURf RVJST1IsCisJCQlOXygiQ291bGQgbm90IHJldHJpZXZlIGZpbGUgY29udGVudHM6ICVzIiksCisJ CQlmaWxlcGF0aCk7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAqYnVmZmVyID0gcmVh ZF9idWZmZXI7CisgICpidWZmZXJfc2l6ZSA9IGZpbGVfc2l6ZTsKKworICBlcnIgPSBHUlVCX0VS Ul9OT05FOworCitlcnJvcjoKKyAgaWYgKGZpbGUgIT0gTlVMTCkKKyAgICBncnViX2ZpbGVfY2xv c2UgKGZpbGUpOworCisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBncnViX2Vycl90CitncnVi X3RwbTJfcHJvdGVjdG9yX3Nya191bm1hcnNoYWxfa2V5ZmlsZSAodm9pZCAqc2VhbGVkX2tleSwK KwkJCQkJICAgZ3J1Yl9zaXplX3Qgc2VhbGVkX2tleV9zaXplLAorCQkJCQkgICBUUE0yX1NFQUxF RF9LRVkgKnNrKQoreworICBzdHJ1Y3QgZ3J1Yl90cG0yX2J1ZmZlciBidWY7CisKKyAgZ3J1Yl90 cG0yX2J1ZmZlcl9pbml0ICgmYnVmKTsKKyAgaWYgKHNlYWxlZF9rZXlfc2l6ZSA+IGJ1Zi5jYXAp CisgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9BUkdVTUVOVCwKKwkJICAgICAg IE5fKCJTZWFsZWQga2V5IGxhcmdlciB0aGFuICUiIFBSSXVHUlVCX1NJWkUgIiBieXRlcyIpLAor CQkgICAgICAgYnVmLmNhcCk7CisKKyAgZ3J1Yl9tZW1jcHkgKGJ1Zi5kYXRhLCBzZWFsZWRfa2V5 LCBzZWFsZWRfa2V5X3NpemUpOworICBidWYuc2l6ZSA9IHNlYWxlZF9rZXlfc2l6ZTsKKworICBn cnViX3RwbTJfbXVfVFBNMkJfUFVCTElDX1VubWFyc2hhbCAoJmJ1ZiwgJnNrLT5wdWJsaWMpOwor ICBncnViX3RwbTJfbXVfVFBNMkJfUFJJVkFURV9Vbm1hcnNoYWwgKCZidWYsICZzay0+cHJpdmF0 ZSk7CisKKyAgaWYgKGJ1Zi5lcnJvcikKKyAgICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJf QkFEX0FSR1VNRU5ULCBOXygiTWFsZm9ybWVkIFRQTSB3aXJlIGtleSBmaWxlIikpOworCisgIHJl dHVybiBHUlVCX0VSUl9OT05FOworfQorCitzdGF0aWMgZ3J1Yl9lcnJfdAorZ3J1Yl90cG0yX3By b3RlY3Rvcl9zcmtfdW5tYXJzaGFsX3RwbTJrZXkgKHZvaWQgKnNlYWxlZF9rZXksCisJCQkJCSAg IGdydWJfc2l6ZV90IHNlYWxlZF9rZXlfc2l6ZSwKKwkJCQkJICAgdHBtMmtleV9wb2xpY3lfdCAq cG9saWN5X3NlcSwKKwkJCQkJICAgdHBtMmtleV9hdXRocG9saWN5X3QgKmF1dGhwb2xfc2VxLAor CQkJCQkgICBncnViX3VpbnQ4X3QgKnJzYXBhcmVudCwKKwkJCQkJICAgZ3J1Yl91aW50MzJfdCAq cGFyZW50LAorCQkJCQkgICBUUE0yX1NFQUxFRF9LRVkgKnNrKQoreworICBhc24xX25vZGUgdHBt MmtleSA9IE5VTEw7CisgIGdydWJfdWludDhfdCByc2FwYXJlbnRfdG1wOworICBncnViX3VpbnQz Ml90IHBhcmVudF90bXA7CisgIHZvaWQgKnNlYWxlZF9wdWIgPSBOVUxMOworICBncnViX3NpemVf dCBzZWFsZWRfcHViX3NpemU7CisgIHZvaWQgKnNlYWxlZF9wcml2ID0gTlVMTDsKKyAgZ3J1Yl9z aXplX3Qgc2VhbGVkX3ByaXZfc2l6ZTsKKyAgc3RydWN0IGdydWJfdHBtMl9idWZmZXIgYnVmOwor ICBncnViX2Vycl90IGVycjsKKworICAvKgorICAgKiBTdGFydCB0byBwYXJzZSB0aGUgdHBtMmtl eSBmaWxlCisgICAqIFRQTUtleSA6Oj0gU0VRVUVOQ0UgeworICAgKiAgICAgdHlwZSAgICAgICAg T0JKRUNUIElERU5USUZJRVIsCisgICAqICAgICBlbXB0eUF1dGggICBbMF0gRVhQTElDSVQgQk9P TEVBTiBPUFRJT05BTCwKKyAgICogICAgIHBvbGljeSAgICAgIFsxXSBFWFBMSUNJVCBTRVFVRU5D RSBPRiBUUE1Qb2xpY3kgT1BUSU9OQUwsCisgICAqICAgICBzZWNyZXQgICAgICBbMl0gRVhQTElD SVQgT0NURVQgU1RSSU5HIE9QVElPTkFMLAorICAgKiAgICAgYXV0aFBvbGljeSAgWzNdIEVYUExJ Q0lUIFNFUVVFTkNFIE9GIFRQTUF1dGhQb2xpY3kgT1BUSU9OQUwsCisgICAqICAgICBkZXNjcmlw dGlvbiBbNF0gRVhQTElDSVQgVVRGOFN0cmluZyBPUFRJT05BTCwKKyAgICogICAgIHJzYVBhcmVu dCAgIFs1XSBFWFBMSUNJVCBCT09MRUFOIE9QVElPTkFMLAorICAgKiAgICAgcGFyZW50ICAgICAg SU5URUdFUiwKKyAgICogICAgIHB1YmtleSAgICAgIE9DVEVUIFNUUklORywKKyAgICogICAgIHBy aXZrZXkgICAgIE9DVEVUIFNUUklORworICAgKiB9CisgICAqLworICBlcnIgPSBncnViX3RwbTJr ZXlfc3RhcnRfcGFyc2luZyAoJnRwbTJrZXksIHNlYWxlZF9rZXksIHNlYWxlZF9rZXlfc2l6ZSk7 CisgIGlmIChlcnIgIT0gR1JVQl9FUlJfTk9ORSkKKyAgICByZXR1cm4gZXJyOworCisgIC8qCisg ICAqIFJldHJpZXZlIHRoZSBwb2xpY3kgc2VxdWVuY2UgZnJvbSAncG9saWN5JworICAgKiBwb2xp Y3lfc2VxIHdpbGwgYmUgTlVMTCB3aGVuICdwb2xpY3knIGlzIG5vdCBhdmFpbGFibGUKKyAgICov CisgIGVyciA9IGdydWJfdHBtMmtleV9nZXRfcG9saWN5X3NlcSAodHBtMmtleSwgcG9saWN5X3Nl cSk7CisgIGlmIChlcnIgIT0gR1JVQl9FUlJfTk9ORSkKKyAgICBnb3RvIGVycm9yOworCisgIC8q CisgICAqIFJldHJpZXZlIHRoZSBhdXRocG9saWN5IHNlcXVlbmNlIGZyb20gJ2F1dGhQb2xpY3kn CisgICAqIGF1dGhwb2xfc2VxIHdpbGwgYmUgTlVMTCB3aGVuICdhdXRoUG9saWN5JyBpcyBub3Qg YXZhaWxhYmxlCisgICAqLworICBlcnIgPSBncnViX3RwbTJrZXlfZ2V0X2F1dGhwb2xpY3lfc2Vx ICh0cG0ya2V5LCBhdXRocG9sX3NlcSk7CisgIGlmIChlcnIgIT0gR1JVQl9FUlJfTk9ORSkKKyAg ICBnb3RvIGVycm9yOworCisgIC8qIFJldHJpZXZlIHJzYVBhcmVudCAqLworICBlcnIgPSBncnVi X3RwbTJrZXlfZ2V0X3JzYXBhcmVudCAodHBtMmtleSwgJnJzYXBhcmVudF90bXApOworICBpZiAo ZXJyICE9IEdSVUJfRVJSX05PTkUpCisgICAgZ290byBlcnJvcjsKKworICAqcnNhcGFyZW50ID0g cnNhcGFyZW50X3RtcDsKKworICAvKiBSZXRyaWV2ZSB0aGUgcGFyZW50IGhhbmRsZSAqLworICBl cnIgPSBncnViX3RwbTJrZXlfZ2V0X3BhcmVudCAodHBtMmtleSwgJnBhcmVudF90bXApOworICBp ZiAoZXJyICE9IEdSVUJfRVJSX05PTkUpCisgICAgZ290byBlcnJvcjsKKworICAvKiAgVGhlIHBh cmVudCBoYW5kbGUgc2hvdWxkIGJlIGVpdGhlciBQRVJNQU5FTlQgb3IgUEVSU0lTVEVOVC4gKi8K KyAgaWYgKCFUUE1fSFRfSVNfUEVSTUFORU5UIChwYXJlbnRfdG1wKSAmJiAhVFBNX0hUX0lTX1BF UlNJU1RFTlQgKHBhcmVudF90bXApKQorICAgIHsKKyAgICAgIGVyciA9IEdSVUJfRVJSX09VVF9P Rl9SQU5HRTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICpwYXJlbnQgPSBwYXJlbnRf dG1wOworCisgIC8qIFJldHJpZXZlIHRoZSBwdWJsaWMgcGFydCBvZiB0aGUgc2VhbGVkIGtleSAq LworICBlcnIgPSBncnViX3RwbTJrZXlfZ2V0X3B1YmtleSAodHBtMmtleSwgJnNlYWxlZF9wdWIs ICZzZWFsZWRfcHViX3NpemUpOworICBpZiAoZXJyICE9IEdSVUJfRVJSX05PTkUpCisgICAgZ290 byBlcnJvcjsKKworICAvKiBSZXRyaWV2ZSB0aGUgcHJpdmF0ZSBwYXJ0IG9mIHRoZSBzZWFsZWQg a2V5ICovCisgIGVyciA9IGdydWJfdHBtMmtleV9nZXRfcHJpdmtleSAodHBtMmtleSwgJnNlYWxl ZF9wcml2LCAmc2VhbGVkX3ByaXZfc2l6ZSk7CisgIGlmIChlcnIgIT0gR1JVQl9FUlJfTk9ORSkK KyAgICBnb3RvIGVycm9yOworCisgIC8qIFVubWFyc2hhbCB0aGUgc2VhbGVkIGtleSAqLworICBn cnViX3RwbTJfYnVmZmVyX2luaXQgKCZidWYpOworICBpZiAoc2VhbGVkX3B1Yl9zaXplICsgc2Vh bGVkX3ByaXZfc2l6ZSA+IGJ1Zi5jYXApCisgICAgeworICAgICAgZXJyID0gZ3J1Yl9lcnJvciAo R1JVQl9FUlJfQkFEX0FSR1VNRU5ULAorCQkJTl8oIlNlYWxlZCBrZXkgbGFyZ2VyIHRoYW4gJSIg UFJJdUdSVUJfU0laRSAiIGJ5dGVzIiksCisJCQlidWYuY2FwKTsKKyAgICAgIGdvdG8gZXJyb3I7 CisgICAgfQorCisgIGdydWJfdHBtMl9idWZmZXJfcGFjayAoJmJ1Ziwgc2VhbGVkX3B1Yiwgc2Vh bGVkX3B1Yl9zaXplKTsKKyAgZ3J1Yl90cG0yX2J1ZmZlcl9wYWNrICgmYnVmLCBzZWFsZWRfcHJp diwgc2VhbGVkX3ByaXZfc2l6ZSk7CisKKyAgYnVmLm9mZnNldCA9IDA7CisKKyAgZ3J1Yl90cG0y X211X1RQTTJCX1BVQkxJQ19Vbm1hcnNoYWwgKCZidWYsICZzay0+cHVibGljKTsKKyAgZ3J1Yl90 cG0yX211X1RQTTJCX1BSSVZBVEVfVW5tYXJzaGFsICgmYnVmLCAmc2stPnByaXZhdGUpOworCisg IGlmIChidWYuZXJyb3IpCisgICAgeworICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJf QkFEX0FSR1VNRU5ULCBOXygiTWFsZm9ybWVkIFRQTSAyLjAga2V5IGZpbGUiKSk7CisgICAgICBn b3RvIGVycm9yOworICAgIH0KKworICBlcnIgPSBHUlVCX0VSUl9OT05FOworCitlcnJvcjoKKyAg LyogRW5kIHRoZSBwYXJzaW5nICovCisgIGdydWJfdHBtMmtleV9lbmRfcGFyc2luZyAodHBtMmtl eSk7CisgIGdydWJfZnJlZSAoc2VhbGVkX3B1Yik7CisgIGdydWJfZnJlZSAoc2VhbGVkX3ByaXYp OworCisgIHJldHVybiBlcnI7Cit9CisKKy8qIENoZWNrIGlmIHRoZSBTUksgZXhpc3RzIGluIHRo ZSBzcGVjaWZpZWQgaGFuZGxlICovCitzdGF0aWMgZ3J1Yl9lcnJfdAorZ3J1Yl90cG0yX3Byb3Rl Y3Rvcl9zcmtfY2hlY2sgKGNvbnN0IFRQTV9IQU5ETEUgc3JrX2hhbmRsZSkKK3sKKyAgVFBNX1JD IHJjOworICBUUE0yQl9QVUJMSUMgcHVibGljOworCisgIC8qIEZpbmQgU1JLICovCisgIHJjID0g VFBNMl9SZWFkUHVibGljIChzcmtfaGFuZGxlLCBOVUxMLCAmcHVibGljKTsKKyAgaWYgKHJjID09 IFRQTV9SQ19TVUNDRVNTKQorICAgIHJldHVybiBHUlVCX0VSUl9OT05FOworCisgIHJldHVybiBn cnViX2Vycm9yIChHUlVCX0VSUl9CQURfQVJHVU1FTlQsCisJCSAgICAgTl8oIkZhaWxlZCB0byBy ZXRyaWV2ZSBTUksgZnJvbSAweCV4IChUUE0yX1JlYWRQdWJsaWM6IDB4JXgpIiksCisJCSAgICAg c3JrX2hhbmRsZSwgcmMpOworfQorCisvKiBHZXQgdGhlIFNSSyB3aXRoIHRoZSB0ZW1wbGF0ZSAq Lworc3RhdGljIGdydWJfZXJyX3QKK2dydWJfdHBtMl9wcm90ZWN0b3Jfc3JrX2dldCAoY29uc3Qg Z3J1Yl9zcmtfdHlwZV90IHNya190eXBlLAorCQkJICAgICBjb25zdCBUUE1fSEFORExFIHBhcmVu dCwKKwkJCSAgICAgVFBNX0hBTkRMRSAqc3JrX2hhbmRsZSkKK3sKKyAgVFBNX1JDIHJjOworICBU UE1UX1BVQkxJQ19QQVJNUyBwYXJtcyA9IHsgMCB9OworICBUUE1TX0FVVEhfQ09NTUFORCBhdXRo Q29tbWFuZCA9IHsgMCB9OworICBUUE0yQl9TRU5TSVRJVkVfQ1JFQVRFIGluU2Vuc2l0aXZlID0g eyAwIH07CisgIFRQTTJCX1BVQkxJQyBpblB1YmxpYyA9IHsgMCB9OworICBUUE0yQl9EQVRBIG91 dHNpZGVJbmZvID0geyAwIH07CisgIFRQTUxfUENSX1NFTEVDVElPTiBjcmVhdGlvblBjciA9IHsg MCB9OworICBUUE0yQl9QVUJMSUMgb3V0UHVibGljID0geyAwIH07CisgIFRQTTJCX0NSRUFUSU9O X0RBVEEgY3JlYXRpb25EYXRhID0geyAwIH07CisgIFRQTTJCX0RJR0VTVCBjcmVhdGlvbkhhc2gg PSB7IDAgfTsKKyAgVFBNVF9US19DUkVBVElPTiBjcmVhdGlvblRpY2tldCA9IHsgMCB9OworICBU UE0yQl9OQU1FIHNya05hbWUgPSB7IDAgfTsKKyAgVFBNX0hBTkRMRSB0bXBfaGFuZGxlID0gMDsK KworICBpblB1YmxpYy5wdWJsaWNBcmVhLnR5cGUgPSBzcmtfdHlwZS50eXBlOworICBpblB1Ymxp Yy5wdWJsaWNBcmVhLm5hbWVBbGcgPSBUUE1fQUxHX1NIQTI1NjsKKyAgaW5QdWJsaWMucHVibGlj QXJlYS5vYmplY3RBdHRyaWJ1dGVzLnJlc3RyaWN0ZWQgPSAxOworICBpblB1YmxpYy5wdWJsaWNB cmVhLm9iamVjdEF0dHJpYnV0ZXMudXNlcldpdGhBdXRoID0gMTsKKyAgaW5QdWJsaWMucHVibGlj QXJlYS5vYmplY3RBdHRyaWJ1dGVzLmRlY3J5cHQgPSAxOworICBpblB1YmxpYy5wdWJsaWNBcmVh Lm9iamVjdEF0dHJpYnV0ZXMuZml4ZWRUUE0gPSAxOworICBpblB1YmxpYy5wdWJsaWNBcmVhLm9i amVjdEF0dHJpYnV0ZXMuZml4ZWRQYXJlbnQgPSAxOworICBpblB1YmxpYy5wdWJsaWNBcmVhLm9i amVjdEF0dHJpYnV0ZXMuc2Vuc2l0aXZlRGF0YU9yaWdpbiA9IDE7CisgIGluUHVibGljLnB1Ymxp Y0FyZWEub2JqZWN0QXR0cmlidXRlcy5ub0RBID0gMTsKKworICBpZiAoc3JrX3R5cGUudHlwZSA9 PSBUUE1fQUxHX1JTQSkKKyAgICB7CisgICAgICBpblB1YmxpYy5wdWJsaWNBcmVhLnBhcmFtZXRl cnMucnNhRGV0YWlsLnN5bW1ldHJpYy5hbGdvcml0aG0gPSBUUE1fQUxHX0FFUzsKKyAgICAgIGlu UHVibGljLnB1YmxpY0FyZWEucGFyYW1ldGVycy5yc2FEZXRhaWwuc3ltbWV0cmljLmtleUJpdHMu YWVzID0gMTI4OworICAgICAgaW5QdWJsaWMucHVibGljQXJlYS5wYXJhbWV0ZXJzLnJzYURldGFp bC5zeW1tZXRyaWMubW9kZS5hZXMgPSBUUE1fQUxHX0NGQjsKKyAgICAgIGluUHVibGljLnB1Ymxp Y0FyZWEucGFyYW1ldGVycy5yc2FEZXRhaWwuc2NoZW1lLnNjaGVtZSA9IFRQTV9BTEdfTlVMTDsK KyAgICAgIGluUHVibGljLnB1YmxpY0FyZWEucGFyYW1ldGVycy5yc2FEZXRhaWwua2V5Qml0cyA9 IHNya190eXBlLmRldGFpbC5yc2FfYml0czsKKyAgICAgIGluUHVibGljLnB1YmxpY0FyZWEucGFy YW1ldGVycy5yc2FEZXRhaWwuZXhwb25lbnQgPSAwOworICAgIH0KKyAgZWxzZSBpZiAoc3JrX3R5 cGUudHlwZSA9PSBUUE1fQUxHX0VDQykKKyAgICB7CisgICAgICBpblB1YmxpYy5wdWJsaWNBcmVh LnBhcmFtZXRlcnMuZWNjRGV0YWlsLnN5bW1ldHJpYy5hbGdvcml0aG0gPSBUUE1fQUxHX0FFUzsK KyAgICAgIGluUHVibGljLnB1YmxpY0FyZWEucGFyYW1ldGVycy5lY2NEZXRhaWwuc3ltbWV0cmlj LmtleUJpdHMuYWVzID0gMTI4OworICAgICAgaW5QdWJsaWMucHVibGljQXJlYS5wYXJhbWV0ZXJz LmVjY0RldGFpbC5zeW1tZXRyaWMubW9kZS5hZXMgPSBUUE1fQUxHX0NGQjsKKyAgICAgIGluUHVi bGljLnB1YmxpY0FyZWEucGFyYW1ldGVycy5lY2NEZXRhaWwuc2NoZW1lLnNjaGVtZSA9IFRQTV9B TEdfTlVMTDsKKyAgICAgIGluUHVibGljLnB1YmxpY0FyZWEucGFyYW1ldGVycy5lY2NEZXRhaWwu Y3VydmVJRCA9IHNya190eXBlLmRldGFpbC5lY2NfY3VydmU7CisgICAgICBpblB1YmxpYy5wdWJs aWNBcmVhLnBhcmFtZXRlcnMuZWNjRGV0YWlsLmtkZi5zY2hlbWUgPSBUUE1fQUxHX05VTEw7Cisg ICAgfQorICBlbHNlCisgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9BUkdVTUVO VCwgTl8oIlVua25vd24gU1JLIGFsZ29yaXRobSIpKTsKKworICAvKiBUZXN0IHRoZSBwYXJhbWV0 ZXJzIGJlZm9yZSBTUksgZ2VuZXJhdGlvbiAqLworICBwYXJtcy50eXBlID0gc3JrX3R5cGUudHlw ZTsKKyAgZ3J1Yl9tZW1jcHkgKCZwYXJtcy5wYXJhbWV0ZXJzLCAmaW5QdWJsaWMucHVibGljQXJl YS5wYXJhbWV0ZXJzLAorCSAgICAgICBzaXplb2YgKFRQTVVfUFVCTElDX1BBUk1TKSk7CisKKyAg cmMgPSBUUE0yX1Rlc3RQYXJtcyAoJnBhcm1zLCBOVUxMKTsKKyAgaWYgKHJjICE9IFRQTV9SQ19T VUNDRVNTKQorICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfQVJHVU1FTlQsCisJ CSAgICAgICBOXygiVW5zdXBwb3J0ZWQgU1JLIHRlbXBsYXRlIChUUE0yX1Rlc3RQYXJtczogMHgl eCkiKSwKKwkJICAgICAgIHJjKTsKKworICAvKiBDcmVhdGUgU1JLICovCisgIGF1dGhDb21tYW5k LnNlc3Npb25IYW5kbGUgPSBUUE1fUlNfUFc7CisgIHJjID0gVFBNMl9DcmVhdGVQcmltYXJ5IChw YXJlbnQsICZhdXRoQ29tbWFuZCwgJmluU2Vuc2l0aXZlLCAmaW5QdWJsaWMsCisJCQkgICAmb3V0 c2lkZUluZm8sICZjcmVhdGlvblBjciwgJnRtcF9oYW5kbGUsICZvdXRQdWJsaWMsCisJCQkgICAm Y3JlYXRpb25EYXRhLCAmY3JlYXRpb25IYXNoLCAmY3JlYXRpb25UaWNrZXQsCisJCQkgICAmc3Jr TmFtZSwgTlVMTCk7CisgIGlmIChyYyAhPSBUUE1fUkNfU1VDQ0VTUykKKyAgICByZXR1cm4gZ3J1 Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0RFVklDRSwKKwkJICAgICAgIE5fKCJDb3VsZCBub3QgY3Jl YXRlIFNSSyAoVFBNMl9DcmVhdGVQcmltYXJ5OiAweCV4KSIpLAorCQkgICAgICAgcmMpOworCisg ICpzcmtfaGFuZGxlID0gdG1wX2hhbmRsZTsKKworICByZXR1cm4gR1JVQl9FUlJfTk9ORTsKK30K KworLyogTG9hZCB0aGUgU1JLIGZyb20gdGhlIHBlcnNpc3RlbnQgaGFuZGxlIG9yIGNyZWF0ZSBv bmUgd2l0aCBhIGdpdmVuIHR5cGUgb2YKKyAgIHRlbXBsYXRlLCBhbmQgdGhlbiBhc3NvY2lhdGUg dGhlIHNlYWxlZCBrZXkgd2l0aCB0aGUgU1JLCisgICBSZXR1cm4gdmFsdWVzOgorICAgKiBHUlVC X0VSUl9OT05FOiBFdmVyeXRoaW5nIGlzIGZpbmUuCisgICAqIEdSVUJfRVJSX0JBRF9BUkdVTUVO VDogVGhlIFNSSyBkb2Vzbid0IG1hdGNoLiBUcnkgYW5vdGhlciBvbmUuCisgICAqIE90aGVyOiBT b21ldGhpbmcgd2VudCB3cm9uZy4KKyovCitzdGF0aWMgZ3J1Yl9lcnJfdAorZ3J1Yl90cG0yX3By b3RlY3Rvcl9zcmtfbG9hZCAoY29uc3QgZ3J1Yl9zcmtfdHlwZV90IHNya190eXBlLAorCQkJICAg ICAgY29uc3QgVFBNMl9TRUFMRURfS0VZICpzZWFsZWRfa2V5LAorCQkJICAgICAgY29uc3QgVFBN X0hBTkRMRSBwYXJlbnQsCisJCQkgICAgICBUUE1fSEFORExFICpzZWFsZWRfaGFuZGxlLAorCQkJ ICAgICAgVFBNX0hBTkRMRSAqc3JrX2hhbmRsZSkKK3sKKyAgVFBNU19BVVRIX0NPTU1BTkQgYXV0 aENtZCA9IHsgMCB9OworICBUUE0yQl9OQU1FIG5hbWUgPSB7IDAgfTsKKyAgVFBNX1JDIHJjOwor ICBncnViX2Vycl90IGVycjsKKworICBpZiAoc3JrX2hhbmRsZSA9PSBOVUxMKQorICAgIHJldHVy biBHUlVCX0VSUl9CVUc7CisKKyAgaWYgKCpzcmtfaGFuZGxlICE9IDApCisgICAgeworICAgICAg ZXJyID0gZ3J1Yl90cG0yX3Byb3RlY3Rvcl9zcmtfY2hlY2sgKCpzcmtfaGFuZGxlKTsKKyAgICAg IGlmIChlcnIgIT0gR1JVQl9FUlJfTk9ORSkKKwlyZXR1cm4gZXJyOworICAgIH0KKyAgZWxzZQor ICAgIHsKKyAgICAgIGVyciA9IGdydWJfdHBtMl9wcm90ZWN0b3Jfc3JrX2dldCAoc3JrX3R5cGUs IHBhcmVudCwgc3JrX2hhbmRsZSk7CisgICAgICBpZiAoZXJyICE9IEdSVUJfRVJSX05PTkUpCisJ cmV0dXJuIGVycjsKKyAgICB9CisKKyAgLyogTG9hZCB0aGUgc2VhbGVkIGtleSBhbmQgYXNzb2Np YXRlIGl0IHdpdGggdGhlIFNSSyAqLworICBhdXRoQ21kLnNlc3Npb25IYW5kbGUgPSBUUE1fUlNf UFc7CisgIHJjID0gVFBNMl9Mb2FkICgqc3JrX2hhbmRsZSwgJmF1dGhDbWQsICZzZWFsZWRfa2V5 LT5wcml2YXRlLCAmc2VhbGVkX2tleS0+cHVibGljLAorCQkgIHNlYWxlZF9oYW5kbGUsICZuYW1l LCBOVUxMKTsKKyAgLyogSWYgVFBNMl9Mb2FkIHJldHVybnMgKFRQTV9SQ19JTlRFR1JJVFkgfCBU UE1fUkNfUCB8IFRQTV9SQ18xKSwgdGhlbiBpdAorICAgICBpbXBsaWVzIHRoZSB3cm9uZyBTUksg aXMgdXNlZC4gKi8KKyAgaWYgKHJjID09IChUUE1fUkNfSU5URUdSSVRZIHwgVFBNX1JDX1AgfCBU UE1fUkNfMSkpCisgICAgeworICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0FS R1VNRU5ULCBOXygiU1JLIG5vdCBtYXRjaGVkIikpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9 CisgIGVsc2UgaWYgKHJjICE9IFRQTV9SQ19TVUNDRVNTKQorICAgIHsKKyAgICAgIGVyciA9IGdy dWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9ERVZJQ0UsCisJCQlOXygiRmFpbGVkIHRvIGxvYWQgc2Vh bGVkIGtleSAoVFBNMl9Mb2FkOiAweCV4KSIpLAorCQkJcmMpOworICAgICAgZ290byBlcnJvcjsK KyAgICB9CisKKyAgcmV0dXJuIEdSVUJfRVJSX05PTkU7CisKK2Vycm9yOgorICBpZiAoIVRQTV9I VF9JU19QRVJTSVNURU5UICgqc3JrX2hhbmRsZSkpCisgICAgVFBNMl9GbHVzaENvbnRleHQgKCpz cmtfaGFuZGxlKTsKKworICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitz cmtfdHlwZV90b19uYW1lIChncnViX3Nya190eXBlX3Qgc3JrX3R5cGUpCit7CisgIGlmIChzcmtf dHlwZS50eXBlID09IFRQTV9BTEdfRUNDKQorICAgIHsKKyAgICAgIHN3aXRjaCAoc3JrX3R5cGUu ZGV0YWlsLmVjY19jdXJ2ZSkKKyAgICAgICAgeworCSAgY2FzZSBUUE1fRUNDX05JU1RfUDI1NjoK KwkgICAgcmV0dXJuICJFQ0NfTklTVF9QMjU2IjsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBp ZiAoc3JrX3R5cGUudHlwZSA9PSBUUE1fQUxHX1JTQSkKKyAgIHsKKyAgICAgIHN3aXRjaCAoc3Jr X3R5cGUuZGV0YWlsLnJzYV9iaXRzKQorCXsKKwkgIGNhc2UgMjA0ODoKKwkgICAgcmV0dXJuICJS U0EyMDQ4IjsKKwl9CisgICB9CisKKyAgcmV0dXJuICJVbmtub3duIjsKK30KKworc3RhdGljIGdy dWJfZXJyX3QKK2dydWJfdHBtMl9wcm90ZWN0b3JfbG9hZF9rZXkgKGNvbnN0IHN0cnVjdCBncnVi X3RwbTJfcHJvdGVjdG9yX2NvbnRleHQgKmN0eCwKKwkJCSAgICAgIGNvbnN0IFRQTTJfU0VBTEVE X0tFWSAqc2VhbGVkX2tleSwKKwkJCSAgICAgIGNvbnN0IFRQTV9IQU5ETEUgcGFyZW50X2hhbmRs ZSwKKwkJCSAgICAgIFRQTV9IQU5ETEUgKnNlYWxlZF9oYW5kbGUsCisJCQkgICAgICBUUE1fSEFO RExFICpzcmtfaGFuZGxlKQoreworICBncnViX2Vycl90IGVycjsKKyAgaW50IGk7CisgIGdydWJf c3JrX3R5cGVfdCBmYWxsYmFja19zcmtzW10gPSB7CisgICAgeworICAgICAgLnR5cGUgPSBUUE1f QUxHX0VDQywKKyAgICAgIC5kZXRhaWwuZWNjX2N1cnZlID0gVFBNX0VDQ19OSVNUX1AyNTYsCisg ICAgfSwKKyAgICB7CisgICAgICAudHlwZSA9IFRQTV9BTEdfUlNBLAorICAgICAgLmRldGFpbC5y c2FfYml0cyA9IDIwNDgsCisgICAgfSwKKyAgICB7CisgICAgICAudHlwZSA9IFRQTV9BTEdfRVJS T1IsCisgICAgfQorICB9OworCisgIC8qIFRyeSB0aGUgZ2l2ZW4gcGVyc2lzdGVudCBTUksgaWYg ZXhpc3RzICovCisgIGlmICgqc3JrX2hhbmRsZSAhPSAwKQorICAgIHsKKyAgICAgIGVyciA9IGdy dWJfdHBtMl9wcm90ZWN0b3Jfc3JrX2xvYWQgKGN0eC0+c3JrX3R5cGUsIHNlYWxlZF9rZXksCisJ CQkJCSAgcGFyZW50X2hhbmRsZSwgc2VhbGVkX2hhbmRsZSwKKwkJCQkJICBzcmtfaGFuZGxlKTsK KyAgICAgIGlmIChlcnIgIT0gR1JVQl9FUlJfQkFEX0FSR1VNRU5UKQorCXJldHVybiBlcnI7CisK KyAgICAgIGdydWJfcHJpbnRfZXJyb3IgKCk7CisgICAgICBncnViX3ByaW50Zl8gKE5fKCJUcnlp bmcgdGhlIHNwZWNpZmllZCBTUksgYWxnb3JpdGhtOiAlc1xuIiksCisJCSAgICBzcmtfdHlwZV90 b19uYW1lIChjdHgtPnNya190eXBlKSk7CisgICAgICBncnViX2Vycm5vID0gR1JVQl9FUlJfTk9O RTsKKyAgICAgICpzcmtfaGFuZGxlID0gMDsKKyAgICB9CisKKyAgLyogVHJ5IHRoZSBzcGVjaWZp ZWQgYWxnb3JpdGhtIGZvciB0aGUgU1JLIHRlbXBsYXRlICovCisgIGlmICgqc3JrX2hhbmRsZSA9 PSAwKQorICAgIHsKKyAgICAgIGVyciA9IGdydWJfdHBtMl9wcm90ZWN0b3Jfc3JrX2xvYWQgKGN0 eC0+c3JrX3R5cGUsIHNlYWxlZF9rZXksCisJCQkJCSAgcGFyZW50X2hhbmRsZSwgc2VhbGVkX2hh bmRsZSwKKwkJCQkJICBzcmtfaGFuZGxlKTsKKyAgICAgIGlmIChlcnIgIT0gR1JVQl9FUlJfQkFE X0FSR1VNRU5UKQorCXJldHVybiBlcnI7CisKKyAgICAgIGdydWJfcHJpbnRfZXJyb3IgKCk7Cisg ICAgICBncnViX2Vycm5vID0gR1JVQl9FUlJfTk9ORTsKKyAgICAgICpzcmtfaGFuZGxlID0gMDsK KyAgICB9CisKKyAgLyogVHJ5IGFsbCB0aGUgZmFsbGJhY2sgU1JLIHRlbXBsYXRlcyAqLworICBm b3IgKGkgPSAwOyBmYWxsYmFja19zcmtzW2ldLnR5cGUgIT0gVFBNX0FMR19FUlJPUjsgaSsrKQor ICAgIHsKKyAgICAgIC8qIFNraXAgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gKi8KKyAgICAgIGlm IChmYWxsYmFja19zcmtzW2ldLnR5cGUgPT0gY3R4LT5zcmtfdHlwZS50eXBlICYmCisJICAoZmFs bGJhY2tfc3Jrc1tpXS5kZXRhaWwucnNhX2JpdHMgPT0gY3R4LT5zcmtfdHlwZS5kZXRhaWwucnNh X2JpdHMgfHwKKwkgICBmYWxsYmFja19zcmtzW2ldLmRldGFpbC5lY2NfY3VydmUgPT0gY3R4LT5z cmtfdHlwZS5kZXRhaWwuZWNjX2N1cnZlKSkKKwljb250aW51ZTsKKworICAgICAgZ3J1Yl9wcmlu dGZfIChOXygiVHJ5aW5nIGZhbGxiYWNrICVzIHRlbXBsYXRlXG4iKSwKKwkJICAgIHNya190eXBl X3RvX25hbWUgKGZhbGxiYWNrX3Nya3NbaV0pKTsKKworICAgICAgKnNya19oYW5kbGUgPSAwOwor CisgICAgICBlcnIgPSBncnViX3RwbTJfcHJvdGVjdG9yX3Nya19sb2FkIChmYWxsYmFja19zcmtz W2ldLCBzZWFsZWRfa2V5LAorCQkJCQkgIHBhcmVudF9oYW5kbGUsIHNlYWxlZF9oYW5kbGUsCisJ CQkJCSAgc3JrX2hhbmRsZSk7CisgICAgICBpZiAoZXJyICE9IEdSVUJfRVJSX0JBRF9BUkdVTUVO VCkKKwlyZXR1cm4gZXJyOworCisgICAgICBncnViX3ByaW50X2Vycm9yICgpOworICAgICAgZ3J1 Yl9lcnJubyA9IEdSVUJfRVJSX05PTkU7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCitzdGF0 aWMgZ3J1Yl9lcnJfdAorZ3J1Yl90cG0yX3Byb3RlY3Rvcl9wb2xpY3lwY3IgKFRQTUlfU0hfQVVU SF9TRVNTSU9OIHNlc3Npb24sCisJCQkgICAgICAgc3RydWN0IGdydWJfdHBtMl9idWZmZXIgKmNt ZF9idWYpCit7CisgIFRQTTJCX0RJR0VTVCBwY3JfZGlnZXN0OworICBUUE1MX1BDUl9TRUxFQ1RJ T04gcGNyX3NlbDsKKyAgVFBNX1JDIHJjOworCisgIGdydWJfdHBtMl9tdV9UUE0yQl9ESUdFU1Rf VW5tYXJzaGFsIChjbWRfYnVmLCAmcGNyX2RpZ2VzdCk7CisgIGdydWJfdHBtMl9tdV9UUE1MX1BD Ul9TRUxFQ1RJT05fVW5tYXJzaGFsIChjbWRfYnVmLCAmcGNyX3NlbCk7CisgIGlmIChjbWRfYnVm LT5lcnJvcikKKyAgICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0FSR1VNRU5ULAor CQkgICAgICAgTl8oIkZhaWxlZCB0byB1bm1hcnNoYWwgQ29tbWFuZFBvbGljeSBmb3IgVFBNMl9Q b2xpY3lQQ1IiKSk7CisKKyAgcmMgPSBUUE0yX1BvbGljeVBDUiAoc2Vzc2lvbiwgTlVMTCwgJnBj cl9kaWdlc3QsICZwY3Jfc2VsLCBOVUxMKTsKKyAgaWYgKHJjICE9IFRQTV9SQ19TVUNDRVNTKQor ICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfREVWSUNFLAorCQkgICAgICAgTl8o IkZhaWxlZCB0byBzdWJtaXQgUENSIHBvbGljeSAoVFBNMl9Qb2xpY3lQQ1I6IDB4JXgpIiksCisJ CSAgICAgICByYyk7CisKKyAgcmV0dXJuIEdSVUJfRVJSX05PTkU7Cit9CisKK3N0YXRpYyBncnVi X2Vycl90CitncnViX3RwbTJfcHJvdGVjdG9yX2VuZm9yY2VfcG9saWN5ICh0cG0ya2V5X3BvbGlj eV90IHBvbGljeSwgVFBNSV9TSF9BVVRIX1NFU1NJT04gc2Vzc2lvbikKK3sKKyAgc3RydWN0IGdy dWJfdHBtMl9idWZmZXIgYnVmOworICBncnViX2Vycl90IGVycjsKKworICBncnViX3RwbTJfYnVm ZmVyX2luaXQgKCZidWYpOworICBpZiAocG9saWN5LT5jbWRfcG9saWN5X2xlbiA+IGJ1Zi5jYXAp CisgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9BUkdVTUVOVCwKKwkJICAgICAg IE5fKCJDb21tYW5kUG9saWN5IGxhcmdlciB0aGFuIFRQTSBidWZmZXIiKSk7CisKKyAgZ3J1Yl9t ZW1jcHkgKGJ1Zi5kYXRhLCBwb2xpY3ktPmNtZF9wb2xpY3ksIHBvbGljeS0+Y21kX3BvbGljeV9s ZW4pOworICBidWYuc2l6ZSA9IHBvbGljeS0+Y21kX3BvbGljeV9sZW47CisKKyAgc3dpdGNoIChw b2xpY3ktPmNtZF9jb2RlKQorICAgIHsKKyAgICBjYXNlIFRQTV9DQ19Qb2xpY3lQQ1I6CisgICAg ICBlcnIgPSBncnViX3RwbTJfcHJvdGVjdG9yX3BvbGljeXBjciAoc2Vzc2lvbiwgJmJ1Zik7Cisg ICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJf RVJSX0JBRF9BUkdVTUVOVCwKKwkJCSBOXygiVW5rbm93biBUUE0gQ29tbWFuZDogMHgleCIpLCBw b2xpY3ktPmNtZF9jb2RlKTsKKyAgICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGdy dWJfZXJyX3QKK2dydWJfdHBtMl9wcm90ZWN0b3JfZW5mb3JjZV9wb2xpY3lfc2VxICh0cG0ya2V5 X3BvbGljeV90IHBvbGljeV9zZXEsCisJCQkJCVRQTUlfU0hfQVVUSF9TRVNTSU9OIHNlc3Npb24p Cit7CisgIHRwbTJrZXlfcG9saWN5X3QgcG9saWN5OworICBncnViX2Vycl90IGVycjsKKworICBG T1JfTElTVF9FTEVNRU5UUyAocG9saWN5LCBwb2xpY3lfc2VxKQorICAgIHsKKyAgICAgIGVyciA9 IGdydWJfdHBtMl9wcm90ZWN0b3JfZW5mb3JjZV9wb2xpY3kgKHBvbGljeSwgc2Vzc2lvbik7Cisg ICAgICBpZiAoZXJyICE9IEdSVUJfRVJSX05PTkUpCisJcmV0dXJuIGVycjsKKyAgICB9CisKKyAg cmV0dXJuIEdSVUJfRVJSX05PTkU7Cit9CisKK3N0YXRpYyBncnViX2Vycl90CitncnViX3RwbTJf cHJvdGVjdG9yX3NpbXBsZV9wb2xpY3lfc2VxIChjb25zdCBzdHJ1Y3QgZ3J1Yl90cG0yX3Byb3Rl Y3Rvcl9jb250ZXh0ICpjdHgsCisJCQkJICAgICAgIHRwbTJrZXlfcG9saWN5X3QgKnBvbGljeV9z ZXEpCit7CisgIHRwbTJrZXlfcG9saWN5X3QgcG9saWN5ID0gTlVMTDsKKyAgc3RydWN0IGdydWJf dHBtMl9idWZmZXIgYnVmOworICBUUE1MX1BDUl9TRUxFQ1RJT04gcGNyX3NlbCA9IHsKKyAgICAu Y291bnQgPSAxLAorICAgIC5wY3JTZWxlY3Rpb25zID0geworICAgICAgeworCS5oYXNoID0gY3R4 LT5iYW5rLAorCS5zaXplT2ZTZWxlY3QgPSAzLAorCS5wY3JTZWxlY3QgPSB7IDAgfQorICAgICAg fSwKKyAgICB9CisgIH07CisgIGdydWJfdWludDhfdCBpOworICBncnViX2Vycl90IGVycjsKKwor ICBpZiAocG9saWN5X3NlcSA9PSBOVUxMKQorICAgIHJldHVybiBHUlVCX0VSUl9CQURfQVJHVU1F TlQ7CisKKyAgZ3J1Yl90cG0yX2J1ZmZlcl9pbml0ICgmYnVmKTsKKworICBmb3IgKGkgPSAwOyBp IDwgY3R4LT5wY3JfY291bnQ7IGkrKykKKyAgICBUUE1TX1BDUl9TRUxFQ1RJT05fU2VsZWN0UENS ICgmcGNyX3NlbC5wY3JTZWxlY3Rpb25zWzBdLCBjdHgtPnBjcnNbaV0pOworCisgIGdydWJfdHBt Ml9idWZmZXJfcGFja191MTYgKCZidWYsIDApOworICBncnViX3RwbTJfbXVfVFBNTF9QQ1JfU0VM RUNUSU9OX01hcnNoYWwgKCZidWYsICZwY3Jfc2VsKTsKKworICBpZiAoYnVmLmVycm9yKQorICAg IHJldHVybiBHUlVCX0VSUl9CQURfQVJHVU1FTlQ7CisKKyAgcG9saWN5ID0gZ3J1Yl9tYWxsb2Mg KHNpemVvZihzdHJ1Y3QgdHBtMmtleV9wb2xpY3kpKTsKKyAgaWYgKHBvbGljeSA9PSBOVUxMKQor ICAgIHsKKyAgICAgIGVyciA9IEdSVUJfRVJSX09VVF9PRl9NRU1PUlk7CisgICAgICBnb3RvIGVy cm9yOworICAgIH0KKyAgcG9saWN5LT5jbWRfY29kZSA9IFRQTV9DQ19Qb2xpY3lQQ1I7CisgIHBv bGljeS0+Y21kX3BvbGljeSA9IGdydWJfbWFsbG9jIChidWYuc2l6ZSk7CisgIGlmIChwb2xpY3kt PmNtZF9wb2xpY3kgPT0gTlVMTCkKKyAgICB7CisgICAgICBlcnIgPSBHUlVCX0VSUl9PVVRfT0Zf TUVNT1JZOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgIGdydWJfbWVtY3B5IChwb2xpY3kt PmNtZF9wb2xpY3ksIGJ1Zi5kYXRhLCBidWYuc2l6ZSk7CisgIHBvbGljeS0+Y21kX3BvbGljeV9s ZW4gPSBidWYuc2l6ZTsKKworICBncnViX2xpc3RfcHVzaCAoR1JVQl9BU19MSVNUX1AgKHBvbGlj eV9zZXEpLCBHUlVCX0FTX0xJU1QgKHBvbGljeSkpOworCisgIHJldHVybiBHUlVCX0VSUl9OT05F OworCitlcnJvcjoKKyAgZ3J1Yl9mcmVlIChwb2xpY3kpOworCisgIHJldHVybiBlcnI7Cit9CisK K3N0YXRpYyBncnViX2Vycl90CitncnViX3RwbTJfcHJvdGVjdG9yX3Vuc2VhbCAodHBtMmtleV9w b2xpY3lfdCBwb2xpY3lfc2VxLCBUUE1fSEFORExFIHNlYWxlZF9oYW5kbGUsCisJCQkgICAgZ3J1 Yl91aW50OF90ICoqa2V5LCBncnViX3NpemVfdCAqa2V5X3NpemUpCit7CisgIFRQTVNfQVVUSF9D T01NQU5EIGF1dGhDbWQgPSB7IDAgfTsKKyAgVFBNMkJfU0VOU0lUSVZFX0RBVEEgZGF0YTsKKyAg VFBNMkJfTk9OQ0Ugbm9uY2VDYWxsZXIgPSB7IDAgfTsKKyAgVFBNVF9TWU1fREVGIHN5bW1ldHJp YyA9IHsgMCB9OworICBUUE1JX1NIX0FVVEhfU0VTU0lPTiBzZXNzaW9uOworICBncnViX3VpbnQ4 X3QgKmtleV9vdXQ7CisgIFRQTV9SQyByYzsKKyAgZ3J1Yl9lcnJfdCBlcnI7CisKKyAgLyogU3Rh cnQgQXV0aCBTZXNzaW9uICovCisgIG5vbmNlQ2FsbGVyLnNpemUgPSBUUE1fU0hBMjU2X0RJR0VT VF9TSVpFOworICBzeW1tZXRyaWMuYWxnb3JpdGhtID0gVFBNX0FMR19OVUxMOworICByYyA9IFRQ TTJfU3RhcnRBdXRoU2Vzc2lvbiAoVFBNX1JIX05VTEwsIFRQTV9SSF9OVUxMLCBOVUxMLCAmbm9u Y2VDYWxsZXIsIE5VTEwsCisJCQkgICAgICBUUE1fU0VfUE9MSUNZLCAmc3ltbWV0cmljLCBUUE1f QUxHX1NIQTI1NiwKKwkJCSAgICAgICZzZXNzaW9uLCBOVUxMLCBOVUxMKTsKKyAgaWYgKHJjICE9 IFRQTV9SQ19TVUNDRVNTKQorICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfREVW SUNFLAorCQkgICAgICAgTl8oIkZhaWxlZCB0byBzdGFydCBhdXRoIHNlc3Npb24gKFRQTTJfU3Rh cnRBdXRoU2Vzc2lvbjogMHgleCkiKSwKKwkJICAgICAgIHJjKTsKKworICAvKiBFbmZvcmNlIHRo ZSBwb2xpY3kgY29tbWFuZCBzZXF1ZW5jZSAqLworICBlcnIgPSBncnViX3RwbTJfcHJvdGVjdG9y X2VuZm9yY2VfcG9saWN5X3NlcSAocG9saWN5X3NlcSwgc2Vzc2lvbik7CisgIGlmIChlcnIgIT0g R1JVQl9FUlJfTk9ORSkKKyAgICBnb3RvIGVycm9yOworCisgIC8qIFVuc2VhbCBTZWFsZWQgS2V5 ICovCisgIGF1dGhDbWQuc2Vzc2lvbkhhbmRsZSA9IHNlc3Npb247CisgIHJjID0gVFBNMl9VbnNl YWwgKHNlYWxlZF9oYW5kbGUsICZhdXRoQ21kLCAmZGF0YSwgTlVMTCk7CisgIGlmIChyYyAhPSBU UE1fUkNfU1VDQ0VTUykKKyAgICB7CisgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9C QURfREVWSUNFLAorCQkJTl8oIkZhaWxlZCB0byB1bnNlYWwgc2VhbGVkIGtleSAoVFBNMl9VbnNl YWw6IDB4JXgpIiksCisJCQlyYyk7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAvKiBF cGlsb2d1ZSAqLworICBrZXlfb3V0ID0gZ3J1Yl9tYWxsb2MgKGRhdGEuc2l6ZSk7CisgIGlmIChr ZXlfb3V0ID09IE5VTEwpCisgICAgeworICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJf T1VUX09GX01FTU9SWSwKKwkJCU5fKCJObyBtZW1vcnkgbGVmdCB0byBhbGxvY2F0ZSB1bmxvY2sg a2V5IGJ1ZmZlciIpKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIGdydWJfbWVtY3B5 IChrZXlfb3V0LCBkYXRhLmJ1ZmZlciwgZGF0YS5zaXplKTsKKworICAqa2V5ID0ga2V5X291dDsK KyAgKmtleV9zaXplID0gZGF0YS5zaXplOworCisgIGVyciA9IEdSVUJfRVJSX05PTkU7CisKK2Vy cm9yOgorICBUUE0yX0ZsdXNoQ29udGV4dCAoc2Vzc2lvbik7CisKKyAgcmV0dXJuIGVycjsKK30K Kworc3RhdGljIGdydWJfZXJyX3QKK2dydWJfdHBtMl9wcm90ZWN0b3Jfc3JrX3JlY292ZXIgKGNv bnN0IHN0cnVjdCBncnViX3RwbTJfcHJvdGVjdG9yX2NvbnRleHQgKmN0eCwKKwkJCQkgZ3J1Yl91 aW50OF90ICoqa2V5LCBncnViX3NpemVfdCAqa2V5X3NpemUpCit7CisgIFRQTTJfU0VBTEVEX0tF WSBzZWFsZWRfa2V5ID0geyAwIH07CisgIHZvaWQgKmZpbGVfYnl0ZXMgPSBOVUxMOworICBncnVi X3NpemVfdCBmaWxlX3NpemUgPSAwOworICBncnViX3VpbnQ4X3QgcnNhcGFyZW50ID0gMDsKKyAg VFBNX0hBTkRMRSBwYXJlbnRfaGFuZGxlID0gMDsKKyAgVFBNX0hBTkRMRSBzcmtfaGFuZGxlID0g MDsKKyAgVFBNX0hBTkRMRSBzZWFsZWRfaGFuZGxlID0gMDsKKyAgdHBtMmtleV9wb2xpY3lfdCBw b2xpY3lfc2VxID0gTlVMTDsKKyAgdHBtMmtleV9hdXRocG9saWN5X3QgYXV0aHBvbCA9IE5VTEw7 CisgIHRwbTJrZXlfYXV0aHBvbGljeV90IGF1dGhwb2xfc2VxID0gTlVMTDsKKyAgZ3J1Yl9lcnJf dCBlcnI7CisKKyAgLyoKKyAgICogUmV0cmlldmUgc2VhbGVkIGtleSwgcGFyZW50IGhhbmRsZSwg cG9saWN5IHNlcXVlbmNlLCBhbmQgYXV0aHBvbGljeQorICAgKiBzZXF1ZW5jZSBmcm9tIHRoZSBr ZXkgZmlsZQorICAqLworICBpZiAoY3R4LT50cG0ya2V5KQorICAgIHsKKyAgICAgIGVyciA9IGdy dWJfdHBtMl9wcm90ZWN0b3Jfc3JrX3JlYWRfZmlsZSAoY3R4LT50cG0ya2V5LCAmZmlsZV9ieXRl cywKKwkJCQkJICAgICAgICZmaWxlX3NpemUpOworICAgICAgaWYgKGVyciAhPSBHUlVCX0VSUl9O T05FKQorCXJldHVybiBlcnI7CisKKyAgICAgIGVyciA9IGdydWJfdHBtMl9wcm90ZWN0b3Jfc3Jr X3VubWFyc2hhbF90cG0ya2V5IChmaWxlX2J5dGVzLAorCQkJCQkJICAgICAgIGZpbGVfc2l6ZSwK KwkJCQkJCSAgICAgICAmcG9saWN5X3NlcSwKKwkJCQkJCSAgICAgICAmYXV0aHBvbF9zZXEsCisJ CQkJCQkgICAgICAgJnJzYXBhcmVudCwKKwkJCQkJCSAgICAgICAmcGFyZW50X2hhbmRsZSwKKwkJ CQkJCSAgICAgICAmc2VhbGVkX2tleSk7CisgICAgICBpZiAoZXJyICE9IEdSVUJfRVJSX05PTkUp CisJZ290byBleGl0MTsKKworICAgICAgaWYgKHJzYXBhcmVudCA9PSAxKQorCXsKKwkgIHN0cnVj dCBncnViX3RwbTJfcHJvdGVjdG9yX2NvbnRleHQgKmN0eF93OworCisJICAvKiBPdmVyd3JpdGUg dGhlIFNSSyB0eXBlIGFzIG5vdGVkIGluIHRoZSBrZXkgKi8KKwkgIGN0eF93ID0gKHN0cnVjdCBn cnViX3RwbTJfcHJvdGVjdG9yX2NvbnRleHQgKiljdHg7CisJICBjdHhfdy0+c3JrX3R5cGUudHlw ZSA9IFRQTV9BTEdfUlNBOworCSAgY3R4X3ctPnNya190eXBlLmRldGFpbC5yc2FfYml0cyA9IDIw NDg7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGVyciA9IGdydWJfdHBtMl9wcm90 ZWN0b3Jfc3JrX3JlYWRfZmlsZSAoY3R4LT5rZXlmaWxlLCAmZmlsZV9ieXRlcywKKwkJCQkJICAg ICAgICZmaWxlX3NpemUpOworICAgICAgaWYgKGVyciAhPSBHUlVCX0VSUl9OT05FKQorCXJldHVy biBlcnI7CisKKyAgICAgIHBhcmVudF9oYW5kbGUgPSBUUE1fUkhfT1dORVI7CisgICAgICBlcnIg PSBncnViX3RwbTJfcHJvdGVjdG9yX3Nya191bm1hcnNoYWxfa2V5ZmlsZSAoZmlsZV9ieXRlcywK KwkJCQkJCSAgICAgICBmaWxlX3NpemUsCisJCQkJCQkgICAgICAgJnNlYWxlZF9rZXkpOworICAg ICAgaWYgKGVyciAhPSBHUlVCX0VSUl9OT05FKQorCWdvdG8gZXhpdDE7CisgICAgfQorCisgIC8q IFNldCB0aGUgU1JLIGhhbmRsZSBpZiBpdCBpcyBzcGVjaWZpZWQgd2l0aCAnLS1zcmsnIG9yIGlu c2lkZSB0aGUga2V5IGZpbGUgKi8KKyAgaWYgKGN0eC0+c3JrICE9IDApCisgICAgc3JrX2hhbmRs ZSA9IGN0eC0+c3JrOworICBlbHNlIGlmIChUUE1fSFRfSVNfUEVSU0lTVEVOVCAocGFyZW50X2hh bmRsZSkpCisgICAgc3JrX2hhbmRsZSA9IHBhcmVudF9oYW5kbGU7CisKKyAgLyogTG9hZCB0aGUg c2VhbGVkIGtleSBpbnRvIFRQTSBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIFNSSyAqLworICBl cnIgPSBncnViX3RwbTJfcHJvdGVjdG9yX2xvYWRfa2V5IChjdHgsICZzZWFsZWRfa2V5LCBwYXJl bnRfaGFuZGxlLAorCQkJCSAgICAgICZzZWFsZWRfaGFuZGxlLCAmc3JrX2hhbmRsZSk7CisgIGlm IChlcnIgIT0gR1JVQl9FUlJfTk9ORSkKKyAgICBnb3RvIGV4aXQxOworCisgIC8qCisgICAqIFNl dCBlcnIgdG8gYW4gZXJyb3IgY29kZSB0byB0cmlnZ2VyIHRoZSBzdGFuZGFsb25lIHBvbGljeSBz ZXF1ZW5jZQorICAgKiBpZiB0aGVyZSBpcyBubyBhdXRocG9saWN5IHNlcXVlbmNlCisgICAqLwor ICBlcnIgPSBHUlVCX0VSUl9SRUFEX0VSUk9SOworCisgIC8qIEl0ZXJhdGUgdGhlIGF1dGhwb2xp Y3kgc2VxdWVuY2UgdG8gZmluZCBvbmUgdGhhdCB1bnNlYWxzIHRoZSBrZXkgKi8KKyAgRk9SX0xJ U1RfRUxFTUVOVFMgKGF1dGhwb2wsIGF1dGhwb2xfc2VxKQorICAgIHsKKyAgICAgIGVyciA9IGdy dWJfdHBtMl9wcm90ZWN0b3JfdW5zZWFsIChhdXRocG9sLT5wb2xpY3lfc2VxLCBzZWFsZWRfaGFu ZGxlLAorCQkJCQlrZXksIGtleV9zaXplKTsKKyAgICAgIGlmIChlcnIgPT0gR1JVQl9FUlJfTk9O RSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qCisgICAgICAgKiBQdXNoIHRoZSBlcnJvciBt ZXNzYWdlIGludG8gdGhlIGdydWJfZXJyb3Igc3RhY2sKKyAgICAgICAqIE5vdGU6IFRoZSBncnVi X2Vycm9yIHN0YWNrIG1heSBvdmVyZmxvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgcG9saWN5Cisg ICAgICAgKiAgICAgICBzZXF1ZW5jZXMuIEFueXdheSwgd2Ugc3RpbGwgY2FuIGtlZXAgdGhlIGVy cm9yIG1lc3NhZ2VzIGZyb20KKyAgICAgICAqICAgICAgIHRoZSBmaXJzdCBmZXcgcG9saWN5IHNl cXVlbmNlcyB3aGljaCBhcmUgdXN1YWxseSBtb3N0IGxpa2VseSB0bworICAgICAgICogICAgICAg dW5zZWFsIHRoZSBrZXkuCisgICAgICAgKi8KKyAgICAgIGdydWJfZXJyb3JfcHVzaCgpOworICAg IH0KKworICAvKiBHaXZlIHRoZSBzdGFuZGFsb25lIHBvbGljeSBzZXF1ZW5jZSBhIHRyeSAqLwor ICBpZiAoZXJyICE9IEdSVUJfRVJSX05PTkUpCisgICAgeworICAgICAgLyoKKyAgICAgICAqIENy ZWF0ZSBhIGJhc2ljIHBvbGljeSBzZXF1ZW5jZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gUENSIHNlbGVj dGlvbiBpZiB0aGUKKyAgICAgICAqIGtleSBmaWxlIGRvZXNuJ3QgcHJvdmlkZSBvbmUKKyAgICAg ICAqLworICAgICAgaWYgKHBvbGljeV9zZXEgPT0gTlVMTCkKKwl7CisJICBlcnIgPSBncnViX3Rw bTJfcHJvdGVjdG9yX3NpbXBsZV9wb2xpY3lfc2VxIChjdHgsICZwb2xpY3lfc2VxKTsKKwkgIGlm IChlcnIgIT0gR1JVQl9FUlJfTk9ORSkKKwkgICAgZ290byBleGl0MjsKKwl9CisKKyAgICAgIGVy ciA9IGdydWJfdHBtMl9wcm90ZWN0b3JfdW5zZWFsIChwb2xpY3lfc2VxLCBzZWFsZWRfaGFuZGxl LCBrZXksIGtleV9zaXplKTsKKyAgICB9CisKKyAgLyogUG9wIGVycm9yIG1lc3NhZ2VzIG9uIHN1 Y2Nlc3MgKi8KKyAgaWYgKGVyciA9PSBHUlVCX0VSUl9OT05FKQorICAgIHdoaWxlIChncnViX2Vy cm9yX3BvcCAoKSk7CisKK2V4aXQyOgorICBUUE0yX0ZsdXNoQ29udGV4dCAoc2VhbGVkX2hhbmRs ZSk7CisKKyAgaWYgKCFUUE1fSFRfSVNfUEVSU0lTVEVOVCAoc3JrX2hhbmRsZSkpCisgICAgVFBN Ml9GbHVzaENvbnRleHQgKHNya19oYW5kbGUpOworCitleGl0MToKKyAgZ3J1Yl90cG0ya2V5X2Zy ZWVfcG9saWN5X3NlcSAocG9saWN5X3NlcSk7CisgIGdydWJfdHBtMmtleV9mcmVlX2F1dGhwb2xp Y3lfc2VxIChhdXRocG9sX3NlcSk7CisgIGdydWJfZnJlZSAoZmlsZV9ieXRlcyk7CisgIHJldHVy biBlcnI7Cit9CisKK3N0YXRpYyBncnViX2Vycl90CitncnViX3RwbTJfcHJvdGVjdG9yX252X3Jl Y292ZXIgKGNvbnN0IHN0cnVjdCBncnViX3RwbTJfcHJvdGVjdG9yX2NvbnRleHQgKmN0eCwKKwkJ CQlncnViX3VpbnQ4X3QgKiprZXksIGdydWJfc2l6ZV90ICprZXlfc2l6ZSkKK3sKKyAgKHZvaWQp Y3R4OworICAodm9pZClrZXk7CisgICh2b2lkKWtleV9zaXplOworCisgIHJldHVybiBncnViX2Vy cm9yIChHUlVCX0VSUl9OT1RfSU1QTEVNRU5URURfWUVULAorCQkgICAgIE5fKCJOViBJbmRleCBt b2RlIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKSk7Cit9CisKK3N0YXRpYyBncnViX2Vycl90Citn cnViX3RwbTJfcHJvdGVjdG9yX3JlY292ZXIgKGNvbnN0IHN0cnVjdCBncnViX3RwbTJfcHJvdGVj dG9yX2NvbnRleHQgKmN0eCwKKwkJCSAgICAgZ3J1Yl91aW50OF90ICoqa2V5LCBncnViX3NpemVf dCAqa2V5X3NpemUpCit7CisgIHN3aXRjaCAoY3R4LT5tb2RlKQorICAgIHsKKyAgICBjYXNlIEdS VUJfVFBNMl9QUk9URUNUT1JfTU9ERV9TUks6CisgICAgICByZXR1cm4gZ3J1Yl90cG0yX3Byb3Rl Y3Rvcl9zcmtfcmVjb3ZlciAoY3R4LCBrZXksIGtleV9zaXplKTsKKyAgICBjYXNlIEdSVUJfVFBN Ml9QUk9URUNUT1JfTU9ERV9OVjoKKyAgICAgIHJldHVybiBncnViX3RwbTJfcHJvdGVjdG9yX252 X3JlY292ZXIgKGN0eCwga2V5LCBrZXlfc2l6ZSk7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVy biBHUlVCX0VSUl9CQURfQVJHVU1FTlQ7CisgICAgfQorfQorCitzdGF0aWMgZ3J1Yl9lcnJfdAor Z3J1Yl90cG0yX3Byb3RlY3Rvcl9yZWNvdmVyX2tleSAoZ3J1Yl91aW50OF90ICoqa2V5LCBncnVi X3NpemVfdCAqa2V5X3NpemUpCit7CisgIC8qIEV4cGVjdCBhIGNhbGwgdG8gdHBtMl9wcm90ZWN0 b3JfaW5pdCBiZWZvcmUgYW55Ym9keSB0cmllcyB0byB1c2UgdXMgKi8KKyAgaWYgKGdydWJfdHBt Ml9wcm90ZWN0b3JfY3R4Lm1vZGUgPT0gR1JVQl9UUE0yX1BST1RFQ1RPUl9NT0RFX1VOU0VUKQor ICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9JTlZBTElEX0NPTU1BTkQsCisJCSAgICAg ICBOXygiQ2Fubm90IHVzZSBUUE0yIGtleSBwcm90ZWN0b3Igd2l0aG91dCBpbml0aWFsaXppbmcg IgorCQkJICAiaXQsIGNhbGwgdHBtMl9wcm90ZWN0b3JfaW5pdCBmaXJzdCIpKTsKKworICBpZiAo a2V5ID09IE5VTEwgfHwga2V5X3NpemUgPT0gTlVMTCkKKyAgICByZXR1cm4gR1JVQl9FUlJfQkFE X0FSR1VNRU5UOworCisgIHJldHVybiBncnViX3RwbTJfcHJvdGVjdG9yX3JlY292ZXIgKCZncnVi X3RwbTJfcHJvdGVjdG9yX2N0eCwga2V5LCBrZXlfc2l6ZSk7Cit9CisKK3N0YXRpYyBncnViX2Vy cl90CitncnViX3RwbTJfcHJvdGVjdG9yX2NoZWNrX2FyZ3MgKHN0cnVjdCBncnViX3RwbTJfcHJv dGVjdG9yX2NvbnRleHQgKmN0eCkKK3sKKyAgaWYgKGN0eC0+bW9kZSA9PSBHUlVCX1RQTTJfUFJP VEVDVE9SX01PREVfVU5TRVQpCisgICAgY3R4LT5tb2RlID0gR1JVQl9UUE0yX1BST1RFQ1RPUl9N T0RFX1NSSzsKKworICAvKiBDaGVja3MgZm9yIFNSSyBtb2RlICovCisgIGlmIChjdHgtPm1vZGUg PT0gR1JVQl9UUE0yX1BST1RFQ1RPUl9NT0RFX1NSSyAmJgorICAgICAgKGN0eC0+a2V5ZmlsZSA9 PSBOVUxMICYmIGN0eC0+dHBtMmtleSA9PSBOVUxMKSkKKyAgICByZXR1cm4gZ3J1Yl9lcnJvciAo R1JVQl9FUlJfQkFEX0FSR1VNRU5ULAorCQkgICAgICAgTl8oIkluIFNSSyBtb2RlLCBhIGtleSBm aWxlIG11c3QgYmUgc3BlY2lmaWVkOiAiCisJCQkgICItLXRwbTJrZXkvLVQgb3IgLS1rZXlmaWxl Ly1rIikpOworCisgIGlmIChjdHgtPm1vZGUgPT0gR1JVQl9UUE0yX1BST1RFQ1RPUl9NT0RFX1NS SyAmJgorICAgICAgKGN0eC0+a2V5ZmlsZSAhPSBOVUxMICYmIGN0eC0+dHBtMmtleSAhPSBOVUxM KSkKKyAgICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0FSR1VNRU5ULAorCQkgICAg ICAgTl8oIkluIFNSSyBtb2RlLCBwbGVhc2Ugc3BlY2lmeSBhIGtleSBmaWxlIHdpdGggIgorCQkJ ICAib25seSAtLXRwbTJrZXkvLVQgb3IgLS1rZXlmaWxlLy1rIikpOworCisgIGlmIChjdHgtPm1v ZGUgPT0gR1JVQl9UUE0yX1BST1RFQ1RPUl9NT0RFX1NSSyAmJiBjdHgtPm52ICE9IDApCisgICAg cmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9BUkdVTUVOVCwKKwkJICAgICAgIE5fKCJJ biBTUksgbW9kZSwgYW4gTlYgSW5kZXggY2Fubm90IGJlIHNwZWNpZmllZCIpKTsKKworICAvKiBD aGVja3MgZm9yIE5WIG1vZGUgKi8KKyAgaWYgKGN0eC0+bW9kZSA9PSBHUlVCX1RQTTJfUFJPVEVD VE9SX01PREVfTlYgJiYgY3R4LT5udiA9PSAwKQorICAgIHJldHVybiBncnViX2Vycm9yIChHUlVC X0VSUl9CQURfQVJHVU1FTlQsCisJCSAgICAgICBOXygiSW4gTlYgSW5kZXggbW9kZSwgYW4gTlYg SW5kZXggbXVzdCBiZSBzcGVjaWZpZWQ6ICIKKwkJCSAgICItLW52aW5kZXggb3IgLW4iKSk7CisK KyAgaWYgKGN0eC0+bW9kZSA9PSBHUlVCX1RQTTJfUFJPVEVDVE9SX01PREVfTlYgJiYKKyAgICAg IChjdHgtPnRwbTJrZXkgIT0gTlVMTCB8fCBjdHgtPmtleWZpbGUgIT0gTlVMTCkpCisgICAgcmV0 dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9BUkdVTUVOVCwKKwkJICAgICAgIE5fKCJJbiBO ViBJbmRleCBtb2RlLCBhIGtleWZpbGUgY2Fubm90IGJlIHNwZWNpZmllZCIpKTsKKworICBpZiAo Y3R4LT5tb2RlID09IEdSVUJfVFBNMl9QUk9URUNUT1JfTU9ERV9OViAmJiBjdHgtPnNyayAhPSAw KQorICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfQVJHVU1FTlQsCisJCSAgICAg ICBOXygiSW4gTlYgSW5kZXggbW9kZSwgYW4gU1JLIGNhbm5vdCBiZSBzcGVjaWZpZWQiKSk7CisK KyAgaWYgKGN0eC0+bW9kZSA9PSBHUlVCX1RQTTJfUFJPVEVDVE9SX01PREVfTlYgJiYKKyAgICAg IGN0eC0+c3JrX3R5cGUudHlwZSAhPSBUUE1fQUxHX0VSUk9SKQorICAgIHJldHVybiBncnViX2Vy cm9yIChHUlVCX0VSUl9CQURfQVJHVU1FTlQsCisJCSAgICAgICBOXygiSW4gTlYgSW5kZXggbW9k ZSwgYW4gYXN5bW1ldHJpYyBrZXkgdHlwZSBjYW5ub3QgYmUgIgorCQkJICAic3BlY2lmaWVkIikp OworCisgIC8qIERlZmF1bHRzIGFzc2lnbm1lbnQgKi8KKyAgaWYgKGN0eC0+YmFuayA9PSBUUE1f QUxHX0VSUk9SKQorICAgIGN0eC0+YmFuayA9IFRQTV9BTEdfU0hBMjU2OworCisgIGlmIChjdHgt PnBjcl9jb3VudCA9PSAwKQorICAgIHsKKyAgICAgIGN0eC0+cGNyc1swXSA9IDc7CisgICAgICBj dHgtPnBjcl9jb3VudCA9IDE7CisgICAgfQorCisgIGlmIChjdHgtPm1vZGUgPT0gR1JVQl9UUE0y X1BST1RFQ1RPUl9NT0RFX1NSSyAmJgorICAgICAgY3R4LT5zcmtfdHlwZS50eXBlID09IFRQTV9B TEdfRVJST1IpCisgICAgeworICAgICAgY3R4LT5zcmtfdHlwZS50eXBlID0gVFBNX0FMR19FQ0M7 CisgICAgICBjdHgtPnNya190eXBlLmRldGFpbC5lY2NfY3VydmUgPSBUUE1fRUNDX05JU1RfUDI1 NjsKKyAgICB9CisKKyAgcmV0dXJuIEdSVUJfRVJSX05PTkU7Cit9CisKK3N0YXRpYyBncnViX2Vy cl90CitncnViX3RwbTJfcHJvdGVjdG9yX3BhcnNlX2ZpbGUgKGNvbnN0IGNoYXIgKnZhbHVlLCBj b25zdCBjaGFyICoqZmlsZSkKK3sKKyAgaWYgKGdydWJfc3RybGVuICh2YWx1ZSkgPT0gMCkKKyAg ICByZXR1cm4gR1JVQl9FUlJfQkFEX0FSR1VNRU5UOworCisgICpmaWxlID0gZ3J1Yl9zdHJkdXAg KHZhbHVlKTsKKyAgaWYgKCpmaWxlID09IE5VTEwpCisgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdS VUJfRVJSX09VVF9PRl9NRU1PUlksCisJCSAgICAgICBOXygiTm8gbWVtb3J5IHRvIGR1cGxpY2F0 ZSBmaWxlIHBhdGgiKSk7CisKKyAgcmV0dXJuIEdSVUJfRVJSX05PTkU7Cit9CisKK3N0YXRpYyBn cnViX2Vycl90CitncnViX3RwbTJfcHJvdGVjdG9yX3BhcnNlX21vZGUgKGNvbnN0IGNoYXIgKnZh bHVlLAorCQkJCWdydWJfdHBtMl9wcm90ZWN0b3JfbW9kZV90ICptb2RlKQoreworICBpZiAoZ3J1 Yl9zdHJjbXAgKHZhbHVlLCAic3JrIikgPT0gMCkKKyAgICAqbW9kZSA9IEdSVUJfVFBNMl9QUk9U RUNUT1JfTU9ERV9TUks7CisgIGVsc2UgaWYgKGdydWJfc3RyY21wICh2YWx1ZSwgIm52IikgPT0g MCkKKyAgICAqbW9kZSA9IEdSVUJfVFBNMl9QUk9URUNUT1JfTU9ERV9OVjsKKyAgZWxzZQorICAg IHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9PVVRfT0ZfUkFOR0UsCisJCSAgICAgICBOXygi VmFsdWUgJyVzJyBpcyBub3QgYSB2YWxpZCBUUE0yIGtleSBwcm90ZWN0b3IgbW9kZSIpLAorCQkg ICAgICAgdmFsdWUpOworCisgIHJldHVybiBHUlVCX0VSUl9OT05FOworfQorCitzdGF0aWMgZ3J1 Yl9lcnJfdAorZ3J1Yl90cG0yX3Byb3RlY3Rvcl9pbml0X2NtZF9oYW5kbGVyIChncnViX2V4dGNt ZF9jb250ZXh0X3QgY3R4dCwgaW50IGFyZ2MsCisJCQkJICAgICAgY2hhciAqKmFyZ3MgX19hdHRy aWJ1dGVfXyAoKHVudXNlZCkpKQoreworICBzdHJ1Y3QgZ3J1Yl9hcmdfbGlzdCAqc3RhdGUgPSBj dHh0LT5zdGF0ZTsKKyAgZ3J1Yl9lcnJfdCBlcnI7CisKKyAgaWYgKGFyZ2MpCisgICAgcmV0dXJu IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9BUkdVTUVOVCwKKwkJICAgICAgIE5fKCJUaGUgVFBN MiBrZXkgcHJvdGVjdG9yIGRvZXMgbm90IGFjY2VwdCBhbnkgIgorCQkJICAibm9uLW9wdGlvbiBh cmd1bWVudHMgKGkuZS4sIGxpa2UgLW8gYW5kL29yIC0tb3B0aW9uICIKKwkJCSAgIm9ubHkpIikp OworCisgIGdydWJfZnJlZSAoKHZvaWQgKikgZ3J1Yl90cG0yX3Byb3RlY3Rvcl9jdHgua2V5Zmls ZSk7CisgIGdydWJfbWVtc2V0ICgmZ3J1Yl90cG0yX3Byb3RlY3Rvcl9jdHgsIDAsIHNpemVvZiAo Z3J1Yl90cG0yX3Byb3RlY3Rvcl9jdHgpKTsKKworICBpZiAoc3RhdGVbT1BUSU9OX01PREVdLnNl dCkgIC8qIG1vZGUgKi8KKyAgICB7CisgICAgICBlcnIgPSBncnViX3RwbTJfcHJvdGVjdG9yX3Bh cnNlX21vZGUgKHN0YXRlW09QVElPTl9NT0RFXS5hcmcsCisJCQkJCSAgICAmZ3J1Yl90cG0yX3By b3RlY3Rvcl9jdHgubW9kZSk7CisgICAgICBpZiAoZXJyICE9IEdSVUJfRVJSX05PTkUpCisJcmV0 dXJuIGVycjsKKyAgICB9CisKKyAgaWYgKHN0YXRlW09QVElPTl9QQ1JTXS5zZXQpICAvKiBwY3Jz ICovCisgICAgeworICAgICAgZXJyID0gZ3J1Yl90cG0yX3Byb3RlY3Rvcl9wYXJzZV9wY3JzIChz dGF0ZVtPUFRJT05fUENSU10uYXJnLAorCQkJCQkgICAgZ3J1Yl90cG0yX3Byb3RlY3Rvcl9jdHgu cGNycywKKwkJCQkJICAgICZncnViX3RwbTJfcHJvdGVjdG9yX2N0eC5wY3JfY291bnQpOworICAg ICAgaWYgKGVyciAhPSBHUlVCX0VSUl9OT05FKQorCXJldHVybiBlcnI7CisgICAgfQorCisgIGlm IChzdGF0ZVtPUFRJT05fQkFOS10uc2V0KSAgLyogYmFuayAqLworICAgIHsKKyAgICAgIGVyciA9 IGdydWJfdHBtMl9wcm90ZWN0b3JfcGFyc2VfYmFuayAoc3RhdGVbT1BUSU9OX0JBTktdLmFyZywK KwkJCQkJICAgICZncnViX3RwbTJfcHJvdGVjdG9yX2N0eC5iYW5rKTsKKyAgICAgIGlmIChlcnIg IT0gR1JVQl9FUlJfTk9ORSkKKwlyZXR1cm4gZXJyOworICAgIH0KKworICBpZiAoc3RhdGVbT1BU SU9OX1RQTTJLRVldLnNldCkgIC8qIHRwbTJrZXkgKi8KKyAgICB7CisgICAgICBlcnIgPSBncnVi X3RwbTJfcHJvdGVjdG9yX3BhcnNlX2ZpbGUgKHN0YXRlW09QVElPTl9UUE0yS0VZXS5hcmcsCisJ CQkJCSAgICAmZ3J1Yl90cG0yX3Byb3RlY3Rvcl9jdHgudHBtMmtleSk7CisgICAgICBpZiAoZXJy ICE9IEdSVUJfRVJSX05PTkUpCisJcmV0dXJuIGVycjsKKyAgICB9CisKKyAgaWYgKHN0YXRlW09Q VElPTl9LRVlGSUxFXS5zZXQpICAvKiBrZXlmaWxlICovCisgICAgeworICAgICAgZXJyID0gZ3J1 Yl90cG0yX3Byb3RlY3Rvcl9wYXJzZV9maWxlIChzdGF0ZVtPUFRJT05fS0VZRklMRV0uYXJnLAor CQkJCQkgICAgJmdydWJfdHBtMl9wcm90ZWN0b3JfY3R4LmtleWZpbGUpOworICAgICAgaWYgKGVy ciAhPSBHUlVCX0VSUl9OT05FKQorCXJldHVybiBlcnI7CisgICAgfQorCisgIGlmIChzdGF0ZVtP UFRJT05fU1JLXS5zZXQpICAvKiBzcmsgKi8KKyAgICB7CisgICAgICBlcnIgPSBncnViX3RwbTJf cHJvdGVjdG9yX3BhcnNlX3RwbV9oYW5kbGUgKHN0YXRlW09QVElPTl9TUktdLmFyZywKKwkJCQkJ CSAgJmdydWJfdHBtMl9wcm90ZWN0b3JfY3R4LnNyayk7CisgICAgICBpZiAoZXJyICE9IEdSVUJf RVJSX05PTkUpCisJcmV0dXJuIGVycjsKKyAgICB9CisKKyAgaWYgKHN0YXRlW09QVElPTl9BU1lN TUVUUklDXS5zZXQpICAvKiBhc3ltbWV0cmljICovCisgICAgeworICAgICAgZXJyID0gZ3J1Yl90 cG0yX3Byb3RlY3Rvcl9wYXJzZV9hc3ltbWV0cmljIChzdGF0ZVtPUFRJT05fQVNZTU1FVFJJQ10u YXJnLAorCQkJCQkJICAmZ3J1Yl90cG0yX3Byb3RlY3Rvcl9jdHguc3JrX3R5cGUpOworICAgICAg aWYgKGVyciAhPSBHUlVCX0VSUl9OT05FKQorCXJldHVybiBlcnI7CisgICAgfQorCisgIGlmIChz dGF0ZVtPUFRJT05fTlZJTkRFWF0uc2V0KSAgLyogbnZpbmRleCAqLworICAgIHsKKyAgICAgIGVy ciA9IGdydWJfdHBtMl9wcm90ZWN0b3JfcGFyc2VfdHBtX2hhbmRsZSAoc3RhdGVbT1BUSU9OX05W SU5ERVhdLmFyZywKKwkJCQkJCSAgJmdydWJfdHBtMl9wcm90ZWN0b3JfY3R4Lm52KTsKKyAgICAg IGlmIChlcnIgIT0gR1JVQl9FUlJfTk9ORSkKKwlyZXR1cm4gZXJyOworICAgIH0KKworICBlcnIg PSBncnViX3RwbTJfcHJvdGVjdG9yX2NoZWNrX2FyZ3MgKCZncnViX3RwbTJfcHJvdGVjdG9yX2N0 eCk7CisKKyAgLyogVGhpcyBjb21tYW5kIG9ubHkgaW5pdGlhbGl6ZXMgdGhlIHByb3RlY3Rvciwg c28gbm90aGluZyBlbHNlIHRvIGRvLiAqLworCisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBn cnViX2Vycl90CitncnViX3RwbTJfcHJvdGVjdG9yX2NsZWFyX2NtZF9oYW5kbGVyIChncnViX2V4 dGNtZF9jb250ZXh0X3QgY3R4dCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCQkJICAgICAg IGludCBhcmdjLAorCQkJCSAgICAgICBjaGFyICoqYXJncyBfX2F0dHJpYnV0ZV9fICgodW51c2Vk KSkpCit7CisgIGlmIChhcmdjKQorICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9CQURf QVJHVU1FTlQsCisJCSAgICAgICBOXygidHBtMl9rZXlfcHJvdGVjdG9yX2NsZWFyIGFjY2VwdHMg bm8gYXJndW1lbnRzIikpOworCisgIGdydWJfZnJlZSAoKHZvaWQgKikgZ3J1Yl90cG0yX3Byb3Rl Y3Rvcl9jdHgua2V5ZmlsZSk7CisgIGdydWJfbWVtc2V0ICgmZ3J1Yl90cG0yX3Byb3RlY3Rvcl9j dHgsIDAsIHNpemVvZiAoZ3J1Yl90cG0yX3Byb3RlY3Rvcl9jdHgpKTsKKworICByZXR1cm4gR1JV Ql9FUlJfTk9ORTsKK30KKworc3RhdGljIHN0cnVjdCBncnViX2tleV9wcm90ZWN0b3IgZ3J1Yl90 cG0yX2tleV9wcm90ZWN0b3IgPQorICB7CisgICAgLm5hbWUgPSAidHBtMiIsCisgICAgLnJlY292 ZXJfa2V5ID0gZ3J1Yl90cG0yX3Byb3RlY3Rvcl9yZWNvdmVyX2tleQorICB9OworCitHUlVCX01P RF9JTklUICh0cG0yKQoreworICBncnViX3RwbTJfcHJvdGVjdG9yX2luaXRfY21kID0KKyAgICBn cnViX3JlZ2lzdGVyX2V4dGNtZCAoInRwbTJfa2V5X3Byb3RlY3Rvcl9pbml0IiwKKwkJCSAgZ3J1 Yl90cG0yX3Byb3RlY3Rvcl9pbml0X2NtZF9oYW5kbGVyLCAwLAorCQkJICBOXygiWy1tIG1vZGVd ICIKKwkJCSAgICAgIlstcCBwY3JfbGlzdF0gIgorCQkJICAgICAiWy1iIHBjcl9iYW5rXSAiCisJ CQkgICAgICJbLVQgdHBtMl9rZXlfZmlsZV9wYXRoXSAiCisJCQkgICAgICJbLWsgc2VhbGVkX2tl eV9maWxlX3BhdGhdICIKKwkJCSAgICAgIlstcyBzcmtfaGFuZGxlXSAiCisJCQkgICAgICJbLWEg YXN5bW1ldHJpY19rZXlfdHlwZV0gIgorCQkJICAgICAiWy1uIG52X2luZGV4XSIpLAorCQkJICBO XygiSW5pdGlhbGl6ZSB0aGUgVFBNMiBrZXkgcHJvdGVjdG9yLiIpLAorCQkJICBncnViX3RwbTJf cHJvdGVjdG9yX2luaXRfY21kX29wdGlvbnMpOworICBncnViX3RwbTJfcHJvdGVjdG9yX2NsZWFy X2NtZCA9CisgICAgZ3J1Yl9yZWdpc3Rlcl9leHRjbWQgKCJ0cG0yX2tleV9wcm90ZWN0b3JfY2xl YXIiLAorCQkJICBncnViX3RwbTJfcHJvdGVjdG9yX2NsZWFyX2NtZF9oYW5kbGVyLCAwLCBOVUxM LAorCQkJICBOXygiQ2xlYXIgdGhlIFRQTTIga2V5IHByb3RlY3RvciBpZiBwcmV2aW91c2x5IGlu aXRpYWxpemVkLiIpLAorCQkJICBOVUxMKTsKKyAgZ3J1Yl9rZXlfcHJvdGVjdG9yX3JlZ2lzdGVy ICgmZ3J1Yl90cG0yX2tleV9wcm90ZWN0b3IpOworfQorCitHUlVCX01PRF9GSU5JICh0cG0yKQor eworICBncnViX2ZyZWUgKCh2b2lkICopIGdydWJfdHBtMl9wcm90ZWN0b3JfY3R4LmtleWZpbGUp OworICBncnViX21lbXNldCAoJmdydWJfdHBtMl9wcm90ZWN0b3JfY3R4LCAwLCBzaXplb2YgKGdy dWJfdHBtMl9wcm90ZWN0b3JfY3R4KSk7CisKKyAgZ3J1Yl9rZXlfcHJvdGVjdG9yX3VucmVnaXN0 ZXIgKCZncnViX3RwbTJfa2V5X3Byb3RlY3Rvcik7CisgIGdydWJfdW5yZWdpc3Rlcl9leHRjbWQg KGdydWJfdHBtMl9wcm90ZWN0b3JfY2xlYXJfY21kKTsKKyAgZ3J1Yl91bnJlZ2lzdGVyX2V4dGNt ZCAoZ3J1Yl90cG0yX3Byb3RlY3Rvcl9pbml0X2NtZCk7Cit9CmRpZmYgLS1naXQgYS9ncnViLWNv cmUvdHBtMi90cG0ya2V5LmFzbiBiL2dydWItY29yZS90cG0yL3RwbTJrZXkuYXNuCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMC4uN2FkNGI2YTJhCi0tLSAvZGV2L251bGwKKysr IGIvZ3J1Yi1jb3JlL3RwbTIvdHBtMmtleS5hc24KQEAgLTAsMCArMSwzMyBAQAorLS0KKy0tIFRQ TSAyLjAga2V5IGZpbGUgZm9ybWF0CistLSAgVG8gZ2VuZXJhdGUgdHBtMmtleV9hc24xX3RhYi5j OiBhc24xUGFyc2VyIHRwbTJrZXkuYXNuCistLQorVFBNMktFWSB7fQorREVGSU5JVElPTlMgSU1Q TElDSVQgVEFHUyA6Oj0KKworQkVHSU4KKworVFBNUG9saWN5IDo6PSBTRVFVRU5DRSB7CisgICAg Q29tbWFuZENvZGUgICBbMF0gRVhQTElDSVQgSU5URUdFUiwKKyAgICBDb21tYW5kUG9saWN5IFsx XSBFWFBMSUNJVCBPQ1RFVCBTVFJJTkcKK30KKworVFBNQXV0aFBvbGljeSA6Oj0gU0VRVUVOQ0Ug eworICAgIE5hbWUgICAgWzBdIEVYUExJQ0lUIFVURjhTdHJpbmcgT1BUSU9OQUwsCisgICAgUG9s aWN5ICBbMV0gRVhQTElDSVQgU0VRVUVOQ0UgT0YgVFBNUG9saWN5Cit9CisKK1RQTUtleSA6Oj0g U0VRVUVOQ0UgeworICAgIHR5cGUgICAgICAgIE9CSkVDVCBJREVOVElGSUVSLAorICAgIGVtcHR5 QXV0aCAgIFswXSBFWFBMSUNJVCBCT09MRUFOIE9QVElPTkFMLAorICAgIHBvbGljeSAgICAgIFsx XSBFWFBMSUNJVCBTRVFVRU5DRSBPRiBUUE1Qb2xpY3kgT1BUSU9OQUwsCisgICAgc2VjcmV0ICAg ICAgWzJdIEVYUExJQ0lUIE9DVEVUIFNUUklORyBPUFRJT05BTCwKKyAgICBhdXRoUG9saWN5ICBb M10gRVhQTElDSVQgU0VRVUVOQ0UgT0YgVFBNQXV0aFBvbGljeSBPUFRJT05BTCwKKyAgICBkZXNj cmlwdGlvbiBbNF0gRVhQTElDSVQgVVRGOFN0cmluZyBPUFRJT05BTCwKKyAgICByc2FQYXJlbnQg ICBbNV0gRVhQTElDSVQgQk9PTEVBTiBPUFRJT05BTCwKKyAgICBwYXJlbnQgICAgICBJTlRFR0VS LAorICAgIHB1YmtleSAgICAgIE9DVEVUIFNUUklORywKKyAgICBwcml2a2V5ICAgICBPQ1RFVCBT VFJJTkcKK30KKworRU5ECmRpZmYgLS1naXQgYS9ncnViLWNvcmUvdHBtMi90cG0ya2V5LmMgYi9n cnViLWNvcmUvdHBtMi90cG0ya2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwLi43YTU1NjQ0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncnViLWNvcmUvdHBtMi90cG0ya2V5 LmMKQEAgLTAsMCArMSw0NzYgQEAKKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9v dGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMjAyMyBTVVNFIExMQworICoKKyAqICBHUlVCIGlz IGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAq ICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFz IHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2 ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0 ZXIgdmVyc2lvbi4KKyAqCisgKiAgR1JVQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0 IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91 dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2 ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAg YWxvbmcgd2l0aCBHUlVCLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNl cy8+LgorICovCisKKyNpbmNsdWRlIDxncnViL2xpYnRhc24xLmg+CisjaW5jbHVkZSA8Z3J1Yi9s aXN0Lmg+CisjaW5jbHVkZSA8Z3J1Yi9taXNjLmg+CisjaW5jbHVkZSA8Z3J1Yi9tbS5oPgorI2lu Y2x1ZGUgPGdydWIvdHBtMi9idWZmZXIuaD4KKyNpbmNsdWRlIDxncnViL3RwbTIvdHBtMmtleS5o PgorCitleHRlcm4gYXNuMV9zdGF0aWNfbm9kZSB0cG0ya2V5X2FzbjFfdGFiW107Citjb25zdCBj aGFyICpzZWFsZWRfa2V5X29pZCA9ICIyLjIzLjEzMy4xMC4xLjUiOworCitzdGF0aWMgaW50Cith c24xX2FsbG9jYXRlX2FuZF9yZWFkIChhc24xX25vZGUgbm9kZSwgY29uc3QgY2hhciAqbmFtZSwg dm9pZCAqKmNvbnRlbnQsIGdydWJfc2l6ZV90ICpjb250ZW50X3NpemUpCit7CisgIGdydWJfdWlu dDhfdCAqdG1wc3RyID0gTlVMTDsKKyAgaW50IHRtcHN0cl9zaXplID0gMDsKKyAgaW50IHJldDsK KworICBpZiAoY29udGVudCA9PSBOVUxMKQorICAgIHJldHVybiBBU04xX01FTV9FUlJPUjsKKwor ICByZXQgPSBhc24xX3JlYWRfdmFsdWUgKG5vZGUsIG5hbWUsIE5VTEwsICZ0bXBzdHJfc2l6ZSk7 CisgIGlmIChyZXQgIT0gQVNOMV9NRU1fRVJST1IpCisgICAgcmV0dXJuIHJldDsKKworICB0bXBz dHIgPSBncnViX21hbGxvYyAodG1wc3RyX3NpemUpOworICBpZiAodG1wc3RyID09IE5VTEwpCisg ICAgcmV0dXJuIEFTTjFfTUVNX0VSUk9SOworCisgIHJldCA9IGFzbjFfcmVhZF92YWx1ZSAobm9k ZSwgbmFtZSwgdG1wc3RyLCAmdG1wc3RyX3NpemUpOworICBpZiAocmV0ICE9IEFTTjFfU1VDQ0VT UykKKyAgICByZXR1cm4gcmV0OworCisgICpjb250ZW50ID0gdG1wc3RyOworICAqY29udGVudF9z aXplID0gdG1wc3RyX3NpemU7CisKKyAgcmV0dXJuIEFTTjFfU1VDQ0VTUzsKK30KKworc3RhdGlj IGludAorYXNuMV9yZWFkX3VpbnQzMiAoYXNuMV9ub2RlIG5vZGUsIGNvbnN0IGNoYXIgKm5hbWUs IGdydWJfdWludDMyX3QgKm91dCkKK3sKKyAgZ3J1Yl91aW50MzJfdCB0bXAgPSAwOworICBncnVi X3VpbnQ4X3QgKnB0cjsKKyAgdm9pZCAqZGF0YSA9IE5VTEw7CisgIGdydWJfc2l6ZV90IGRhdGFf c2l6ZTsKKyAgaW50IHJldDsKKworICByZXQgPSBhc24xX2FsbG9jYXRlX2FuZF9yZWFkIChub2Rl LCBuYW1lLCAmZGF0YSwgJmRhdGFfc2l6ZSk7CisgIGlmIChyZXQgIT0gQVNOMV9TVUNDRVNTKQor ICAgIHJldHVybiByZXQ7CisKKyAgaWYgKGRhdGFfc2l6ZSA+IDQpCisgICAgeworICAgICAgcmV0 ID0gQVNOMV9NRU1fRVJST1I7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAvKiBjb252 ZXJ0IHRoZSBiaWctZW5kaWFuIGludGVnZXIgdG8gaG9zdCB1aW50MzIgKi8KKyAgcHRyID0gKGdy dWJfdWludDhfdCAqKSZ0bXAgKyAoNCAtIGRhdGFfc2l6ZSk7CisgIGdydWJfbWVtY3B5IChwdHIs IGRhdGEsIGRhdGFfc2l6ZSk7CisgIHRtcCA9IGdydWJfYmVfdG9fY3B1MzIgKHRtcCk7CisKKyAg Km91dCA9IHRtcDsKK2Vycm9yOgorICBpZiAoZGF0YSkKKyAgICBncnViX2ZyZWUgKGRhdGEpOwor ICByZXR1cm4gcmV0OworfQorCitncnViX2Vycl90CitncnViX3RwbTJrZXlfc3RhcnRfcGFyc2lu ZyAoYXNuMV9ub2RlICpwYXJzZWRfdHBtMmtleSwgdm9pZCAqZGF0YSwgZ3J1Yl9zaXplX3Qgc2l6 ZSkKK3sKKyAgYXNuMV9ub2RlIHRwbTJrZXk7CisgIGFzbjFfbm9kZSB0cG0ya2V5X2FzbjEgPSBO VUxMOworICB2b2lkICp0eXBlX29pZCA9IE5VTEw7CisgIGdydWJfc2l6ZV90IHR5cGVfb2lkX3Np emUgPSAwOworICB2b2lkICplbXB0eV9hdXRoID0gTlVMTDsKKyAgZ3J1Yl9zaXplX3QgZW1wdHlf YXV0aF9zaXplID0gMDsKKyAgaW50IHRtcF9zaXplID0gMDsKKyAgaW50IHJldDsKKyAgZ3J1Yl9l cnJfdCBlcnI7CisKKyAgLyoKKyAgICogVFBNS2V5IDo6PSBTRVFVRU5DRSB7CisgICAqICAgIHR5 cGUgICAgICAgIE9CSkVDVCBJREVOVElGSUVSLAorICAgKiAgICBlbXB0eUF1dGggICBbMF0gRVhQ TElDSVQgQk9PTEVBTiBPUFRJT05BTCwKKyAgICogICAgcG9saWN5ICAgICAgWzFdIEVYUExJQ0lU IFNFUVVFTkNFIE9GIFRQTVBvbGljeSBPUFRJT05BTCwKKyAgICogICAgc2VjcmV0ICAgICAgWzJd IEVYUExJQ0lUIE9DVEVUIFNUUklORyBPUFRJT05BTCwKKyAgICogICAgYXV0aFBvbGljeSAgWzNd IEVYUExJQ0lUIFNFUVVFTkNFIE9GIFRQTUF1dGhQb2xpY3kgT1BUSU9OQUwsCisgICAqICAgIGRl c2NyaXB0aW9uIFs0XSBFWFBMSUNJVCBVVEY4U3RyaW5nIE9QVElPTkFMLAorICAgKiAgICByc2FQ YXJlbnQgICBbNV0gRVhQTElDSVQgQk9PTEVBTiBPUFRJT05BTCwKKyAgICogICAgcGFyZW50ICAg ICAgSU5URUdFUiwKKyAgICogICAgcHVia2V5ICAgICAgT0NURVQgU1RSSU5HLAorICAgKiAgICBw cml2a2V5ICAgICBPQ1RFVCBTVFJJTkcKKyAgICogfQorICAgKi8KKyAgcmV0ID0gYXNuMV9hcnJh eTJ0cmVlICh0cG0ya2V5X2FzbjFfdGFiLCAmdHBtMmtleV9hc24xLCBOVUxMKTsKKyAgaWYgKHJl dCAhPSBBU04xX1NVQ0NFU1MpCisgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9B UkdVTUVOVCwKKwkJICAgICAgIE5fKCJGYWlsZWQgdG8gcGFyc2UgVFBNMktFWSBBU04uMSBhcnJh eSIpKTsKKworICByZXQgPSBhc24xX2NyZWF0ZV9lbGVtZW50ICh0cG0ya2V5X2FzbjEsICJUUE0y S0VZLlRQTUtleSIsICZ0cG0ya2V5KTsKKyAgaWYgKHJldCAhPSBBU04xX1NVQ0NFU1MpCisgICAg cmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9BUkdVTUVOVCwKKwkJICAgICAgIE5fKCJG YWlsZWQgdG8gY3JlYXRlIFRQTTJLRVkuVFBNS2V5IikpOworCisgIHJldCA9IGFzbjFfZGVyX2Rl Y29kaW5nICgmdHBtMmtleSwgZGF0YSwgc2l6ZSwgTlVMTCk7CisgIGlmIChyZXQgIT0gQVNOMV9T VUNDRVNTKQorICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfQVJHVU1FTlQsCisJ CSAgICAgICBOXygiRmFpbGVkIHRvIGRlY29kZSBUUE0yS0VZIERFUiIpKTsKKworICAvKiBDaGVj ayBpZiAndHlwZScgaXMgU2VhbGVkIEtleSBvciBub3QgKi8KKyAgcmV0ID0gYXNuMV9hbGxvY2F0 ZV9hbmRfcmVhZCAodHBtMmtleSwgInR5cGUiLCAmdHlwZV9vaWQsICZ0eXBlX29pZF9zaXplKTsK KyAgaWYgKHJldCAhPSBBU04xX1NVQ0NFU1MpCisgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJf RVJSX0JBRF9GSUxFX1RZUEUsCisJCSAgICAgICBOXygiTm90IGEgdmFsaWQgVFBNMktFWSBmaWxl IikpOworCisgIGlmIChncnViX21lbWNtcCAoc2VhbGVkX2tleV9vaWQsIHR5cGVfb2lkLCB0eXBl X29pZF9zaXplKSAhPSAwKQorICAgIHsKKyAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJS X0JBRF9GSUxFX1RZUEUsCisJCQlOXygiTm90IGEgdmFsaWQgVFBNMktFWSBmaWxlIikpOworICAg ICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgLyogJ2VtcHR5QXV0aCcgbXVzdCBiZSAnVFJVRScg c2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBwYXNzd29yZCBhdXRob3JpemF0aW9uICovCisgIHJldCA9 IGFzbjFfYWxsb2NhdGVfYW5kX3JlYWQgKHRwbTJrZXksICJlbXB0eUF1dGgiLCAmZW1wdHlfYXV0 aCwgJmVtcHR5X2F1dGhfc2l6ZSk7CisgIGlmIChyZXQgIT0gQVNOMV9TVUNDRVNTIHx8IGdydWJf c3RybmNtcCAoIlRSVUUiLCBlbXB0eV9hdXRoLCBlbXB0eV9hdXRoX3NpemUpICE9IDApCisgICAg eworICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0FSR1VNRU5ULCBOXygiZW1w dHlBdXRoIG5vdCBUUlVFIikpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgLyogJ3Nl Y3JldCcgc2hvdWxkIG5vdCBiZSBpbiBhIHNlYWxlZCBrZXkgKi8KKyAgcmV0ID0gYXNuMV9yZWFk X3ZhbHVlICh0cG0ya2V5LCAic2VjcmV0IiwgTlVMTCwgJnRtcF9zaXplKTsKKyAgaWYgKHJldCAh PSBBU04xX0VMRU1FTlRfTk9UX0ZPVU5EKQorICAgIHsKKyAgICAgIGVyciA9IGdydWJfZXJyb3Ig KEdSVUJfRVJSX0JBRF9BUkdVTUVOVCwKKwkJCU5fKCJcInNlY3JldFwiIG5vdCBhbGxvd2VkIGZv ciBTZWFsZWQgS2V5IikpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgKnBhcnNlZF90 cG0ya2V5ID0gdHBtMmtleTsKKworICBlcnIgPSBHUlVCX0VSUl9OT05FOworCitlcnJvcjoKKyAg Z3J1Yl9mcmVlICh0eXBlX29pZCk7CisgIGdydWJfZnJlZSAoZW1wdHlfYXV0aCk7CisKKyAgcmV0 dXJuIGVycjsKK30KKwordm9pZAorZ3J1Yl90cG0ya2V5X2VuZF9wYXJzaW5nIChhc24xX25vZGUg dHBtMmtleSkKK3sKKyAgYXNuMV9kZWxldGVfc3RydWN0dXJlICgmdHBtMmtleSk7CisgIHRwbTJr ZXkgPSBOVUxMOworfQorCitncnViX2Vycl90CitncnViX3RwbTJrZXlfZ2V0X3JzYXBhcmVudCAo YXNuMV9ub2RlIHRwbTJrZXksIGdydWJfdWludDhfdCAqcnNhcGFyZW50KQoreworICB2b2lkICpi b29sX3N0ciA9IE5VTEw7CisgIGdydWJfc2l6ZV90IGJvb2xfc3RyX3NpemUgPSAwOworICBpbnQg cmV0OworCisgIGlmIChyc2FwYXJlbnQgPT0gTlVMTCkKKyAgICByZXR1cm4gZ3J1Yl9lcnJvciAo R1JVQl9FUlJfQkFEX0FSR1VNRU5ULCBOXygiTlVMTCBwb2ludGVyIGRldGVjdGVkIikpOworCisg IGlmICh0cG0ya2V5ID09IE5VTEwpCisgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX1JF QURfRVJST1IsIE5fKCJJbnZhbGlkIHBhcmVudCBub2RlIikpOworCisgIHJldCA9IGFzbjFfYWxs b2NhdGVfYW5kX3JlYWQgKHRwbTJrZXksICJyc2FQYXJlbnQiLCAmYm9vbF9zdHIsICZib29sX3N0 cl9zaXplKTsKKyAgaWYgKHJldCA9PSBBU04xX1NVQ0NFU1MpCisgICAgeworICAgICAgaWYgKGdy dWJfc3RybmNtcCAoIlRSVUUiLCBib29sX3N0ciwgYm9vbF9zdHJfc2l6ZSkgPT0gMCkKKwkqcnNh cGFyZW50ID0gMTsKKyAgICAgIGVsc2UKKwkqcnNhcGFyZW50ID0gMDsKKyAgICB9CisgIGVsc2Ug aWYgKHJldCA9PSBBU04xX0VMRU1FTlRfTk9UX0ZPVU5EKQorICAgICpyc2FwYXJlbnQgPSAwOwor ICBlbHNlCisgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX1JFQURfRVJST1IsIE5fKCJG YWlsZWQgdG8gcmV0cmlldmUgcnNhUGFyZW50IikpOworCisgIGdydWJfZnJlZSAoYm9vbF9zdHIp OworCisgIHJldHVybiBHUlVCX0VSUl9OT05FOworfQorCitncnViX2Vycl90CitncnViX3RwbTJr ZXlfZ2V0X3BhcmVudCAoYXNuMV9ub2RlIHRwbTJrZXksIGdydWJfdWludDMyX3QgKnBhcmVudCkK K3sKKyAgaW50IHJldDsKKworICBpZiAocGFyZW50ID09IE5VTEwpCisgICAgcmV0dXJuIGdydWJf ZXJyb3IgKEdSVUJfRVJSX0JBRF9BUkdVTUVOVCwgTl8oIk5VTEwgcG9pbnRlciBkZXRlY3RlZCIp KTsKKworICBpZiAodHBtMmtleSA9PSBOVUxMKQorICAgIHJldHVybiBncnViX2Vycm9yIChHUlVC X0VSUl9SRUFEX0VSUk9SLCBOXygiSW52YWxpZCBwYXJlbnQgbm9kZSIpKTsKKworICByZXQgPSBh c24xX3JlYWRfdWludDMyICh0cG0ya2V5LCAicGFyZW50IiwgcGFyZW50KTsKKyAgaWYgKHJldCAh PSBBU04xX1NVQ0NFU1MpCisgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX1JFQURfRVJS T1IsIE5fKCJGYWlsZWQgdG8gcmV0cmlldmUgcGFyZW50IikpOworCisgIHJldHVybiBHUlVCX0VS Ul9OT05FOworfQorCitzdGF0aWMgZ3J1Yl9lcnJfdAordHBtMmtleV9nZXRfb2N0c3RyaW5nIChh c24xX25vZGUgdHBtMmtleSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqKmRhdGEsIGdydWJfc2l6 ZV90ICpzaXplKQoreworICBpbnQgcmV0OworCisgIGlmIChuYW1lID09IE5VTEwgfHwgZGF0YSA9 PSBOVUxMIHx8IHNpemUgPT0gTlVMTCkKKyAgICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJf QkFEX0FSR1VNRU5ULCBOXygiSW52YWxpZCBwYXJhbWV0ZXIocykiKSk7CisKKyAgaWYgKHRwbTJr ZXkgPT0gTlVMTCkKKyAgICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfUkVBRF9FUlJPUiwg Tl8oIkludmFsaWQgJXMgbm9kZSIpLCBuYW1lKTsKKworICByZXQgPSBhc24xX2FsbG9jYXRlX2Fu ZF9yZWFkICh0cG0ya2V5LCBuYW1lLCBkYXRhLCBzaXplKTsKKyAgaWYgKHJldCAhPSBBU04xX1NV Q0NFU1MpCisgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX1JFQURfRVJST1IsCisJCSAg ICAgICBOXygiRmFpbGVkIHRvIHJldHJpZXZlICVzIiksCisJCSAgICAgICBuYW1lKTsKKworICBy ZXR1cm4gR1JVQl9FUlJfTk9ORTsKK30KKworZ3J1Yl9lcnJfdAorZ3J1Yl90cG0ya2V5X2dldF9w dWJrZXkgKGFzbjFfbm9kZSB0cG0ya2V5LCB2b2lkICoqZGF0YSwgZ3J1Yl9zaXplX3QgKnNpemUp Cit7CisgIHJldHVybiB0cG0ya2V5X2dldF9vY3RzdHJpbmcgKHRwbTJrZXksICJwdWJrZXkiLCBk YXRhLCBzaXplKTsKK30KKworZ3J1Yl9lcnJfdAorZ3J1Yl90cG0ya2V5X2dldF9wcml2a2V5IChh c24xX25vZGUgdHBtMmtleSwgdm9pZCAqKmRhdGEsIGdydWJfc2l6ZV90ICpzaXplKQoreworICBy ZXR1cm4gdHBtMmtleV9nZXRfb2N0c3RyaW5nICh0cG0ya2V5LCAicHJpdmtleSIsIGRhdGEsIHNp emUpOworfQorCisvKgorICogVGhlIHN0cmluZyB0byBmZXRjaCAnUG9saWN5JyBmcm9tICdhdXRo UG9saWN5JzoKKyAqICAgYXV0aFBvbGljeS4/WFguUG9saWN5CisgKi8KKyNkZWZpbmUgQVVUSFBP TElDWV9QT0xfTUFYX1NUUiAiYXV0aFBvbGljeS4/WFguUG9saWN5IgorI2RlZmluZSBBVVRIUE9M SUNZX1BPTF9NQVggKHNpemVvZiAoQVVUSFBPTElDWV9QT0xfTUFYX1NUUikpCisKKy8qCisgKiBF eHBlY3RlZCBzdHJpbmdzIGZvciBDb21tYW5kQ29kZSBhbmQgQ29tbWFuZFBvbGljeToKKyAqICAg cG9saWN5Lj9YWC5Db21tYW5kQ29kZQorICogICBwb2xpY3kuP1hYLkNvbW1hbmRQb2xpY3kKKyAq ICAgYXV0aFBvbGljeS4/WFguUG9saWN5Lj9ZWS5Db21tYW5kQ29kZQorICogICBhdXRoUG9saWN5 Lj9YWC5Qb2xpY3kuP1lZLkNvbW1hbmRQb2xpY3kKKyAqLworI2RlZmluZSBDTURfQ09ERV9NQVhf U1RSIEFVVEhQT0xJQ1lfUE9MX01BWF9TVFIiLj9ZWS5Db21tYW5kQ29kZSIKKyNkZWZpbmUgQ01E X1BPTF9NQVhfU1RSICBBVVRIUE9MSUNZX1BPTF9NQVhfU1RSIi4/WVkuQ29tbWFuZFBvbGljeSIK KyNkZWZpbmUgQ01EX0NPREVfTUFYIChzaXplb2YgKENNRF9DT0RFX01BWF9TVFIpKQorI2RlZmlu ZSBDTURfUE9MX01BWCAgKHNpemVvZiAoQ01EX1BPTF9NQVhfU1RSKSkKKworc3RhdGljIGludAor dHBtMmtleV9nZXRfcG9saWN5X3NlcSAoYXNuMV9ub2RlIHRwbTJrZXksIGNvbnN0IGNoYXIgKnBy ZWZpeCwKKwkJCXRwbTJrZXlfcG9saWN5X3QgKnBvbGljeV9zZXEpCit7CisgIHRwbTJrZXlfcG9s aWN5X3QgdG1wX3NlcSA9IE5VTEw7CisgIHRwbTJrZXlfcG9saWN5X3QgcG9saWN5ID0gTlVMTDsK KyAgaW50IHBvbGljeV9uOworICBjaGFyIGNtZF9jb2RlW0NNRF9DT0RFX01BWF07CisgIGNoYXIg Y21kX3BvbFtDTURfUE9MX01BWF07CisgIGdydWJfc2l6ZV90IGNtZF9wb2xpY3lfbGVuOworICBp bnQgaTsKKyAgaW50IHJldDsKKworICByZXQgPSBhc24xX251bWJlcl9vZl9lbGVtZW50cyAodHBt MmtleSwgcHJlZml4LCAmcG9saWN5X24pOworICBpZiAocmV0ICE9IEFTTjFfU1VDQ0VTUykKKyAg ICByZXR1cm4gcmV0OworCisgIC8qCisgICAqIExpbWl0IHRoZSBudW1iZXIgb2YgcG9saWN5IGNv bW1hbmRzIHRvIHR3byBkaWdpdHMgKDk5KQorICAgKiBBbHRob3VnaCB0aGVyZSBpcyBubyB1cHBl ciBib3VuZCBmb3IgdGhlIG51bWJlciBvZiBwb2xpY3kgY29tbWFuZHMsCisgICAqIGluIHByYWN0 aWNlLCBpdCB0YWtlcyBvbmUgb3IgdHdvIHBvbGljeSBjb21tYW5kcyB0byB1bnNlYWwgdGhlIGtl eSwKKyAgICogc28gdGhlIDk5IGNvbW1hbmRzIGxpbWl0IGlzIG1vcmUgdGhhbiBlbm91Z2guCisg ICAqLworICBpZiAocG9saWN5X24gPiAxMDAgfHwgcG9saWN5X24gPCAxKQorICAgIHJldHVybiBB U04xX1ZBTFVFX05PVF9WQUxJRDsKKworICAvKgorICAgKiBJdGVyYXRlIHRoZSBwb2xpY3kgY29t bWFuZHMgYmFja3dhcmRzIHNpbmNlIGdydWJfbGlzdF9wdXNoKCkgcHJlcGVuZHMKKyAgICogdGhl IGl0ZW0gaW50byB0aGUgbGlzdC4KKyAgICovCisgIGZvciAoaSA9IHBvbGljeV9uOyBpID49IDE7 IGktLSkgeworICAgIHBvbGljeSA9IGdydWJfemFsbG9jIChzaXplb2YgKHN0cnVjdCB0cG0ya2V5 X3BvbGljeSkpOworICAgIGlmIChwb2xpY3kgPT0gTlVMTCkKKyAgICAgIHsKKwlyZXQgPSBBU04x X01FTV9BTExPQ19FUlJPUjsKKwlnb3RvIGVycm9yOworICAgICAgfQorICAgIGdydWJfc25wcmlu dGYgKGNtZF9jb2RlLCBDTURfQ09ERV9NQVgsICIlcy4/JWQuQ29tbWFuZENvZGUiLCBwcmVmaXgs IGkpOworICAgIGdydWJfc25wcmludGYgKGNtZF9wb2wsIENNRF9QT0xfTUFYLCAiJXMuPyVkLkNv bW1hbmRQb2xpY3kiLCBwcmVmaXgsIGkpOworCisgICAgLyogQ29tbWFuZENvZGUgICBbMF0gRVhQ TElDSVQgSU5URUdFUiAqLworICAgIHJldCA9IGFzbjFfcmVhZF91aW50MzIgKHRwbTJrZXksIGNt ZF9jb2RlLCAmcG9saWN5LT5jbWRfY29kZSk7CisgICAgaWYgKHJldCAhPSBBU04xX1NVQ0NFU1Mp CisgICAgICByZXR1cm4gcmV0OworCisgICAgLyogQ29tbWFuZFBvbGljeSBbMV0gRVhQTElDSVQg T0NURVQgU1RSSU5HICovCisgICAgcmV0ID0gdHBtMmtleV9nZXRfb2N0c3RyaW5nICh0cG0ya2V5 LCBjbWRfcG9sLCAmcG9saWN5LT5jbWRfcG9saWN5LAorCQkJCSAmY21kX3BvbGljeV9sZW4pOwor ICAgIGlmIChyZXQgIT0gQVNOMV9TVUNDRVNTKQorICAgICAgeworCWdvdG8gZXJyb3I7CisgICAg ICB9CisgICAgZWxzZSBpZiAoY21kX3BvbGljeV9sZW4gPiBHUlVCX1RQTTJfQlVGRkVSX0NBUEFD SVRZKQorICAgICAgeworCS8qCisJICogQ29tbWFuZFBvbGljeSBpcyB0aGUgbWFyc2hhbGxlZCBw YXJhbWV0ZXJzIGZvciB0aGUgVFBNIGNvbW1hbmQgc28KKwkgKiBpdCBzaG91bGQgbm90IGJlIGxh cmdlciB0aGFuIHRoZSBtYXhpbXVtIFRQTTIgYnVmZmVyLgorCSAqLworCXJldCA9IEFTTjFfVkFM VUVfTk9UX1ZBTElEOworCWdvdG8gZXJyb3I7CisgICAgICB9CisgICAgcG9saWN5LT5jbWRfcG9s aWN5X2xlbiA9IChncnViX3VpbnQxNl90KWNtZF9wb2xpY3lfbGVuOworCisgICAgLyogUHJlcGVu ZCB0aGUgcG9saWN5IGNvbW1hbmQgaW50byB0aGUgc2VxdWVuY2UgKi8KKyAgICBncnViX2xpc3Rf cHVzaCAoR1JVQl9BU19MSVNUX1AgKCZ0bXBfc2VxKSwgR1JVQl9BU19MSVNUIChwb2xpY3kpKTsK KyAgfQorCisgICpwb2xpY3lfc2VxID0gdG1wX3NlcTsKKworICByZXR1cm4gQVNOMV9TVUNDRVNT OworCitlcnJvcjoKKyAgaWYgKHBvbGljeSkKKyAgICB7CisgICAgICBncnViX2ZyZWUgKHBvbGlj eS0+Y21kX3BvbGljeSk7CisgICAgICBncnViX2ZyZWUgKHBvbGljeSk7CisgICAgfQorICBncnVi X3RwbTJrZXlfZnJlZV9wb2xpY3lfc2VxICh0bXBfc2VxKTsKKworICByZXR1cm4gcmV0OworfQor CitncnViX2Vycl90CitncnViX3RwbTJrZXlfZ2V0X3BvbGljeV9zZXEgKGFzbjFfbm9kZSB0cG0y a2V5LCB0cG0ya2V5X3BvbGljeV90ICpwb2xpY3lfc2VxKQoreworICBpbnQgcmV0OworCisgIHJl dCA9IHRwbTJrZXlfZ2V0X3BvbGljeV9zZXEgKHRwbTJrZXksICJwb2xpY3kiLCBwb2xpY3lfc2Vx KTsKKyAgaWYgKHJldCA9PSBBU04xX0VMRU1FTlRfTk9UX0ZPVU5EKQorICAgIHsKKyAgICAgIC8q ICJwb2xpY3kiIGlzIG9wdGlvbmFsLCBzbyBpdCBtYXkgbm90IGJlIGF2YWlsYWJsZSAqLworICAg ICAgKnBvbGljeV9zZXEgPSBOVUxMOworICAgICAgcmV0dXJuIEdSVUJfRVJSX05PTkU7CisgICAg fQorICBlbHNlIGlmIChyZXQgIT0gQVNOMV9TVUNDRVNTKQorICAgIHJldHVybiBncnViX2Vycm9y IChHUlVCX0VSUl9SRUFEX0VSUk9SLCBOXygiRmFpbGVkIHRvIHJldHJpZXZlIHBvbGljeSIpKTsK KworICByZXR1cm4gR1JVQl9FUlJfTk9ORTsKK30KKwordm9pZAorZ3J1Yl90cG0ya2V5X2ZyZWVf cG9saWN5X3NlcSAodHBtMmtleV9wb2xpY3lfdCBwb2xpY3lfc2VxKQoreworICB0cG0ya2V5X3Bv bGljeV90IHBvbGljeTsKKyAgdHBtMmtleV9wb2xpY3lfdCBuZXh0OworCisgIGlmIChwb2xpY3lf c2VxID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIEZPUl9MSVNUX0VMRU1FTlRTX1NBRkUgKHBv bGljeSwgbmV4dCwgcG9saWN5X3NlcSkKKyAgICB7CisgICAgICBncnViX2ZyZWUgKHBvbGljeS0+ Y21kX3BvbGljeSk7CisgICAgICBncnViX2ZyZWUgKHBvbGljeSk7CisgICAgfQorfQorCitncnVi X2Vycl90CitncnViX3RwbTJrZXlfZ2V0X2F1dGhwb2xpY3lfc2VxIChhc24xX25vZGUgdHBtMmtl eSwgdHBtMmtleV9hdXRocG9saWN5X3QgKmF1dGhwb2xfc2VxKQoreworICB0cG0ya2V5X2F1dGhw b2xpY3lfdCB0bXBfc2VxID0gTlVMTDsKKyAgdHBtMmtleV9hdXRocG9saWN5X3QgYXV0aHBvbCA9 IE5VTEw7CisgIGludCBhdXRocG9sX247CisgIGNoYXIgYXV0aHBvbF9wb2xbQVVUSFBPTElDWV9Q T0xfTUFYXTsKKyAgaW50IGk7CisgIGludCByZXQ7CisgIGdydWJfZXJyX3QgZXJyOworCisgIHJl dCA9IGFzbjFfbnVtYmVyX29mX2VsZW1lbnRzICh0cG0ya2V5LCAiYXV0aFBvbGljeSIsICZhdXRo cG9sX24pOworICBpZiAocmV0ID09IEFTTjFfRUxFTUVOVF9OT1RfRk9VTkQpCisgICAgeworICAg ICAgLyogImF1dGhQb2xpY3kiIGlzIG9wdGlvbmFsLCBzbyBpdCBtYXkgbm90IGJlIGF2YWlsYWJs ZSAqLworICAgICAgKmF1dGhwb2xfc2VxID0gTlVMTDsKKyAgICAgIHJldHVybiBHUlVCX0VSUl9O T05FOworICAgIH0KKyAgZWxzZSBpZiAocmV0ICE9IEFTTjFfU1VDQ0VTUykKKyAgICByZXR1cm4g Z3J1Yl9lcnJvciAoR1JVQl9FUlJfUkVBRF9FUlJPUiwgTl8oIkZhaWxlZCB0byByZXRyaWV2ZSBh dXRoUG9saWN5IikpOworCisgIC8qIExpbWl0IHRoZSBudW1iZXIgb2YgYXV0aFBvbGljeSBlbGVt ZW50cyB0byB0d28gZGlnaXRzICg5OSkgKi8KKyAgaWYgKGF1dGhwb2xfbiA+IDEwMCB8fCBhdXRo cG9sX24gPCAxKQorICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9PVVRfT0ZfUkFOR0Us CisJCSAgICAgICBOXygiSW52YWxpZCBudW1iZXIgb2YgYXV0aFBvbGljeSBlbGVtZW50cyIpKTsK KworICAvKgorICAgKiBJdGVyYXRlIHRoZSBhdXRoUG9saWN5IGVsZW1lbnRzIGJhY2t3YXJkcyBz aW5jZSBncnViX2xpc3RfcHVzaCgpIHByZXBlbmRzCisgICAqIHRoZSBpdGVtIGludG8gdGhlIGxp c3QuCisgICAqLworICBmb3IgKGkgPSBhdXRocG9sX247IGkgPj0gMTsgaS0tKSB7CisgICAgYXV0 aHBvbCA9IGdydWJfemFsbG9jIChzaXplb2YgKHN0cnVjdCB0cG0ya2V5X2F1dGhwb2xpY3kpKTsK KyAgICBpZiAoYXV0aHBvbCA9PSBOVUxMKQorICAgICAgeworCWVyciA9IGdydWJfZXJyb3IgKEdS VUJfRVJSX09VVF9PRl9NRU1PUlksCisJCQkgIE5fKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5 IGZvciBhdXRoUG9saWN5IikpOworCWdvdG8gZXJyb3I7CisgICAgICB9CisgICAgZ3J1Yl9zbnBy aW50ZiAoYXV0aHBvbF9wb2wsIEFVVEhQT0xJQ1lfUE9MX01BWCwgImF1dGhQb2xpY3kuPyVkLlBv bGljeSIsIGkpOworCisgICAgcmV0ID0gdHBtMmtleV9nZXRfcG9saWN5X3NlcSAodHBtMmtleSwg YXV0aHBvbF9wb2wsICZhdXRocG9sLT5wb2xpY3lfc2VxKTsKKyAgICBpZiAocmV0ICE9IEFTTjFf U1VDQ0VTUykKKyAgICAgIHsKKyAgICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfUkVB RF9FUlJPUiwKKwkJCSAgTl8oIkZhaWxlZCB0byByZXRyaWV2ZSBwb2xpY3kgZnJvbSBhdXRoUG9s aWN5IikpOworICAgICAgICBnb3RvIGVycm9yOworICAgICAgfQorCisgICAgLyogUHJlcGVuZCB0 aGUgYXV0aFBvbGljeSBlbGVtZW50IGludG8gdGhlIHNlcXVlbmNlICovCisgICAgZ3J1Yl9saXN0 X3B1c2ggKEdSVUJfQVNfTElTVF9QICgmdG1wX3NlcSksIEdSVUJfQVNfTElTVCAoYXV0aHBvbCkp OworICB9CisKKyAgKmF1dGhwb2xfc2VxID0gdG1wX3NlcTsKKworICByZXR1cm4gR1JVQl9FUlJf Tk9ORTsKKworZXJyb3I6CisgIGlmIChhdXRocG9sKQorICAgIHsKKyAgICAgIGdydWJfdHBtMmtl eV9mcmVlX3BvbGljeV9zZXEgKGF1dGhwb2wtPnBvbGljeV9zZXEpOworICAgICAgZ3J1Yl9mcmVl IChhdXRocG9sKTsKKyAgICB9CisKKyAgZ3J1Yl90cG0ya2V5X2ZyZWVfYXV0aHBvbGljeV9zZXEg KHRtcF9zZXEpOworCisgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQKK2dydWJfdHBtMmtleV9mcmVl X2F1dGhwb2xpY3lfc2VxICh0cG0ya2V5X2F1dGhwb2xpY3lfdCBhdXRocG9sX3NlcSkKK3sKKyAg dHBtMmtleV9hdXRocG9saWN5X3QgYXV0aHBvbDsKKyAgdHBtMmtleV9hdXRocG9saWN5X3QgbmV4 dDsKKworICBpZiAoYXV0aHBvbF9zZXEgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgRk9SX0xJ U1RfRUxFTUVOVFNfU0FGRSAoYXV0aHBvbCwgbmV4dCwgYXV0aHBvbF9zZXEpCisgICAgeworICAg ICAgZ3J1Yl90cG0ya2V5X2ZyZWVfcG9saWN5X3NlcSAoYXV0aHBvbC0+cG9saWN5X3NlcSk7Cisg ICAgICBncnViX2ZyZWUgKGF1dGhwb2wpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dydWItY29y ZS90cG0yL3RwbTJrZXlfYXNuMV90YWIuYyBiL2dydWItY29yZS90cG0yL3RwbTJrZXlfYXNuMV90 YWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAuLjY4Njg5MjRmOQotLS0g L2Rldi9udWxsCisrKyBiL2dydWItY29yZS90cG0yL3RwbTJrZXlfYXNuMV90YWIuYwpAQCAtMCww ICsxLDQ1IEBACisvKgorICogVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSAnYXNuMVBhcnNlciB0 cG0ya2V5LmFzbicgYW5kIHRoZSAnI2luY2x1ZGUnCisgKiBoZWFkZXJzIGFyZSByZXBsYWNlZCB3 aXRoIHRoZSBvbmVzIGluIGdydWIyLgorICogLSAnZ3J1Yi9tbS5oJyBmb3IgdGhlIGRlZmluaXRp b24gb2YgJ05VTEwnCisgKiAtICdncnViL2xpYnRhc24xLmgnIGZvciB0aGUgZGVmaW5pdGlvbiBv ZiAnYXNuMV9zdGF0aWNfbm9kZScKKyAqLworCisjaW5jbHVkZSA8Z3J1Yi9tbS5oPgorI2luY2x1 ZGUgPGdydWIvbGlidGFzbjEuaD4KKworY29uc3QgYXNuMV9zdGF0aWNfbm9kZSB0cG0ya2V5X2Fz bjFfdGFiW10gPSB7CisgIHsgIlRQTTJLRVkiLCA1MzY4NzUwMjQsIE5VTEwgfSwKKyAgeyBOVUxM LCAxMDczNzQxODM2LCBOVUxMIH0sCisgIHsgIlRQTVBvbGljeSIsIDE2MTA2MTI3NDEsIE5VTEwg fSwKKyAgeyAiQ29tbWFuZENvZGUiLCAxNjEwNjIwOTMxLCBOVUxMIH0sCisgIHsgTlVMTCwgMjA1 NiwgIjAifSwKKyAgeyAiQ29tbWFuZFBvbGljeSIsIDUzNjg3OTExMSwgTlVMTCB9LAorICB7IE5V TEwsIDIwNTYsICIxIn0sCisgIHsgIlRQTUF1dGhQb2xpY3kiLCAxNjEwNjEyNzQxLCBOVUxMIH0s CisgIHsgIk5hbWUiLCAxNjEwNjM3MzQ2LCBOVUxMIH0sCisgIHsgTlVMTCwgMjA1NiwgIjAifSwK KyAgeyAiUG9saWN5IiwgNTM2ODc5MTE1LCBOVUxMIH0sCisgIHsgTlVMTCwgMTA3Mzc0Mzg4MCwg IjEifSwKKyAgeyBOVUxMLCAyLCAiVFBNUG9saWN5In0sCisgIHsgIlRQTUtleSIsIDUzNjg3MDkx NywgTlVMTCB9LAorICB7ICJ0eXBlIiwgMTA3Mzc0MTgzNiwgTlVMTCB9LAorICB7ICJlbXB0eUF1 dGgiLCAxNjEwNjM3MzE2LCBOVUxMIH0sCisgIHsgTlVMTCwgMjA1NiwgIjAifSwKKyAgeyAicG9s aWN5IiwgMTYxMDYzNzMyMywgTlVMTCB9LAorICB7IE5VTEwsIDEwNzM3NDM4ODAsICIxIn0sCisg IHsgTlVMTCwgMiwgIlRQTVBvbGljeSJ9LAorICB7ICJzZWNyZXQiLCAxNjEwNjM3MzE5LCBOVUxM IH0sCisgIHsgTlVMTCwgMjA1NiwgIjIifSwKKyAgeyAiYXV0aFBvbGljeSIsIDE2MTA2MzczMjMs IE5VTEwgfSwKKyAgeyBOVUxMLCAxMDczNzQzODgwLCAiMyJ9LAorICB7IE5VTEwsIDIsICJUUE1B dXRoUG9saWN5In0sCisgIHsgImRlc2NyaXB0aW9uIiwgMTYxMDYzNzM0NiwgTlVMTCB9LAorICB7 IE5VTEwsIDIwNTYsICI0In0sCisgIHsgInJzYVBhcmVudCIsIDE2MTA2MzczMTYsIE5VTEwgfSwK KyAgeyBOVUxMLCAyMDU2LCAiNSJ9LAorICB7ICJwYXJlbnQiLCAxMDczNzQxODI3LCBOVUxMIH0s CisgIHsgInB1YmtleSIsIDEwNzM3NDE4MzEsIE5VTEwgfSwKKyAgeyAicHJpdmtleSIsIDcsIE5V TEwgfSwKKyAgeyBOVUxMLCAwLCBOVUxMIH0KK307CmRpZmYgLS1naXQgYS9pbmNsdWRlL2dydWIv dHBtMi9pbnRlcm5hbC9hcmdzLmggYi9pbmNsdWRlL2dydWIvdHBtMi9pbnRlcm5hbC9hcmdzLmgK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwLi45ZjRjMGViOWYKLS0tIC9kZXYv bnVsbAorKysgYi9pbmNsdWRlL2dydWIvdHBtMi9pbnRlcm5hbC9hcmdzLmgKQEAgLTAsMCArMSw0 OSBAQAorLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29w eXJpZ2h0IChDKSAyMDIyIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbgorICoKKyAqICBHUlVCIGlzIGZy ZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBp dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJz aW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4KKyAqCisgKiAgR1JVQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0 IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSBy ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxv bmcgd2l0aCBHUlVCLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+ LgorICovCisKKyNpZm5kZWYgR1JVQl9UUE0yX0lOVEVSTkFMX0FSR1NfSEVBREVSCisjZGVmaW5l IEdSVUJfVFBNMl9JTlRFUk5BTF9BUkdTX0hFQURFUiAxCisKKyNpbmNsdWRlIDxncnViL2Vyci5o PgorI2luY2x1ZGUgPGdydWIvdHBtMi90cG0yLmg+CisKK3N0cnVjdCBncnViX3Nya190eXBlCit7 CisgIFRQTUlfQUxHX1BVQkxJQyB0eXBlOworICB1bmlvbiB7CisgICAgVFBNX0tFWV9CSVRTIHJz YV9iaXRzOworICAgIFRQTV9FQ0NfQ1VSVkUgZWNjX2N1cnZlOworICB9IGRldGFpbDsKK307Cit0 eXBlZGVmIHN0cnVjdCBncnViX3Nya190eXBlIGdydWJfc3JrX3R5cGVfdDsKKworZ3J1Yl9lcnJf dAorZ3J1Yl90cG0yX3Byb3RlY3Rvcl9wYXJzZV9wY3JzIChjaGFyICp2YWx1ZSwgZ3J1Yl91aW50 OF90ICpwY3JzLAorCQkJCWdydWJfdWludDhfdCAqcGNyX2NvdW50KTsKKworZ3J1Yl9lcnJfdAor Z3J1Yl90cG0yX3Byb3RlY3Rvcl9wYXJzZV9hc3ltbWV0cmljIChjb25zdCBjaGFyICp2YWx1ZSwK KwkJCQkgICAgICBncnViX3Nya190eXBlX3QgKnNya190eXBlKTsKKworZ3J1Yl9lcnJfdAorZ3J1 Yl90cG0yX3Byb3RlY3Rvcl9wYXJzZV9iYW5rIChjb25zdCBjaGFyICp2YWx1ZSwgVFBNX0FMR19J RCAqYmFuayk7CisKK2dydWJfZXJyX3QKK2dydWJfdHBtMl9wcm90ZWN0b3JfcGFyc2VfdHBtX2hh bmRsZSAoY29uc3QgY2hhciAqdmFsdWUsIFRQTV9IQU5ETEUgKmhhbmRsZSk7CisKKyNlbmRpZiAv KiAhIEdSVUJfVFBNMl9JTlRFUk5BTF9BUkdTX0hFQURFUiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVk ZS9ncnViL3RwbTIvdHBtMmtleS5oIGIvaW5jbHVkZS9ncnViL3RwbTIvdHBtMmtleS5oCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMC4uYzI3YjUzMDVlCi0tLSAvZGV2L251bGwK KysrIGIvaW5jbHVkZS9ncnViL3RwbTIvdHBtMmtleS5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisg KiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykg MjAyMyBTVVNFIExMQworICoKKyAqICBHUlVCIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9y CisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgR1JVQiBp cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1 dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5 IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl dGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCBHUlVCLiAgSWYgbm90LCBz ZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgR1JVQl9U UE0yX1RQTTJLRVlfSEVBREVSCisjZGVmaW5lIEdSVUJfVFBNMl9UUE0yS0VZX0hFQURFUiAxCisK KyNpbmNsdWRlIDxncnViL3R5cGVzLmg+CisjaW5jbHVkZSA8Z3J1Yi9saWJ0YXNuMS5oPgorCisv KgorICogVFBNUG9saWN5IDo6PSBTRVFVRU5DRSB7CisgKiAgIENvbW1hbmRDb2RlICAgWzBdIEVY UExJQ0lUIElOVEVHRVIsCisgKiAgIENvbW1hbmRQb2xpY3kgWzFdIEVYUExJQ0lUIE9DVEVUIFNU UklORworICogfQorICovCitzdHJ1Y3QgdHBtMmtleV9wb2xpY3kgeworICBzdHJ1Y3QgdHBtMmtl eV9wb2xpY3kgKm5leHQ7CisgIHN0cnVjdCB0cG0ya2V5X3BvbGljeSAqKnByZXY7CisgIGdydWJf dWludDMyX3QgY21kX2NvZGU7CisgIHZvaWQgKmNtZF9wb2xpY3k7CisgIGdydWJfdWludDE2X3Qg Y21kX3BvbGljeV9sZW47Cit9OwordHlwZWRlZiBzdHJ1Y3QgdHBtMmtleV9wb2xpY3kgKnRwbTJr ZXlfcG9saWN5X3Q7CisKKy8qCisgKiBUUE1BdXRoUG9saWN5IDo6PSBTRVFVRU5DRSB7CisgKiAg IE5hbWUgICAgWzBdIEVYUExJQ0lUIFVURjhTdHJpbmcgT1BUSU9OQUwsCisgKiAgIFBvbGljeSAg WzFdIEVYUExJQ0lUIFNFUVVFTkNFIE9GIFRQTVBvbGljeQorICogfQorICoKKyAqIE5hbWUgaXMg bm90IGEgbmVjZXNzYXJ5IHBhcnQgdG8gdW5zZWFsIHRoZSBrZXkuIElnbm9yZSBpdC4KKyAqLwor c3RydWN0IHRwbTJrZXlfYXV0aHBvbGljeSB7CisgIHN0cnVjdCB0cG0ya2V5X2F1dGhwb2xpY3kg Km5leHQ7CisgIHN0cnVjdCB0cG0ya2V5X2F1dGhwb2xpY3kgKipwcmV2OworICAvKiBjaGFyICpu YW1lOyAqLworICB0cG0ya2V5X3BvbGljeV90IHBvbGljeV9zZXE7Cit9OwordHlwZWRlZiBzdHJ1 Y3QgdHBtMmtleV9hdXRocG9saWN5ICp0cG0ya2V5X2F1dGhwb2xpY3lfdDsKKworZ3J1Yl9lcnJf dAorZ3J1Yl90cG0ya2V5X3N0YXJ0X3BhcnNpbmcgKGFzbjFfbm9kZSAqcGFyc2VkX3RwbTJrZXks IHZvaWQgKmRhdGEsIGdydWJfc2l6ZV90IHNpemUpOworCit2b2lkCitncnViX3RwbTJrZXlfZW5k X3BhcnNpbmcgKGFzbjFfbm9kZSB0cG0ya2V5KTsKKworZ3J1Yl9lcnJfdAorZ3J1Yl90cG0ya2V5 X2dldF9yc2FwYXJlbnQgKGFzbjFfbm9kZSB0cG0ya2V5LCBncnViX3VpbnQ4X3QgKnJzYXBhcmVu dCk7CisKK2dydWJfZXJyX3QKK2dydWJfdHBtMmtleV9nZXRfcGFyZW50IChhc24xX25vZGUgdHBt MmtleSwgZ3J1Yl91aW50MzJfdCAqcGFyZW50KTsKKworZ3J1Yl9lcnJfdAorZ3J1Yl90cG0ya2V5 X2dldF9wdWJrZXkgKGFzbjFfbm9kZSB0cG0ya2V5LCB2b2lkICoqZGF0YSwgZ3J1Yl9zaXplX3Qg KnNpemUpOworCitncnViX2Vycl90CitncnViX3RwbTJrZXlfZ2V0X3ByaXZrZXkgKGFzbjFfbm9k ZSB0cG0ya2V5LCB2b2lkICoqZGF0YSwgZ3J1Yl9zaXplX3QgKnNpemUpOworCitncnViX2Vycl90 CitncnViX3RwbTJrZXlfZ2V0X3BvbGljeV9zZXEgKGFzbjFfbm9kZSB0cG0ya2V5LCB0cG0ya2V5 X3BvbGljeV90ICpwb2xpY3lfc2VxKTsKKwordm9pZAorZ3J1Yl90cG0ya2V5X2ZyZWVfcG9saWN5 X3NlcSAodHBtMmtleV9wb2xpY3lfdCBwb2xpY3lfc2VxKTsKKworZ3J1Yl9lcnJfdAorZ3J1Yl90 cG0ya2V5X2dldF9hdXRocG9saWN5X3NlcSAoYXNuMV9ub2RlIHRwbTJrZXksIHRwbTJrZXlfYXV0 aHBvbGljeV90ICphdXRocG9sX3NlcSk7CisKK3ZvaWQKK2dydWJfdHBtMmtleV9mcmVlX2F1dGhw b2xpY3lfc2VxICh0cG0ya2V5X2F1dGhwb2xpY3lfdCBhdXRocG9sX3NlcSk7CisKKyNlbmRpZiAv KiBHUlVCX1RQTTJfVFBNMktFWV9IRUFERVIgKi8KLS0gCjIuMzUuMwoKCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkdydWItZGV2ZWwgbWFpbGluZyBsaXN0 CkdydWItZGV2ZWxAZ251Lm9yZwpodHRwczovL2xpc3RzLmdudS5vcmcvbWFpbG1hbi9saXN0aW5m by9ncnViLWRldmVsCg==