From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id AA60Lv2OjGhvhwEAWB0awg (envelope-from ) for ; Fri, 01 Aug 2025 05:55:09 -0400 Authentication-Results: simark.ca; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=H8/KyjGl; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id B76521E11C; Fri, 1 Aug 2025 05:55:09 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-10.1 required=5.0 tests=ARC_SIGNED,ARC_VALID, BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,RCVD_IN_VALIDITY_CERTIFIED, RCVD_IN_VALIDITY_RPBL,RCVD_IN_VALIDITY_SAFE autolearn=ham autolearn_force=no version=4.0.1 Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 1E6EA1E089 for ; Fri, 1 Aug 2025 05:55:03 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id CE2043858418 for ; Fri, 1 Aug 2025 09:55:02 +0000 (GMT) Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.19]) by sourceware.org (Postfix) with ESMTPS id F3289385843D for ; Fri, 1 Aug 2025 09:41:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org F3289385843D Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org F3289385843D Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=198.175.65.19 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1754041310; cv=none; b=UBdS7t6BSc1IwC6Jc4V6My1K7cjwGxpG1SNmcuhoxa4DyJKhUqA8HcVQAoxmIRyjok6WxorqiJ4cESG2N6K0+DiKlimZGU2tu9z+b/+gI6kTEfIAOOx1h8lLc67ODYbieF3eGKIF6GB+vVuH/772eQIosXAAUCAWlRuChyBs7YI= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1754041310; c=relaxed/simple; bh=CNKMteqvXfYKTUz8Yb/zZRJAChnd7ctd/v5URSFOSC4=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=J2E2EU+qqpDiAWl++NGLNztzJV+GJPzUqckudtLAnQBRdqeqpNuAp2gFjuEXEguk6S5uyvIY5eXoDtW7Yddttfn/yxJpTrBj+IeKok2XkGCnkLLcqU2lsVjUAybBsFb/WDUuX2chG5znu0F8BUNNWDgcVQQ0VTTxzGyg/EaQ0ck= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F3289385843D Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=H8/KyjGl DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1754041311; x=1785577311; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=CNKMteqvXfYKTUz8Yb/zZRJAChnd7ctd/v5URSFOSC4=; b=H8/KyjGliyznu3XjOMXFKBDYlyeYxaEc+zP78MEcWC44M2cikQpwOHaC KTRgjbxlysYTWLDCqo6GWkLea5op8QtWPkt4/017OvSyTpbOIKCtt83/m +YESzC5IWLBQ3n/LJVrJ9Jhcwm9Qv6yF47F6+Otdvd3md9zvA71T3gT9d FU+LRpGCxTK55PdmT4Wcm3dWTcude9vb1Rn+SNkHHQvXaInnAdAOMiXaU FwEF1FDtzwDCN3gZeD4MLCnOe3v/7t1wh5qYmU5HpxpVDkjeTopGWNWDL dUn90KFPM1+mopogxC5bVtJJG+9nO94A+qxmkNG2Gr8W2zlL7lnMfdG4B A==; X-CSE-ConnectionGUID: xs5AqUuHQdSSeAgR7CmKTQ== X-CSE-MsgGUID: CuHp5Y9pS3SQQ4m9lEAhkg== X-IronPort-AV: E=McAfee;i="6800,10657,11508"; a="56253975" X-IronPort-AV: E=Sophos;i="6.17,255,1747724400"; d="scan'208";a="56253975" Received: from fmviesa007.fm.intel.com ([10.60.135.147]) by orvoesa111.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Aug 2025 02:41:38 -0700 X-CSE-ConnectionGUID: 0NrOcG3XT/ObHe3DtBMI2Q== X-CSE-MsgGUID: WMwU5IWIT7yO0ghYw41xeg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.17,255,1747724400"; d="scan'208";a="163086857" Received: from gkldtt-dev-004.igk.intel.com (HELO localhost) ([10.123.221.202]) by fmviesa007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Aug 2025 02:41:34 -0700 From: Tankut Baris Aktemur To: gdb-patches@sourceware.org, Markus Metzger , config-patches@gnu.org Subject: [PATCH v3 35/44] gdbserver, ze, intelgt: introduce ze-low and intel-ze-low targets Date: Fri, 1 Aug 2025 11:37:37 +0200 Message-Id: <20250801-upstream-intelgt-mvp-v3-35-59ce0f87075b@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250801-upstream-intelgt-mvp-v3-0-59ce0f87075b@intel.com> References: <20250801-upstream-intelgt-mvp-v3-0-59ce0f87075b@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.14.2 Content-Transfer-Encoding: base64 X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org RnJvbTogTWFya3VzIE1ldHpnZXIgPG1hcmt1cy50Lm1ldHpnZXJAaW50ZWwuY29tPgoKQWRkIHRo ZSBMZXZlbC1aZXJvIGJhc2VkIGludGVsZ3QgdGFyZ2V0LiAgSXQgaXMgY29uZmlndXJlZCBhcwoK ICBpbnRlbGd0LSotemViaW4KClRoaXMgYWRkcyBmdW5kYW1lbnRhbCBkZWJ1ZyBzdXBwb3J0IGZv ciBJbnRlbCBHVCBkZXZpY2VzLiAgSW4gdGhlCmZ1dHVyZSwgd2UgcGxhbiB0byBhZGQgbW9yZSBw YXRjaGVzIHRoYXQgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2UgYXMKd2VsbCB0aGUgdXNlciBleHBl cmllbmNlLiAgVGhvc2UgcGF0Y2hlcyBhcmUgYWxyZWFkeSBhdmFpbGFibGUgaW4gdGhlCmRvd25z dHJlYW0gIkludGVsIERpc3RyaWJ1dGlvbiBmb3IgR0RCIiBkZWJ1Z2dlciBhdAoKICBodHRwczov L2dpdGh1Yi5jb20vaW50ZWwvZ2RiCgpGb3IgTGV2ZWwtWmVybyBiYXNlZCBkZXZpY2VzLCB3ZSBt b2RlbCBoYXJkd2FyZSB0aHJlYWRzLiAgVGhlcmUgaXMgb25lCkdEQiB0aHJlYWQgZm9yIGVhY2gg aGFyZHdhcmUgdGhyZWFkIG9uIHRoZSBkZXZpY2UuCgpXZSBkaXN0aW5ndWlzaCBSVU5OSU5HIGFu ZCBVTkFWQUlMQUJMRSB0aHJlYWQgZXhlY3V0aW9uIHN0YXRlcy4gIFRoZXkKYXJlIHByZXR0eSBz aW1pbGFyIGJ1dCBVTkFWQUlMQUJMRSBtZWFucyB0aGF0IHdlIGhhdmUgdHJpZWQgdG8gc3RvcAp0 aGUgdGhyZWFkIGFuZCBmYWlsZWQsIHdoZXJlYXMgUlVOTklORyBtZWFucyB3ZSBoYXZlIHJlc3Vt ZWQgdGhlCnRocmVhZCBhbmQgc2luY2Ugbm90IHRyaWVkIHRvIGludGVyYWN0IHdpdGggaXQuCgpP biBhdHRhY2ggdG8gUElELCBhdHRhY2ggdG8gdGhhdCBQSUQgb24gYWxsIHN1cHBvcnRlZCBkZXZp Y2VzIGFuZApjcmVhdGUgdGFyZ2V0IGRlc2NyaXB0aW9ucyBhbmQgYSBwcm9jZXNzIGZvciBlYWNo IGRldmljZS4gIFRoaXMKdmVyc2lvbiBkb2VzIG5vdCBhbGxvdyBhdHRhY2hpbmcgdG8gb3IgZGV0 YWNoaW5nIGZyb20gYW5kIHJlYXR0YWNoaW5nCnRvIGluZGl2aWR1YWwgZGV2aWNlcy4KClRoZSB0 YXJnZXQgY2FuIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBhIG5hdGl2ZSB0YXJnZXQsIHJl bHlpbmcgb24KR0RCJ3MgbXVsdGktdGFyZ2V0IGZlYXR1cmUsIHRvIGRlYnVnIHRoZSBHUFUgYW5k IHRoZSBob3N0IGFwcGxpY2F0aW9uCmluIHRoZSBzYW1lIGRlYnVnIHNlc3Npb24uICBGb3IgdGhp cywgYnJpbmcgdGhlIG5hdGl2ZSBhcHAgdG8gYSBzdGF0ZQp3aGVyZSB0aGUgTGV2ZWwtWmVybyBi YWNrZW5kIGZvciB0aGUgR1BVIGhhcyBiZWVuIGluaXRpYWxpemVkLCB0aGVuCmNyZWF0ZSBhIGdk YnNlcnZlciBpbnN0YW5jZSBhbmQgY29ubmVjdCB0byBpdCBmcm9tIGEgc2Vjb25kIGluZmVyaW9y LgoKQmVsb3cgaXMgYSBzYW1wbGUgc2Vzc2lvbiB0aGF0IHNob3dzIGhvdyB0byBkbyB0aGlzIG1h bnVhbGx5LiAgSW4gdGhlCmRvd25zdHJlYW0gZGVidWdnZXIsIGEgUHl0aG9uIHNjcmlwdCBpcyB1 c2VkIHRvIHRha2UgdGhlc2Ugc3RlcHMKaW4gYW4gYXV0b21hdGVkIG1hbm5lciBmb3IgYmV0dGVy IHVzZXIgZXhwZXJpZW5jZS4KCiAgJCBnZGIgZGVtbwogIC4uLgogIChnZGIpIG1haW50ZW5hbmNl IHNldCB0YXJnZXQtbm9uLXN0b3Agb24KICAoZ2RiKSB0YnJlYWsgNjAKICBUZW1wb3JhcnkgYnJl YWtwb2ludCAxIGF0IDB4NDA0OWM4OiBmaWxlIGRlbW8uY3BwLCBsaW5lIDYwLgogIChnZGIpIHJ1 bgogIC4uLgogIFtTWUNMXSBVc2luZyBkZXZpY2U6IFtJbnRlbChSKSBBcmMoVE0pIEE3NTAgR3Jh cGhpY3NdIGZyb20gW0ludGVsKFIpIExldmVsLVplcm9dCgogIFRocmVhZCAxICJkZW1vIiBoaXQg VGVtcG9yYXJ5IGJyZWFrcG9pbnQgMSwgbWFpbiAoYXJnYz0xLCBhcmd2PTB4N2ZmZmZmZmZkOWI4 KSBhdCBkZW1vLmNwcDo2MAogIDYwICAgICAgICAgIHJhbmdlIGRhdGFfcmFuZ2V7bGVuZ3RofTsK ICAoZ2RiKQoKICAjIENvbm5lY3QgdGhlIEludGVsIEdUIGdkYnNlcnZlciBieSBzcGVjaWZ5aW5n IHRoZSBob3N0IGluZmVyaW9yIFBJRC4KCiAgKGdkYikgYWRkLWluZmVyaW9yIC1uby1jb25uZWN0 aW9uCiAgW05ldyBpbmZlcmlvciAyXQogIEFkZGVkIGluZmVyaW9yIDIKICAoZ2RiKSBpbmZlcmlv ciAyCiAgW1N3aXRjaGluZyB0byBpbmZlcmlvciAyIFs8bnVsbD5dICg8bm9leGVjPildCiAgKGdk YikgaW5mbyBpbmZlcmlvcnMKICAgIE51bSAgRGVzY3JpcHRpb24gICAgICAgQ29ubmVjdGlvbiAg ICAgICAgICAgRXhlY3V0YWJsZQogICAgMSAgICBwcm9jZXNzIDE2NDU4ICAgICAxIChuYXRpdmUp ICAgICAgICAgICAvdGVtcC9kZW1vCiAgKiAyICAgIDxudWxsPgogIChnZGIpIHRhcmdldCByZW1v dGUgfCBnZGJzZXJ2ZXItemUgLS1hdHRhY2ggLSAxNjQ1OAogIFJlbW90ZSBkZWJ1Z2dpbmcgdXNp bmcgfCBnZGJzZXJ2ZXItemUgLS1hdHRhY2ggLSAxNjQ1OAogIEF0dGFjaGVkOyBnaXZlbiBwaWQg PSAxNjQ1OCwgdXBkYXRlZCB0byAxCiAgUmVtb3RlIGRlYnVnZ2luZyB1c2luZyBzdGRpbwogIDx1 bmF2YWlsYWJsZT4gaW4gPz8gKCkKICAoZ2RiKQoKICAjIEZvciAiY29udGludWUiIHRvIGNvbnZl bmllbnRseSByZXN1bWUgYm90aCBpbmZlcmlvcnMsCiAgIyBzZXQgdGhlICdzY2hlZHVsZS1tdWx0 aScgbW9kZS4gIFRoZW4gZGVmaW5lIGEgYnJlYWtwb2ludAogICMgaW5zaWRlIHRoZSBrZXJuZWwg YW5kIHJlc3VtZSB0byBoaXQgdGhhdCBCUC4KCiAgKGdkYikgc2V0IHNjaGVkdWxlLW11bHRpcGxl IG9uCiAgKGdkYikgYnJlYWsgZGVtby5jcHA6MzIKICBCcmVha3BvaW50IDIgYXQgMHg0MDY1MWY6 IGZpbGUgZGVtby5jcHAsIGxpbmUgMzIuCiAgKGdkYikgY29udGludWUKICBDb250aW51aW5nLgog IC4uLgogIFRocmVhZCAyLjIwMSBoaXQgQnJlYWtwb2ludCAyLjIsIGNvbXB1dGUgKGluZGV4PXN5 Y2w6Ol9WMTo6aWQ8MT4gPSB7Li4ufSwKICAgIGVsZW1lbnQ9MTE2KSBhdCBkZW1vLmNwcDozMgog IDMyICAgICAgICBzaXplX3QgaWQwID0gR2V0RGltKGluZGV4LCAwKTsKICAoZ2RiKQoKT24gSW50 ZWwgR1QsIHRoZSAzMmIgSVAgcmVnaXN0ZXIgaG9sZHMgdGhlIG9mZnNldCBmcm9tIHRoZSA2NGIK SW5zdHJ1Y3Rpb24gQmFzZSBBZGRyZXNzLCB3aGljaCB3ZSBtb2RlbCBhcyB2aXJ0dWFsICdpc2Fi YXNlJwpyZWdpc3Rlci4KCldlIHBvcnQgYXN5bmMgc3VwcG9ydCBmcm9tIGxpbnV4LWxvdy5jYy4g IFRoZXJlIGlzIG5vIG5lZWQgdG8gbWFzawpTSUdDSExEIGR1cmluZyBwaXBlIGluaXRpYWxpemF0 aW9uIGFzIHdlJ3JlIG5vdCB1c2luZyBwdHJhY2UuICBXZSByZWx5Cm9uIEdEQiBleHBsaWNpdGx5 IHJlcXVlc3RpbmcgYWxsLXN0b3Avbm9uLXN0b3AgbW9kZSB0byBlbmFibGUgYXN5bmMuCgpGb3Ig TGV2ZWwtWmVybyB0YXJnZXRzLCBtb2R1bGUgbG9hZCBhbmQgdW5sb2FkIGV2ZW50cyBhcmUgc2Vu dCBpbiB0aGUKY29udGV4dCBvZiB0aGUgaG9zdCBwcm9jZXNzLiAgVGhleSBibG9jayBhIGhvc3Qg c3lzdGVtIGNhbGwgdW50aWwgYW4KYXR0YWNoZWQgZGVidWdnZXIgYWNrbm93bGVkZ2VzIHRoZSBl dmVudCB0byBnaXZlIGl0IGVub3VnaCB0aW1lIHRvIHBsYWNlCmJyZWFrcG9pbnRzIGJlZm9yZSB0 aGUgbW9kdWxlIG1heSBiZSB1c2VkLgoKQWNjZXNzaW5nIHRoZSBtZW1vcnkgcmVxdWlyZXMgc3Bl Y2lmeWluZyBhIGRlYnVnIHNlc3Npb24gaGFuZGxlLCB3aGljaAppcyBhdmFpbGFibGUgdGhyb3Vn aCBhIHRocmVhZC4gIEZvciBjb252ZW5pZW5jZSwgd2UgaW50cm9kdWNlCm92ZXJsb2FkZWQgdmVy c2lvbnMgb2YgcmVhZF9tZW1vcnkgYW5kIHdyaXRlX21lbW9yeSB0aGF0IHRha2UgYQpgdGhyZWFk X2luZm8gKmAgdG8gZGVub3RlIHRoZSBjb250ZXh0IGluIHdoaWNoIG1lbW9yeSBzaG91bGQgYmUK YWNjZXNzZWQuICBUaGUgZXhpc3RpbmcgcmVhZF9tZW1vcnkgYW5kIHdyaXRlX21lbW9yeSB0YXJn ZXQgb3BzIHVzZQp0aGUgb3ZlcmxvYWRlZCB2ZXJzaW9ucyBzaW1wbHkgYnkgcGFzc2luZyBjdXJy ZW50X3RocmVhZC4KCldoZW4gR0RCIHNlbmRzIGFuIGludGVycnVwdCwgc29tZSB0aHJlYWRzIG1h eSB0dXJuIG91dCB0byBiZQp1bmF2YWlsYWJsZS4gIEZyb20gR0RCJ3MgUG9WLCB0aG9zZSB0aHJl YWRzIGFyZSBub3QgcnVubmluZy4gIEhvd2V2ZXIsCnRoZXkgbWF5IGVtaXQgZXZlbnRzLiAgSW4g YWxsLXN0b3AgbW9kZSwgdGhvc2UgZXZlbnRzIGFyZSBub3QgZmV0Y2hlZAp1bnRpbCBHREIgcmVz dW1lcyB0aGUgdGhyZWFkcywgZHVlIHRvIHRoZSBzeW5jaHJvbm91cyBjb21tdW5pY2F0aW9uCm1v ZGVsLiAgSW4gbm9uLXN0b3AgbW9kZSwgaG93ZXZlciwgdGhlIGV2ZW50cyBtYXkgYmUgZmV0Y2hl ZC4gIFdoZW4KdGhleSBhcmUgc2VudCB0byBHREIsIHRoZXkgY2FuIGNhdXNlIGNvbmZ1c2lvbiwg aW4gcGFydGljdWxhciB3aGVuIEdEQgpjb21taXRzIHJlc3VtZSByZXF1ZXN0cy4gIFRvIHByZXZl bnQgYSBzdGF0ZSBtaXNtYXRjaCwgd2UgaG9sZCBldmVudHMKdGhhdCBhcmlzZSBmcm9tIHVuYXZh aWxhYmxlIHRocmVhZHMgd2hvc2UgcmVzdW1lIHN0YXRlIGlzICdzdG9wJy4KT25jZSBHREIgc2Vu ZHMgcmVzdW1lIHJlcXVlc3RzIGZvciB0aGVzZSB0aHJlYWRzLCB3ZSB1bmxlYXNoIHRoZQpldmVu dC4KCkNvLWF1dGhvcmVkLWJ5OiBUYW5rdXQgQmFyaXMgQWt0ZW11ciA8dGFua3V0LmJhcmlzLmFr dGVtdXJAaW50ZWwuY29tPgpDby1hdXRob3JlZC1ieTogTmF0YWxpYSBTYWlhcG92YSA8bmF0YWxp YS5zYWlhcG92YUBpbnRlbC5jb20+CgpDYzogPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+CkNjOiA8 YmludXRpbHNAc291cmNld2FyZS5vcmc+Ci0tLQogY29uZmlnLnN1YiAgICAgICAgICAgICAgICAg IHwgICAgMyArLQogZ2Ric2VydmVyL01ha2VmaWxlLmluICAgICAgIHwgICAgNCArLQogZ2Ric2Vy dmVyL2NvbmZpZy5pbiAgICAgICAgIHwgICAgNiArCiBnZGJzZXJ2ZXIvY29uZmlndXJlICAgICAg ICAgfCAgNTAwICsrKysrKysrCiBnZGJzZXJ2ZXIvY29uZmlndXJlLmFjICAgICAgfCAgIDE4ICsK IGdkYnNlcnZlci9jb25maWd1cmUuc3J2ICAgICB8ICAgIDQgKwogZ2Ric2VydmVyL2dkYnRocmVh ZC5oICAgICAgIHwgICAgMiArLQogZ2Ric2VydmVyL2ludGVsZ3QtemUtbG93LmNjIHwgMTAxNiAr KysrKysrKysrKysrKysKIGdkYnNlcnZlci96ZS1sb3cuY2MgICAgICAgICB8IDI5OTYgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogZ2Ric2VydmVyL3plLWxvdy5o ICAgICAgICAgIHwgIDQ5NiArKysrKysrCiAxMCBmaWxlcyBjaGFuZ2VkLCA1MDQyIGluc2VydGlv bnMoKyksIDMgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvY29uZmlnLnN1YiBiL2NvbmZpZy5z dWIKaW5kZXggNjY0ZWUyNjEyNGFjODE3MjU3ZjA3NmVkMWQ5NWY5OWNkMDUzMGZhNC4uMmE1NGM4 YTliNDEwZTM2N2MwN2MzOGJmMDYxZjJiZDRiZTlmNzRkNCAxMDA3NTUKLS0tIGEvY29uZmlnLnN1 YgorKysgYi9jb25maWcuc3ViCkBAIC0yMTQ5LDYgKzIxNDksNyBAQCBjYXNlICRvcyBpbgogCXwg d2lubnQqIFwKIAl8IHhlbml4KiBcCiAJfCB4cmF5KiBcCisJfCB6ZSogXAogCXwgemVwaHlyKiBc CiAJfCB6dm1vZSogKQogCQk7OwpAQCAtMjIxMSw3ICsyMjEyLDcgQEAgZXNhYwogY2FzZSAka2Vy bmVsLSRvcy0kb2JqIGluCiAJbGludXgtZ251Ki0gfCBsaW51eC1hbmRyb2lkKi0gfCBsaW51eC1k aWV0bGliYyotIHwgbGludXgtbGx2bSotIFwKIAkJICAgIHwgbGludXgtbWxpYmMqLSB8IGxpbnV4 LW11c2wqLSB8IGxpbnV4LW5ld2xpYiotIFwKLQkJICAgIHwgbGludXgtcmVsaWJjKi0gfCBsaW51 eC11Y2xpYmMqLSB8IGxpbnV4LW9ob3MqLSApCisJCSAgICB8IGxpbnV4LXJlbGliYyotIHwgbGlu dXgtdWNsaWJjKi0gfCBsaW51eC1vaG9zKi0gfCBsaW51eC16ZSotICkKIAkJOzsKIAl1Y2xpbnV4 LXVjbGliYyotIHwgdWNsaW51eC1nbnUqLSApCiAJCTs7CmRpZmYgLS1naXQgYS9nZGJzZXJ2ZXIv TWFrZWZpbGUuaW4gYi9nZGJzZXJ2ZXIvTWFrZWZpbGUuaW4KaW5kZXggZGJjYzE4YTg1ZGM3MGYy YWFhOGJmNzFjN2Q2ODY1Y2Q3ZjI2NGJkMS4uMjMwYTk0OGIxYzAyZjMzYjc4MjVmZjUzZTk4NDgw NmNjYWI3ZmMzZiAxMDA2NDQKLS0tIGEvZ2Ric2VydmVyL01ha2VmaWxlLmluCisrKyBiL2dkYnNl cnZlci9NYWtlZmlsZS5pbgpAQCAtMTA0LDYgKzEwNCw4IEBAIExJQklCRVJUWSA9ICQoTElCSUJF UlRZX05PUk1BTCkKIEdEQlNVUFBPUlRfQlVJTERESVIgPSAuLi9nZGJzdXBwb3J0CiBHREJTVVBQ T1JUID0gJChHREJTVVBQT1JUX0JVSUxERElSKS9saWJnZGJzdXBwb3J0LmEKIAorTElCWkVfTE9B REVSID0gQExJQlpFX0xPQURFUkAKKwogIyBnbnVsaWIKIEdOVUxJQl9QQVJFTlRfRElSID0gLi4K IGluY2x1ZGUgJChHTlVMSUJfUEFSRU5UX0RJUikvZ251bGliL01ha2VmaWxlLmdudWxpYi5pbmMK QEAgLTM2OSw3ICszNzEsNyBAQCBnZGJzZXJ2ZXIkKEVYRUVYVCk6ICQoc29ydCAkKE9CUykpICR7 Q0RFUFN9ICQoTElCR05VKSAkKExJQklCRVJUWSkgXAogCQkkKENYWEZMQUdTKSBcCiAJCS1vIGdk YnNlcnZlciQoRVhFRVhUKSAkKE9CUykgJChHREJTVVBQT1JUKSAkKExJQkdOVSkgXAogCQkkKExJ QkdOVV9FWFRSQV9MSUJTKSAkKExJQklCRVJUWSkgJChJTlRMKSBcCi0JCSQoR0RCU0VSVkVSX0xJ QlMpICQoWE1fQ0xJQlMpICQoV0lOMzJBUElMSUJTKSAkKE1BWUJFX0xJQklDT05WKQorCQkkKEdE QlNFUlZFUl9MSUJTKSAkKFhNX0NMSUJTKSAkKFdJTjMyQVBJTElCUykgJChNQVlCRV9MSUJJQ09O VikgJChMSUJaRV9MT0FERVIpCiAKIGdkYnJlcGxheSQoRVhFRVhUKTogJChzb3J0ICQoR0RCUkVQ TEFZX09CUykpICQoTElCR05VKSAkKExJQklCRVJUWSkgXAogCQkkKElOVExfREVQUykgJChHREJT VVBQT1JUKQpkaWZmIC0tZ2l0IGEvZ2Ric2VydmVyL2NvbmZpZy5pbiBiL2dkYnNlcnZlci9jb25m aWcuaW4KaW5kZXggZWFkNjZjZTdhNTc0NmM1ODIwZjA2ZTk4NTMzMmU0ZGY5OTQ5YjBiYS4uZTRi YTI5ZWNkNWQzZDVmNzk5M2Q2OTI4OWJjNzBiY2ZmYjg4ZjZhNCAxMDA2NDQKLS0tIGEvZ2Ric2Vy dmVyL2NvbmZpZy5pbgorKysgYi9nZGJzZXJ2ZXIvY29uZmlnLmluCkBAIC0xNTgsOSArMTU4LDE1 IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGRsJyBsaWJyYXJ5ICgtbGRsKS4g Ki8KICN1bmRlZiBIQVZFX0xJQkRMCiAKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgaWdmeGRi ZyBsaWJyYXJ5LiAqLworI3VuZGVmIEhBVkVfTElCSUdGWERCRworCiAvKiBEZWZpbmUgaWYgeW91 IGhhdmUgdGhlIGlwdCBsaWJyYXJ5LiAqLwogI3VuZGVmIEhBVkVfTElCSVBUCiAKKy8qIERlZmlu ZSBpZiB5b3UgaGF2ZSB0aGUgemVfbG9hZGVyIGxpYnJhcnkuICovCisjdW5kZWYgSEFWRV9MSUJa RV9MT0FERVIKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB4eGhhc2ggbGlicmFyeS4gKi8K ICN1bmRlZiBIQVZFX0xJQlhYSEFTSAogCmRpZmYgLS1naXQgYS9nZGJzZXJ2ZXIvY29uZmlndXJl IGIvZ2Ric2VydmVyL2NvbmZpZ3VyZQppbmRleCBiNDViNTVmZmRlN2EyMzcxNmZkOWY3ODhiYzdl ZWVjYzE4M2U5NmQ2Li44MjgxMDU1OTVjYTA2NWQyOTFmZWNkZjI3NGVhZDEyYjExZTFjNThhIDEw MDc1NQotLS0gYS9nZGJzZXJ2ZXIvY29uZmlndXJlCisrKyBiL2dkYnNlcnZlci9jb25maWd1cmUK QEAgLTYzMSw2ICs2MzEsOSBAQCBzcnZfeG1sZmlsZXMKIHNydl94bWxidWlsdGluCiBHREJTRVJW RVJfTElCUwogR0RCU0VSVkVSX0RFUEZJTEVTCitMVExJQlpFX0xPQURFUgorTElCWkVfTE9BREVS CitIQVZFX0xJQlpFX0xPQURFUgogUkRZTkFNSUMKIFJFUE9SVF9CVUdTX1RFWEkKIFJFUE9SVF9C VUdTX1RPCkBAIC03ODAsNiArNzgzLDggQEAgd2l0aF9wa2d2ZXJzaW9uCiB3aXRoX2J1Z3VybAog d2l0aF9saWJ0aHJlYWRfZGIKIGVuYWJsZV9pbnByb2Nlc3NfYWdlbnQKK3dpdGhfbGliemVfbG9h ZGVyX3ByZWZpeAord2l0aF9saWJ6ZV9sb2FkZXJfdHlwZQogJwogICAgICAgYWNfcHJlY2lvdXNf dmFycz0nYnVpbGRfYWxpYXMKIGhvc3RfYWxpYXMKQEAgLTE0NTAsNiArMTQ1NSw5IEBAIE9wdGlv bmFsIFBhY2thZ2VzOgogICAtLXdpdGgtYnVndXJsPVVSTCAgICAgICBEaXJlY3QgdXNlcnMgdG8g VVJMIHRvIHJlcG9ydCBhIGJ1ZwogICAtLXdpdGgtbGlidGhyZWFkLWRiPVBBVEgKICAgICAgICAg ICAgICAgICAgICAgICAgICAgdXNlIGdpdmVuIGxpYnRocmVhZF9kYiBkaXJlY3RseQorICAtLXdp dGgtbGliemVfbG9hZGVyLXByZWZpeFs9RElSXSAgc2VhcmNoIGZvciBsaWJ6ZV9sb2FkZXIgaW4g RElSL2luY2x1ZGUgYW5kIERJUi9saWIKKyAgLS13aXRob3V0LWxpYnplX2xvYWRlci1wcmVmaXgg ICAgIGRvbid0IHNlYXJjaCBmb3IgbGliemVfbG9hZGVyIGluIGluY2x1ZGVkaXIgYW5kIGxpYmRp cgorICAtLXdpdGgtbGliemVfbG9hZGVyLXR5cGU9VFlQRSAgICAgdHlwZSBvZiBsaWJyYXJ5IHRv IHNlYXJjaCBmb3IgKGF1dG8vc3RhdGljL3NoYXJlZCkKIAogU29tZSBpbmZsdWVudGlhbCBlbnZp cm9ubWVudCB2YXJpYWJsZXM6CiAgIENDICAgICAgICAgIEMgY29tcGlsZXIgY29tbWFuZApAQCAt MTQ3MjUsNiArMTQ3MzMsNDk4IEBAIGZpCiAKIAogCisKKyAgICB1c2VfYWRkaXRpb25hbD15ZXMK KworICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0iJGFjbF9maW5hbF9wcmVm aXgiCisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVmaXgiCisgIGV4ZWNfcHJlZml4 PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorCisgICAgZXZhbCBhZGRpdGlvbmFsX2luY2x1ZGVk aXI9XCIkaW5jbHVkZWRpclwiCisgICAgZXZhbCBhZGRpdGlvbmFsX2xpYmRpcj1cIiRsaWJkaXJc IgorCisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHByZWZpeD0iJGFj bF9zYXZlX3ByZWZpeCIKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWxpYnplX2xvYWRlci1w cmVmaXggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2xpYnplX2xvYWRlcl9wcmVmaXgrc2V0 fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2xpYnplX2xvYWRlcl9wcmVmaXg7Cisg ICAgaWYgdGVzdCAiWCR3aXRodmFsIiA9ICJYbm8iOyB0aGVuCisgICAgICB1c2VfYWRkaXRpb25h bD1ubworICAgIGVsc2UKKyAgICAgIGlmIHRlc3QgIlgkd2l0aHZhbCIgPSAiWCI7IHRoZW4KKwor ICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0iJGFjbF9maW5hbF9wcmVmaXgi CisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVmaXgiCisgIGV4ZWNfcHJlZml4PSIk YWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorCisgICAgICAgICAgZXZhbCBhZGRpdGlvbmFsX2luY2x1 ZGVkaXI9XCIkaW5jbHVkZWRpclwiCisgICAgICAgICAgZXZhbCBhZGRpdGlvbmFsX2xpYmRpcj1c IiRsaWJkaXJcIgorCisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHBy ZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKKworICAgICAgZWxzZQorICAgICAgICBhZGRpdGlvbmFs X2luY2x1ZGVkaXI9IiR3aXRodmFsL2luY2x1ZGUiCisgICAgICAgIGFkZGl0aW9uYWxfbGliZGly PSIkd2l0aHZhbC9saWIiCisgICAgICBmaQorICAgIGZpCisKK2ZpCisKKworIyBDaGVjayB3aGV0 aGVyIC0td2l0aC1saWJ6ZV9sb2FkZXItdHlwZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhf bGliemVfbG9hZGVyX3R5cGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2xp YnplX2xvYWRlcl90eXBlOyAgd2l0aF9saWJ6ZV9sb2FkZXJfdHlwZT0kd2l0aHZhbAorZWxzZQor ICAgd2l0aF9saWJ6ZV9sb2FkZXJfdHlwZT1hdXRvCitmaQorCisgIGxpYl90eXBlPWBldmFsIGVj aG8gXCR3aXRoX2xpYnplX2xvYWRlcl90eXBlYAorCisgICAgICBMSUJaRV9MT0FERVI9CisgIExU TElCWkVfTE9BREVSPQorICBJTkNaRV9MT0FERVI9CisgIHJwYXRoZGlycz0KKyAgbHRycGF0aGRp cnM9CisgIG5hbWVzX2FscmVhZHlfaGFuZGxlZD0KKyAgbmFtZXNfbmV4dF9yb3VuZD0nemVfbG9h ZGVyICcKKyAgd2hpbGUgdGVzdCAtbiAiJG5hbWVzX25leHRfcm91bmQiOyBkbworICAgIG5hbWVz X3RoaXNfcm91bmQ9IiRuYW1lc19uZXh0X3JvdW5kIgorICAgIG5hbWVzX25leHRfcm91bmQ9Cisg ICAgZm9yIG5hbWUgaW4gJG5hbWVzX3RoaXNfcm91bmQ7IGRvCisgICAgICBhbHJlYWR5X2hhbmRs ZWQ9CisgICAgICBmb3IgbiBpbiAkbmFtZXNfYWxyZWFkeV9oYW5kbGVkOyBkbworICAgICAgICBp ZiB0ZXN0ICIkbiIgPSAiJG5hbWUiOyB0aGVuCisgICAgICAgICAgYWxyZWFkeV9oYW5kbGVkPXll cworICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgICBkb25lCisgICAgICBpZiB0ZXN0 IC16ICIkYWxyZWFkeV9oYW5kbGVkIjsgdGhlbgorICAgICAgICBuYW1lc19hbHJlYWR5X2hhbmRs ZWQ9IiRuYW1lc19hbHJlYWR5X2hhbmRsZWQgJG5hbWUiCisgICAgICAgICAgICAgICAgICAgICAg ICB1cHBlcm5hbWU9YGVjaG8gIiRuYW1lIiB8IHNlZCAtZSAneXxhYmNkZWZnaGlqa2xtbm9wcXJz dHV2d3h5ei4vLXxBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fX3wnYAorICAgICAgICBldmFs IHZhbHVlPVwiXCRIQVZFX0xJQiR1cHBlcm5hbWVcIgorICAgICAgICBpZiB0ZXN0IC1uICIkdmFs dWUiOyB0aGVuCisgICAgICAgICAgaWYgdGVzdCAiJHZhbHVlIiA9IHllczsgdGhlbgorICAgICAg ICAgICAgZXZhbCB2YWx1ZT1cIlwkTElCJHVwcGVybmFtZVwiCisgICAgICAgICAgICB0ZXN0IC16 ICIkdmFsdWUiIHx8IExJQlpFX0xPQURFUj0iJHtMSUJaRV9MT0FERVJ9JHtMSUJaRV9MT0FERVI6 KyB9JHZhbHVlIgorICAgICAgICAgICAgZXZhbCB2YWx1ZT1cIlwkTFRMSUIkdXBwZXJuYW1lXCIK KyAgICAgICAgICAgIHRlc3QgLXogIiR2YWx1ZSIgfHwgTFRMSUJaRV9MT0FERVI9IiR7TFRMSUJa RV9MT0FERVJ9JHtMVExJQlpFX0xPQURFUjorIH0kdmFsdWUiCisgICAgICAgICAgZWxzZQorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgIGZpCisgICAgICAg IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2Rpcj0KKyAgICAgICAg ICBmb3VuZF9sYT0KKyAgICAgICAgICBmb3VuZF9zbz0KKyAgICAgICAgICBmb3VuZF9hPQorICAg ICAgICAgIGlmIHRlc3QgJHVzZV9hZGRpdGlvbmFsID0geWVzOyB0aGVuCisgICAgICAgICAgICBp ZiB0ZXN0IC1uICIkc2hsaWJleHQiICYmIHRlc3QgLWYgIiRhZGRpdGlvbmFsX2xpYmRpci9saWIk bmFtZS4kc2hsaWJleHQiICYmIHRlc3QgeCRsaWJfdHlwZSAhPSB4c3RhdGljOyB0aGVuCisgICAg ICAgICAgICAgIGZvdW5kX2Rpcj0iJGFkZGl0aW9uYWxfbGliZGlyIgorICAgICAgICAgICAgICBm b3VuZF9zbz0iJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLiRzaGxpYmV4dCIKKyAgICAgICAg ICAgICAgaWYgdGVzdCAtZiAiJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLmxhIjsgdGhlbgor ICAgICAgICAgICAgICAgIGZvdW5kX2xhPSIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUubGEi CisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBlbGlmIHRlc3QgeCRsaWJfdHlwZSAhPSB4 c2hhcmVkOyB0aGVuCisgICAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRhZGRpdGlvbmFsX2xpYmRp ci9saWIkbmFtZS4kbGliZXh0IjsgdGhlbgorICAgICAgICAgICAgICAgIGZvdW5kX2Rpcj0iJGFk ZGl0aW9uYWxfbGliZGlyIgorICAgICAgICAgICAgICAgIGZvdW5kX2E9IiRhZGRpdGlvbmFsX2xp YmRpci9saWIkbmFtZS4kbGliZXh0IgorICAgICAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRhZGRp dGlvbmFsX2xpYmRpci9saWIkbmFtZS5sYSI7IHRoZW4KKyAgICAgICAgICAgICAgICAgIGZvdW5k X2xhPSIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUubGEiCisgICAgICAgICAgICAgICAgZmkK KyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAgICAg ICBpZiB0ZXN0ICJYJGZvdW5kX2RpciIgPSAiWCI7IHRoZW4KKyAgICAgICAgICAgIGZvciB4IGlu ICRMREZMQUdTICRMVExJQlpFX0xPQURFUjsgZG8KKworICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVm aXgiCisgIHByZWZpeD0iJGFjbF9maW5hbF9wcmVmaXgiCisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4 PSIkZXhlY19wcmVmaXgiCisgIGV4ZWNfcHJlZml4PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4Igor ICBldmFsIHg9XCIkeFwiCisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisg IHByZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKKworICAgICAgICAgICAgICBjYXNlICIkeCIgaW4K KyAgICAgICAgICAgICAgICAtTCopCisgICAgICAgICAgICAgICAgICBkaXI9YGVjaG8gIlgkeCIg fCBzZWQgLWUgJ3MvXlgtTC8vJ2AKKyAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRzaGxp YmV4dCIgJiYgdGVzdCAtZiAiJGRpci9saWIkbmFtZS4kc2hsaWJleHQiICYmIHRlc3QgeCRsaWJf dHlwZSAhPSB4c3RhdGljOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGZvdW5kX2Rpcj0iJGRp ciIKKyAgICAgICAgICAgICAgICAgICAgZm91bmRfc289IiRkaXIvbGliJG5hbWUuJHNobGliZXh0 IgorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLmxhIjsgdGhl bgorICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2xhPSIkZGlyL2xpYiRuYW1lLmxhIgorICAg ICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgZWxpZiB0ZXN0IHgkbGliX3R5 cGUgIT0geHNoYXJlZDsgdGhlbgorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZGly L2xpYiRuYW1lLiRsaWJleHQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgZm91bmRfZGly PSIkZGlyIgorICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2E9IiRkaXIvbGliJG5hbWUuJGxp YmV4dCIKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLmxh IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfbGE9IiRkaXIvbGliJG5hbWUu bGEiCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAg ICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICBl c2FjCisgICAgICAgICAgICAgIGlmIHRlc3QgIlgkZm91bmRfZGlyIiAhPSAiWCI7IHRoZW4KKyAg ICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZG9uZQor ICAgICAgICAgIGZpCisgICAgICAgICAgaWYgdGVzdCAiWCRmb3VuZF9kaXIiICE9ICJYIjsgdGhl bgorICAgICAgICAgICAgICAgICAgICAgICAgTFRMSUJaRV9MT0FERVI9IiR7TFRMSUJaRV9MT0FE RVJ9JHtMVExJQlpFX0xPQURFUjorIH0tTCRmb3VuZF9kaXIgLWwkbmFtZSIKKyAgICAgICAgICAg IGlmIHRlc3QgIlgkZm91bmRfc28iICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkZW5hYmxlX3JwYXRo IiA9IG5vIHx8IHRlc3QgIlgkZm91bmRfZGlyIiA9ICJYL3Vzci9saWIiOyB0aGVuCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIExJQlpFX0xPQURFUj0iJHtMSUJaRV9MT0FERVJ9JHtM SUJaRV9MT0FERVI6KyB9JGZvdW5kX3NvIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICBmb3IgeCBpbiAkbHRycGF0aGRp cnM7IGRvCisgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZm91bmRfZGlyIjsg dGhlbgorICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAg IGJyZWFrCisgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGRvbmUKKyAgICAg ICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAg bHRycGF0aGRpcnM9IiRsdHJwYXRoZGlycyAkZm91bmRfZGlyIgorICAgICAgICAgICAgICAgIGZp CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJl Y3QiID0geWVzOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBMSUJaRV9MT0FERVI9IiR7TElCWkVfTE9BREVSfSR7TElCWkVfTE9BREVS OisgfSRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBp ZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIgJiYgdGVzdCAiJGhhcmRjb2Rl X21pbnVzX0wiID0gbm87IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIExJQlpFX0xPQURFUj0iJHtMSUJaRV9MT0FERVJ9JHtM SUJaRV9MT0FERVI6KyB9JGZvdW5kX3NvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAg ICBmb3IgeCBpbiAkcnBhdGhkaXJzOyBkbworICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3Qg IlgkeCIgPSAiWCRmb3VuZF9kaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBoYXZl aXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAg ICAgIGZpCisgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgaWYg dGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBycGF0aGRpcnM9 IiRycGF0aGRpcnMgJGZvdW5kX2RpciIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAg ICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAg ICAgICAgICAgICBmb3IgeCBpbiAkTERGTEFHUyAkTElCWkVfTE9BREVSOyBkbworCisgIGFjbF9z YXZlX3ByZWZpeD0iJHByZWZpeCIKKyAgcHJlZml4PSIkYWNsX2ZpbmFsX3ByZWZpeCIKKyAgYWNs X3NhdmVfZXhlY19wcmVmaXg9IiRleGVjX3ByZWZpeCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfZmlu YWxfZXhlY19wcmVmaXgiCisgIGV2YWwgeD1cIiR4XCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfc2F2 ZV9leGVjX3ByZWZpeCIKKyAgcHJlZml4PSIkYWNsX3NhdmVfcHJlZml4IgorCisgICAgICAgICAg ICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYLUwkZm91bmRfZGlyIjsgdGhlbgorICAgICAg ICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgYnJl YWsKKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICBkb25lCisg ICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAg ICAgICAgICAgICAgTElCWkVfTE9BREVSPSIke0xJQlpFX0xPQURFUn0ke0xJQlpFX0xPQURFUjor IH0tTCRmb3VuZF9kaXIiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAg ICAgIGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSBubzsgdGhlbgorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIExJQlpFX0xPQURFUj0iJHtMSUJaRV9MT0FERVJ9JHtMSUJaRV9M T0FERVI6KyB9JGZvdW5kX3NvIgorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQlpF X0xPQURFUj0iJHtMSUJaRV9MT0FERVJ9JHtMSUJaRV9MT0FERVI6KyB9LWwkbmFtZSIKKyAgICAg ICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAg ZmkKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgaWYg dGVzdCAiWCRmb3VuZF9hIiAhPSAiWCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgTElCWkVfTE9BREVSPSIke0xJQlpFX0xPQURFUn0ke0xJQlpFX0xPQURFUjorIH0kZm91 bmRfYSIKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgTElCWkVfTE9BREVSPSIke0xJQlpFX0xPQURFUn0ke0xJQlpFX0xP QURFUjorIH0tTCRmb3VuZF9kaXIgLWwkbmFtZSIKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAg ICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsX2luY2x1ZGVkaXI9Cisg ICAgICAgICAgICBjYXNlICIkZm91bmRfZGlyIiBpbgorICAgICAgICAgICAgICAqL2xpYiB8ICov bGliLykKKyAgICAgICAgICAgICAgICBiYXNlZGlyPWBlY2hvICJYJGZvdW5kX2RpciIgfCBzZWQg LWUgJ3MsXlgsLCcgLWUgJ3MsL2xpYi8qJCwsJ2AKKyAgICAgICAgICAgICAgICBhZGRpdGlvbmFs X2luY2x1ZGVkaXI9IiRiYXNlZGlyL2luY2x1ZGUiCisgICAgICAgICAgICAgICAgOzsKKyAgICAg ICAgICAgIGVzYWMKKyAgICAgICAgICAgIGlmIHRlc3QgIlgkYWRkaXRpb25hbF9pbmNsdWRlZGly IiAhPSAiWCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIgIT0gIlgvdXNy L2luY2x1ZGUiOyB0aGVuCisgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAg IGlmIHRlc3QgIlgkYWRkaXRpb25hbF9pbmNsdWRlZGlyIiA9ICJYL3Vzci9sb2NhbC9pbmNsdWRl IjsgdGhlbgorICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJEdDQyI7IHRoZW4KKyAgICAg ICAgICAgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgICAgICAgICAgICAgICAgIGxp bnV4KikgaGF2ZWl0PXllczs7CisgICAgICAgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAg ICAgICAgIGZpCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC16 ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJENQUEZMQUdTICRJ TkNaRV9MT0FERVI7IGRvCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9 IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4 IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKyAgZXZhbCB4PVwiJHhc IgorICBleGVjX3ByZWZpeD0iJGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xf c2F2ZV9wcmVmaXgiCisKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYLUkk YWRkaXRpb25hbF9pbmNsdWRlZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgIGhhdmVp dD15ZXMKKyAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBm aQorICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAi JGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAiJGFkZGl0aW9u YWxfaW5jbHVkZWRpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgSU5DWkVfTE9BREVSPSIke0lOQ1pFX0xPQURFUn0ke0lOQ1pFX0xPQURFUjorIH0t SSRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAg ICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgIGZpCisgICAg ICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGZvdW5kX2xh IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzYXZlX2xpYmRpcj0iJGxpYmRpciIKKyAgICAgICAgICAgICAgY2FzZSAiJGZvdW5k X2xhIiBpbgorICAgICAgICAgICAgICAgICovKiB8ICpcXCopIC4gIiRmb3VuZF9sYSIgOzsKKyAg ICAgICAgICAgICAgICAqKSAuICIuLyRmb3VuZF9sYSIgOzsKKyAgICAgICAgICAgICAgZXNhYwor ICAgICAgICAgICAgICBsaWJkaXI9IiRzYXZlX2xpYmRpciIKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICBmb3IgZGVwIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisgICAgICAgICAgICAgICAg Y2FzZSAiJGRlcCIgaW4KKyAgICAgICAgICAgICAgICAgIC1MKikKKyAgICAgICAgICAgICAgICAg ICAgYWRkaXRpb25hbF9saWJkaXI9YGVjaG8gIlgkZGVwIiB8IHNlZCAtZSAncy9eWC1MLy8nYAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgk YWRkaXRpb25hbF9saWJkaXIiICE9ICJYL3Vzci9saWIiOyB0aGVuCisgICAgICAgICAgICAgICAg ICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkYWRkaXRpb25h bF9saWJkaXIiID0gIlgvdXNyL2xvY2FsL2xpYiI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAg ICAgIGlmIHRlc3QgLW4gIiRHQ0MiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNh c2UgJGhvc3Rfb3MgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW51eCopIGhhdmVp dD15ZXM7OworICAgICAgICAgICAgICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgICAg ICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAg ICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGhh dmVpdD0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluICRMREZMQUdTICRMSUJaRV9M T0FERVI7IGRvCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xf ZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBl eGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKyAgZXZhbCB4PVwiJHhcIgorICBl eGVjX3ByZWZpeD0iJGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9w cmVmaXgiCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYLUwk YWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2 ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAg ICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAg ICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAg ICAgICAgICAgICBpZiB0ZXN0IC1kICIkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQlpFX0xP QURFUj0iJHtMSUJaRV9MT0FERVJ9JHtMSUJaRV9MT0FERVI6KyB9LUwkYWRkaXRpb25hbF9saWJk aXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAg ICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAg ICAgICAgZm9yIHggaW4gJExERkxBR1MgJExUTElCWkVfTE9BREVSOyBkbworCisgIGFjbF9zYXZl X3ByZWZpeD0iJHByZWZpeCIKKyAgcHJlZml4PSIkYWNsX2ZpbmFsX3ByZWZpeCIKKyAgYWNsX3Nh dmVfZXhlY19wcmVmaXg9IiRleGVjX3ByZWZpeCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfZmluYWxf ZXhlY19wcmVmaXgiCisgIGV2YWwgeD1cIiR4XCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfc2F2ZV9l eGVjX3ByZWZpeCIKKyAgcHJlZml4PSIkYWNsX3NhdmVfcHJlZml4IgorCisgICAgICAgICAgICAg ICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWC1MJGFkZGl0aW9uYWxfbGliZGlyIjsgdGhl bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD15ZXMKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAg ICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAt eiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAi JGFkZGl0aW9uYWxfbGliZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBMVExJQlpFX0xPQURFUj0iJHtMVExJQlpFX0xPQURF Un0ke0xUTElCWkVfTE9BREVSOisgfS1MJGFkZGl0aW9uYWxfbGliZGlyIgorICAgICAgICAgICAg ICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAg ICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAg ICA7OworICAgICAgICAgICAgICAgICAgLVIqKQorICAgICAgICAgICAgICAgICAgICBkaXI9YGVj aG8gIlgkZGVwIiB8IHNlZCAtZSAncy9eWC1SLy8nYAorICAgICAgICAgICAgICAgICAgICBpZiB0 ZXN0ICIkZW5hYmxlX3JwYXRoIiAhPSBubzsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAg ICAgICAgICAgICAgICAgIGZvciB4IGluICRycGF0aGRpcnM7IGRvCisgICAgICAgICAgICAgICAg ICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAg ICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAg ICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAg ICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAg ICAgICAgICAgICAgcnBhdGhkaXJzPSIkcnBhdGhkaXJzICRkaXIiCisgICAgICAgICAgICAgICAg ICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBp biAkbHRycGF0aGRpcnM7IGRvCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgi ID0gIlgkZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisg ICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICBm aQorICAgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0 ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgbHRycGF0aGRp cnM9IiRsdHJwYXRoZGlycyAkZGlyIgorICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAg ICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAg ICAtbCopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfbmV4 dF9yb3VuZD0iJG5hbWVzX25leHRfcm91bmQgImBlY2hvICJYJGRlcCIgfCBzZWQgLWUgJ3MvXlgt bC8vJ2AKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgICoubGEpCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX25leHRfcm91bmQ9IiRuYW1lc19uZXh0X3JvdW5k ICJgZWNobyAiWCRkZXAiIHwgc2VkIC1lICdzLF5YLiovLCwnIC1lICdzLF5saWIsLCcgLWUgJ3Ms XC5sYSQsLCdgCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgICAqKQor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQlpFX0xPQURFUj0iJHtM SUJaRV9MT0FERVJ9JHtMSUJaRV9MT0FERVI6KyB9JGRlcCIKKyAgICAgICAgICAgICAgICAgICAg TFRMSUJaRV9MT0FERVI9IiR7TFRMSUJaRV9MT0FERVJ9JHtMVExJQlpFX0xPQURFUjorIH0kZGVw IgorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAg ICAgICAgZG9uZQorICAgICAgICAgICAgZmkKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJ4 JGxpYl90eXBlIiA9ICJ4YXV0byIgfHwgdGVzdCAieCRsaWJfdHlwZSIgPSAieHNoYXJlZCI7IHRo ZW4KKyAgICAgICAgICAgICAgTElCWkVfTE9BREVSPSIke0xJQlpFX0xPQURFUn0ke0xJQlpFX0xP QURFUjorIH0tbCRuYW1lIgorICAgICAgICAgICAgICBMVExJQlpFX0xPQURFUj0iJHtMVExJQlpF X0xPQURFUn0ke0xUTElCWkVfTE9BREVSOisgfS1sJG5hbWUiCisgICAgICAgICAgICBlbHNlCisg ICAgICAgICAgICAgIExJQlpFX0xPQURFUj0iJHtMSUJaRV9MT0FERVJ9JHtMSUJaRV9MT0FERVI6 KyB9LWw6bGliJG5hbWUuJGxpYmV4dCIKKyAgICAgICAgICAgICAgTFRMSUJaRV9MT0FERVI9IiR7 TFRMSUJaRV9MT0FERVJ9JHtMVExJQlpFX0xPQURFUjorIH0tbDpsaWIkbmFtZS4kbGliZXh0Igor ICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgZmkKKyAgICBk b25lCisgIGRvbmUKKyAgaWYgdGVzdCAiWCRycGF0aGRpcnMiICE9ICJYIjsgdGhlbgorICAgIGlm IHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorICAgICAgICAgICAg ICAgICAgICAgICAgYWxsZGlycz0KKyAgICAgIGZvciBmb3VuZF9kaXIgaW4gJHJwYXRoZGlyczsg ZG8KKyAgICAgICAgYWxsZGlycz0iJHthbGxkaXJzfSR7YWxsZGlyczorJGhhcmRjb2RlX2xpYmRp cl9zZXBhcmF0b3J9JGZvdW5kX2RpciIKKyAgICAgIGRvbmUKKyAgICAgICAgICAgIGFjbF9zYXZl X2xpYmRpcj0iJGxpYmRpciIKKyAgICAgIGxpYmRpcj0iJGFsbGRpcnMiCisgICAgICBldmFsIGZs YWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICBsaWJkaXI9IiRhY2xfc2F2 ZV9saWJkaXIiCisgICAgICBMSUJaRV9MT0FERVI9IiR7TElCWkVfTE9BREVSfSR7TElCWkVfTE9B REVSOisgfSRmbGFnIgorICAgIGVsc2UKKyAgICAgICAgICAgIGZvciBmb3VuZF9kaXIgaW4gJHJw YXRoZGlyczsgZG8KKyAgICAgICAgYWNsX3NhdmVfbGliZGlyPSIkbGliZGlyIgorICAgICAgICBs aWJkaXI9IiRmb3VuZF9kaXIiCisgICAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJf ZmxhZ19zcGVjXCIKKyAgICAgICAgbGliZGlyPSIkYWNsX3NhdmVfbGliZGlyIgorICAgICAgICBM SUJaRV9MT0FERVI9IiR7TElCWkVfTE9BREVSfSR7TElCWkVfTE9BREVSOisgfSRmbGFnIgorICAg ICAgZG9uZQorICAgIGZpCisgIGZpCisgIGlmIHRlc3QgIlgkbHRycGF0aGRpcnMiICE9ICJYIjsg dGhlbgorICAgICAgICAgICAgZm9yIGZvdW5kX2RpciBpbiAkbHRycGF0aGRpcnM7IGRvCisgICAg ICBMVExJQlpFX0xPQURFUj0iJHtMVExJQlpFX0xPQURFUn0ke0xUTElCWkVfTE9BREVSOisgfS1S JGZvdW5kX2RpciIKKyAgICBkb25lCisgIGZpCisKKworICAgICAgICBhY19zYXZlX0NQUEZMQUdT PSIkQ1BQRkxBR1MiCisKKyAgZm9yIGVsZW1lbnQgaW4gJElOQ1pFX0xPQURFUjsgZG8KKyAgICBo YXZlaXQ9CisgICAgZm9yIHggaW4gJENQUEZMQUdTOyBkbworCisgIGFjbF9zYXZlX3ByZWZpeD0i JHByZWZpeCIKKyAgcHJlZml4PSIkYWNsX2ZpbmFsX3ByZWZpeCIKKyAgYWNsX3NhdmVfZXhlY19w cmVmaXg9IiRleGVjX3ByZWZpeCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfZmluYWxfZXhlY19wcmVm aXgiCisgIGV2YWwgeD1cIiR4XCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfc2F2ZV9leGVjX3ByZWZp eCIKKyAgcHJlZml4PSIkYWNsX3NhdmVfcHJlZml4IgorCisgICAgICBpZiB0ZXN0ICJYJHgiID0g IlgkZWxlbWVudCI7IHRoZW4KKyAgICAgICAgaGF2ZWl0PXllcworICAgICAgICBicmVhaworICAg ICAgZmkKKyAgICBkb25lCisgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgIENQ UEZMQUdTPSIke0NQUEZMQUdTfSR7Q1BQRkxBR1M6KyB9JGVsZW1lbnQiCisgICAgZmkKKyAgZG9u ZQorCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2lu ZyBmb3IgbGliemVfbG9hZGVyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJ6ZV9s b2FkZXIuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliemVfbG9hZGVyKzp9IGZhbHNlOyB0aGVu IDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICAgIGFjX3NhdmVfTElC Uz0iJExJQlMiCisgICAgTElCUz0iJExJQlMgJExJQlpFX0xPQURFUiIKKyAgICBjYXQgY29uZmRl ZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICov CisjaW5jbHVkZSAibGV2ZWxfemVyby96ZXRfYXBpLmgiCitpbnQKK21haW4gKCkKK3sKK3plSW5p dCAoMCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsg IiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliemVfbG9hZGVyPXllcworZWxzZQorICBhY19j dl9saWJ6ZV9sb2FkZXI9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4k YWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICAg IExJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l bm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYnplX2xvYWRlciIgPiY1CiskYXNfZWNobyAi JGFjX2N2X2xpYnplX2xvYWRlciIgPiY2OyB9CisgIGlmIHRlc3QgIiRhY19jdl9saWJ6ZV9sb2Fk ZXIiID0geWVzOyB0aGVuCisgICAgSEFWRV9MSUJaRV9MT0FERVI9eWVzCisKKyRhc19lY2hvICIj ZGVmaW5lIEhBVkVfTElCWkVfTE9BREVSIDEiID4+Y29uZmRlZnMuaAorCisgICAgeyAkYXNfZWNo byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gbGluayB3aXRo IGxpYnplX2xvYWRlciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gbGluayB3aXRo IGxpYnplX2xvYWRlci4uLiAiID4mNjsgfQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp bmVuby0kTElORU5PfTogcmVzdWx0OiAkTElCWkVfTE9BREVSIiA+JjUKKyRhc19lY2hvICIkTElC WkVfTE9BREVSIiA+JjY7IH0KKyAgZWxzZQorICAgIEhBVkVfTElCWkVfTE9BREVSPW5vCisgICAg ICAgICAgICBDUFBGTEFHUz0iJGFjX3NhdmVfQ1BQRkxBR1MiCisgICAgTElCWkVfTE9BREVSPQor ICAgIExUTElCWkVfTE9BREVSPQorICBmaQorCisKKworCisKKworCitjYXNlICIke3RhcmdldH0i IGluCisgIGludGVsZ3QtKi16ZSkKKyAgICBpZiB0ZXN0ICIkSEFWRV9MSUJaRV9MT0FERVIiICE9 IHllczsgdGhlbgorICAgICAgYXNfZm5fZXJyb3IgJD8gImxpYnplX2xvYWRlciBpcyBtaXNzaW5n IG9yIHVudXNhYmxlIiAiJExJTkVOTyIgNQorICAgIGZpCisgICAgOzsKKyAgKikKKyAgICAjIERv IG5vdCBsaW5rIGxpYnplX2xvYWRlciBzcHVyaW91c2x5CisgICAgSEFWRV9MSUJaRV9MT0FERVI9 bm8KKyAgICBMSUJaRV9MT0FERVI9CisgICAgTFRMSUJaRV9MT0FERVI9CisgICAgOzsKK2VzYWMK KworCisKKworCisKKworCiBHTlVMSUI9Li4vZ251bGliL2ltcG9ydAogCiBHTlVMSUJfU1RESU5U X0g9CmRpZmYgLS1naXQgYS9nZGJzZXJ2ZXIvY29uZmlndXJlLmFjIGIvZ2Ric2VydmVyL2NvbmZp Z3VyZS5hYwppbmRleCBiZDJjYWM4ZDM1ZGI4NzkxNWI3YzIwZTUzMzNiMTkxY2FmN2E0ODVmLi5j ZTA3YTRkNDcwNTk4YmYzNjIzNDM1YzJiOGY3MTQ3OGU4ODRmOTk3IDEwMDY0NAotLS0gYS9nZGJz ZXJ2ZXIvY29uZmlndXJlLmFjCisrKyBiL2dkYnNlcnZlci9jb25maWd1cmUuYWMKQEAgLTQwMyw2 ICs0MDMsMjQgQEAgaWYgJHdhbnRfaXBhIDsgdGhlbgogICAgZmkKIGZpCiAKK2RubCBjaGVjayBm b3IgdGhlIHplIGxvYWRlcgorQUNfTElCX0hBVkVfTElOS0ZMQUdTKFt6ZV9sb2FkZXJdLCBbXSwg WyNpbmNsdWRlICJsZXZlbF96ZXJvL3pldF9hcGkuaCJdLAorICBbemVJbml0ICgwKTtdLCkKKwor Y2FzZSAiJHt0YXJnZXR9IiBpbgorICBpbnRlbGd0LSotemUpCisgICAgaWYgdGVzdCAiJEhBVkVf TElCWkVfTE9BREVSIiAhPSB5ZXM7IHRoZW4KKyAgICAgIEFDX01TR19FUlJPUihbbGliemVfbG9h ZGVyIGlzIG1pc3Npbmcgb3IgdW51c2FibGVdKQorICAgIGZpCisgICAgOzsKKyAgKikKKyAgICAj IERvIG5vdCBsaW5rIGxpYnplX2xvYWRlciBzcHVyaW91c2x5CisgICAgSEFWRV9MSUJaRV9MT0FE RVI9bm8KKyAgICBMSUJaRV9MT0FERVI9CisgICAgTFRMSUJaRV9MT0FERVI9CisgICAgOzsKK2Vz YWMKKwogQUNfU1VCU1QoR0RCU0VSVkVSX0RFUEZJTEVTKQogQUNfU1VCU1QoR0RCU0VSVkVSX0xJ QlMpCiBBQ19TVUJTVChzcnZfeG1sYnVpbHRpbikKZGlmZiAtLWdpdCBhL2dkYnNlcnZlci9jb25m aWd1cmUuc3J2IGIvZ2Ric2VydmVyL2NvbmZpZ3VyZS5zcnYKaW5kZXggOWE2OTQ0YjZlNGViNTcw ZDk5MDVjOGRkNzZlM2VlM2JiMDc4YmJmOC4uMWM1NGJiOGI5OTIwMDM3MjZjMzRmYzFkYjNmODli M2RmM2EwZGRlNCAxMDA2NDQKLS0tIGEvZ2Ric2VydmVyL2NvbmZpZ3VyZS5zcnYKKysrIGIvZ2Ri c2VydmVyL2NvbmZpZ3VyZS5zcnYKQEAgLTE0Nyw2ICsxNDcsMTAgQEAgY2FzZSAiJHtnZGJzZXJ2 ZXJfaG9zdH0iIGluCiAJCQlzcnZfdGd0b2JqPSIkc3J2X2xpbnV4X29iaiBsaW51eC1pYTY0LWxv dy5vIgogCQkJc3J2X2xpbnV4X3VzcnJlZ3M9eWVzCiAJCQk7OworICBpbnRlbGd0LSotemUpIAlz cnZfcmVnb2JqPSIiCisJCQlzcnZfeG1sZmlsZXM9IiIKKwkJCXNydl90Z3RvYmo9InplLWxvdy5v IGludGVsZ3QtemUtbG93Lm8gYXJjaC9pbnRlbGd0Lm8iCisJCQk7OwogICBsb29uZ2FyY2gqLSot bGludXgqKQlzcnZfdGd0b2JqPSJhcmNoL2xvb25nYXJjaC5vIGxpbnV4LWxvb25nYXJjaC1sb3cu byIKIAkJCXNydl90Z3RvYmo9IiR7c3J2X3RndG9ian0gJHtzcnZfbGludXhfb2JqfSIKIAkJCXNy dl90Z3RvYmo9IiRzcnZfdGd0b2JqIG5hdC9sb29uZ2FyY2gtaHctcG9pbnQubyIKZGlmZiAtLWdp dCBhL2dkYnNlcnZlci9nZGJ0aHJlYWQuaCBiL2dkYnNlcnZlci9nZGJ0aHJlYWQuaAppbmRleCA1 ZTYxMzAxMDZmNWY0NGEyNzVmOWU5ODczYzcyYjhiZmMwY2JhNGQ4Li43ZjI4MDg0M2MzMDFiYWEy N2Q4YzMwNzA5ZmY4YTc1YTAzOWY2M2U5IDEwMDY0NAotLS0gYS9nZGJzZXJ2ZXIvZ2RidGhyZWFk LmgKKysrIGIvZ2Ric2VydmVyL2dkYnRocmVhZC5oCkBAIC00Miw3ICs0Miw3IEBAIHN0cnVjdCB0 aHJlYWRfaW5mbyA6IHB1YmxpYyBpbnRydXNpdmVfbGlzdF9ub2RlPHRocmVhZF9pbmZvPgogICB2 b2lkIHNldF9yZWdjYWNoZSAoc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCByZWdjYWNoZT4gcmVnY2Fj aGUpCiAgIHsgbV9yZWdjYWNoZSA9IHN0ZDo6bW92ZSAocmVnY2FjaGUpOyB9CiAKLSAgdm9pZCAq dGFyZ2V0X2RhdGEgKCkKKyAgdm9pZCAqdGFyZ2V0X2RhdGEgKCkgY29uc3QKICAgeyByZXR1cm4g bV90YXJnZXRfZGF0YTsgfQogCiAgIC8qIFRoZSBpZCBvZiB0aGlzIHRocmVhZC4gICovCmRpZmYg LS1naXQgYS9nZGJzZXJ2ZXIvaW50ZWxndC16ZS1sb3cuY2MgYi9nZGJzZXJ2ZXIvaW50ZWxndC16 ZS1sb3cuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMC4uYWMwYzE1N2E0NmE3NzhmNjAxNGY2MTE5MmIzYmQ2ZmE3Yzhj OTRkYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYnNlcnZlci9pbnRlbGd0LXplLWxvdy5jYwpAQCAt MCwwICsxLDEwMTYgQEAKKy8qIFRhcmdldCBpbnRlcmZhY2UgZm9yIEludGVsIEdUIGJhc2VkIG9u IExldmVsLVplcm8gZm9yIGdkYnNlcnZlci4KKworICAgQ29weXJpZ2h0IChDKSAyMDIwLTIwMjUg RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9m IEdEQi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0 cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICAg KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlz IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQg V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv ZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF LiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls cy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBz ZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2luY2x1ZGUgInplLWxv dy5oIgorI2luY2x1ZGUgImFyY2gvaW50ZWxndC5oIgorI2luY2x1ZGUgImdkYnN1cHBvcnQvb3Nh YmkuaCIKKworI2luY2x1ZGUgPGxldmVsX3plcm8vemV0X2ludGVsX2dwdV9kZWJ1Zy5oPgorI2lu Y2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworCisvKiBGSVhNRSBtYWtlIGlu dG8gYSB0YXJnZXQgbWV0aG9kPyAgKi8KK2ludCB1c2luZ190aHJlYWRzID0gMTsKKworLyogQ29u dmVuaWVuY2UgbWFjcm9zLiAgKi8KKworI2RlZmluZSBkcHJpbnRmKC4uLikJCQkJCQlcCisgIGRv CQkJCQkJCQlcCisgICAgewkJCQkJCQkJXAorICAgICAgaWYgKGRlYnVnX3RocmVhZHMpCQkJCQlc CisJewkJCQkJCQlcCisJICBkZWJ1Z19wcmludGYgKCIlczogIiwgX19GVU5DVElPTl9fKTsJCQlc CisJICBkZWJ1Z19wcmludGYgKF9fVkFfQVJHU19fKTsJCQkJXAorCSAgZGVidWdfcHJpbnRmICgi XG4iKTsJCQkJCVwKKwl9CQkJCQkJCVwKKyAgICB9CQkJCQkJCQlcCisgIHdoaWxlICgwKQorCisK Ky8qIERldGVybWluZSB0aGUgbW9zdCBzdWl0YWJsZSB0eXBlIHRvIGJlIHVzZWQgZm9yIGEgcmVn aXN0ZXIgd2l0aCBiaXQgc2l6ZQorICAgQklUU0laRSBhbmQgZWxlbWVudCBzaXplIEVMRU1TSVpF LiAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKgoraW50ZWxndF91aW50X3JlZ190eXBlICh0ZGVz Y19mZWF0dXJlICpmZWF0dXJlLCB1aW50MzJfdCBiaXRzaXplLAorCQkgICAgICAgdWludDMyX3Qg ZWxlbXNpemUpCit7CisgIGlmICgwICE9IChiaXRzaXplICUgZWxlbXNpemUpKQorICAgIGVycm9y IChfKCJ1bnN1cHBvcnRlZCBjb21iaW5hdGlvbiBvZiBiaXRzaXplICUiIFBSSXUzMiAiYW5kIGVs ZW1zaXplICUiCisJICAgICBQUkl1MzIpLCBiaXRzaXplLCBlbGVtc2l6ZSk7CisgIGlmICgoZWxl bXNpemUgPCA4KSB8fCAoZWxlbXNpemUgPiAxMjgpIHx8ICgoZWxlbXNpemUgJiAoZWxlbXNpemUg LSAxKSkgIT0gMCkpCisgICAgZXJyb3IgKF8oInVuc3VwcG9ydGVkIGVsZW1zaXplICUiIFBSSXUz MiksIGVsZW1zaXplKTsKKworICBjaGFyIHR5cGVfbmFtZVsyMF07CisgIHNucHJpbnRmICh0eXBl X25hbWUsIHNpemVvZiAodHlwZV9uYW1lKSwgInVpbnQldSIsIGVsZW1zaXplKTsKKyAgdGRlc2Nf dHlwZSAqdHlwZSA9IHRkZXNjX25hbWVkX3R5cGUgKGZlYXR1cmUsIHR5cGVfbmFtZSk7CisKKyAg aWYgKGVsZW1zaXplID09IGJpdHNpemUpCisgICAgcmV0dXJuIHR5cGUtPm5hbWUuY19zdHIgKCk7 CisKKyAgdWludDMyX3QgZWxlbWVudHMgPSBiaXRzaXplIC8gZWxlbXNpemU7CisgIHNucHJpbnRm ICh0eXBlX25hbWUsIHNpemVvZiAodHlwZV9uYW1lKSwgInZlY3RvciV1eCV1IiwgZWxlbWVudHMs CisJICAgIGVsZW1zaXplKTsKKyAgdGRlc2NfdHlwZSAqdmVjdG9yCisgICAgPSB0ZGVzY19jcmVh dGVfdmVjdG9yIChmZWF0dXJlLCB0eXBlX25hbWUsIHR5cGUsIGVsZW1lbnRzKTsKKworICByZXR1 cm4gdmVjdG9yLT5uYW1lLmNfc3RyICgpOworfQorCisvKiBBZGQgYSAodW5pZm9ybSkgcmVnaXN0 ZXIgc2V0IHRvIEZFQVRVUkUuICAqLworCitzdGF0aWMgdm9pZAoraW50ZWxndF9hZGRfcmVnc2V0 ICh0ZGVzY19mZWF0dXJlICpmZWF0dXJlLCBsb25nICZyZWdudW0sCisJCSAgICBjb25zdCBjaGFy ICpwcmVmaXgsIHVpbnQzMl90IGNvdW50LCBjb25zdCBjaGFyICpncm91cCwKKwkJICAgIHVpbnQz Ml90IGJpdHNpemUsIGNvbnN0IGNoYXIgKnR5cGUsIGV4cGVkaXRlX3QgJmV4cGVkaXRlKQorewor ICBmb3IgKHVpbnQzMl90IHJlZyA9IDA7IHJlZyA8IGNvdW50OyArK3JlZykKKyAgICB7CisgICAg ICBzdGQ6OnN0cmluZyBuYW1lID0gc3RkOjpzdHJpbmcgKHByZWZpeCkgKyBzdGQ6OnRvX3N0cmlu ZyAocmVnKTsKKworICAgICAgdGRlc2NfY3JlYXRlX3JlZyAoZmVhdHVyZSwgbmFtZS5jX3N0ciAo KSwgcmVnbnVtKyssIDEsIGdyb3VwLAorCQkJYml0c2l6ZSwgdHlwZSk7CisgICAgfQorfQorCisv KiBDb250cm9sIFJlZ2lzdGVyIGRldGFpbHMuICAqLworCitlbnVtCit7CisgICAgLyogVGhlIHBv c2l0aW9uIG9mIHRoZSBCcmVha3BvaW50IFN1cHByZXNzIGJpdCBpbiBDUjAuMC4gICovCisgICAg SU5URUxHVF9DUjBfMF9CUkVBS1BPSU5UX1NVUFBSRVNTID0gMTUsCisKKyAgICAvKiBUaGUgcG9z aXRpb24gb2YgdGhlIEJyZWFrcG9pbnQgU3RhdHVzIGFuZCBDb250cm9sIGJpdCBpbiBDUjAuMS4g ICovCisgICAgSU5URUxHVF9DUjBfMV9CUkVBS1BPSU5UX1NUQVRVUyA9IDMxLAorCisgICAgLyog VGhlIHBvc2l0aW9uIG9mIHRoZSBFeHRlcm5hbCBIYWx0IFN0YXR1cyBhbmQgQ29udHJvbCBiaXQg aW4gQ1IwLjEuICAqLworICAgIElOVEVMR1RfQ1IwXzFfRVhURVJOQUxfSEFMVF9TVEFUVVMgPSAz MCwKKworICAgIC8qIFRoZSBwb3NpdGlvbiBvZiB0aGUgU29mdHdhcmUgRXhjZXB0aW9uIENvbnRy b2wgYml0IGluIENSMC4xLiAgKi8KKyAgICBJTlRFTEdUX0NSMF8xX1NPRlRXQVJFX0VYQ0VQVElP Tl9DT05UUk9MID0gMjksCisKKyAgICAvKiBUaGUgcG9zaXRpb24gb2YgdGhlIElsbGVnYWwgT3Bj b2RlIEV4Y2VwdGlvbiBTdGF0dXMgYml0IGluIENSMC4xLiAgKi8KKyAgICBJTlRFTEdUX0NSMF8x X0lMTEVHQUxfT1BDT0RFX1NUQVRVUyA9IDI4LAorCisgICAgLyogVGhlIHBvc2l0aW9uIG9mIHRo ZSBGb3JjZSBFeGNlcHRpb24gU3RhdHVzIGFuZCBDb250cm9sIGJpdCBpbiBDUjAuMS4gICovCisg ICAgSU5URUxHVF9DUjBfMV9GT1JDRV9FWENFUFRJT05fU1RBVFVTID0gMjYsCisKKyAgICAvKiBU aGUgcG9zaXRpb24gb2YgdGhlIFBhZ2UgRmF1bHQgU3RhdHVzIGJpdCBpbiBDUjAuMS4KKyAgICAg ICBUaGlzIGlzIGEgc29mdHdhcmUgY29udmVudGlvbiB1c2luZyBhIHJlc2VydmVkIGJpdCB0byBp bmRpY2F0ZQorICAgICAgIHBhZ2UgZmF1bHRzIGJ5IHRoZSB1c2VyIG1vZGUgZHJpdmVyLiAgKi8K KyAgICBJTlRFTEdUX0NSMF8xX1BBR0VGQVVMVF9TVEFUVVMgPSAxNiwKK307CisKKy8qIFJldHVy biBDUjAuU1VCUkVHIGluIFJFR0NBQ0hFLiAgKi8KKworc3RhdGljIHVpbnQzMl90CitpbnRlbGd0 X3JlYWRfY3IwIChyZWdjYWNoZSAqcmVnY2FjaGUsIGludCBzdWJyZWcpCit7CisgIGludCBjcjBy ZWdubyA9IGZpbmRfcmVnbm8gKHJlZ2NhY2hlLT50ZGVzYywgImNyMCIpOworICBpbnQgY3Iwc2l6 ZSA9IHJlZ2lzdGVyX3NpemUgKHJlZ2NhY2hlLT50ZGVzYywgY3IwcmVnbm8pOworICB1aW50MzJf dCBjcjBbMTZdOworICBnZGJfYXNzZXJ0IChjcjBzaXplIDw9IHNpemVvZiAoY3IwKSk7CisgIGdk Yl9hc3NlcnQgKGNyMHNpemUgPj0gc2l6ZW9mIChjcjBbMF0pICogKHN1YnJlZyArIDEpKTsKKyAg Y29sbGVjdF9yZWdpc3RlciAocmVnY2FjaGUsIGNyMHJlZ25vLCBjcjApOworCisgIGVudW0gcmVn aXN0ZXJfc3RhdHVzIGNyMHN0YXR1cyA9IHJlZ2NhY2hlLT5nZXRfcmVnaXN0ZXJfc3RhdHVzIChj cjByZWdubyk7CisgIHN3aXRjaCAoY3Iwc3RhdHVzKQorICAgIHsKKyAgICBjYXNlIFJFR19WQUxJ RDoKKyAgICAgIHJldHVybiBjcjBbc3VicmVnXTsKKworICAgIGNhc2UgUkVHX1VOS05PV046Cisg ICAgICBpbnRlcm5hbF9lcnJvciAoXygidW5rbm93biByZWdpc3RlciAnY3IwJy4iKSk7CisKKyAg ICBjYXNlIFJFR19VTkFWQUlMQUJMRToKKyAgICAgIGVycm9yIChfKCJjcjAgaXMgbm90IGF2YWls YWJsZSIpKTsKKyAgICB9CisKKyAgaW50ZXJuYWxfZXJyb3IgKF8oInVua25vd24gcmVnaXN0ZXIg c3RhdHVzOiAlZC4iKSwgY3Iwc3RhdHVzKTsKK30KKworLyogV3JpdGUgVkFMVUUgaW50byBDUjAu U1VCUkVHIGluIFJFR0NBQ0hFLiAgKi8KKworc3RhdGljIHZvaWQKK2ludGVsZ3Rfd3JpdGVfY3Iw IChyZWdjYWNoZSAqcmVnY2FjaGUsIGludCBzdWJyZWcsIHVpbnQzMl90IHZhbHVlKQoreworICBp bnQgY3IwcmVnbm8gPSBmaW5kX3JlZ25vIChyZWdjYWNoZS0+dGRlc2MsICJjcjAiKTsKKyAgaW50 IGNyMHNpemUgPSByZWdpc3Rlcl9zaXplIChyZWdjYWNoZS0+dGRlc2MsIGNyMHJlZ25vKTsKKyAg dWludDMyX3QgY3IwWzE2XTsKKyAgZ2RiX2Fzc2VydCAoY3Iwc2l6ZSA8PSBzaXplb2YgKGNyMCkp OworICBnZGJfYXNzZXJ0IChjcjBzaXplID49IHNpemVvZiAoY3IwWzBdKSAqIChzdWJyZWcgKyAx KSk7CisgIGNvbGxlY3RfcmVnaXN0ZXIgKHJlZ2NhY2hlLCBjcjByZWdubywgY3IwKTsKKworICBl bnVtIHJlZ2lzdGVyX3N0YXR1cyBjcjBzdGF0dXMgPSByZWdjYWNoZS0+Z2V0X3JlZ2lzdGVyX3N0 YXR1cyAoY3IwcmVnbm8pOworICBzd2l0Y2ggKGNyMHN0YXR1cykKKyAgICB7CisgICAgY2FzZSBS RUdfVkFMSUQ6CisgICAgICBjcjBbc3VicmVnXSA9IHZhbHVlOworICAgICAgc3VwcGx5X3JlZ2lz dGVyIChyZWdjYWNoZSwgY3IwcmVnbm8sIGNyMCk7CisgICAgICByZXR1cm47CisKKyAgICBjYXNl IFJFR19VTktOT1dOOgorICAgICAgaW50ZXJuYWxfZXJyb3IgKF8oInVua25vd24gcmVnaXN0ZXIg J2NyMCcuIikpOworCisgICAgY2FzZSBSRUdfVU5BVkFJTEFCTEU6CisgICAgICBlcnJvciAoXygi Y3IwIGlzIG5vdCBhdmFpbGFibGUiKSk7CisgICAgfQorCisgIGludGVybmFsX2Vycm9yIChfKCJ1 bmtub3duIHJlZ2lzdGVyIHN0YXR1czogJWQuIiksIGNyMHN0YXR1cyk7Cit9CisKKy8qIFJldHVy biBDUjAuU1VCUkVHIGZvciBUUC4gICovCisKK3N0YXRpYyB1aW50MzJfdAoraW50ZWxndF9yZWFk X2NyMCAodGhyZWFkX2luZm8gKnRwLCBpbnQgc3VicmVnKQoreworICBzdHJ1Y3QgcmVnY2FjaGUg KnJlZ2NhY2hlID0gZ2V0X3RocmVhZF9yZWdjYWNoZSAodHAsIC8qIGZldGNoID0gKi8gdHJ1ZSk7 CisgIHJldHVybiBpbnRlbGd0X3JlYWRfY3IwIChyZWdjYWNoZSwgc3VicmVnKTsKK30KKworLyog V3JpdGUgVkFMVUUgaW50byBDUjAuU1VCUkVHIGZvciBUUC4gICovCisKK3N0YXRpYyB2b2lkCitp bnRlbGd0X3dyaXRlX2NyMCAodGhyZWFkX2luZm8gKnRwLCBpbnQgc3VicmVnLCB1aW50MzJfdCB2 YWx1ZSkKK3sKKyAgc3RydWN0IHJlZ2NhY2hlICpyZWdjYWNoZSA9IGdldF90aHJlYWRfcmVnY2Fj aGUgKHRwLCAvKiBmZXRjaCA9ICovIHRydWUpOworICBpbnRlbGd0X3dyaXRlX2NyMCAocmVnY2Fj aGUsIHN1YnJlZywgdmFsdWUpOworfQorCisvKiBSZXR1cm4gYSBodW1hbi1yZWFkYWJsZSBkZXZp Y2UgVVVJRCBzdHJpbmcuICAqLworCitzdGF0aWMgc3RkOjpzdHJpbmcKK2RldmljZV91dWlkX3N0 ciAoY29uc3QgdWludDhfdCB1dWlkW10sIHNpemVfdCBzaXplKQoreworICBzdGQ6OnN0cmluZ3N0 cmVhbSBzc3RyZWFtOworICBmb3IgKGludCBpID0gc2l6ZSAtIDE7IGkgPj0gMDsgLS1pKQorICAg IHNzdHJlYW0gPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsICgnMCcpIDw8IHN0ZDo6c2V0dyAo MikKKwkgICAgPDwgc3RhdGljX2Nhc3Q8aW50PiAodXVpZFtpXSk7CisKKyAgcmV0dXJuIHNzdHJl YW0uc3RyICgpOworfQorCitzdGF0aWMgdWludDMyX3QKK2dldF9kZXZpY2VfaWQgKHplX2Rldmlj ZV9pbmZvICpkZXZpY2UpCit7CisgIGdkYl9hc3NlcnQgKGRldmljZSAhPSBudWxscHRyKTsKKyAg cmV0dXJuIGRldmljZS0+cHJvcGVydGllcy5kZXZpY2VJZDsKK30KKworLyogVGFyZ2V0IG9wIGRl ZmluaXRpb25zIGZvciBJbnRlbCBHVCB0YXJnZXQgYmFzZWQgb24gTGV2ZWwtWmVyby4gICovCisK K2NsYXNzIGludGVsZ3RfemVfdGFyZ2V0IDogcHVibGljIHplX3RhcmdldAoreworcHVibGljOgor ICBjb25zdCBnZGJfYnl0ZSAqc3dfYnJlYWtwb2ludF9mcm9tX2tpbmQgKGludCBraW5kLCBpbnQg KnNpemUpIG92ZXJyaWRlOworCisgIGJvb2wgc3VwcG9ydHNfc3RvcHBlZF9ieV9zd19icmVha3Bv aW50ICgpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCBzdG9wcGVkX2J5X3N3X2Jy ZWFrcG9pbnQgKCkgb3ZlcnJpZGU7CisKKyAgQ09SRV9BRERSIHJlYWRfcGMgKHJlZ2NhY2hlICpy ZWdjYWNoZSkgb3ZlcnJpZGU7CisgIHZvaWQgd3JpdGVfcGMgKHJlZ2NhY2hlICpyZWdjYWNoZSwg Q09SRV9BRERSIHBjKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICBib29sIGlzX2RldmljZV9z dXBwb3J0ZWQKKyAgICAoY29uc3QgemVfZGV2aWNlX3Byb3BlcnRpZXNfdCAmLAorICAgICBjb25z dCBzdGQ6OnZlY3Rvcjx6ZXRfZGVidWdfcmVnc2V0X3Byb3BlcnRpZXNfdD4gJikgb3ZlcnJpZGU7 CisKKyAgdGFyZ2V0X2Rlc2MgKmNyZWF0ZV90ZGVzYworICAgICh6ZV9kZXZpY2VfaW5mbyAqZGlu Zm8sCisgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHpldF9kZWJ1Z19yZWdzZXRfcHJvcGVydGllc190 PiAmLAorICAgICBjb25zdCB6ZV9wY2lfZXh0X3Byb3BlcnRpZXNfdCAmKSBvdmVycmlkZTsKKwor ICB0YXJnZXRfc3RvcF9yZWFzb24gZ2V0X3N0b3BfcmVhc29uICh0aHJlYWRfaW5mbyAqLCBnZGJf c2lnbmFsICYpIG92ZXJyaWRlOworCisgIHZvaWQgcHJlcGFyZV90aHJlYWRfcmVzdW1lICh0aHJl YWRfaW5mbyAqdHApIG92ZXJyaWRlOworCisgIC8qIFJlYWQgb25lIGluc3RydWN0aW9uIGZyb20g bWVtb3J5IGF0IFBDIGludG8gQlVGRkVSIGFuZCByZXR1cm4gdGhlCisgICAgIG51bWJlciBvZiBi eXRlcyByZWFkIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJubyBlcnJvciBjb2RlLgorCisg ICAgIEJVRkZFUiBtdXN0IGJlIGludGVsZ3Q6Ok1BWF9JTlNUX0xFTkdUSCBieXRlcyBsb25nLiAg Ki8KKyAgaW50IHJlYWRfaW5zdCAodGhyZWFkX2luZm8gKnRwLCBDT1JFX0FERFIgcGMsCisJCSBn ZGI6OmFycmF5X3ZpZXc8Z2RiX2J5dGU+IGJ1ZmZlcik7CisKKyAgYm9vbCBpc19hdF9icmVha3Bv aW50ICh0aHJlYWRfaW5mbyAqdHApIG92ZXJyaWRlOworICBib29sIGlzX2F0X2VvdCAodGhyZWFk X2luZm8gKnRwKTsKKworICBib29sIGVycmF0dW1fMTgwMjAzNTU4MTMgKHRocmVhZF9pbmZvICp0 cCk7CisKK3ByaXZhdGU6CisgIC8qIEFkZCBhIHJlZ2lzdGVyIHNldCBmb3IgUkVHUFJPUCBvbiBE RVZJQ0UgdG8gUkVHU0VUUyBhbmQgaW5jcmVtZW50IFJFR05VTQorICAgICBhY2NvcmRpbmdseS4K KworICAgICBNYXkgb3B0aW9uYWxseSBhZGQgcmVnaXN0ZXJzIHRvIEVYUEVESVRFLiAgKi8KKyAg dm9pZCBhZGRfcmVnc2V0ICh0YXJnZXRfZGVzYyAqdGRlc2MsIGNvbnN0IHplX2RldmljZV9pbmZv ICZkaW5mbywKKwkJICAgY29uc3QgemV0X2RlYnVnX3JlZ3NldF9wcm9wZXJ0aWVzX3QgJnJlZ3By b3AsCisJCSAgIGxvbmcgJnJlZ251bSwgemVfcmVnc2V0X2luZm9fdCAmcmVnc2V0cywKKwkJICAg ZXhwZWRpdGVfdCAmZXhwZWRpdGUpOworfTsKKworY29uc3QgZ2RiX2J5dGUgKgoraW50ZWxndF96 ZV90YXJnZXQ6OnN3X2JyZWFrcG9pbnRfZnJvbV9raW5kIChpbnQga2luZCwgaW50ICpzaXplKQor eworICAvKiBXZSBkbyBub3Qgc3VwcG9ydCBicmVha3BvaW50IGluc3RydWN0aW9ucy4KKworICAg ICBVc2UgZ2RiYXJjaCBtZXRob2RzIHRoYXQgdXNlIHJlYWQvd3JpdGUgbWVtb3J5IHRhcmdldCBv cGVyYXRpb25zIGZvcgorICAgICBzZXR0aW5nIHMvdyBicmVha29waW50cy4gICovCisgICpzaXpl ID0gMDsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2Jvb2wKK2ludGVsZ3RfemVfdGFyZ2V0Ojpz dG9wcGVkX2J5X3N3X2JyZWFrcG9pbnQgKCkKK3sKKyAgY29uc3QgemVfdGhyZWFkX2luZm8gKnpl dHAgPSB6ZV90aHJlYWQgKGN1cnJlbnRfdGhyZWFkKTsKKyAgaWYgKHpldHAgPT0gbnVsbHB0cikK KyAgICByZXR1cm4gZmFsc2U7CisKKyAgcHRpZF90IHB0aWQgPSBjdXJyZW50X3RocmVhZC0+aWQ7 CisKKyAgaWYgKHpldHAtPmV4ZWNfc3RhdGUgIT0gWkVfVEhSRUFEX1NUQVRFX1NUT1BQRUQpCisg ICAgeworICAgICAgZHByaW50ZiAoIm5vdC1zdG9wcGVkIHRocmVhZCAlcyIsIHB0aWQudG9fc3Ry aW5nICgpLmNfc3RyICgpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJu ICh6ZXRwLT5zdG9wX3JlYXNvbiA9PSBUQVJHRVRfU1RPUFBFRF9CWV9TV19CUkVBS1BPSU5UKTsK K30KKworQ09SRV9BRERSCitpbnRlbGd0X3plX3RhcmdldDo6cmVhZF9wYyAocmVnY2FjaGUgKnJl Z2NhY2hlKQoreworICB1aW50MzJfdCBpcCA9IGludGVsZ3RfcmVhZF9jcjAgKHJlZ2NhY2hlLCAy KTsKKyAgdWludDY0X3QgaXNhYmFzZTsKKyAgY29sbGVjdF9yZWdpc3Rlcl9ieV9uYW1lIChyZWdj YWNoZSwgImlzYWJhc2UiLCAmaXNhYmFzZSk7CisKKyAgaWYgKFVJTlQzMl9NQVggPCBpcCkKKyAg ICB3YXJuaW5nIChfKCJJUCAnMHglIiBQUkl4MzIgIicgb3V0c2lkZSBvZiBJU0EgcmFuZ2UuIiks IGlwKTsKKworICBDT1JFX0FERFIgcGMgPSAoQ09SRV9BRERSKSBpc2FiYXNlICsgKENPUkVfQURE UikgaXA7CisgIGlmIChwYyA8IGlzYWJhc2UpCisgICAgd2FybmluZyAoXygiUEMgJyVzJyBvdXRz aWRlIG9mIElTQSByYW5nZS4iKSwKKwkgICAgIGNvcmVfYWRkcl90b19zdHJpbmdfbnogKHBjKSk7 CisKKyAgcmV0dXJuIHBjOworfQorCit2b2lkCitpbnRlbGd0X3plX3RhcmdldDo6d3JpdGVfcGMg KHJlZ2NhY2hlICpyZWdjYWNoZSwgQ09SRV9BRERSIHBjKQoreworICB1aW50NjRfdCBpc2FiYXNl OworICBjb2xsZWN0X3JlZ2lzdGVyX2J5X25hbWUgKHJlZ2NhY2hlLCAiaXNhYmFzZSIsICZpc2Fi YXNlKTsKKworICBpZiAocGMgPCBpc2FiYXNlKQorICAgIGVycm9yIChfKCJQQyAnJXMnIG91dHNp ZGUgb2YgSVNBIHJhbmdlLiIpLCBjb3JlX2FkZHJfdG9fc3RyaW5nX256IChwYykpOworCisgIHBj IC09IGlzYWJhc2U7CisgIGlmIChVSU5UMzJfTUFYIDwgcGMpCisgICAgZXJyb3IgKF8oIlBDICcl cycgb3V0c2lkZSBvZiBJU0EgcmFuZ2UuIiksIGNvcmVfYWRkcl90b19zdHJpbmdfbnogKHBjKSk7 CisKKyAgaW50ZWxndF93cml0ZV9jcjAgKHJlZ2NhY2hlLCAyLCAodWludDMyX3QpIHBjKTsKK30K KworYm9vbAoraW50ZWxndF96ZV90YXJnZXQ6OmlzX2RldmljZV9zdXBwb3J0ZWQKKyAgKGNvbnN0 IHplX2RldmljZV9wcm9wZXJ0aWVzX3QgJnByb3BlcnRpZXMsCisgICBjb25zdCBzdGQ6OnZlY3Rv cjx6ZXRfZGVidWdfcmVnc2V0X3Byb3BlcnRpZXNfdD4gJnJlZ3NldF9wcm9wZXJ0aWVzKQorewor ICBpZiAocHJvcGVydGllcy50eXBlICE9IFpFX0RFVklDRV9UWVBFX0dQVSkKKyAgICB7CisgICAg ICBkcHJpbnRmICgibm9uLWdwdSAoJXgpIGRldmljZSAoJSIgUFJJeDMyICIpOiAlcyIsIHByb3Bl cnRpZXMudHlwZSwKKwkgICAgICAgcHJvcGVydGllcy5kZXZpY2VJZCwgcHJvcGVydGllcy5uYW1l KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKHByb3BlcnRpZXMudmVuZG9y SWQgIT0gMHg4MDg2KQorICAgIHsKKyAgICAgIGRwcmludGYgKCJ1bmtub3duIHZlbmRvciAoJSIg UFJJeDMyICIpIG9mIGRldmljZSAoJSIgUFJJeDMyICIpOiAlcyIsCisJICAgICAgIHByb3BlcnRp ZXMudmVuZG9ySWQsIHByb3BlcnRpZXMuZGV2aWNlSWQsIHByb3BlcnRpZXMubmFtZSk7CisgICAg ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFdlIG5lZWQgYSBmZXcgcmVnaXN0ZXJzIHRv IHN1cHBvcnQgYW4gSW50ZWwgR1QgZGV2aWNlLgorCisgICAgIFRob3NlIGFyZSByZWdpc3RlcnMg dGhhdCBHREIgaXRzZWxmIHVzZXMuICBXaXRob3V0IHRob3NlLCB3ZSBtaWdodCBydW4gaW50bwor ICAgICBpbnRlcm5hbCBlcnJvcnMgYXQgc29tZSBwb2ludC4gIFdlIG5lZWQgb3RoZXJzLCB0b28s IHRoYXQgbWF5IGJlIHJlZmVyZW5jZWQKKyAgICAgaW4gZGVidWcgaW5mb3JtYXRpb24uICAqLwor ICBib29sIGhhdmVfZ3JmID0gZmFsc2U7CisgIGJvb2wgaGF2ZV9pc2FiYXNlID0gZmFsc2U7Cisg IGJvb2wgaGF2ZV9jciA9IGZhbHNlOworICBib29sIGhhdmVfc3IgPSBmYWxzZTsKKyAgYm9vbCBo YXZlX2NlID0gZmFsc2U7CisgIGZvciAoY29uc3QgemV0X2RlYnVnX3JlZ3NldF9wcm9wZXJ0aWVz X3QgJnJlZ3Byb3AgOiByZWdzZXRfcHJvcGVydGllcykKKyAgICB7CisgICAgICBpZiAocmVncHJv cC5jb3VudCA8IDEpCisJeworCSAgd2FybmluZyAoXygiSWdub3JpbmcgZW1wdHkgcmVnc2V0ICV1 IGluICVzLiIpLCByZWdwcm9wLnR5cGUsCisJCSAgIHByb3BlcnRpZXMubmFtZSk7CisJICBjb250 aW51ZTsKKwl9CisKKyAgICAgIHN3aXRjaCAocmVncHJvcC50eXBlKQorCXsKKwljYXNlIFpFVF9E RUJVR19SRUdTRVRfVFlQRV9HUkZfSU5URUxfR1BVOgorCSAgaGF2ZV9ncmYgPSB0cnVlOworCSAg YnJlYWs7CisKKwljYXNlIFpFVF9ERUJVR19SRUdTRVRfVFlQRV9DRV9JTlRFTF9HUFU6CisJICBo YXZlX2NlID0gdHJ1ZTsKKwkgIGJyZWFrOworCisJY2FzZSBaRVRfREVCVUdfUkVHU0VUX1RZUEVf Q1JfSU5URUxfR1BVOgorCSAgaGF2ZV9jciA9IHRydWU7CisJICBicmVhazsKKworCWNhc2UgWkVU X0RFQlVHX1JFR1NFVF9UWVBFX1NSX0lOVEVMX0dQVToKKwkgIGhhdmVfc3IgPSB0cnVlOworCSAg YnJlYWs7CisKKwljYXNlIFpFVF9ERUJVR19SRUdTRVRfVFlQRV9TQkFfSU5URUxfR1BVOgorCSAg LyogV2UgbmVlZCAnaXNhYmFzZScsIHdoaWNoIGlzIGF0IHBvc2l0aW9uIDUgaW4gdmVyc2lvbiAx LiAgKi8KKwkgIGlmICgocmVncHJvcC52ZXJzaW9uID09IDApICYmIChyZWdwcm9wLmNvdW50ID49 IDUpKQorCSAgICBoYXZlX2lzYWJhc2UgPSB0cnVlOworCSAgZWxzZQorCSAgICB3YXJuaW5nIChf KCJJZ25vcmluZyB1bmtub3duIFNCQSByZWdzZXQgdmVyc2lvbiAldSBpbiAlcy4iKSwKKwkJICAg ICByZWdwcm9wLnZlcnNpb24sIHByb3BlcnRpZXMubmFtZSk7CisJICBicmVhazsKKwl9CisgICAg fQorCisgIGlmIChoYXZlX2dyZiAmJiBoYXZlX2lzYWJhc2UgJiYgaGF2ZV9jciAmJiBoYXZlX3Ny ICYmIGhhdmVfY2UpCisgICAgcmV0dXJuIHRydWU7CisKKyAgZHByaW50ZiAoInVuc3VwcG9ydGVk IGRldmljZSAoJSIgUFJJeDMyICIpOiAlcyIsIHByb3BlcnRpZXMuZGV2aWNlSWQsCisJICAgcHJv cGVydGllcy5uYW1lKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCit0YXJnZXRfZGVzYyAqCitpbnRl bGd0X3plX3RhcmdldDo6Y3JlYXRlX3RkZXNjCisgICh6ZV9kZXZpY2VfaW5mbyAqZGluZm8sCisg ICBjb25zdCBzdGQ6OnZlY3Rvcjx6ZXRfZGVidWdfcmVnc2V0X3Byb3BlcnRpZXNfdD4gJnJlZ3Nl dF9wcm9wZXJ0aWVzLAorICAgY29uc3QgemVfcGNpX2V4dF9wcm9wZXJ0aWVzX3QgJnBjaV9wcm9w ZXJ0aWVzKQoreworICBjb25zdCB6ZV9kZXZpY2VfcHJvcGVydGllc190ICZwcm9wZXJ0aWVzID0g ZGluZm8tPnByb3BlcnRpZXM7CisKKyAgaWYgKHByb3BlcnRpZXMudmVuZG9ySWQgIT0gMHg4MDg2 KQorICAgIGVycm9yIChfKCJ1bmtub3duIHZlbmRvciAoJSIgUFJJeDMyICIpIG9mIGRldmljZSAo JSIgUFJJeDMyICIpOiAlcyIpLAorCSAgIHByb3BlcnRpZXMudmVuZG9ySWQsIHByb3BlcnRpZXMu ZGV2aWNlSWQsIHByb3BlcnRpZXMubmFtZSk7CisKKyAgdGFyZ2V0X2Rlc2NfdXAgdGRlc2MgPSBh bGxvY2F0ZV90YXJnZXRfZGVzY3JpcHRpb24gKCk7CisgIHNldF90ZGVzY19hcmNoaXRlY3R1cmUg KHRkZXNjLmdldCAoKSwgImludGVsZ3QiKTsKKyAgc2V0X3RkZXNjX29zYWJpICh0ZGVzYy5nZXQg KCksIEdEQl9PU0FCSV9MSU5VWCk7CisKKyAgc3RkOjpzdHJpbmcgZGV2aWNlX3V1aWQgPSBkZXZp Y2VfdXVpZF9zdHIgKAorICAgIGRpbmZvLT5wcm9wZXJ0aWVzLnV1aWQuaWQsIHNpemVvZiAoZGlu Zm8tPnByb3BlcnRpZXMudXVpZC5pZCkpOworICBjb25zdCB1aW50MzJfdCB0b3RhbF9jb3JlcyA9 IChwcm9wZXJ0aWVzLm51bVNsaWNlcworCQkJCSogcHJvcGVydGllcy5udW1TdWJzbGljZXNQZXJT bGljZQorCQkJCSogcHJvcGVydGllcy5udW1FVXNQZXJTdWJzbGljZSk7CisgIGNvbnN0IHVpbnQz Ml90IHRvdGFsX3RocmVhZHMgPSAodG90YWxfY29yZXMgKiBwcm9wZXJ0aWVzLm51bVRocmVhZHNQ ZXJFVSk7CisKKyAgdGRlc2NfZGV2aWNlICpkZXZpY2VfaW5mbyA9IG5ldyB0ZGVzY19kZXZpY2Ug KCk7CisgIGRldmljZV9pbmZvLT52ZW5kb3JfaWQgPSBwcm9wZXJ0aWVzLnZlbmRvcklkOworICBk ZXZpY2VfaW5mby0+dGFyZ2V0X2lkID0gcHJvcGVydGllcy5kZXZpY2VJZDsKKyAgZGV2aWNlX2lu Zm8tPm5hbWUgPSBwcm9wZXJ0aWVzLm5hbWU7CisgIGRldmljZV9pbmZvLT5wY2lfc2xvdCA9IHN0 cmluZ19wcmludGYgKCIlMDIiIFBSSXgzMiAiOiUwMiIgUFJJeDMyCisJCQkJCSAiLiUiIFBSSWQz MiwKKwkJCQkJIHBjaV9wcm9wZXJ0aWVzLmFkZHJlc3MuYnVzLAorCQkJCQkgcGNpX3Byb3BlcnRp ZXMuYWRkcmVzcy5kZXZpY2UsCisJCQkJCSBwY2lfcHJvcGVydGllcy5hZGRyZXNzLmZ1bmN0aW9u KTsKKyAgZGV2aWNlX2luZm8tPnV1aWQgPSBkZXZpY2VfdXVpZDsKKyAgZGV2aWNlX2luZm8tPnRv dGFsX2NvcmVzID0gdG90YWxfY29yZXM7CisgIGRldmljZV9pbmZvLT50b3RhbF90aHJlYWRzID0g dG90YWxfdGhyZWFkczsKKworICBpZiAocHJvcGVydGllcy5mbGFncyAmIFpFX0RFVklDRV9QUk9Q RVJUWV9GTEFHX1NVQkRFVklDRSkKKyAgICBkZXZpY2VfaW5mby0+c3ViZGV2aWNlX2lkID0gcHJv cGVydGllcy5zdWJkZXZpY2VJZDsKKworICBzZXRfdGRlc2NfZGV2aWNlX2luZm8gKHRkZXNjLmdl dCAoKSwgZGV2aWNlX2luZm8pOworCisgIGxvbmcgcmVnbnVtID0gMDsKKyAgZm9yIChjb25zdCB6 ZXRfZGVidWdfcmVnc2V0X3Byb3BlcnRpZXNfdCAmcmVncHJvcCA6IHJlZ3NldF9wcm9wZXJ0aWVz KQorICAgIGFkZF9yZWdzZXQgKHRkZXNjLmdldCAoKSwgKmRpbmZvLCByZWdwcm9wLCByZWdudW0s CisJCWRpbmZvLT5yZWdzZXRzLCBkaW5mby0+ZXhwZWRpdGUpOworCisgIC8qIFRkZXNjIGV4cGVj dHMgYSBudWxscHRyLXRlcm1pbmF0ZWQgYXJyYXkuICAqLworICBkaW5mby0+ZXhwZWRpdGUucHVz aF9iYWNrIChudWxscHRyKTsKKworICBpbml0X3RhcmdldF9kZXNjICh0ZGVzYy5nZXQgKCksIGRp bmZvLT5leHBlZGl0ZS5kYXRhICgpLCBHREJfT1NBQklfTElOVVgpOworICByZXR1cm4gdGRlc2Mu cmVsZWFzZSAoKTsKK30KKwordGFyZ2V0X3N0b3BfcmVhc29uCitpbnRlbGd0X3plX3RhcmdldDo6 Z2V0X3N0b3BfcmVhc29uICh0aHJlYWRfaW5mbyAqdHAsIGdkYl9zaWduYWwgJnNpZ25hbCkKK3sK KyAgemVfZGV2aWNlX3RocmVhZF90IHRocmVhZCA9IHplX3RocmVhZF9pZCAodHApOworICB1aW50 MzJfdCBjcjBbM10gPSB7CisgICAgaW50ZWxndF9yZWFkX2NyMCAodHAsIDApLAorICAgIGludGVs Z3RfcmVhZF9jcjAgKHRwLCAxKSwKKyAgICBpbnRlbGd0X3JlYWRfY3IwICh0cCwgMikKKyAgfTsK KworICBkcHJpbnRmICgidGhyZWFkICVzICglcykgc3RvcHBlZCwgY3IwLjA9JSIgUFJJeDMyICIs IC4xPSUiIFBSSXgzMgorCSAgICIgWyAlcyVzJXMlcyVzJXNdLCAuMj0lIiBQUkl4MzIgIi4iLCB0 cC0+aWQudG9fc3RyaW5nICgpLmNfc3RyICgpLAorCSAgIHplX3RocmVhZF9pZF9zdHIgKHRocmVh ZCkuY19zdHIgKCksIGNyMFswXSwgY3IwWzFdLAorCSAgICgoKGNyMFsxXSAmICgxIDw8IElOVEVM R1RfQ1IwXzFfQlJFQUtQT0lOVF9TVEFUVVMpKSAhPSAwKQorCSAgICA/ICJicCAiIDogIiIpLAor CSAgICgoKGNyMFsxXSAmICgxIDw8IElOVEVMR1RfQ1IwXzFfSUxMRUdBTF9PUENPREVfU1RBVFVT KSkgIT0gMCkKKwkgICAgPyAiaWxsICIgOiAiIiksCisJICAgKCgoY3IwWzFdICYgKDEgPDwgSU5U RUxHVF9DUjBfMV9GT1JDRV9FWENFUFRJT05fU1RBVFVTKSkgIT0gMCkKKwkgICAgPyAiZmUgIiA6 ICIiKSwKKwkgICAoKChjcjBbMV0gJiAoMSA8PCBJTlRFTEdUX0NSMF8xX1NPRlRXQVJFX0VYQ0VQ VElPTl9DT05UUk9MKSkgIT0gMCkKKwkgICAgPyAic3cgIiA6ICIiKSwKKwkgICAoKChjcjBbMV0g JiAoMSA8PCBJTlRFTEdUX0NSMF8xX0VYVEVSTkFMX0hBTFRfU1RBVFVTKSkgIT0gMCkKKwkgICAg PyAiZWggIiA6ICIiKSwKKwkgICAoKChjcjBbMV0gJiAoMSA8PCBJTlRFTEdUX0NSMF8xX1BBR0VG QVVMVF9TVEFUVVMpKSAhPSAwKQorCSAgICA/ICJwZiAiIDogIiIpLAorCSAgIGNyMFsyXSk7CisK KyAgaWYgKChjcjBbMV0gJiAoMSA8PCBJTlRFTEdUX0NSMF8xX1BBR0VGQVVMVF9TVEFUVVMpKSAh PSAwKQorICAgIHsKKyAgICAgIGNyMFsxXSAmPSB+KDEgPDwgSU5URUxHVF9DUjBfMV9QQUdFRkFV TFRfU1RBVFVTKTsKKyAgICAgIGludGVsZ3Rfd3JpdGVfY3IwICh0cCwgMSwgY3IwWzFdKTsKKwor ICAgICAgc2lnbmFsID0gR0RCX1NJR05BTF9TRUdWOworICAgICAgcmV0dXJuIFRBUkdFVF9TVE9Q UEVEX0JZX05PX1JFQVNPTjsKKyAgICB9CisKKyAgaWYgKChjcjBbMV0gJiAoMSA8PCBJTlRFTEdU X0NSMF8xX0JSRUFLUE9JTlRfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICBjcjBbMV0gJj0g figxIDw8IElOVEVMR1RfQ1IwXzFfQlJFQUtQT0lOVF9TVEFUVVMpOworICAgICAgaW50ZWxndF93 cml0ZV9jcjAgKHRwLCAxLCBjcjBbMV0pOworCisgICAgICAvKiBXZSBjYW5ub3QgZGlzdGluZ3Vp c2ggYSBzaW5nbGUgc3RlcCBleGNlcHRpb24gZnJvbSBhIGJyZWFrcG9pbnQKKwkgZXhjZXB0aW9u IGp1c3QgYnkgbG9va2luZyBhdCBDUjAuCisKKwkgV2UgY291bGQgaW5zcGVjdCB0aGUgaW5zdHJ1 Y3Rpb24gdG8gc2VlIGlmIHRoZSBicmVha3BvaW50IGJpdCBpcworCSBzZXQuICBPciB3ZSBjb3Vs ZCBjaGVjayB0aGUgcmVzdW1lIHR5cGUgYW5kIGFzc3VtZSB0aGF0IHdlIHNldAorCSB0aGluZ3Mg dXAgY29ycmVjdGx5IGZvciBzaW5nbGUtc3RlcHBpbmcgYmVmb3JlIHdlIHJlc3VtZWQuICAqLwor ICAgICAgY29uc3QgemVfdGhyZWFkX2luZm8gKnpldHAgPSB6ZV90aHJlYWQgKHRwKTsKKyAgICAg IGdkYl9hc3NlcnQgKHpldHAgIT0gbnVsbHB0cik7CisKKyAgICAgIHN3aXRjaCAoemV0cC0+cmVz dW1lX3N0YXRlKQorCXsKKwljYXNlIFpFX1RIUkVBRF9SRVNVTUVfU1RFUDoKKwkgIHNpZ25hbCA9 IEdEQl9TSUdOQUxfVFJBUDsKKwkgIHJldHVybiBUQVJHRVRfU1RPUFBFRF9CWV9TSU5HTEVfU1RF UDsKKworCWNhc2UgWkVfVEhSRUFEX1JFU1VNRV9SVU46CisJY2FzZSBaRV9USFJFQURfUkVTVU1F X05PTkU6CisJICAvKiBPbiBzb21lIGRldmljZXMsIHdlIG1heSBnZXQgc3B1cmlvdXMgYnJlYWtw b2ludCBleGNlcHRpb25zLiAgKi8KKwkgIGlmIChlcnJhdHVtXzE4MDIwMzU1ODEzICh0cCkpCisJ ICAgIHsKKwkgICAgICB6ZV9kZXZpY2VfdGhyZWFkX3QgemVpZCA9IHplX3RocmVhZF9pZCAodHAp OworCisJICAgICAgZHByaW50ZiAoImFwcGx5aW5nICMxODAyMDM1NTgxMyB3b3JrYXJvdW5kIGZv ciB0aHJlYWQgIgorCQkgICAgICAgIiVzICglcykiLCB0cC0+aWQudG9fc3RyaW5nICgpLmNfc3Ry ICgpLAorCQkgICAgICAgemVfdGhyZWFkX2lkX3N0ciAoemVpZCkuY19zdHIgKCkpOworCisJICAg ICAgc2lnbmFsID0gR0RCX1NJR05BTF8wOworCSAgICAgIHJldHVybiBUQVJHRVRfU1RPUFBFRF9C WV9OT19SRUFTT047CisJICAgIH0KKworCSAgW1tmYWxsdGhyb3VnaF1dOworCWNhc2UgWkVfVEhS RUFEX1JFU1VNRV9TVE9QOgorCSAgc2lnbmFsID0gR0RCX1NJR05BTF9UUkFQOworCSAgcmV0dXJu IFRBUkdFVF9TVE9QUEVEX0JZX1NXX0JSRUFLUE9JTlQ7CisJfQorICAgIH0KKworICBpZiAoKGNy MFsxXSAmICgxIDw8IElOVEVMR1RfQ1IwXzFfSUxMRUdBTF9PUENPREVfU1RBVFVTKSkgIT0gMCkK KyAgICB7CisgICAgICBjcjBbMV0gJj0gfigxIDw8IElOVEVMR1RfQ1IwXzFfSUxMRUdBTF9PUENP REVfU1RBVFVTKTsKKyAgICAgIGludGVsZ3Rfd3JpdGVfY3IwICh0cCwgMSwgY3IwWzFdKTsKKwor ICAgICAgc2lnbmFsID0gR0RCX1NJR05BTF9JTEw7CisgICAgICByZXR1cm4gVEFSR0VUX1NUT1BQ RURfQllfTk9fUkVBU09OOworICAgIH0KKworICBpZiAoKGNyMFsxXSAmICgxIDw8IElOVEVMR1Rf Q1IwXzFfU09GVFdBUkVfRVhDRVBUSU9OX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgIGNy MFsxXSAmPSB+KDEgPDwgSU5URUxHVF9DUjBfMV9TT0ZUV0FSRV9FWENFUFRJT05fQ09OVFJPTCk7 CisgICAgICBpbnRlbGd0X3dyaXRlX2NyMCAodHAsIDEsIGNyMFsxXSk7CisKKyAgICAgIHNpZ25h bCA9IEdEQl9FWENfU09GVFdBUkU7CisgICAgICByZXR1cm4gVEFSR0VUX1NUT1BQRURfQllfTk9f UkVBU09OOworICAgIH0KKworICBpZiAoKGNyMFsxXSAmICgoMSA8PCBJTlRFTEdUX0NSMF8xX0ZP UkNFX0VYQ0VQVElPTl9TVEFUVVMpCisJCSB8ICgxIDw8IElOVEVMR1RfQ1IwXzFfRVhURVJOQUxf SEFMVF9TVEFUVVMpKSkgIT0gMCkKKyAgICB7CisgICAgICBjcjBbMV0gJj0gfigxIDw8IElOVEVM R1RfQ1IwXzFfRk9SQ0VfRVhDRVBUSU9OX1NUQVRVUyk7CisgICAgICBjcjBbMV0gJj0gfigxIDw8 IElOVEVMR1RfQ1IwXzFfRVhURVJOQUxfSEFMVF9TVEFUVVMpOworICAgICAgaW50ZWxndF93cml0 ZV9jcjAgKHRwLCAxLCBjcjBbMV0pOworCisgICAgICBzaWduYWwgPSBHREJfU0lHTkFMX1RSQVA7 CisgICAgICByZXR1cm4gVEFSR0VUX1NUT1BQRURfQllfTk9fUkVBU09OOworICAgIH0KKworICBz aWduYWwgPSBHREJfU0lHTkFMX1VOS05PV047CisgIHJldHVybiBUQVJHRVRfU1RPUFBFRF9CWV9O T19SRUFTT047Cit9CisKK2ludAoraW50ZWxndF96ZV90YXJnZXQ6OnJlYWRfaW5zdCAodGhyZWFk X2luZm8gKnRwLCBDT1JFX0FERFIgcGMsCisJCQkgICAgICBnZGI6OmFycmF5X3ZpZXc8Z2RiX2J5 dGU+IGJ1ZmZlcikKK3sKKyAgZ2RiX2Fzc2VydCAoYnVmZmVyLnNpemUgKCkgPj0gaW50ZWxndDo6 TUFYX0lOU1RfTEVOR1RIKTsKKworICBpbnQgc3RhdHVzID0gcmVhZF9tZW1vcnkgKHRwLCBwYywg YnVmZmVyLmRhdGEgKCksIGludGVsZ3Q6Ok1BWF9JTlNUX0xFTkdUSCk7CisgIGlmIChzdGF0dXMg PT0gMCkKKyAgICByZXR1cm4gaW50ZWxndDo6TUFYX0lOU1RfTEVOR1RIOworCisgIHN0YXR1cyA9 IHJlYWRfbWVtb3J5ICh0cCwgcGMsIGJ1ZmZlci5kYXRhICgpLCBpbnRlbGd0OjpDT01QQUNUX0lO U1RfTEVOR1RIKTsKKyAgaWYgKHN0YXR1cyA+IDApCisgICAgcmV0dXJuIHN0YXR1czsKKworICB1 aW50MzJfdCBkZXZpY2VfaWQgPSBnZXRfZGV2aWNlX2lkICh6ZV90aHJlYWRfZGV2aWNlICh0cCkp OworICBpZiAoaW50ZWxndDo6aW5zdF9sZW5ndGggKGJ1ZmZlciwgZGV2aWNlX2lkKSA9PSBpbnRl bGd0OjpNQVhfSU5TVF9MRU5HVEgpCisgICAgcmV0dXJuIC1FSU87CisKKyAgbWVtc2V0IChidWZm ZXIuYmVnaW4gKCkgKyBpbnRlbGd0OjpDT01QQUNUX0lOU1RfTEVOR1RILCAwLAorCSAgaW50ZWxn dDo6TUFYX0lOU1RfTEVOR1RIIC0gaW50ZWxndDo6Q09NUEFDVF9JTlNUX0xFTkdUSCk7CisKKyAg cmV0dXJuIGludGVsZ3Q6OkNPTVBBQ1RfSU5TVF9MRU5HVEg7Cit9CisKK2Jvb2wKK2ludGVsZ3Rf emVfdGFyZ2V0Ojppc19hdF9icmVha3BvaW50ICh0aHJlYWRfaW5mbyAqdHApCit7CisgIHJlZ2Nh Y2hlICpyZWdjYWNoZSA9IGdldF90aHJlYWRfcmVnY2FjaGUgKHRwLCAvKiBmZXRjaCA9ICovIHRy dWUpOworICBDT1JFX0FERFIgcGMgPSByZWFkX3BjIChyZWdjYWNoZSk7CisKKyAgZ2RiX2J5dGUg aW5zdFtpbnRlbGd0OjpNQVhfSU5TVF9MRU5HVEhdOworICBpbnQgc3RhdHVzID0gcmVhZF9pbnN0 ICh0cCwgcGMsIGluc3QpOworICBpZiAoc3RhdHVzIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisK KyAgdWludDMyX3QgZGV2aWNlX2lkID0gZ2V0X2RldmljZV9pZCAoemVfdGhyZWFkX2RldmljZSAo dHApKTsKKyAgcmV0dXJuIGludGVsZ3Q6Omhhc19icmVha3BvaW50IChpbnN0LCBkZXZpY2VfaWQp OworfQorCitib29sCitpbnRlbGd0X3plX3RhcmdldDo6aXNfYXRfZW90ICh0aHJlYWRfaW5mbyAq dHApCit7CisgIHJlZ2NhY2hlICpyZWdjYWNoZSA9IGdldF90aHJlYWRfcmVnY2FjaGUgKHRwLCAv KiBmZXRjaCA9ICovIHRydWUpOworICBDT1JFX0FERFIgcGMgPSByZWFkX3BjIChyZWdjYWNoZSk7 CisKKyAgZ2RiX2J5dGUgaW5zdFtpbnRlbGd0OjpNQVhfSU5TVF9MRU5HVEhdOworICBpbnQgc3Rh dHVzID0gcmVhZF9pbnN0ICh0cCwgcGMsIGluc3QpOworICBpZiAoc3RhdHVzIDwgMCkKKyAgICB7 CisgICAgICB6ZV9kZXZpY2VfdGhyZWFkX3QgemVpZCA9IHplX3RocmVhZF9pZCAodHApOworCisg ICAgICB3YXJuaW5nIChfKCJlcnJvciByZWFkaW5nIG1lbW9yeSBmb3IgdGhyZWFkICVzICglcykg YXQgMHglIgorCQkgUFJJeDY0KSwgdHAtPmlkLnRvX3N0cmluZyAoKS5jX3N0ciAoKSwKKwkgICAg ICAgemVfdGhyZWFkX2lkX3N0ciAoemVpZCkuY19zdHIgKCksIHBjKTsKKyAgICAgIHJldHVybiBm YWxzZTsKKyAgICB9CisKKyAgdWludDMyX3QgZGV2aWNlX2lkID0gZ2V0X2RldmljZV9pZCAoemVf dGhyZWFkX2RldmljZSAodHApKTsKKyAgaW50ZWxndDo6eGVfdmVyc2lvbiBkZXZpY2VfdmVyc2lv biA9IGludGVsZ3Q6OmdldF94ZV92ZXJzaW9uIChkZXZpY2VfaWQpOworICBzd2l0Y2ggKGRldmlj ZV92ZXJzaW9uKQorICAgIHsKKyAgICBjYXNlIGludGVsZ3Q6OlhFX0hQOgorICAgIGNhc2UgaW50 ZWxndDo6WEVfSFBHOgorICAgIGNhc2UgaW50ZWxndDo6WEVfSFBDOgorICAgIGNhc2UgaW50ZWxn dDo6WEUyOgorICAgIGNhc2UgaW50ZWxndDo6WEUzOgorICAgICAgeworCS8qIFRoZSBvcGNvZGUg bWFzayBmb3IgYml0cyA2OjAuICAqLworCWNvbnN0ZXhwciB1aW50OF90IE9QQ19NQVNLID0gMHg3 ZjsKKwlzd2l0Y2ggKGluc3RbMF0gJiBPUENfTUFTSykKKwkgIHsKKwkgIGNhc2UgMHgzMTogLyog c2VuZCAqLworCSAgY2FzZSAweDMyOiAvKiBzZW5kYyAqLworCSAgICB7CisJICAgICAgLyogVGhl IEVuZCBPZiBUaHJlYWQgY29udHJvbC4gIE9ubHkgdXNlZCBmb3IgU0VORCBhbmQKKwkJIFNFTkRD LiAgKi8KKwkgICAgICBjb25zdGV4cHIgdWludDhfdCBDVFJMX0VPVF9TRU5EID0gMzQ7CisJICAg ICAgcmV0dXJuIGludGVsZ3Q6OmdldF9pbnN0X2JpdCAoaW5zdCwgQ1RSTF9FT1RfU0VORCk7CisJ ICAgIH0KKworCSAgZGVmYXVsdDoKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgfQorICAgICAgfQor CisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yIChfKCJVbnN1cHBvcnRlZCBkZXZpY2UgaWQgMHgl IiBQUkl4MzIpLCBkZXZpY2VfaWQpOworICAgIH0KK30KKworLyogUmV0dXJuIHdoZXRoZXIgZXJy YXR1bSAjMTgwMjAzNTU4MTMgYXBwbGllcy4gICovCisKK2Jvb2wKK2ludGVsZ3RfemVfdGFyZ2V0 OjplcnJhdHVtXzE4MDIwMzU1ODEzICh0aHJlYWRfaW5mbyAqdHApCit7CisgIHplX2RldmljZV9p bmZvICpkZXZpY2UgPSB6ZV90aHJlYWRfZGV2aWNlICh0cCk7CisKKyAgLyogV2UgbWF5IG5vdCBo YXZlIGEgZGV2aWNlIGlmIHdlIGdvdCBkZXRhY2hlZC4gICovCisgIGlmIChkZXZpY2UgPT0gbnVs bHB0cikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogVGhlIGVycmF0dW0gb25seSBhcHBsaWVz IHRvIEludGVsIGRldmljZXMuICAqLworICBpZiAoZGV2aWNlLT5wcm9wZXJ0aWVzLnZlbmRvcklk ICE9IDB4ODA4NikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgdWludDMyX3QgZGV2aWNlX2lkID0g Z2V0X2RldmljZV9pZCAoZGV2aWNlKTsKKworICAvKiBUaGUgZXJyYXR1bSBvbmx5IGFwcGxpZXMg dG8gYSByYW5nZSBvZiBkZXZpY2VzLiAgKi8KKyAgc3dpdGNoIChpbnRlbGd0OjpnZXRfeGVfdmVy c2lvbiAoZGV2aWNlX2lkKSkKKyAgICB7CisgICAgICBjYXNlIGludGVsZ3Q6OlhFX0hQRzoKKyAg ICAgIGNhc2UgaW50ZWxndDo6WEVfSFBDOgorCWJyZWFrOworCisgICAgICBkZWZhdWx0OgorCXJl dHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmVnY2FjaGUgKnJlZ2NhY2hlID0gZ2V0X3RocmVhZF9y ZWdjYWNoZSAodHAsIC8qIGZldGNoID0gKi8gdHJ1ZSk7CisgIENPUkVfQUREUiBwYyA9IHJlYWRf cGMgKHJlZ2NhY2hlKTsKKworICBnZGJfYnl0ZSBpbnN0W2ludGVsZ3Q6Ok1BWF9JTlNUX0xFTkdU SF07CisgIGludCBzdGF0dXMgPSByZWFkX2luc3QgKHRwLCBwYywgaW5zdCk7CisgIGlmIChzdGF0 dXMgPCAwKQorICAgIHsKKyAgICAgIHplX2RldmljZV90aHJlYWRfdCB6ZWlkID0gemVfdGhyZWFk X2lkICh0cCk7CisKKyAgICAgIHdhcm5pbmcgKF8oImVycm9yIHJlYWRpbmcgbWVtb3J5IGZvciB0 aHJlYWQgJXMgKCVzKSBhdCAweCUiCisJCSBQUkl4NjQpLCB0cC0+aWQudG9fc3RyaW5nICgpLmNf c3RyICgpLAorCSAgICAgICB6ZV90aHJlYWRfaWRfc3RyICh6ZWlkKS5jX3N0ciAoKSwgcGMpOwor ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBUaGUgZXJyYXR1bSBhcHBsaWVzIHRv IGluc3RydWN0aW9ucyB3aXRob3V0IGJyZWFrcG9pbnQgY29udHJvbC4gICovCisgIHJldHVybiAh aW50ZWxndDo6aGFzX2JyZWFrcG9pbnQgKGluc3QsIGRldmljZV9pZCk7Cit9CisKK3ZvaWQKK2lu dGVsZ3RfemVfdGFyZ2V0OjpwcmVwYXJlX3RocmVhZF9yZXN1bWUgKHRocmVhZF9pbmZvICp0cCkK K3sKKyAgemVfdGhyZWFkX2luZm8gKnpldHAgPSB6ZV90aHJlYWQgKHRwKTsKKyAgZ2RiX2Fzc2Vy dCAoemV0cCAhPSBudWxscHRyKTsKKworICByZWdjYWNoZSAqcmVnY2FjaGUgPSBnZXRfdGhyZWFk X3JlZ2NhY2hlICh0cCwgLyogZmV0Y2ggPSAqLyB0cnVlKTsKKyAgdWludDMyX3QgY3IwWzNdID0g eworICAgIGludGVsZ3RfcmVhZF9jcjAgKHJlZ2NhY2hlLCAwKSwKKyAgICBpbnRlbGd0X3JlYWRf Y3IwIChyZWdjYWNoZSwgMSksCisgICAgaW50ZWxndF9yZWFkX2NyMCAocmVnY2FjaGUsIDIpCisg IH07CisKKyAgLyogVGhlIHRocmVhZCBpcyBydW5uaW5nLiAgV2UgbWF5IG5lZWQgdG8gb3Zlcndy aXRlIHRoaXMgYmVsb3cuICAqLworICB6ZXRwLT5leGVjX3N0YXRlID0gWkVfVEhSRUFEX1NUQVRF X1JVTk5JTkc7CisKKyAgLyogQ2xlYXIgYW55IHBvdGVudGlhbCBpbnRlcnJ1cHQgaW5kaWNhdGlv bi4KKworICAgICBXZSBsZWF2ZSBvdGhlciBleGNlcHRpb24gaW5kaWNhdGlvbnMgc28gdGhlIGV4 Y2VwdGlvbiB3b3VsZCBiZQorICAgICByZXBvcnRlZCBhZ2FpbiBhbmQgY2FuIGJlIGhhbmRsZWQg YnkgR0RCLiAgKi8KKyAgY3IwWzFdICY9IH4oMSA8PCBJTlRFTEdUX0NSMF8xX0ZPUkNFX0VYQ0VQ VElPTl9TVEFUVVMpOworICBjcjBbMV0gJj0gfigxIDw8IElOVEVMR1RfQ1IwXzFfRVhURVJOQUxf SEFMVF9TVEFUVVMpOworCisgIC8qIERpc3Rpbmd1aXNoIHN0ZXBwaW5nIGFuZCBjb250aW51aW5n LiAgKi8KKyAgc3dpdGNoICh6ZXRwLT5yZXN1bWVfc3RhdGUpCisgICAgeworICAgIGNhc2UgWkVf VEhSRUFEX1JFU1VNRV9TVEVQOgorICAgICAgLyogV2Ugc3RlcCBieSBpbmRpY2F0aW5nIGEgYnJl YWtwb2ludCBleGNlcHRpb24sIHdoaWNoIHdpbGwgYmUKKwkgY29uc2lkZXJlZCBvbiB0aGUgbmV4 dCBpbnN0cnVjdGlvbi4KKworCSBUaGlzIGRvZXMgbm90IHdvcmsgZm9yIEVPVCwgdGhvdWdoLiAg Ki8KKyAgICAgIGlmICghaXNfYXRfZW90ICh0cCkpCisJeworCSAgY3IwWzBdIHw9ICgxIDw8IElO VEVMR1RfQ1IwXzBfQlJFQUtQT0lOVF9TVVBQUkVTUyk7CisJICBjcjBbMV0gfD0gKDEgPDwgSU5U RUxHVF9DUjBfMV9CUkVBS1BPSU5UX1NUQVRVUyk7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8q IEF0IEVPVCwgdGhlIHRocmVhZCBkaXNwYXRjaCBlbmRzIGFuZCB0aGUgdGhyZWFkIGJlY29tZXMg aWRsZS4KKworCSBUaGVyZSdzIG5vIHBvaW50IGluIHJlcXVlc3RpbmcgYSBzaW5nbGUtc3RlcCBl eGNlcHRpb24gYnV0IHdlCisJIG5lZWQgdG8gaW5qZWN0IGFuIGV2ZW50IHRvIHRlbGwgR0RCIHRo YXQgdGhlIHN0ZXAgY29tcGxldGVkLiAgKi8KKyAgICAgIHpldHAtPmV4ZWNfc3RhdGUgPSBaRV9U SFJFQURfU1RBVEVfVU5BVkFJTEFCTEU7CisgICAgICB6ZXRwLT53YWl0c3RhdHVzLnNldF91bmF2 YWlsYWJsZSAoKTsKKworICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgIGNhc2UgWkVfVEhSRUFE X1JFU1VNRV9SVU46CisgICAgICBjcjBbMV0gJj0gfigxIDw8IElOVEVMR1RfQ1IwXzFfQlJFQUtQ T0lOVF9TVEFUVVMpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgaW50ZXJu YWxfZXJyb3IgKF8oImJhZCByZXN1bWUga2luZDogJWQuIiksIHpldHAtPnJlc3VtZV9zdGF0ZSk7 CisgICAgfQorCisgIC8qIFdoZW4gc3RlcHBpbmcgb3ZlciBhIGJyZWFrcG9pbnQsIHdlIG5lZWQg dG8gc3VwcHJlc3MgdGhlIGJyZWFrcG9pbnQKKyAgICAgZXhjZXB0aW9uIHdlIHdvdWxkIG90aGVy d2lzZSBnZXQgaW1tZWRpYXRlbHkuCisKKyAgICAgVGhpcyByZXF1aXJlcyBicmVha3BvaW50cyB0 byBiZSBhbHJlYWR5IGluc2VydGVkIHdoZW4gdGhpcyBmdW5jdGlvbgorICAgICBpcyBjYWxsZWQu ICBJdCBhbHNvIGhhbmRsZXMgcGVybWFuZW50IGJyZWFrcG9pbnRzLiAgKi8KKyAgaWYgKGlzX2F0 X2JyZWFrcG9pbnQgKHRwKSkKKyAgICBjcjBbMF0gfD0gKDEgPDwgSU5URUxHVF9DUjBfMF9CUkVB S1BPSU5UX1NVUFBSRVNTKTsKKworICBpbnRlbGd0X3dyaXRlX2NyMCAocmVnY2FjaGUsIDAsIGNy MFswXSk7CisgIGludGVsZ3Rfd3JpdGVfY3IwIChyZWdjYWNoZSwgMSwgY3IwWzFdKTsKKyAgaW50 ZWxndF93cml0ZV9jcjAgKHJlZ2NhY2hlLCAyLCBjcjBbMl0pOworCisgIGRwcmludGYgKCJ0aHJl YWQgJXMgKCVzKSByZXN1bWVkLCBjcjAuMD0lIiBQUkl4MzIgIiAuMT0lIiBQUkl4MzIKKwkgICAi IC4yPSUiIFBSSXgzMiAiLiIsIHRwLT5pZC50b19zdHJpbmcgKCkuY19zdHIgKCksCisJICAgemVf dGhyZWFkX2lkX3N0ciAoemV0cC0+aWQpLmNfc3RyICgpLCBjcjBbMF0sIGNyMFsxXSwgY3IwWzJd KTsKK30KKwordm9pZAoraW50ZWxndF96ZV90YXJnZXQ6OmFkZF9yZWdzZXQgKHRhcmdldF9kZXNj ICp0ZGVzYywgY29uc3QgemVfZGV2aWNlX2luZm8gJmRpbmZvLAorCQkJICAgICAgIGNvbnN0IHpl dF9kZWJ1Z19yZWdzZXRfcHJvcGVydGllc190ICZyZWdwcm9wLAorCQkJICAgICAgIGxvbmcgJnJl Z251bSwgemVfcmVnc2V0X2luZm9fdCAmcmVnc2V0cywKKwkJCSAgICAgICBleHBlZGl0ZV90ICZl eHBlZGl0ZSkKK3sKKyAgdGRlc2NfZmVhdHVyZSAqZmVhdHVyZSA9IG51bGxwdHI7CisgIGNvbnN0 IHplX2RldmljZV9wcm9wZXJ0aWVzX3QgJmRldmljZSA9IGRpbmZvLnByb3BlcnRpZXM7CisKKyAg emVfcmVnc2V0X2luZm8gcmVnc2V0ID0ge307CisgIHJlZ3NldC50eXBlID0gKHVpbnQzMl90KSBy ZWdwcm9wLnR5cGU7CisgIHJlZ3NldC5zaXplID0gcmVncHJvcC5ieXRlU2l6ZTsKKyAgcmVnc2V0 LmJlZ2luID0gcmVnbnVtOworICByZWdzZXQuaXNfd3JpdGVhYmxlCisgICAgPSAoKHJlZ3Byb3Au Z2VuZXJhbEZsYWdzICYgWkVUX0RFQlVHX1JFR1NFVF9GTEFHX1dSSVRFQUJMRSkgIT0gMCk7CisK KyAgaWYgKHJlZ3Byb3AuY291bnQgPCAxKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKF8oIklnbm9y aW5nIGVtcHR5IHJlZ3NldCAldSBpbiAlcy4iKSwgcmVncHJvcC50eXBlLAorCSAgICAgICBkZXZp Y2UubmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICgocmVncHJvcC5nZW5lcmFs RmxhZ3MgJiBaRVRfREVCVUdfUkVHU0VUX0ZMQUdfUkVBREFCTEUpID09IDApCisgICAgeworICAg ICAgd2FybmluZyAoXygiSWdub3Jpbmcgbm9uLXJlYWRhYmxlIHJlZ3NldCAldSBpbiAlcy4iKSwg cmVncHJvcC50eXBlLAorCSAgICAgICBkZXZpY2UubmFtZSk7CisgICAgICByZXR1cm47CisgICAg fQorCisgIHN3aXRjaCAocmVncHJvcC50eXBlKQorICAgIHsKKyAgICBjYXNlIFpFVF9ERUJVR19S RUdTRVRfVFlQRV9HUkZfSU5URUxfR1BVOgorICAgICAgZmVhdHVyZSA9IHRkZXNjX2NyZWF0ZV9m ZWF0dXJlICh0ZGVzYywgaW50ZWxndDo6RkVBVFVSRV9HUkYpOworCisgICAgICBleHBlZGl0ZS5w dXNoX2JhY2sgKCJyMCIpOworCisgICAgICBpbnRlbGd0X2FkZF9yZWdzZXQgKGZlYXR1cmUsIHJl Z251bSwgInIiLCByZWdwcm9wLmNvdW50LCAiZ3JmIiwKKwkJCSAgcmVncHJvcC5iaXRTaXplLAor CQkJICBpbnRlbGd0X3VpbnRfcmVnX3R5cGUgKGZlYXR1cmUsIHJlZ3Byb3AuYml0U2l6ZSwKKwkJ CQkJCSAzMnUpLAorCQkJICBleHBlZGl0ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgWkVU X0RFQlVHX1JFR1NFVF9UWVBFX0FERFJfSU5URUxfR1BVOgorICAgICAgZmVhdHVyZSA9IHRkZXNj X2NyZWF0ZV9mZWF0dXJlICh0ZGVzYywgaW50ZWxndDo6RkVBVFVSRV9BRERSKTsKKworICAgICAg aW50ZWxndF9hZGRfcmVnc2V0IChmZWF0dXJlLCByZWdudW0sICJhIiwgcmVncHJvcC5jb3VudCwg ImFyZiIsCisJCQkgIHJlZ3Byb3AuYml0U2l6ZSwKKwkJCSAgaW50ZWxndF91aW50X3JlZ190eXBl IChmZWF0dXJlLCByZWdwcm9wLmJpdFNpemUsCisJCQkJCQkgMTZ1KSwKKwkJCSAgZXhwZWRpdGUp OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFpFVF9ERUJVR19SRUdTRVRfVFlQRV9GTEFHX0lO VEVMX0dQVToKKyAgICAgIGZlYXR1cmUgPSB0ZGVzY19jcmVhdGVfZmVhdHVyZSAodGRlc2MsIGlu dGVsZ3Q6OkZFQVRVUkVfRkxBRyk7CisKKyAgICAgIGludGVsZ3RfYWRkX3JlZ3NldCAoZmVhdHVy ZSwgcmVnbnVtLCAiZiIsIHJlZ3Byb3AuY291bnQsICJhcmYiLAorCQkJICByZWdwcm9wLmJpdFNp emUsCisJCQkgIGludGVsZ3RfdWludF9yZWdfdHlwZSAoZmVhdHVyZSwgcmVncHJvcC5iaXRTaXpl LAorCQkJCQkJIDE2dSksCisJCQkgIGV4cGVkaXRlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2Fz ZSBaRVRfREVCVUdfUkVHU0VUX1RZUEVfQ0VfSU5URUxfR1BVOgorICAgICAgLyogV2UgZXhwZWN0 IGEgc2luZ2xlICdjZScgcmVnaXN0ZXIuICAqLworICAgICAgaWYgKHJlZ3Byb3AuY291bnQgIT0g MSkKKwl3YXJuaW5nIChfKCJJZ25vcmluZyAldSB1bmV4cGVjdGVkICdjZScgcmVnaXN0ZXJzIGlu ICVzLiIpLAorCQkgcmVncHJvcC5jb3VudCAtIDEsIGRldmljZS5uYW1lKTsKKworICAgICAgZmVh dHVyZSA9IHRkZXNjX2NyZWF0ZV9mZWF0dXJlICh0ZGVzYywgaW50ZWxndDo6RkVBVFVSRV9DRSk7 CisKKyAgICAgIHRkZXNjX2NyZWF0ZV9yZWcgKGZlYXR1cmUsICJjZSIsIHJlZ251bSsrLCAxLCAi YXJmIiwKKwkJCXJlZ3Byb3AuYml0U2l6ZSwKKwkJCWludGVsZ3RfdWludF9yZWdfdHlwZSAoZmVh dHVyZSwgcmVncHJvcC5iaXRTaXplLAorCQkJCQkgICAgICAgMzJ1KSk7CisKKyAgICAgIGV4cGVk aXRlLnB1c2hfYmFjayAoImNlIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgWkVUX0RFQlVH X1JFR1NFVF9UWVBFX1NSX0lOVEVMX0dQVToKKyAgICAgIGZlYXR1cmUgPSB0ZGVzY19jcmVhdGVf ZmVhdHVyZSAodGRlc2MsIGludGVsZ3Q6OkZFQVRVUkVfU1IpOworCisgICAgICBleHBlZGl0ZS5w dXNoX2JhY2sgKCJzcjAiKTsKKyAgICAgIGludGVsZ3RfYWRkX3JlZ3NldCAoZmVhdHVyZSwgcmVn bnVtLCAic3IiLCByZWdwcm9wLmNvdW50LCAiYXJmIiwKKwkJCSAgcmVncHJvcC5iaXRTaXplLAor CQkJICBpbnRlbGd0X3VpbnRfcmVnX3R5cGUgKGZlYXR1cmUsIHJlZ3Byb3AuYml0U2l6ZSwKKwkJ CQkJCSAzMnUpLAorCQkJICBleHBlZGl0ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgWkVU X0RFQlVHX1JFR1NFVF9UWVBFX0NSX0lOVEVMX0dQVToKKyAgICAgIGZlYXR1cmUgPSB0ZGVzY19j cmVhdGVfZmVhdHVyZSAodGRlc2MsIGludGVsZ3Q6OkZFQVRVUkVfQ1IpOworCisgICAgICBleHBl ZGl0ZS5wdXNoX2JhY2sgKCJjcjAiKTsKKyAgICAgIGludGVsZ3RfYWRkX3JlZ3NldCAoZmVhdHVy ZSwgcmVnbnVtLCAiY3IiLCByZWdwcm9wLmNvdW50LCAiYXJmIiwKKwkJCSAgcmVncHJvcC5iaXRT aXplLAorCQkJICBpbnRlbGd0X3VpbnRfcmVnX3R5cGUgKGZlYXR1cmUsIHJlZ3Byb3AuYml0U2l6 ZSwKKwkJCQkJCSAzMnUpLAorCQkJICBleHBlZGl0ZSk7CisgICAgICBicmVhazsKKworICAgIGNh c2UgWkVUX0RFQlVHX1JFR1NFVF9UWVBFX1REUl9JTlRFTF9HUFU6CisgICAgICBmZWF0dXJlID0g dGRlc2NfY3JlYXRlX2ZlYXR1cmUgKHRkZXNjLCBpbnRlbGd0OjpGRUFUVVJFX1REUik7CisKKyAg ICAgIGludGVsZ3RfYWRkX3JlZ3NldCAoZmVhdHVyZSwgcmVnbnVtLCAidGRyIiwgcmVncHJvcC5j b3VudCwgImFyZiIsCisJCQkgIHJlZ3Byb3AuYml0U2l6ZSwKKwkJCSAgaW50ZWxndF91aW50X3Jl Z190eXBlIChmZWF0dXJlLCByZWdwcm9wLmJpdFNpemUsCisJCQkJCQkgMTZ1KSwKKwkJCSAgZXhw ZWRpdGUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFpFVF9ERUJVR19SRUdTRVRfVFlQRV9B Q0NfSU5URUxfR1BVOgorICAgICAgZmVhdHVyZSA9IHRkZXNjX2NyZWF0ZV9mZWF0dXJlICh0ZGVz YywgaW50ZWxndDo6RkVBVFVSRV9BQ0MpOworCisgICAgICBpbnRlbGd0X2FkZF9yZWdzZXQgKGZl YXR1cmUsIHJlZ251bSwgImFjYyIsIHJlZ3Byb3AuY291bnQsICJhcmYiLAorCQkJICByZWdwcm9w LmJpdFNpemUsCisJCQkgIGludGVsZ3RfdWludF9yZWdfdHlwZSAoZmVhdHVyZSwgcmVncHJvcC5i aXRTaXplLAorCQkJCQkJIDMydSksCisJCQkgIGV4cGVkaXRlKTsKKyAgICAgIGJyZWFrOworCisg ICAgY2FzZSBaRVRfREVCVUdfUkVHU0VUX1RZUEVfTU1FX0lOVEVMX0dQVToKKyAgICAgIGZlYXR1 cmUgPSB0ZGVzY19jcmVhdGVfZmVhdHVyZSAodGRlc2MsIGludGVsZ3Q6OkZFQVRVUkVfTU1FKTsK KworICAgICAgaW50ZWxndF9hZGRfcmVnc2V0IChmZWF0dXJlLCByZWdudW0sICJtbWUiLCByZWdw cm9wLmNvdW50LCAiYXJmIiwKKwkJCSAgcmVncHJvcC5iaXRTaXplLAorCQkJICBpbnRlbGd0X3Vp bnRfcmVnX3R5cGUgKGZlYXR1cmUsIHJlZ3Byb3AuYml0U2l6ZSwKKwkJCQkJCSAzMnUpLAorCQkJ ICBleHBlZGl0ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgWkVUX0RFQlVHX1JFR1NFVF9U WVBFX1NQX0lOVEVMX0dQVToKKyAgICAgIC8qIFdlIGV4cGVjdCBhIHNpbmdsZSAnc3AnIHJlZ2lz dGVyLiAgKi8KKyAgICAgIGlmIChyZWdwcm9wLmNvdW50ICE9IDEpCisJd2FybmluZyAoXygiSWdu b3JpbmcgJXUgdW5leHBlY3RlZCAnc3AnIHJlZ2lzdGVycyBpbiAlcy4iKSwKKwkJIHJlZ3Byb3Au Y291bnQgLSAxLCBkZXZpY2UubmFtZSk7CisKKyAgICAgIGZlYXR1cmUgPSB0ZGVzY19jcmVhdGVf ZmVhdHVyZSAodGRlc2MsIGludGVsZ3Q6OkZFQVRVUkVfU1ApOworCisgICAgICB0ZGVzY19jcmVh dGVfcmVnIChmZWF0dXJlLCAic3AiLCByZWdudW0rKywgMSwgImFyZiIsCisJCQlyZWdwcm9wLmJp dFNpemUsCisJCQlpbnRlbGd0X3VpbnRfcmVnX3R5cGUgKGZlYXR1cmUsIHJlZ3Byb3AuYml0U2l6 ZSwKKwkJCQkJICAgICAgIHJlZ3Byb3AuYml0U2l6ZSkpOworICAgICAgYnJlYWs7CisKKyAgICBj YXNlIFpFVF9ERUJVR19SRUdTRVRfVFlQRV9TQkFfSU5URUxfR1BVOgorICAgICAgZmVhdHVyZSA9 IHRkZXNjX2NyZWF0ZV9mZWF0dXJlICh0ZGVzYywgaW50ZWxndDo6RkVBVFVSRV9TQkEpOworCisg ICAgICBzd2l0Y2ggKHJlZ3Byb3AudmVyc2lvbikKKwl7CisJY2FzZSAwOgorCSAgeworCSAgICBj b25zdCBjaGFyICpyZWd0eXBlID0gaW50ZWxndF91aW50X3JlZ190eXBlIChmZWF0dXJlLAorCQkJ CQkJCSByZWdwcm9wLmJpdFNpemUsCisJCQkJCQkJIHJlZ3Byb3AuYml0U2l6ZSk7CisJICAgIGNv bnN0IGNoYXIgKnNiYXJlZ3NbXSA9IHsKKwkgICAgICAiZ2Vuc3RiYXNlIiwKKwkgICAgICAic3Vz dGJhc2UiLAorCSAgICAgICJkeW5iYXNlIiwKKwkgICAgICAiaW9iYXNlIiwKKwkgICAgICAiaXNh YmFzZSIsCisJICAgICAgImJsc3VzdGJhc2UiLAorCSAgICAgICJibHNhc3RiYXNlIiwKKwkgICAg ICAiYnRiYXNlIiwKKwkgICAgICAic2NyYmFzZSIsCisJICAgICAgInNjcmJhc2UyIiwKKwkgICAg ICBudWxscHRyCisJICAgIH07CisJICAgIGludCByZWcgPSAwOworCSAgICBmb3IgKDsgKHJlZyA8 IHJlZ3Byb3AuY291bnQpICYmIChzYmFyZWdzW3JlZ10gIT0gbnVsbHB0cik7ICsrcmVnKQorCSAg ICAgIHsKKwkJaWYgKChzdHJjbXAgKHNiYXJlZ3NbcmVnXSwgImdlbnN0YmFzZSIpID09IDApCisJ CSAgICB8fCAoc3RyY21wIChzYmFyZWdzW3JlZ10sICJpc2FiYXNlIikgPT0gMCkpCisJCSAgewor CQkgICAgZXhwZWRpdGUucHVzaF9iYWNrIChzYmFyZWdzW3JlZ10pOworCQkgIH0KKworCQl0ZGVz Y19jcmVhdGVfcmVnIChmZWF0dXJlLCBzYmFyZWdzW3JlZ10sIHJlZ251bSsrLCAxLAorCQkJCSAg InZpcnR1YWwiLCByZWdwcm9wLmJpdFNpemUsIHJlZ3R5cGUpOworCSAgICAgIH0KKwkgIH0KKwkg IGJyZWFrOworCisJZGVmYXVsdDoKKwkgIHdhcm5pbmcgKF8oIklnbm9yaW5nIHVua25vd24gU0JB IHJlZ3NldCB2ZXJzaW9uICV1IGluICVzIiksCisJCSAgIHJlZ3Byb3AudmVyc2lvbiwgZGV2aWNl Lm5hbWUpOworCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFpFVF9ERUJV R19SRUdTRVRfVFlQRV9EQkdfSU5URUxfR1BVOgorICAgICAgZmVhdHVyZSA9IHRkZXNjX2NyZWF0 ZV9mZWF0dXJlICh0ZGVzYywgaW50ZWxndDo6RkVBVFVSRV9EQkcpOworCisgICAgICBpbnRlbGd0 X2FkZF9yZWdzZXQgKGZlYXR1cmUsIHJlZ251bSwgImRiZyIsIHJlZ3Byb3AuY291bnQsICJhcmYi LAorCQkJICByZWdwcm9wLmJpdFNpemUsCisJCQkgIGludGVsZ3RfdWludF9yZWdfdHlwZSAoZmVh dHVyZSwgcmVncHJvcC5iaXRTaXplLAorCQkJCQkJIDMydSksCisJCQkgIGV4cGVkaXRlKTsKKyAg ICAgIGJyZWFrOworCisgICAgY2FzZSBaRVRfREVCVUdfUkVHU0VUX1RZUEVfRkNfSU5URUxfR1BV OgorICAgICAgZmVhdHVyZSA9IHRkZXNjX2NyZWF0ZV9mZWF0dXJlICh0ZGVzYywgaW50ZWxndDo6 RkVBVFVSRV9GQyk7CisKKyAgICAgIGludGVsZ3RfYWRkX3JlZ3NldCAoZmVhdHVyZSwgcmVnbnVt LCAiZmMiLCByZWdwcm9wLmNvdW50LCAiYXJmIiwKKwkJCSAgcmVncHJvcC5iaXRTaXplLAorCQkJ ICBpbnRlbGd0X3VpbnRfcmVnX3R5cGUgKGZlYXR1cmUsIHJlZ3Byb3AuYml0U2l6ZSwKKwkJCQkJ CSAzMnUpLAorCQkJICBleHBlZGl0ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgWkVUX0RF QlVHX1JFR1NFVF9UWVBFX0lOVkFMSURfSU5URUxfR1BVOgorICAgIGNhc2UgWkVUX0RFQlVHX1JF R1NFVF9UWVBFX0ZPUkNFX1VJTlQzMjoKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAoZmVh dHVyZSA9PSBudWxscHRyKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKF8oIklnbm9yaW5nIHVua25v d24gcmVnc2V0ICV1IGluICVzLiIpLCByZWdwcm9wLnR5cGUsCisJICAgICAgIGRldmljZS5uYW1l KTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICByZWdzZXQuZW5kID0gcmVnbnVtOworICBy ZWdzZXRzLnB1c2hfYmFjayAocmVnc2V0KTsKK30KKworCisvKiBUaGUgSW50ZWwgR1QgdGFyZ2V0 IG9wcyBvYmplY3QuICAqLworCitzdGF0aWMgaW50ZWxndF96ZV90YXJnZXQgdGhlX2ludGVsZ3Rf emVfdGFyZ2V0OworCitleHRlcm4gdm9pZCBpbml0aWFsaXplX2xvdyAoKTsKK3ZvaWQKK2luaXRp YWxpemVfbG93ICgpCit7CisgIC8qIERlbGF5ZWQgaW5pdGlhbGl6YXRpb24gb2YgTGV2ZWwtWmVy byB0YXJnZXRzLiAgU2VlIHplLWxvdy5oLiAgKi8KKyAgdGhlX2ludGVsZ3RfemVfdGFyZ2V0Lmlu aXQgKCk7CisgIHNldF90YXJnZXRfb3BzICgmdGhlX2ludGVsZ3RfemVfdGFyZ2V0KTsKK30KZGlm ZiAtLWdpdCBhL2dkYnNlcnZlci96ZS1sb3cuY2MgYi9nZGJzZXJ2ZXIvemUtbG93LmNjCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAuLmQzZGZiMWYxNzViYThiNDA2YTlmOWQ5MjdjNzFjYTZlYTUxNTRkMmUKLS0tIC9kZXYv bnVsbAorKysgYi9nZGJzZXJ2ZXIvemUtbG93LmNjCkBAIC0wLDAgKzEsMjk5NiBAQAorLyogVGFy Z2V0IGludGVyZmFjZSBmb3IgTGV2ZWwtWmVybyBiYXNlZCB0YXJnZXRzIGZvciBnZGJzZXJ2ZXIu CisgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL29uZWFwaS1zcmMvbGV2ZWwtemVyby5naXQuCisK KyAgIENvcHlyaWdodCAoQykgMjAyMC0yMDI1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j LgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBm cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBp dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp b24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl cnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0 IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNl aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3 aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5z ZXMvPi4gICovCisKKyNpbmNsdWRlICJ6ZS1sb3cuaCIKKyNpbmNsdWRlICJkbGwuaCIKKworI2lu Y2x1ZGUgPGxldmVsX3plcm8vemV0X2FwaS5oPgorI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyNpbmNs dWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8Y3N0cmluZz4gLyog Rm9yIHNucHJpbnRmLiAgKi8KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dXRpbGl0eT4K KyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c2V0PgorCisjaWZuZGVmIFVTRV9XSU4z MkFQSQorIyAgaW5jbHVkZSA8c2lnbmFsLmg+CisjICBpbmNsdWRlIDxmY250bC5oPgorI2VuZGlm CisKKworLyogQ29udmVuaWVuY2UgbWFjcm9zLiAgKi8KKworI2RlZmluZSBkcHJpbnRmKC4uLikJ CQkJCQlcCisgIGRvCQkJCQkJCQlcCisgICAgewkJCQkJCQkJXAorICAgICAgaWYgKGRlYnVnX3Ro cmVhZHMpCQkJCQlcCisJewkJCQkJCQlcCisJICBkZWJ1Z19wcmludGYgKCIlczogIiwgX19GVU5D VElPTl9fKTsJCQlcCisJICBkZWJ1Z19wcmludGYgKF9fVkFfQVJHU19fKTsJCQkJXAorCSAgZGVi dWdfcHJpbnRmICgiXG4iKTsJCQkJCVwKKwl9CQkJCQkJCVwKKyAgICB9CQkJCQkJCQlcCisgIHdo aWxlICgwKQorCisjaWZuZGVmIFVTRV9XSU4zMkFQSQorLyogQXN5bmMgaW50ZXJhY3Rpb24gc3R1 ZmYuCisKKyAgIFRoZSByZWFkL3dyaXRlIGVuZHMgb2YgdGhlIHBpcGUgcmVnaXN0ZXJlZCBhcyB3 YWl0YWJsZSBmaWxlIGluIHRoZQorICAgZXZlbnQgbG9vcC4gICovCitzdGF0aWMgaW50IHplX2V2 ZW50X3BpcGVbMl0gPSB7IC0xLCAtMSB9OworI2VuZGlmCisKKy8qIFJldHVybiB3aGV0aGVyIHdl J3JlIGluIGFzeW5jIG1vZGUuICAqLworCitzdGF0aWMgYm9vbAoremVfaXNfYXN5bmMgKCkKK3sK KyNpZm5kZWYgVVNFX1dJTjMyQVBJCisgIHJldHVybiAoemVfZXZlbnRfcGlwZVswXSAhPSAtMSk7 CisjZWxzZQorICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKworLyogR2V0IHJpZCBvZiBhbnkg cGVuZGluZyBldmVudCBpbiB0aGUgcGlwZS4gICovCisKK3N0YXRpYyB2b2lkCit6ZV9hc3luY19m bHVzaCAoKQoreworICBpZiAoIXplX2lzX2FzeW5jICgpKQorICAgIHJldHVybjsKKworI2lmbmRl ZiBVU0VfV0lOMzJBUEkKKyAgaW50IHJldDsKKyAgY2hhciBidWY7CisKKyAgZXJybm8gPSAwOwor ICBkbworICAgIHJldCA9IHJlYWQgKHplX2V2ZW50X3BpcGVbMF0sICZidWYsIDEpOworICB3aGls ZSAocmV0ID49IDAgfHwgKHJldCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikpOworI2Vsc2UKKyAg ZXJyb3IgKF8oIiVzOiB0YmQiKSwgX19GVU5DVElPTl9fKTsKKyNlbmRpZgorfQorCisvKiBQdXQg c29tZXRoaW5nIGluIHRoZSBwaXBlLCBzbyB0aGUgZXZlbnQgbG9vcCB3YWtlcyB1cC4gICovCisK K3N0YXRpYyB2b2lkCit6ZV9hc3luY19tYXJrICgpCit7CisgIGlmICghemVfaXNfYXN5bmMgKCkp CisgICAgcmV0dXJuOworCisjaWZuZGVmIFVTRV9XSU4zMkFQSQorICBpbnQgcmV0OworCisgIHpl X2FzeW5jX2ZsdXNoICgpOworCisgIGVycm5vID0gMDsKKyAgZG8KKyAgICByZXQgPSB3cml0ZSAo emVfZXZlbnRfcGlwZVsxXSwgIisiLCAxKTsKKyAgd2hpbGUgKHJldCA9PSAwIHx8IChyZXQgPT0g LTEgJiYgZXJybm8gPT0gRUlOVFIpKTsKKworICAvKiBJZ25vcmUgRUFHQUlOLiAgSWYgdGhlIHBp cGUgaXMgZnVsbCwgdGhlIGV2ZW50IGxvb3Agd2lsbCBhbHJlYWR5CisgICAgIGJlIGF3YWtlbmVk IGFueXdheS4gICovCisjZWxzZQorICBlcnJvciAoXygiJXM6IHRiZCIpLCBfX0ZVTkNUSU9OX18p OworI2VuZGlmCit9CisKKy8qIFJldHVybiBhIGh1bWFuLXJlYWRhYmxlIGRldmljZSB0aHJlYWQg aWQgY29tcG9uZW50IHN0cmluZy4gICovCisKK3N0YXRpYyBzdGQ6OnN0cmluZworemVfdGhyZWFk X2lkX2NvbXBvbmVudF9zdHIgKHVpbnQzMl90IGNvbXBvbmVudCkKK3sKKyAgaWYgKGNvbXBvbmVu dCA9PSBVSU5UMzJfTUFYKQorICAgIHJldHVybiBzdGQ6OnN0cmluZyAoImFsbCIpOworCisgIHJl dHVybiBzdGQ6OnRvX3N0cmluZyAoY29tcG9uZW50KTsKK30KKworLyogU2VlIHplLWxvdy5oLiAg Ki8KKworc3RkOjpzdHJpbmcKK3plX3RocmVhZF9pZF9zdHIgKGNvbnN0IHplX2RldmljZV90aHJl YWRfdCAmdGhyZWFkKQoreworICBzdGQ6OnN0cmluZ3N0cmVhbSBzc3RyZWFtOworICBzc3RyZWFt IDw8IHplX3RocmVhZF9pZF9jb21wb25lbnRfc3RyICh0aHJlYWQuc2xpY2UpCisJICA8PCAiLiIK KwkgIDw8IHplX3RocmVhZF9pZF9jb21wb25lbnRfc3RyICh0aHJlYWQuc3Vic2xpY2UpCisJICA8 PCAiLiIKKwkgIDw8IHplX3RocmVhZF9pZF9jb21wb25lbnRfc3RyICh0aHJlYWQuZXUpCisJICA8 PCAiLiIKKwkgIDw8IHplX3RocmVhZF9pZF9jb21wb25lbnRfc3RyICh0aHJlYWQudGhyZWFkKTsK KworICByZXR1cm4gc3N0cmVhbS5zdHIgKCk7Cit9CisKKy8qIFJldHVybiBhIGh1bWFuLXJlYWRh YmxlIFVVSUQgc3RyaW5nLiAgKi8KKworc3RhdGljIHN0ZDo6c3RyaW5nCit1dWlkX3N0ciAoY29u c3QgdWludDhfdCB1dWlkW10sIHNpemVfdCBzaXplKQoreworICBzdGQ6OnN0cmluZ3N0cmVhbSBz c3RyZWFtOworICB3aGlsZSAoc2l6ZS0tKQorICAgIHNzdHJlYW0gPDwgc3RkOjpzZXR3ICgyKSA8 PCB1dWlkW3NpemVdOworCisgIHJldHVybiBzc3RyZWFtLnN0ciAoKTsKK30KKworLyogUmV0dXJu IGEgaHVtYW4tcmVhZGFibGUgZGV2aWNlIFVVSUQgc3RyaW5nLiAgKi8KKworc3RhdGljIHN0ZDo6 c3RyaW5nCitkcml2ZXJfdXVpZF9zdHIgKGNvbnN0IHplX2RyaXZlcl91dWlkX3QgJnV1aWQpCit7 CisgIHJldHVybiB1dWlkX3N0ciAodXVpZC5pZCwgc2l6ZW9mICh1dWlkLmlkKSk7Cit9CisKKy8q IFJldHVybiBhIGh1bWFuLXJlYWRhYmxlIHByb2Nlc3Mgc3RhdGUgc3RyaW5nLiAgKi8KKworc3Rh dGljIGNvbnN0IGNoYXIgKgoremVfcHJvY2Vzc19zdGF0ZV9zdHIgKHplX3Byb2Nlc3Nfc3RhdGUg c3RhdGUpCit7CisgIHN3aXRjaCAoc3RhdGUpCisgICAgeworICAgIGNhc2UgWkVfUFJPQ0VTU19W SVNJQkxFOgorICAgICAgcmV0dXJuICJ2aXNpYmxlIjsKKworICAgIGNhc2UgWkVfUFJPQ0VTU19I SURERU46CisgICAgICByZXR1cm4gImhpZGRlbiI7CisgICAgfQorCisgIHJldHVybiAidW5rbm93 biI7Cit9CisKKy8qIFJldHVybiB0aGUgcGlkIGZvciBERVZJQ0UuICAqLworCitzdGF0aWMgaW50 Cit6ZV9kZXZpY2VfcGlkIChjb25zdCB6ZV9kZXZpY2VfaW5mbyAmZGV2aWNlKQoreworICBpZiAo ZGV2aWNlLnByb2Nlc3MgIT0gbnVsbHB0cikKKyAgICByZXR1cm4gZGV2aWNlLnByb2Nlc3MtPnBp ZDsKKworICByZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHRoZSBkZXZpY2UgZm9yIFBST0NFU1Mu ICAqLworCitzdGF0aWMgemVfZGV2aWNlX2luZm8gKgoremVfcHJvY2Vzc19kZXZpY2UgKHByb2Nl c3NfaW5mbyAqcHJvY2VzcykKK3sKKyAgaWYgKHByb2Nlc3MgPT0gbnVsbHB0cikKKyAgICByZXR1 cm4gbnVsbHB0cjsKKworICBwcm9jZXNzX2luZm9fcHJpdmF0ZSAqemVwcm9jID0gcHJvY2Vzcy0+ cHJpdjsKKyAgaWYgKHplcHJvYyA9PSBudWxscHRyKQorICAgIHJldHVybiBudWxscHRyOworCisg IHJldHVybiB6ZXByb2MtPmRldmljZTsKK30KKworLyogUmV0dXJuIHRoZSBkZXZpY2UgZm9yIFRI UkVBRC4gICovCisKK3plX2RldmljZV9pbmZvICoKK3plX3RocmVhZF9kZXZpY2UgKGNvbnN0IHRo cmVhZF9pbmZvICp0aHJlYWQpCit7CisgIGlmICh0aHJlYWQgPT0gbnVsbHB0cikKKyAgICByZXR1 cm4gbnVsbHB0cjsKKworICByZXR1cm4gemVfcHJvY2Vzc19kZXZpY2UgKHRocmVhZC0+cHJvY2Vz cyAoKSk7Cit9CisKKy8qIFJldHVybnMgd2hldGhlciBJRCBpcyBpbiBTRVQuICAqLworCitzdGF0 aWMgYm9vbAoremVfZGV2aWNlX3RocmVhZF9pbiAoemVfZGV2aWNlX3RocmVhZF90IGlkLCB6ZV9k ZXZpY2VfdGhyZWFkX3Qgc2V0KQoreworICBpZiAoKHNldC5zbGljZSAhPSBVSU5UMzJfTUFYKSAm JiAoc2V0LnNsaWNlICE9IGlkLnNsaWNlKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKChz ZXQuc3Vic2xpY2UgIT0gVUlOVDMyX01BWCkgJiYgKHNldC5zdWJzbGljZSAhPSBpZC5zdWJzbGlj ZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICgoc2V0LmV1ICE9IFVJTlQzMl9NQVgpICYm IChzZXQuZXUgIT0gaWQuZXUpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoKHNldC50aHJl YWQgIT0gVUlOVDMyX01BWCkgJiYgKHNldC50aHJlYWQgIT0gaWQudGhyZWFkKSkKKyAgICByZXR1 cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIENhbGwgRlVOQyBmb3IgZWFjaCB0 aHJlYWQgb24gREVWSUNFIG1hdGNoaW5nIElELiAgKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIEZ1 bmM+CitzdGF0aWMgdm9pZAorZm9yX2VhY2hfdGhyZWFkIChjb25zdCB6ZV9kZXZpY2VfaW5mbyAm ZGV2aWNlLCB6ZV9kZXZpY2VfdGhyZWFkX3QgaWQsCisJCSBGdW5jIGZ1bmMpCit7CisgIGRldmlj ZS5wcm9jZXNzLT5mb3JfZWFjaF90aHJlYWQgKFtpZCwgZnVuY10gKHRocmVhZF9pbmZvICp0cCkK KyAgICB7CisgICAgICB6ZV9kZXZpY2VfdGhyZWFkX3QgdGlkID0gemVfdGhyZWFkX2lkICh0cCk7 CisgICAgICBpZiAoemVfZGV2aWNlX3RocmVhZF9pbiAodGlkLCBpZCkpCisJZnVuYyAodHApOwor ICAgIH0pOworfQorCisvKiBBZGQgYSBwcm9jZXNzIGZvciBERVZJQ0UuICAqLworCitzdGF0aWMg cHJvY2Vzc19pbmZvICoKK3plX2FkZF9wcm9jZXNzICh6ZV9kZXZpY2VfaW5mbyAqZGV2aWNlLCB6 ZV9wcm9jZXNzX3N0YXRlIHN0YXRlKQoreworICBnZGJfYXNzZXJ0IChkZXZpY2UgIT0gbnVsbHB0 cik7CisKKyAgcHJvY2Vzc19pbmZvICpwcm9jZXNzID0gYWRkX3Byb2Nlc3MgKGRldmljZS0+b3Jk aW5hbCwgMSk7CisgIHByb2Nlc3MtPnByaXYgPSBuZXcgcHJvY2Vzc19pbmZvX3ByaXZhdGUgKGRl dmljZSwgc3RhdGUpOworICBwcm9jZXNzLT50ZGVzYyA9IGRldmljZS0+dGRlc2MuZ2V0ICgpOwor ICBkZXZpY2UtPnByb2Nlc3MgPSBwcm9jZXNzOworCisgIC8qIEVudW1lcmF0ZSB0aHJlYWRzIG9u IHRoZSBkZXZpY2Ugd2UgYXR0YWNoZWQgdG8uCisKKyAgICAgV2UgZGVidWcgdGhlIGVudGlyZSBk ZXZpY2Ugc28gd2UgY2FuIGVudW1lcmF0ZSBhbGwgdGhyZWFkcyBhdCBvbmNlLiAgVGhleQorICAg ICB3aWxsIGJlIGlkbGUgc29tZSBvZiB0aGUgdGltZSBhbmQgd2Ugd29uJ3QgYmUgYWJsZSB0byBp bnRlcmFjdCB3aXRoIHRoZW0uCisgICAgIFdoZW4gd29yayBnZXRzIHN1Ym1pdHRlZCB0byB0aGUg ZGV2aWNlLCB0aGUgdGhyZWFkIGRpc3BhdGNoZXIgd2lsbAorICAgICBkaXN0cmlidXRlIHRoZSB3 b3JrIG9udG8gZGV2aWNlIHRocmVhZHMuCisKKyAgICAgVGhlIGFsdGVybmF0aXZlIG9mIG9ubHkg cmVwcmVzZW50aW5nIHRocmVhZHMgdGhhdCBhcmUgY3VycmVudGx5IGV4ZWN1dGluZworICAgICB3 b3JrIHdvdWxkIGJlIHRvbyBpbnRydXNpdmUgYXMgd2UnZCBuZWVkIHRvIHN0b3AgZWFjaCB0aHJl YWQgb24gZXZlcnkKKyAgICAgZGlzcGF0Y2guICAqLworICBsb25nIHRpZCA9IDA7CisgIHVpbnQz Ml90IHNsaWNlLCBzc2xpY2UsIGV1LCB0aHJlYWQ7CisgIGNvbnN0IHplX2RldmljZV9wcm9wZXJ0 aWVzX3QgJnByb3BlcnRpZXMgPSBkZXZpY2UtPnByb3BlcnRpZXM7CisgIGZvciAoc2xpY2UgPSAw OyBzbGljZSA8IHByb3BlcnRpZXMubnVtU2xpY2VzOyArK3NsaWNlKQorICAgIGZvciAoc3NsaWNl ID0gMDsgc3NsaWNlIDwgcHJvcGVydGllcy5udW1TdWJzbGljZXNQZXJTbGljZTsgKytzc2xpY2Up CisgICAgICBmb3IgKGV1ID0gMDsgZXUgPCBwcm9wZXJ0aWVzLm51bUVVc1BlclN1YnNsaWNlOyAr K2V1KQorCWZvciAodGhyZWFkID0gMDsgdGhyZWFkIDwgcHJvcGVydGllcy5udW1UaHJlYWRzUGVy RVU7ICsrdGhyZWFkKQorCSAgeworCSAgICAvKiBXZSB1c2UgdGhlIGRldmljZSBvcmRpbmFsIGFz IHByb2Nlc3MgaWQuICAqLworCSAgICBwdGlkX3QgcHRpZCA9IHB0aWRfdCAoKGludCkgZGV2aWNl LT5vcmRpbmFsLCArK3RpZCwgMGwpOworCisJICAgIC8qIFdlIGNhbiBvbmx5IHN1cHBvcnQgdGhh dCBtYW55IHRocmVhZHMuICAqLworCSAgICBpZiAodGlkIDwgMCkKKwkgICAgICBlcnJvciAoXygi VG9vIG1hbnkgdGhyZWFkcyBvbiBkZXZpY2UgJWx1OiAlcy4iKSwKKwkJICAgICBkZXZpY2UtPm9y ZGluYWwsIHByb3BlcnRpZXMubmFtZSk7CisKKwkgICAgLyogU3RvcmluZyB0aGUgMTI4YiBkZXZp Y2UgdGhyZWFkIGlkIGluIHRoZSBwcml2YXRlIGRhdGEuICBXZSBtaWdodAorCSAgICAgICB3YW50 IHRvIGV4dGVuZCBwdGlkX3QgYW5kIHB1dCBpdCB0aGVyZSBzbyBHREIgY2FuIHNob3cgaXQgdG8g dGhlCisJICAgICAgIHVzZXIuICAqLworCSAgICB6ZV90aHJlYWRfaW5mbyAqemV0cCA9IG5ldyB6 ZV90aHJlYWRfaW5mbyB7fTsKKwkgICAgemV0cC0+aWQuc2xpY2UgPSBzbGljZTsKKwkgICAgemV0 cC0+aWQuc3Vic2xpY2UgPSBzc2xpY2U7CisJICAgIHpldHAtPmlkLmV1ID0gZXU7CisJICAgIHpl dHAtPmlkLnRocmVhZCA9IHRocmVhZDsKKworCSAgICAvKiBBc3N1bWUgdGhyZWFkcyBhcmUgcnVu bmluZyB1bnRpbCB3ZSBoZWFyIG90aGVyd2lzZS4gICovCisJICAgIHpldHAtPmV4ZWNfc3RhdGUg PSBaRV9USFJFQURfU1RBVEVfUlVOTklORzsKKworCSAgICBwcm9jZXNzLT5hZGRfdGhyZWFkIChw dGlkLCB6ZXRwKTsKKwkgIH0KKworICBkZXZpY2UtPm50aHJlYWRzID0gdGlkOworICBkZXZpY2Ut Pm5yZXN1bWVkID0gdGlkOworCisgIGRwcmludGYgKCJwcm9jZXNzICVkICglcykgd2l0aCAlbGQg dGhyZWFkcyBjcmVhdGVkIGZvciBkZXZpY2UgJWx1OiAlcy4iLAorCSAgIChpbnQpIGRldmljZS0+ b3JkaW5hbCwgemVfcHJvY2Vzc19zdGF0ZV9zdHIgKHN0YXRlKSwgdGlkLAorCSAgIGRldmljZS0+ b3JkaW5hbCwgcHJvcGVydGllcy5uYW1lKTsKKworICByZXR1cm4gcHJvY2VzczsKK30KKworLyog UmVtb3ZlIGEgTGV2ZWwtWmVybyBQUk9DRVNTLiAgKi8KKworc3RhdGljIHZvaWQKK3plX3JlbW92 ZV9wcm9jZXNzIChwcm9jZXNzX2luZm8gKnByb2Nlc3MpCit7CisgIGdkYl9hc3NlcnQgKHByb2Nl c3MgIT0gbnVsbHB0cik7CisKKyAgcHJvY2Vzcy0+Zm9yX2VhY2hfdGhyZWFkIChbPV0gKHRocmVh ZF9pbmZvICp0aHJlYWQpCisgICAgeworICAgICAgZGVsZXRlICh6ZV90aHJlYWRfaW5mbyAqKSB0 aHJlYWQtPnRhcmdldF9kYXRhICgpOworICAgICAgcHJvY2Vzcy0+cmVtb3ZlX3RocmVhZCAodGhy ZWFkKTsKKyAgICB9KTsKKworICBwcm9jZXNzX2luZm9fcHJpdmF0ZSAqemVpbmZvID0gcHJvY2Vz cy0+cHJpdjsKKyAgZ2RiX2Fzc2VydCAoemVpbmZvICE9IG51bGxwdHIpOworCisgIC8qIFdlIG1h eSBvciBtYXkgbm90IGhhdmUgYSBkZXZpY2UuCisKKyAgICAgV2hlbiB3ZSBnb3QgZGV0YWNoZWQs IHdlIHdpbGwgcmVtb3ZlIHRoZSBkZXZpY2UgZmlyc3QsIGFuZCByZW1vdmUgdGhlCisgICAgIHBy b2Nlc3Mgd2hlbiB3ZSBzZWxlY3QgYW4gZXZlbnQgZnJvbSBvbmUgb2YgaXRzIHRocmVhZHMuCisK KyAgICAgV2hlbiB3ZSBnZXQgYSBwcm9jZXNzIGV4aXQgZXZlbnQsIHRoZSBkZXZpY2Ugd2lsbCBy ZW1haW4gYWZ0ZXIgdGhlIHByb2Nlc3MKKyAgICAgaGFzIGJlZW4gcmVtb3ZlZC4gICovCisgIHpl X2RldmljZV9pbmZvICpkZXZpY2UgPSB6ZWluZm8tPmRldmljZTsKKyAgaWYgKGRldmljZSAhPSBu dWxscHRyKQorICAgIHsKKyAgICAgIGdkYl9hc3NlcnQgKGRldmljZS0+cHJvY2VzcyA9PSBwcm9j ZXNzKTsKKyAgICAgIGRldmljZS0+cHJvY2VzcyA9IG51bGxwdHI7CisgICAgfQorCisgIHByb2Nl c3MtPnByaXYgPSBudWxscHRyOworICBkZWxldGUgemVpbmZvOworCisgIHJlbW92ZV9wcm9jZXNz IChwcm9jZXNzKTsKK30KKworLyogU2hvdyBQUk9DRVNTLiAgKi8KKworc3RhdGljIHZvaWQKK3pl X3Nob3dfcHJvY2VzcyAocHJvY2Vzc19pbmZvICpwcm9jZXNzKQoreworICBnZGJfYXNzZXJ0IChw cm9jZXNzICE9IG51bGxwdHIpOworICBwcm9jZXNzX2luZm9fcHJpdmF0ZSAqcHJpdiA9IHByb2Nl c3MtPnByaXY7CisKKyAgZ2RiX2Fzc2VydCAocHJpdiAhPSBudWxscHRyKTsKKyAgc3dpdGNoIChw cml2LT5zdGF0ZSkKKyAgICB7CisgICAgY2FzZSBaRV9QUk9DRVNTX1ZJU0lCTEU6CisgICAgICBy ZXR1cm47CisKKyAgICBjYXNlIFpFX1BST0NFU1NfSElEREVOOgorICAgICAgLyogRklYTUU6IHJl cG9ydCBzdGF0ZSBjaGFuZ2UKKworCSBTZXQgcHJpdi0+c3RhdHVzIGFuZCByZXBvcnQgdGhlIG5l dyB2aXNpYmlsaXR5IHRvIEdEQi4gICovCisgICAgICBwcml2LT5zdGF0ZSA9IFpFX1BST0NFU1Nf VklTSUJMRTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaW50ZXJuYWxfZXJyb3IgKF8oInVu a25vd24gcHJvY2VzcyBzdGF0ZSIpKTsKK30KKworLyogSGlkZSBQUk9DRVNTLiAgKi8KKworc3Rh dGljIHZvaWQKK3plX2hpZGVfcHJvY2VzcyAocHJvY2Vzc19pbmZvICpwcm9jZXNzKQoreworICBn ZGJfYXNzZXJ0IChwcm9jZXNzICE9IG51bGxwdHIpOworICBwcm9jZXNzX2luZm9fcHJpdmF0ZSAq cHJpdiA9IHByb2Nlc3MtPnByaXY7CisKKyAgZ2RiX2Fzc2VydCAocHJpdiAhPSBudWxscHRyKTsK KyAgc3dpdGNoIChwcml2LT5zdGF0ZSkKKyAgICB7CisgICAgY2FzZSBaRV9QUk9DRVNTX0hJRERF TjoKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgWkVfUFJPQ0VTU19WSVNJQkxFOgorICAgICAg LyogRklYTUU6IHJlcG9ydCBzdGF0ZSBjaGFuZ2UKKworCSBTZXQgcHJpdi0+c3RhdHVzIGFuZCBy ZXBvcnQgdGhlIG5ldyB2aXNpYmlsaXR5IHRvIEdEQi4gICovCisgICAgICBwcml2LT5zdGF0ZSA9 IFpFX1BST0NFU1NfSElEREVOOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpbnRlcm5hbF9l cnJvciAoXygidW5rbm93biBwcm9jZXNzIHN0YXRlIikpOworfQorCisvKiBBdHRhY2ggdG8gREVW SUNFIGFuZCBjcmVhdGUgYSBoaWRkZW4gcHJvY2VzcyBmb3IgaXQuCisKKyAgIE1vZGlmaWVzIERF VklDRSBhcyBhIHNpZGUtZWZmZWN0LgorICAgUmV0dXJucyB0aGUgY3JlYXRlZCBwcm9jZXNzIG9y IG51bGxwdHIgaWYgREVWSUNFIGRvZXMgbm90IHN1cHBvcnQgZGVidWcuICAqLworCitzdGF0aWMg cHJvY2Vzc19pbmZvICoKK3plX2F0dGFjaCAoemVfZGV2aWNlX2luZm8gKmRldmljZSkKK3sKKyAg Z2RiX2Fzc2VydCAoZGV2aWNlICE9IG51bGxwdHIpOworCisgIGlmIChkZXZpY2UtPnNlc3Npb24g IT0gbnVsbHB0cikKKyAgICBlcnJvciAoXygiQWxyZWFkeSBhdHRhY2hlZCB0byAlcy4iKSwgZGV2 aWNlLT5wcm9wZXJ0aWVzLm5hbWUpOworCisgIGRldmljZS0+ZGVidWdfYXR0YWNoX3N0YXRlID0g emV0RGVidWdBdHRhY2ggKGRldmljZS0+aGFuZGxlLCAmZGV2aWNlLT5jb25maWcsCisJCQkJCSAg ICAgICAmZGV2aWNlLT5zZXNzaW9uKTsKKyAgc3dpdGNoIChkZXZpY2UtPmRlYnVnX2F0dGFjaF9z dGF0ZSkKKyAgICB7CisgICAgY2FzZSBaRV9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgIGlmIChkZXZp Y2UtPnNlc3Npb24gPT0gbnVsbHB0cikKKwllcnJvciAoXygiQmFkIGhhbmRsZSByZXR1cm5lZCBi eSB6ZXREZWJ1Z0F0dGFjaCBvbiAlcy4iKSwKKwkgICAgICAgZGV2aWNlLT5wcm9wZXJ0aWVzLm5h bWUpOworCisgICAgICByZXR1cm4gemVfYWRkX3Byb2Nlc3MgKGRldmljZSwgWkVfUFJPQ0VTU19I SURERU4pOworCisgICAgY2FzZSBaRV9SRVNVTFRfTk9UX1JFQURZOgorICAgICAgLyogV2UncmUg dG9vIGVhcmx5LiAgVGhlIExldmVsLVplcm8gdXNlci1tb2RlIGRyaXZlciBoYXMgbm90IGJlZW4K KwkgaW5pdGlhbGl6ZWQsIHlldC4gICovCisgICAgICBlcnJvciAoXygiQXR0ZW1wdGluZyB0byBh dHRhY2ggdG9vIGVhcmx5IHRvICVzLiIpLAorCSAgICAgZGV2aWNlLT5wcm9wZXJ0aWVzLm5hbWUp OworCisgICAgY2FzZSBaRV9SRVNVTFRfRVJST1JfVU5TVVBQT1JURURfRkVBVFVSRToKKyAgICAg IC8qIE5vdCBhbGwgc3ViLWRldmljZXMgc3VwcG9ydCBhdHRhY2hpbmcgdG8gdGhlbS4gICovCisg ICAgICBkcHJpbnRmICgiQXR0YWNoIG5vdCBzdXBwb3J0ZWQgb24gJXMiLCBkZXZpY2UtPnByb3Bl cnRpZXMubmFtZSk7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIGNhc2UgWkVfUkVTVUxU X0VSUk9SX05PVF9BVkFJTEFCTEU6CisgICAgICAvKiBTb21lb25lIGVsc2UgaXMgYWxyZWFkeSBh dHRhY2hlZC4gIFRoaXMgY291bGQgYmUgdXMgaWYgd2UgYWxyZWFkeQorCSBhdHRhY2hlZCB0byBz b21lIG90aGVyIHN1Yi1kZXZpY2UgaW4gdGhpcyBkZXZpY2UgdHJlZS4gICovCisgICAgICBlcnJv ciAoXygiU29tZW9uZSBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvICVzLiIpLAorCSAgICAgZGV2aWNl LT5wcm9wZXJ0aWVzLm5hbWUpOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yIChfKCJGYWls ZWQgdG8gYXR0YWNoIHRvICVzICgleCkuIiksIGRldmljZS0+cHJvcGVydGllcy5uYW1lLAorCSAg ICAgZGV2aWNlLT5kZWJ1Z19hdHRhY2hfc3RhdGUpOworICAgIH0KK30KKworLyogRGV0YWNoIGZy b20gREVWSUNFLiAgKi8KKworc3RhdGljIHZvaWQKK3plX2RldGFjaCAoemVfZGV2aWNlX2luZm8g KmRldmljZSkKK3sKKyAgZ2RiX2Fzc2VydCAoZGV2aWNlICE9IG51bGxwdHIpOworCisgIHpldF9k ZWJ1Z19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24gPSBkZXZpY2UtPnNlc3Npb247CisgIGlmIChz ZXNzaW9uID09IG51bGxwdHIpCisgICAgZXJyb3IgKF8oIkFscmVhZHkgZGV0YWNoZWQgZnJvbSAl cy4iKSwgZGV2aWNlLT5wcm9wZXJ0aWVzLm5hbWUpOworCisgIGRwcmludGYgKCJkZXZpY2UgJWx1 PSVzIiwgZGV2aWNlLT5vcmRpbmFsLCBkZXZpY2UtPnByb3BlcnRpZXMubmFtZSk7CisKKyAgemVf cmVzdWx0X3Qgc3RhdHVzICA9IHpldERlYnVnRGV0YWNoIChzZXNzaW9uKTsKKyAgc3dpdGNoIChz dGF0dXMpCisgICAgeworICAgIGNhc2UgWkVfUkVTVUxUX0VSUk9SX0RFVklDRV9MT1NUOgorICAg IGNhc2UgWkVfUkVTVUxUX1NVQ0NFU1M6CisgICAgICBkZXZpY2UtPnNlc3Npb24gPSBudWxscHRy OworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IgKF8oIkZhaWxlZCB0 byBkZXRhY2ggZnJvbSAlcyAoJXgpLiIpLCBkZXZpY2UtPnByb3BlcnRpZXMubmFtZSwKKwkgICAg IHN0YXR1cyk7CisgICAgfQorfQorCisvKiBSZXR1cm4gYSBodW1hbi1yZWFkYWJsZSBkZXRhY2gg cmVhc29uIHN0cmluZy4gICovCisKK3N0YXRpYyBzdGQ6OnN0cmluZworemVfZGV0YWNoX3JlYXNv bl9zdHIgKHpldF9kZWJ1Z19kZXRhY2hfcmVhc29uX3QgcmVhc29uKQoreworICBzd2l0Y2ggKHJl YXNvbikKKyAgICB7CisgICAgY2FzZSBaRVRfREVCVUdfREVUQUNIX1JFQVNPTl9JTlZBTElEOgor ICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nIChfKCJpbnZhbGlkIikpOworCisgICAgY2FzZSBaRVRf REVCVUdfREVUQUNIX1JFQVNPTl9IT1NUX0VYSVQ6CisgICAgICByZXR1cm4gc3RkOjpzdHJpbmcg KF8oInRoZSBob3N0IHByb2Nlc3MgZXhpdGVkIikpOworICAgIH0KKworICByZXR1cm4gc3RkOjpz dHJpbmcgKF8oInVua25vd24iKSk7Cit9CisKKy8qIFJldHVybiBhIGh1bWFuLXJlYWRhYmxlIG1v ZHVsZSBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3JtYXQgc3RyaW5nLiAgKi8KKworc3RhdGljIHN0ZDo6 c3RyaW5nCit6ZV9kZWJ1Z19pbmZvX2Zvcm1hdF9zdHIgKHpldF9tb2R1bGVfZGVidWdfaW5mb19m b3JtYXRfdCBmb3JtYXQpCit7CisgIHN3aXRjaCAoZm9ybWF0KQorICAgIHsKKyAgICBjYXNlIFpF VF9NT0RVTEVfREVCVUdfSU5GT19GT1JNQVRfRUxGX0RXQVJGOgorICAgICAgcmV0dXJuIHN0ZDo6 c3RyaW5nIChfKCJEV0FSRiIpKTsKKyAgICB9CisKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nIChfKCJ1 bmtub3duIikpOworfQorCisvKiBSZXR1cm4gYSBodW1hbi1yZWFkYWJsZSBldmVudCBzdHJpbmcu ICAqLworCitzdGF0aWMgc3RkOjpzdHJpbmcKK3plX2V2ZW50X3N0ciAoY29uc3QgemV0X2RlYnVn X2V2ZW50X3QgJmV2ZW50KQoreworICBzdGQ6OnN0cmluZ3N0cmVhbSBzc3RyZWFtOworCisgIHN3 aXRjaCAoZXZlbnQudHlwZSkKKyAgICB7CisgICAgY2FzZSBaRVRfREVCVUdfRVZFTlRfVFlQRV9J TlZBTElEOgorICAgICAgc3N0cmVhbSA8PCAiaW52YWxpZCI7CisgICAgICByZXR1cm4gc3N0cmVh bS5zdHIgKCk7CisKKyAgICBjYXNlIFpFVF9ERUJVR19FVkVOVF9UWVBFX0RFVEFDSEVEOgorICAg ICAgc3N0cmVhbSA8PCAiZGV0YWNoZWQsIHJlYXNvbj0iCisJICAgICAgPDwgemVfZGV0YWNoX3Jl YXNvbl9zdHIgKGV2ZW50LmluZm8uZGV0YWNoZWQucmVhc29uKTsKKyAgICAgIHJldHVybiBzc3Ry ZWFtLnN0ciAoKTsKKworICAgIGNhc2UgWkVUX0RFQlVHX0VWRU5UX1RZUEVfUFJPQ0VTU19FTlRS WToKKyAgICAgIHNzdHJlYW0gPDwgInByb2Nlc3MgZW50cnkiOworICAgICAgcmV0dXJuIHNzdHJl YW0uc3RyICgpOworCisgICAgY2FzZSBaRVRfREVCVUdfRVZFTlRfVFlQRV9QUk9DRVNTX0VYSVQ6 CisgICAgICBzc3RyZWFtIDw8ICJwcm9jZXNzIGV4aXQiOworICAgICAgcmV0dXJuIHNzdHJlYW0u c3RyICgpOworCisgICAgY2FzZSBaRVRfREVCVUdfRVZFTlRfVFlQRV9NT0RVTEVfTE9BRDoKKyAg ICAgIHNzdHJlYW0gPDwgIm1vZHVsZSBsb2FkLCBmb3JtYXQ9IgorCSAgICAgIDw8IHplX2RlYnVn X2luZm9fZm9ybWF0X3N0ciAoZXZlbnQuaW5mby5tb2R1bGUuZm9ybWF0KQorCSAgICAgIDw8ICIs IG1vZHVsZT1bIiA8PCBzdGQ6OmhleCA8PCBldmVudC5pbmZvLm1vZHVsZS5tb2R1bGVCZWdpbgor CSAgICAgIDw8ICI7ICIgPDwgc3RkOjpoZXggPDwgZXZlbnQuaW5mby5tb2R1bGUubW9kdWxlRW5k CisJICAgICAgPDwgIiksIGFkZHI9IiA8PCBzdGQ6OmhleCA8PCBldmVudC5pbmZvLm1vZHVsZS5s b2FkCisJICAgICAgPDwgIiwgbmVlZC1hY2s6ICIKKwkgICAgICA8PCAoKGV2ZW50LmZsYWdzICYg WkVUX0RFQlVHX0VWRU5UX0ZMQUdfTkVFRF9BQ0spICE9IDApOworICAgICAgcmV0dXJuIHNzdHJl YW0uc3RyICgpOworCisgICAgY2FzZSBaRVRfREVCVUdfRVZFTlRfVFlQRV9NT0RVTEVfVU5MT0FE OgorICAgICAgc3N0cmVhbSA8PCAibW9kdWxlIHVubG9hZCwgZm9ybWF0PSIKKwkgICAgICA8PCB6 ZV9kZWJ1Z19pbmZvX2Zvcm1hdF9zdHIgKGV2ZW50LmluZm8ubW9kdWxlLmZvcm1hdCkKKwkgICAg ICA8PCAiLCBtb2R1bGU9WyIgPDwgc3RkOjpoZXggPDwgZXZlbnQuaW5mby5tb2R1bGUubW9kdWxl QmVnaW4KKwkgICAgICA8PCAiOyAiIDw8IHN0ZDo6aGV4IDw8IGV2ZW50LmluZm8ubW9kdWxlLm1v ZHVsZUVuZAorCSAgICAgIDw8ICIpLCBhZGRyPSIgPDwgc3RkOjpoZXggPDwgZXZlbnQuaW5mby5t b2R1bGUubG9hZDsKKyAgICAgIHJldHVybiBzc3RyZWFtLnN0ciAoKTsKKworICAgIGNhc2UgWkVU X0RFQlVHX0VWRU5UX1RZUEVfVEhSRUFEX1NUT1BQRUQ6CisgICAgICBzc3RyZWFtIDw8ICJ0aHJl YWQgc3RvcHBlZCwgdGhyZWFkPSIKKwkgICAgICA8PCB6ZV90aHJlYWRfaWRfc3RyIChldmVudC5p bmZvLnRocmVhZC50aHJlYWQpOworICAgICAgcmV0dXJuIHNzdHJlYW0uc3RyICgpOworCisgICAg Y2FzZSBaRVRfREVCVUdfRVZFTlRfVFlQRV9USFJFQURfVU5BVkFJTEFCTEU6CisgICAgICBzc3Ry ZWFtIDw8ICJ0aHJlYWQgdW5hdmFpbGFibGUsIHRocmVhZD0iCisJICAgICAgPDwgemVfdGhyZWFk X2lkX3N0ciAoZXZlbnQuaW5mby50aHJlYWQudGhyZWFkKTsKKyAgICAgIHJldHVybiBzc3RyZWFt LnN0ciAoKTsKKyAgICB9CisKKyAgc3N0cmVhbSA8PCAidW5rbm93biwgY29kZT0iIDw8IGV2ZW50 LnR5cGU7CisgIHJldHVybiBzc3RyZWFtLnN0ciAoKTsKK30KKworLyogQWNrbm93bGVkZ2UgYW4g ZXZlbnQsIGlmIG5lY2Vzc2FyeS4gICovCisKK3N0YXRpYyB2b2lkCit6ZV9hY2tfZXZlbnQgKGNv bnN0IHplX2RldmljZV9pbmZvICZkZXZpY2UsIGNvbnN0IHpldF9kZWJ1Z19ldmVudF90ICZldmVu dCkKK3sKKyAgLyogVGhlcmUgaXMgbm90aGluZyB0byBkbyBmb3IgZXZlbnRzIHRoYXQgZG8gbm90 IG5lZWQgYWNrbm93bGVkZ2luZy4gICovCisgIGlmICgoZXZlbnQuZmxhZ3MgJiBaRVRfREVCVUdf RVZFTlRfRkxBR19ORUVEX0FDSykgPT0gMCkKKyAgICByZXR1cm47CisKKyAgemVfcmVzdWx0X3Qg c3RhdHVzID0gemV0RGVidWdBY2tub3dsZWRnZUV2ZW50IChkZXZpY2Uuc2Vzc2lvbiwgJmV2ZW50 KTsKKyAgc3dpdGNoIChzdGF0dXMpCisgICAgeworICAgIGNhc2UgWkVfUkVTVUxUX1NVQ0NFU1M6 CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciAoXygiZXJyb3IgYWNr bm93bGVkZ2luZyBldmVudDogJXM6ICV4LiIpLAorCSAgICAgemVfZXZlbnRfc3RyIChldmVudCku Y19zdHIgKCksIHN0YXR1cyk7CisgICAgfQorfQorCisvKiBDbGVhciBUUCdzIHJlc3VtZSBzdGF0 ZS4gICovCisKK3N0YXRpYyB2b2lkCit6ZV9jbGVhcl9yZXN1bWVfc3RhdGUgKHRocmVhZF9pbmZv ICp0cCkKK3sKKyAgemVfdGhyZWFkX2luZm8gKnpldHAgPSB6ZV90aHJlYWQgKHRwKTsKKyAgZ2Ri X2Fzc2VydCAoemV0cCAhPSBudWxscHRyKTsKKworICB6ZXRwLT5yZXN1bWVfc3RhdGUgPSBaRV9U SFJFQURfUkVTVU1FX05PTkU7Cit9CisKKy8qIFNldCBUUCdzIHJlc3VtZSBzdGF0ZSBmcm9tIFJL SU5ELiAgKi8KKworc3RhdGljIHZvaWQKK3plX3NldF9yZXN1bWVfc3RhdGUgKHRocmVhZF9pbmZv ICp0cCwgcmVzdW1lX2tpbmQgcmtpbmQpCit7CisgIHplX3RocmVhZF9pbmZvICp6ZXRwID0gemVf dGhyZWFkICh0cCk7CisgIGdkYl9hc3NlcnQgKHpldHAgIT0gbnVsbHB0cik7CisKKyAgc3dpdGNo IChya2luZCkKKyAgICB7CisgICAgY2FzZSByZXN1bWVfY29udGludWU6CisgICAgICB6ZXRwLT5y ZXN1bWVfc3RhdGUgPSBaRV9USFJFQURfUkVTVU1FX1JVTjsKKyAgICAgIHJldHVybjsKKworICAg IGNhc2UgcmVzdW1lX3N0ZXA6CisgICAgICB6ZXRwLT5yZXN1bWVfc3RhdGUgPSBaRV9USFJFQURf UkVTVU1FX1NURVA7CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIHJlc3VtZV9zdG9wOgorICAg ICAgemV0cC0+cmVzdW1lX3N0YXRlID0gWkVfVEhSRUFEX1JFU1VNRV9TVE9QOworICAgICAgcmV0 dXJuOworICAgIH0KKworICBpbnRlcm5hbF9lcnJvciAoXygiYmFkIHJlc3VtZSBraW5kOiAlZC4i KSwgcmtpbmQpOworfQorCisvKiBSZXR1cm4gVFAncyByZXN1bWUgc3RhdGUuICAqLworCitzdGF0 aWMgZW51bSB6ZV90aHJlYWRfcmVzdW1lX3N0YXRlX3QKK3plX3Jlc3VtZV9zdGF0ZSAoY29uc3Qg dGhyZWFkX2luZm8gKnRwKQoreworICBjb25zdCB6ZV90aHJlYWRfaW5mbyAqemV0cCA9IHplX3Ro cmVhZCAodHApOworICBpZiAoemV0cCA9PSBudWxscHRyKQorICAgIHJldHVybiBaRV9USFJFQURf UkVTVU1FX05PTkU7CisKKyAgcmV0dXJuIHpldHAtPnJlc3VtZV9zdGF0ZTsKK30KKworLyogUmV0 dXJuIFRQJ3MgZXhlY3V0aW9uIHN0YXRlLiAgKi8KKworc3RhdGljIGVudW0gemVfdGhyZWFkX2V4 ZWNfc3RhdGVfdAoremVfZXhlY19zdGF0ZSAoY29uc3QgdGhyZWFkX2luZm8gKnRwKQoreworICBj b25zdCB6ZV90aHJlYWRfaW5mbyAqemV0cCA9IHplX3RocmVhZCAodHApOworICBpZiAoemV0cCA9 PSBudWxscHRyKQorICAgIHJldHVybiBaRV9USFJFQURfU1RBVEVfVU5LTk9XTjsKKworICByZXR1 cm4gemV0cC0+ZXhlY19zdGF0ZTsKK30KKworLyogUmV0dXJuIHdoZXRoZXIgVFAgaGFzIGEgc3Rv cCBleGVjdXRpb24gc3RhdGUuICAqLworCitzdGF0aWMgYm9vbAoremVfdGhyZWFkX3N0b3BwZWQg KGNvbnN0IHRocmVhZF9pbmZvICp0cCkKK3sKKyAgemVfdGhyZWFkX2V4ZWNfc3RhdGVfdCBzdGF0 ZSA9IHplX2V4ZWNfc3RhdGUgKHRwKTsKKworICByZXR1cm4gKChzdGF0ZSA9PSBaRV9USFJFQURf U1RBVEVfU1RPUFBFRCkKKwkgIHx8IChzdGF0ZSA9PSBaRV9USFJFQURfU1RBVEVfSEVMRCkKKwkg IHx8IChzdGF0ZSA9PSBaRV9USFJFQURfU1RBVEVfUEFVU0VEKSk7Cit9CisKKy8qIFJldHVybiB3 aGV0aGVyIFRQIGhhcyBhIHBlbmRpbmcgZXZlbnQuICAqLworCitzdGF0aWMgYm9vbAoremVfaGFz X3dhaXRzdGF0dXMgKGNvbnN0IHRocmVhZF9pbmZvICp0cCkKK3sKKyAgY29uc3QgemVfdGhyZWFk X2luZm8gKnpldHAgPSB6ZV90aHJlYWQgKHRwKTsKKyAgaWYgKHpldHAgPT0gbnVsbHB0cikKKyAg ICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuICh6ZXRwLT53YWl0c3RhdHVzLmtpbmQgKCkgIT0g VEFSR0VUX1dBSVRLSU5EX0lHTk9SRSk7Cit9CisKKy8qIFJldHVybiB3aGV0aGVyIFRQIGhhcyBh IHBlbmRpbmcgcHJpb3JpdHkgZXZlbnQuICAqLworCitzdGF0aWMgYm9vbAoremVfaGFzX3ByaW9y aXR5X3dhaXRzdGF0dXMgKGNvbnN0IHRocmVhZF9pbmZvICp0cCkKK3sKKyAgY29uc3QgemVfdGhy ZWFkX2luZm8gKnpldHAgPSB6ZV90aHJlYWQgKHRwKTsKKyAgaWYgKHpldHAgPT0gbnVsbHB0cikK KyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3dpdGNoICh6ZXRwLT53YWl0c3RhdHVzLmtpbmQgKCkp CisgICAgeworICAgIGNhc2UgVEFSR0VUX1dBSVRLSU5EX0lHTk9SRToKKyAgICBjYXNlIFRBUkdF VF9XQUlUS0lORF9VTkFWQUlMQUJMRToKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNhc2Ug VEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ6CisgICAgICAvKiBJZiB0aGlzIHRocmVhZCB3YXMgc3Rv cHBlZCB2aWEgYW4gaW50ZXJydXB0LCBpdCBpcyBhbiBpbnRlcmVzdGluZworCSBjYXNlIGlmIEdE QiB3YW50ZWQgaXQgc3RvcHBlZCB3aXRoIGEgc3RvcCByZXN1bWUgcmVxdWVzdC4gICovCisgICAg ICBpZiAoKHpldHAtPnN0b3BfcmVhc29uID09IFRBUkdFVF9TVE9QUEVEX0JZX05PX1JFQVNPTikK KwkgICYmICh6ZXRwLT53YWl0c3RhdHVzLnNpZyAoKSA9PSBHREJfU0lHTkFMX1RSQVApKQorCXJl dHVybiAoemV0cC0+cmVzdW1lX3N0YXRlID09IFpFX1RIUkVBRF9SRVNVTUVfU1RPUCk7CisKKyAg ICAgIC8qIElmIHRoaXMgdGhyZWFkIHN0b3BwZWQgc3B1cmlvdXNseSwgaXQgaXMgbm90IGludGVy ZXN0aW5nLiAgKi8KKyAgICAgIGlmICgoemV0cC0+c3RvcF9yZWFzb24gPT0gVEFSR0VUX1NUT1BQ RURfQllfTk9fUkVBU09OKQorCSAgJiYgKHpldHAtPndhaXRzdGF0dXMuc2lnICgpID09IEdEQl9T SUdOQUxfMCkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGRl ZmF1bHQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CisKKy8qIFJldHVybiBUUCdzIHdh aXRzdGF0dXMgYW5kIGNsZWFyIGl0IGluIFRQLiAgKi8KKworc3RhdGljIHRhcmdldF93YWl0c3Rh dHVzCit6ZV9tb3ZlX3dhaXRzdGF0dXMgKHRocmVhZF9pbmZvICp0cCkKK3sKKyAgemVfdGhyZWFk X2luZm8gKnpldHAgPSB6ZV90aHJlYWQgKHRwKTsKKyAgaWYgKHpldHAgPT0gbnVsbHB0cikKKyAg ICByZXR1cm4ge307CisKKyAgdGFyZ2V0X3dhaXRzdGF0dXMgc3RhdHVzID0gemV0cC0+d2FpdHN0 YXR1czsKKyAgemV0cC0+d2FpdHN0YXR1cy5zZXRfaWdub3JlICgpOworCisgIHJldHVybiBzdGF0 dXM7Cit9CisKKy8qIEluZGljYXRlIHRoYXQgd2UgaGF2ZSBiZWVuIGRldGFjaGVkIGZyb20gdGhl IGRldmljZSBjb3JyZXNwb25kaW5nIHRvCisgICBQUk9DRVNTLiAgKi8KKworc3RhdGljIHZvaWQK K3plX2RldmljZV9kZXRhY2hlZCAocHJvY2Vzc19pbmZvICpwcm9jZXNzLCB6ZXRfZGVidWdfZGV0 YWNoX3JlYXNvbl90IHJlYXNvbikKK3sKKyAgZ2RiX2Fzc2VydCAocHJvY2VzcyAhPSBudWxscHRy KTsKKworICAvKiBXZSBtb2RlbCBnZXR0aW5nIGRldGFjaGVkIGZyb20gYSBkZXZpY2UgYXMgdGhl IGNvcnJlc3BvbmRpbmcgZGV2aWNlIHByb2Nlc3MKKyAgICAgZXhpdGluZyB3aXRoIHRoZSBkZXRh Y2ggcmVhc29uIGFzIGV4aXQgc3RhdHVzLgorCisgICAgIEluIHRoZSBmaXJzdCBzdGVwLCB3ZSBt YXJrIGFsbCB0aHJlYWRzIG9mIHRoYXQgcHJvY2VzcyBleGl0ZWQuICBXZSBhbHJlYWR5CisgICAg IHVzZSB0aGUgcHJvY2VzcyBleGl0IHdhaXQgc3RhdHVzIGFzIGFsbCB0aHJlYWRzIHdpbGwgZXhp dCB0b2dldGhlci4KKworICAgICBJbiB0aGUgc2Vjb25kIHN0ZXAsIHdoZW4gb25lIG9mIHRob3Nl IHRocmVhZHMgZ2V0cyBzZWxlY3RlZCBmb3IgcmVwb3J0aW5nCisgICAgIGl0cyBldmVudCwgd2Ug d2lsbCByZW1vdmUgdGhlIHByb2Nlc3MgYXMgcGFydCBvZiB0aGUgcmVwb3J0aW5nIGZsb3cuICAq LworCisgIHByb2Nlc3MtPmZvcl9lYWNoX3RocmVhZCAoW3JlYXNvbl0gKHRocmVhZF9pbmZvICp0 cCkKKyAgICB7CisgICAgICB6ZV90aHJlYWRfaW5mbyAqemV0cCA9IHplX3RocmVhZCAodHApOwor ICAgICAgZ2RiX2Fzc2VydCAoemV0cCAhPSBudWxscHRyKTsKKworICAgICAgemV0cC0+d2FpdHN0 YXR1cy5zZXRfZXhpdGVkICgoaW50KSByZWFzb24pOworICAgIH0pOworfQorCisvKiBGaW5kIHRo ZSByZWdzZXQgY29udGFpbmluZyBSRUdOTyBvbiBERVZJQ0Ugb3IgdGhyb3cgaWYgbm90IGZvdW5k LiAgKi8KKworc3RhdGljIHplX3JlZ3NldF9pbmZvCit6ZV9maW5kX3JlZ3NldCAoY29uc3QgemVf ZGV2aWNlX2luZm8gJmRldmljZSwgbG9uZyByZWdubykKK3sKKyAgZm9yIChjb25zdCB6ZV9yZWdz ZXRfaW5mbyAmcmVnc2V0IDogZGV2aWNlLnJlZ3NldHMpCisgICAgeworICAgICAgaWYgKHJlZ25v IDwgcmVnc2V0LmJlZ2luKQorCWNvbnRpbnVlOworCisgICAgICBpZiAocmVnc2V0LmVuZCA8PSBy ZWdubykKKwljb250aW51ZTsKKworICAgICAgcmV0dXJuIHJlZ3NldDsKKyAgICB9CisKKyAgZXJy b3IgKF8oIk5vIHJlZ2lzdGVyICVsZCBvbiAlcy4iKSwgcmVnbm8sIGRldmljZS5wcm9wZXJ0aWVz Lm5hbWUpOworfQorCisvKiBGZXRjaCBhbGwgcmVnaXN0ZXJzIGZvciBUSFJFQUQgb24gREVWSUNF IGludG8gUkVHQ0FDSEUuICAqLworCitzdGF0aWMgdm9pZAoremVfZmV0Y2hfYWxsX3JlZ2lzdGVy cyAoY29uc3QgemVfZGV2aWNlX2luZm8gJmRldmljZSwKKwkJCWNvbnN0IHplX2RldmljZV90aHJl YWRfdCB0aHJlYWQsCisJCQlyZWdjYWNoZSAqcmVnY2FjaGUpCit7CisgIGZvciAoY29uc3QgemVf cmVnc2V0X2luZm8gJnJlZ3NldCA6IGRldmljZS5yZWdzZXRzKQorICAgIHsKKyAgICAgIGdkYl9h c3NlcnQgKHJlZ3NldC5iZWdpbiA8PSByZWdzZXQuZW5kKTsKKyAgICAgIGxvbmcgbG5yZWdzID0g cmVnc2V0LmVuZCAtIHJlZ3NldC5iZWdpbjsKKworICAgICAgZ2RiX2Fzc2VydCAobG5yZWdzIDwg VUlOVDMyX01BWCk7CisgICAgICB1aW50MzJfdCBucmVncyA9ICh1aW50MzJfdCkgbG5yZWdzOwor CisgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXIgKHJlZ3NldC5zaXplICogbnJlZ3Mp OworICAgICAgemVfcmVzdWx0X3Qgc3RhdHVzCisJPSB6ZXREZWJ1Z1JlYWRSZWdpc3RlcnMgKGRl dmljZS5zZXNzaW9uLCB0aHJlYWQsIHJlZ3NldC50eXBlLCAwLAorCQkJCSBucmVncywgYnVmZmVy LmRhdGEgKCkpOworICAgICAgc3dpdGNoIChzdGF0dXMpCisJeworCWNhc2UgWkVfUkVTVUxUX1NV Q0NFU1M6CisJY2FzZSBaRV9SRVNVTFRfRVJST1JfTk9UX0FWQUlMQUJMRToKKwkgIHsKKwkgICAg c2l6ZV90IG9mZnNldCA9IDA7CisJICAgIGxvbmcgcmVnID0gcmVnc2V0LmJlZ2luOworCisJICAg IGZvciAoOyByZWcgPCByZWdzZXQuZW5kOyByZWcgKz0gMSwgb2Zmc2V0ICs9IHJlZ3NldC5zaXpl KQorCSAgICAgIHsKKwkJaWYgKHN0YXR1cyA9PSBaRV9SRVNVTFRfU1VDQ0VTUykKKwkJICBzdXBw bHlfcmVnaXN0ZXIgKHJlZ2NhY2hlLCByZWcsICZidWZmZXJbb2Zmc2V0XSk7CisJCWVsc2UKKwkJ ICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ2NhY2hlLCByZWcsIG51bGxwdHIpOworCSAgICAgIH0KKwkg IH0KKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIHdhcm5pbmcgKF8oIkVycm9yICV4IHJlYWRp bmcgcmVnc2V0ICUiIFBSSXUzMiAiIGZvciAlcyBvbiAlcy4iKSwKKwkJICAgc3RhdHVzLCByZWdz ZXQudHlwZSwgemVfdGhyZWFkX2lkX3N0ciAodGhyZWFkKS5jX3N0ciAoKSwKKwkJICAgZGV2aWNl LnByb3BlcnRpZXMubmFtZSk7CisKKwkgIGJyZWFrOworCX0KKyAgICB9Cit9CisKKy8qIEZldGNo IHJlZ2lzdGVyIFJFR05PIGZvciBUSFJFQUQgb24gREVWSUNFIGludG8gUkVHQ0FDSEUuICAqLwor CitzdGF0aWMgdm9pZAoremVfZmV0Y2hfcmVnaXN0ZXIgKGNvbnN0IHplX2RldmljZV9pbmZvICZk ZXZpY2UsCisJCSAgIGNvbnN0IHplX2RldmljZV90aHJlYWRfdCB0aHJlYWQsCisJCSAgIHJlZ2Nh Y2hlICpyZWdjYWNoZSwgbG9uZyByZWdubykKK3sKKyAgemVfcmVnc2V0X2luZm8gcmVnc2V0ID0g emVfZmluZF9yZWdzZXQgKGRldmljZSwgcmVnbm8pOworCisgIGdkYl9hc3NlcnQgKHJlZ3NldC5i ZWdpbiA8PSByZWdubyk7CisgIGxvbmcgbHJzbm8gPSByZWdubyAtIHJlZ3NldC5iZWdpbjsKKwor ICBnZGJfYXNzZXJ0IChscnNubyA8PSBVSU5UMzJfTUFYKTsKKyAgdWludDMyX3QgcnNubyA9ICh1 aW50MzJfdCkgbHJzbm87CisKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyIChyZWdzZXQu c2l6ZSk7CisgIHplX3Jlc3VsdF90IHN0YXR1cworICAgID0gemV0RGVidWdSZWFkUmVnaXN0ZXJz IChkZXZpY2Uuc2Vzc2lvbiwgdGhyZWFkLCByZWdzZXQudHlwZSwgcnNubywgMSwKKwkJCSAgICAg YnVmZmVyLmRhdGEgKCkpOworICBzd2l0Y2ggKHN0YXR1cykKKyAgICB7CisgICAgY2FzZSBaRV9S RVNVTFRfU1VDQ0VTUzoKKyAgICAgIHN1cHBseV9yZWdpc3RlciAocmVnY2FjaGUsIHJlZ25vLCBi dWZmZXIuZGF0YSAoKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgWkVfUkVTVUxUX0VSUk9S X05PVF9BVkFJTEFCTEU6CisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ2NhY2hlLCByZWdubywg bnVsbHB0cik7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICB3YXJuaW5nIChf KCJFcnJvciAleCByZWFkaW5nIHJlZ2lzdGVyICVsZCAocmVnc2V0ICUiIFBSSXUzMgorCQkgIikg Zm9yICVzIG9uICVzLiIpLCBzdGF0dXMsIHJlZ25vLCByZWdzZXQudHlwZSwKKwkgICAgICAgemVf dGhyZWFkX2lkX3N0ciAodGhyZWFkKS5jX3N0ciAoKSwgZGV2aWNlLnByb3BlcnRpZXMubmFtZSk7 CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIFN0b3JlIGFsbCByZWdpc3RlcnMgZm9yIFRI UkVBRCBvbiBERVZJQ0UgZnJvbSBSRUdDQUNIRS4gICovCisKK3N0YXRpYyB2b2lkCit6ZV9zdG9y ZV9hbGxfcmVnaXN0ZXJzIChjb25zdCB6ZV9kZXZpY2VfaW5mbyAmZGV2aWNlLAorCQkJY29uc3Qg emVfZGV2aWNlX3RocmVhZF90IHRocmVhZCwKKwkJCXJlZ2NhY2hlICpyZWdjYWNoZSkKK3sKKyAg Zm9yIChjb25zdCB6ZV9yZWdzZXRfaW5mbyAmcmVnc2V0IDogZGV2aWNlLnJlZ3NldHMpCisgICAg eworICAgICAgaWYgKCFyZWdzZXQuaXNfd3JpdGVhYmxlKQorCWNvbnRpbnVlOworCisgICAgICBn ZGJfYXNzZXJ0IChyZWdzZXQuYmVnaW4gPD0gcmVnc2V0LmVuZCk7CisgICAgICBsb25nIGxucmVn cyA9IHJlZ3NldC5lbmQgLSByZWdzZXQuYmVnaW47CisKKyAgICAgIGdkYl9hc3NlcnQgKGxucmVn cyA8IFVJTlQzMl9NQVgpOworICAgICAgdWludDMyX3QgbnJlZ3MgPSAodWludDMyX3QpIGxucmVn czsKKworICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyIChyZWdzZXQuc2l6ZSAqIG5y ZWdzKTsKKyAgICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgICAgbG9uZyByZWcgPSByZWdzZXQu YmVnaW47CisgICAgICBmb3IgKDsgcmVnIDwgcmVnc2V0LmVuZDsgcmVnICs9IDEsIG9mZnNldCAr PSByZWdzZXQuc2l6ZSkKKwljb2xsZWN0X3JlZ2lzdGVyIChyZWdjYWNoZSwgcmVnLCAmYnVmZmVy W29mZnNldF0pOworCisgICAgICB6ZV9yZXN1bHRfdCBzdGF0dXMKKwk9IHpldERlYnVnV3JpdGVS ZWdpc3RlcnMgKGRldmljZS5zZXNzaW9uLCB0aHJlYWQsIHJlZ3NldC50eXBlLCAwLAorCQkJCSAg bnJlZ3MsIGJ1ZmZlci5kYXRhICgpKTsKKyAgICAgIHN3aXRjaCAoc3RhdHVzKQorCXsKKwljYXNl IFpFX1JFU1VMVF9TVUNDRVNTOgorCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgZXJyb3IgKF8o IkVycm9yICV4IHdyaXRpbmcgcmVnc2V0ICUiIFBSSXUzMiAiIGZvciAlcyBvbiAlcy4iKSwKKwkJ IHN0YXR1cywgcmVnc2V0LnR5cGUsIHplX3RocmVhZF9pZF9zdHIgKHRocmVhZCkuY19zdHIgKCks CisJCSBkZXZpY2UucHJvcGVydGllcy5uYW1lKTsKKwl9CisgICAgfQorfQorCisvKiBTdG9yZSBy ZWdpc3RlciBSRUdOTyBmb3IgVEhSRUFEIG9uIERFVklDRSBmcm9tIFJFR0NBQ0hFLiAgKi8KKwor c3RhdGljIHZvaWQKK3plX3N0b3JlX3JlZ2lzdGVyIChjb25zdCB6ZV9kZXZpY2VfaW5mbyAmZGV2 aWNlLAorCQkgICBjb25zdCB6ZV9kZXZpY2VfdGhyZWFkX3QgdGhyZWFkLAorCQkgICByZWdjYWNo ZSAqcmVnY2FjaGUsIGxvbmcgcmVnbm8pCit7CisgIHplX3JlZ3NldF9pbmZvIHJlZ3NldCA9IHpl X2ZpbmRfcmVnc2V0IChkZXZpY2UsIHJlZ25vKTsKKworICBpZiAoIXJlZ3NldC5pc193cml0ZWFi bGUpCisgICAgZXJyb3IgKF8oIldyaXRpbmcgcmVhZC1vbmx5IHJlZ2lzdGVyICVsZCAocmVnc2V0 ICUiIFBSSXUzMgorCSAgICAgIikgZm9yICVzIG9uICVzLiIpLCByZWdubywgcmVnc2V0LnR5cGUs CisJICAgemVfdGhyZWFkX2lkX3N0ciAodGhyZWFkKS5jX3N0ciAoKSwgZGV2aWNlLnByb3BlcnRp ZXMubmFtZSk7CisKKyAgZ2RiX2Fzc2VydCAocmVnc2V0LmJlZ2luIDw9IHJlZ25vKTsKKyAgbG9u ZyBscnNubyA9IHJlZ25vIC0gcmVnc2V0LmJlZ2luOworCisgIGdkYl9hc3NlcnQgKGxyc25vIDw9 IFVJTlQzMl9NQVgpOworICB1aW50MzJfdCByc25vID0gKHVpbnQzMl90KSBscnNubzsKKworICBz dGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXIgKHJlZ3NldC5zaXplKTsKKyAgY29sbGVjdF9yZWdp c3RlciAocmVnY2FjaGUsIHJlZ25vLCBidWZmZXIuZGF0YSAoKSk7CisKKyAgemVfcmVzdWx0X3Qg c3RhdHVzCisgICAgPSB6ZXREZWJ1Z1dyaXRlUmVnaXN0ZXJzIChkZXZpY2Uuc2Vzc2lvbiwgdGhy ZWFkLCByZWdzZXQudHlwZSwgcnNubywgMSwKKwkJCSAgICAgIGJ1ZmZlci5kYXRhICgpKTsKKyAg c3dpdGNoIChzdGF0dXMpCisgICAgeworICAgIGNhc2UgWkVfUkVTVUxUX1NVQ0NFU1M6CisgICAg ICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciAoXygiRXJyb3IgJXggd3JpdGlu ZyByZWdpc3RlciAlbGQgKHJlZ3NldCAlIiBQUkl1MzIKKwkgICAgICAgIikgZm9yICVzIG9uICVz LiIpLCBzdGF0dXMsICByZWdubywgcmVnc2V0LnR5cGUsCisJICAgICB6ZV90aHJlYWRfaWRfc3Ry ICh0aHJlYWQpLmNfc3RyICgpLAorCSAgICAgZGV2aWNlLnByb3BlcnRpZXMubmFtZSk7CisgICAg fQorfQorCisvKiBEaXNjYXJkIFRQJ3MgcmVnY2FjaGUuICAqLworCitzdGF0aWMgdm9pZAoremVf ZGlzY2FyZF9yZWdjYWNoZSAodGhyZWFkX2luZm8gKnRwKQoreworICByZWdjYWNoZSAqcmVnY2Fj aGUgPSBnZXRfdGhyZWFkX3JlZ2NhY2hlICh0cCwgLyogZmV0Y2ggPSAqLyBmYWxzZSk7CisgIGdk Yl9hc3NlcnQgKHJlZ2NhY2hlICE9IG51bGxwdHIpOworCisgIHJlZ2NhY2hlLT5yZWdpc3RlcnNf ZmV0Y2hlZCA9IGZhbHNlOworICByZWdjYWNoZS0+cmVzZXQgKFJFR19VTktOT1dOKTsKK30KKwor LyogUHJlcGFyZSBmb3IgcmVzdW1pbmcgVFAuICBSZXR1cm4gdHJ1ZSBpZiBUUCBzaG91bGQgYmUg YWN0dWFsbHkKKyAgIHJlc3VtZWQuICAqLworCitzdGF0aWMgYm9vbAoremVfcHJlcGFyZV9mb3Jf cmVzdW1pbmcgKHRocmVhZF9pbmZvICp0cCkKK3sKKyAgemVfdGhyZWFkX2luZm8gKnpldHAgPSB6 ZV90aHJlYWQgKHRwKTsKKyAgZ2RiX2Fzc2VydCAoemV0cCAhPSBudWxscHRyKTsKKworICAvKiBX ZSBzaG91bGQgbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBpZiB0aGVyZSBpcyBhIHByaW9yaXR5Cisg ICAgIHdhaXRzdGF0dXMuICAqLworICBnZGJfYXNzZXJ0ICghemVfaGFzX3ByaW9yaXR5X3dhaXRz dGF0dXMgKHRwKSk7CisKKyAgLyogV2hlbiB3ZSBnZXQgZGV0YWNoZWQsIHdlIHdpbGwgcmVtb3Zl IHRoZSBkZXZpY2UgYnV0IHdlIHdpbGwgYWxzbyBtYXJrCisgICAgIGVhY2ggdGhyZWFkIGV4aXRl ZC4gIFdlIHNob3VsZG4ndCB0cnkgdG8gcmVzdW1lIHRoZW0uICAqLworICB6ZV9kZXZpY2VfaW5m byAqZGV2aWNlID0gemVfdGhyZWFkX2RldmljZSAodHApOworICBnZGJfYXNzZXJ0IChkZXZpY2Ug IT0gbnVsbHB0cik7CisKKyAgemVfdGhyZWFkX2V4ZWNfc3RhdGVfdCBzdGF0ZSA9IHpldHAtPmV4 ZWNfc3RhdGU7CisgIHN3aXRjaCAoc3RhdGUpCisgICAgeworICAgIGNhc2UgWkVfVEhSRUFEX1NU QVRFX1BBVVNFRDoKKyAgICAgIHpldHAtPmV4ZWNfc3RhdGUgPSBaRV9USFJFQURfU1RBVEVfU1RP UFBFRDsKKworICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgIGNhc2UgWkVfVEhSRUFEX1NUQVRF X1NUT1BQRUQ6CisgICAgICBkZXZpY2UtPm5yZXN1bWVkKys7CisgICAgICBpZiAoZGV2aWNlLT5u cmVzdW1lZCA+IGRldmljZS0+bnRocmVhZHMpCisJeworCSAgZGV2aWNlLT5ucmVzdW1lZCA9IGRl dmljZS0+bnRocmVhZHM7CisJICBkcHJpbnRmICgiY2FwcGluZyBkZXZpY2UgJWx1J3MgbnJlc3Vt ZWQgYXQgJWxkIChhbGwpIiwKKwkJICAgZGV2aWNlLT5vcmRpbmFsLCBkZXZpY2UtPm50aHJlYWRz KTsKKwl9CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgWkVfVEhSRUFEX1NUQVRFX0hF TEQ6CisgICAgICBnZGJfYXNzZXJ0X25vdF9yZWFjaGVkICgidGhyZWFkcyB3aXRoICdoZWxkJyBz dGF0ZSBzaG91bGQgIgorCQkJICAgICAgImhhdmUgYmVlbiB0dXJuZWQgaW50byAnc3RvcHBlZCci KTsKKworICAgIGNhc2UgWkVfVEhSRUFEX1NUQVRFX1VOQVZBSUxBQkxFOgorICAgICAgZGV2aWNl LT5ucmVzdW1lZCsrOworICAgICAgaWYgKGRldmljZS0+bnJlc3VtZWQgPiBkZXZpY2UtPm50aHJl YWRzKQorCXsKKwkgIGRldmljZS0+bnJlc3VtZWQgPSBkZXZpY2UtPm50aHJlYWRzOworCSAgZHBy aW50ZiAoImNhcHBpbmcgZGV2aWNlICVsdSdzIG5yZXN1bWVkIGF0ICVsZCAoYWxsKSIsCisJCSAg IGRldmljZS0+b3JkaW5hbCwgZGV2aWNlLT5udGhyZWFkcyk7CisJfQorCisgICAgICB6ZXRwLT5l eGVjX3N0YXRlID0gWkVfVEhSRUFEX1NUQVRFX1JVTk5JTkc7CisKKyAgICAgIC8qIElnbm9yZSBy ZXN1bWluZyB1bmF2YWlsYWJsZSB0aHJlYWRzLiAgKi8KKyAgICAgIHJldHVybiBmYWxzZTsKKwor ICAgIGNhc2UgWkVfVEhSRUFEX1NUQVRFX1JVTk5JTkc6CisgICAgICAvKiBJZ25vcmUgcmVzdW1p bmcgYWxyZWFkeSBydW5uaW5nIHRocmVhZHMuICAqLworICAgICAgcmV0dXJuIGZhbHNlOworCisg ICAgY2FzZSBaRV9USFJFQURfU1RBVEVfVU5LTk9XTjoKKyAgICAgIHdhcm5pbmcgKF8oInRocmVh ZCAlcyBoYXMgdW5rbm93biBleGVjdXRpb24gIgorCQkgInN0YXRlIiksIHRwLT5pZC50b19zdHJp bmcgKCkuY19zdHIgKCkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpbnRlcm5h bF9lcnJvciAoXygiYmFkIGV4ZWN1dGlvbiBzdGF0ZTogJWQuIiksIHN0YXRlKTsKK30KKworLyog UHJlcGFyZSBmb3Igc3RvcHBpbmcgVFAuICBSZXR1cm4gdHJ1ZSBpZiBUUCBzaG91bGQgYmUKKyAg IGFjdHVhbGx5IHN0b3BwZWQgYnkgc2VuZGluZyBhbiBpbnRlcnJ1cHQgdG8gdGhlIHRhcmdldC4g ICovCisKK3N0YXRpYyBib29sCit6ZV9wcmVwYXJlX2Zvcl9zdG9wcGluZyAodGhyZWFkX2luZm8g KnRwKQoreworICB6ZV90aHJlYWRfaW5mbyAqemV0cCA9IHplX3RocmVhZCAodHApOworICBnZGJf YXNzZXJ0ICh6ZXRwICE9IG51bGxwdHIpOworCisgIC8qIFdoZW4gd2UgZ2V0IGRldGFjaGVkLCB3 ZSB3aWxsIHJlbW92ZSB0aGUgZGV2aWNlIGJ1dCB3ZSB3aWxsIGFsc28gbWFyaworICAgICBlYWNo IHRocmVhZCBleGl0ZWQuICBXZSBzaG91bGRuJ3QgdHJ5IHRvIHN0b3AgdGhlbS4gICovCisgIHpl X2RldmljZV9pbmZvICpkZXZpY2UgPSB6ZV90aHJlYWRfZGV2aWNlICh0cCk7CisgIGdkYl9hc3Nl cnQgKGRldmljZSAhPSBudWxscHRyKTsKKworICB6ZV90aHJlYWRfZXhlY19zdGF0ZV90IHN0YXRl ID0gemV0cC0+ZXhlY19zdGF0ZTsKKyAgc3dpdGNoIChzdGF0ZSkKKyAgICB7CisgICAgY2FzZSBa RV9USFJFQURfU1RBVEVfU1RPUFBFRDoKKyAgICAgIC8qIFdlIHNpbGVudGx5IGlnbm9yZSBhbHJl YWR5IHN0b3BwZWQgdGhyZWFkcy4gICovCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjYXNl IFpFX1RIUkVBRF9TVEFURV9IRUxEOgorICAgICAgZ2RiX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRo cmVhZHMgd2l0aCAnaGVsZCcgc3RhdGUgc2hvdWxkICIKKwkJCSAgICAgICJoYXZlIGJlZW4gdHVy bmVkIGludG8gJ3N0b3BwZWQnIik7CisKKyAgICBjYXNlIFpFX1RIUkVBRF9TVEFURV9QQVVTRUQ6 CisgICAgICAvKiBBIHBhdXNlZCB0aHJlYWQgaXMgYWxyZWFkeSBzdG9wcGVkLiAgKi8KKyAgICAg IHpldHAtPmV4ZWNfc3RhdGUgPSBaRV9USFJFQURfU1RBVEVfU1RPUFBFRDsKKyAgICAgIHJldHVy biBmYWxzZTsKKworICAgIGNhc2UgWkVfVEhSRUFEX1NUQVRFX1VOQVZBSUxBQkxFOgorICAgIGNh c2UgWkVfVEhSRUFEX1NUQVRFX1JVTk5JTkc6CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNh c2UgWkVfVEhSRUFEX1NUQVRFX1VOS05PV046CisgICAgICB3YXJuaW5nIChfKCJ0aHJlYWQgJXMg aGFzIHVua25vd24gZXhlY3V0aW9uIHN0YXRlIiksCisJICAgICAgIHRwLT5pZC50b19zdHJpbmcg KCkuY19zdHIgKCkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpbnRlcm5hbF9l cnJvciAoXygiYmFkIGV4ZWN1dGlvbiBzdGF0ZTogJWQuIiksIHN0YXRlKTsKK30KKworLyogUmVz dW1lIFRIUkVBRCBvbiBERVZJQ0UuICAqLworCitzdGF0aWMgdm9pZAoremVfcmVzdW1lICh6ZV9k ZXZpY2VfaW5mbyAmZGV2aWNlLCB6ZV9kZXZpY2VfdGhyZWFkX3QgdGhyZWFkKQoreworICBkcHJp bnRmICgiZGV2aWNlICVsdT0lcywgdGhyZWFkPSVzIiwgZGV2aWNlLm9yZGluYWwsCisJICAgZGV2 aWNlLnByb3BlcnRpZXMubmFtZSwgemVfdGhyZWFkX2lkX3N0ciAodGhyZWFkKS5jX3N0ciAoKSk7 CisKKyAgemVfcmVzdWx0X3Qgc3RhdHVzID0gemV0RGVidWdSZXN1bWUgKGRldmljZS5zZXNzaW9u LCB0aHJlYWQpOworICBzd2l0Y2ggKHN0YXR1cykKKyAgICB7CisgICAgY2FzZSBaRV9SRVNVTFRf U1VDQ0VTUzoKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBaRV9SRVNVTFRfRVJST1JfTk9UX0FW QUlMQUJMRToKKyAgICAgIC8qIElnbm9yZSB0aGlzIGlmIHdlJ3JlIG5vdCBtb2RlbGluZyBERVZJ Q0UgYXMgYSBwcm9jZXNzIGFueW1vcmUuICAqLworICAgICAgaWYgKGRldmljZS5wcm9jZXNzID09 IG51bGxwdHIpCisJYnJlYWs7CisKKyAgICAgIC8qIFRoZSB0aHJlYWQgaXMgYWxyZWFkeSBydW5u aW5nIG9yIHVuYXZhaWxhYmxlLgorCisJIEFzc3VtaW5nIG91ciB0aHJlYWQgc3RhdGUgdHJhY2tp bmcgaXMgY29ycmVjdCwgdGhlIHRocmVhZCBpc24ndAorCSBydW5uaW5nLCBzbyB3ZSBhc3N1bWUg aXQgYmVjYW1lIHVuYXZhaWxhYmxlLiAgVGhhdCBpcyBzdHJhbmdlLAorCSB0b28sIGFzIHdlIGhh ZCBpdCBzdG9wcGVkLiAgKi8KKyAgICAgIHdhcm5pbmcgKF8oInRocmVhZCAlcyB1bmV4cGVjdGVk bHkgdW5hdmFpbGFibGUgb24gJXMuIiksCisJICAgICAgIHplX3RocmVhZF9pZF9zdHIgKHRocmVh ZCkuY19zdHIgKCksIGRldmljZS5wcm9wZXJ0aWVzLm5hbWUpOworCisgICAgICAvKiBVcGRhdGUg b3VyIHRocmVhZCBzdGF0ZSB0byByZWZsZWN0IHRoZSB0YXJnZXQuICAqLworICAgICAgZm9yX2Vh Y2hfdGhyZWFkIChkZXZpY2UsIHRocmVhZCwgWyZdICh0aHJlYWRfaW5mbyAqdHApCisJeworCSAg emVfdGhyZWFkX2luZm8gKnpldHAgPSB6ZV90aHJlYWQgKHRwKTsKKwkgIGdkYl9hc3NlcnQgKHpl dHAgIT0gbnVsbHB0cik7CisKKwkgIHpldHAtPmV4ZWNfc3RhdGUgPSBaRV9USFJFQURfU1RBVEVf VU5BVkFJTEFCTEU7CisJICB6ZXRwLT53YWl0c3RhdHVzLnNldF91bmF2YWlsYWJsZSAoKTsKKwl9 KTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yIChfKCJGYWlsZWQg dG8gcmVzdW1lICVzIG9uICVzOiAleC4iKSwKKwkgICAgIHplX3RocmVhZF9pZF9zdHIgKHRocmVh ZCkuY19zdHIgKCksIGRldmljZS5wcm9wZXJ0aWVzLm5hbWUsCisJICAgICBzdGF0dXMpOworICAg IH0KK30KKworLyogSW50ZXJydXB0IFRIUkVBRCBvbiBERVZJQ0UuICAqLworCitzdGF0aWMgdm9p ZAoremVfaW50ZXJydXB0ICh6ZV9kZXZpY2VfaW5mbyAmZGV2aWNlLCB6ZV9kZXZpY2VfdGhyZWFk X3QgdGhyZWFkKQoreworICBkcHJpbnRmICgiZGV2aWNlICVsdT0lcywgdGhyZWFkPSVzLCBucmVz dW1lZD0lbGQlcyIsCisJICAgZGV2aWNlLm9yZGluYWwsIGRldmljZS5wcm9wZXJ0aWVzLm5hbWUs CisJICAgemVfdGhyZWFkX2lkX3N0ciAodGhyZWFkKS5jX3N0ciAoKSwgZGV2aWNlLm5yZXN1bWVk LAorCSAgICgoZGV2aWNlLm5yZXN1bWVkID09IGRldmljZS5udGhyZWFkcykgPyAiIChhbGwpIiA6 ICIiKSk7CisKKyAgemVfcmVzdWx0X3Qgc3RhdHVzID0gemV0RGVidWdJbnRlcnJ1cHQgKGRldmlj ZS5zZXNzaW9uLCB0aHJlYWQpOworICBzd2l0Y2ggKHN0YXR1cykKKyAgICB7CisgICAgY2FzZSBa RV9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgIGlmICh6ZV9pc190aHJlYWRfaWRfYWxsICh0aHJlYWQp KQorCWRldmljZS5uaW50ZXJydXB0cysrOworCisgICAgICBicmVhazsKKworICAgIGNhc2UgWkVf UkVTVUxUX05PVF9SRUFEWToKKyAgICAgIC8qIFdlIGFscmVhZHkgcmVxdWVzdGVkIFRIUkVBRCB0 byBiZSBzdG9wcGVkLiAgV2UgZG8gbm90IHRyYWNrCisJIHJlcXVlc3RzIHNvIGxldCdzIGlnbm9y ZSB0aGlzLiAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBaRV9SRVNVTFRfRVJST1JfTk9U X0FWQUlMQUJMRToKKyAgICAgIC8qIFRoZSB0aHJlYWQgaXMgYWxyZWFkeSBzdG9wcGVkIG9yIHVu YXZhaWxhYmxlLgorCisJIEFzc3VtaW5nIHRoYXQgb3VyIHN0YXRlIHRyYWNraW5nIHdvcmtzLCB1 cGRhdGUgbm9uLXN0b3BwZWQKKwkgdGhyZWFkcyB0byByZWZsZWN0IHRoYXQuICAqLworICAgICAg Zm9yX2VhY2hfdGhyZWFkIChkZXZpY2UsIHRocmVhZCwgWyZdICh0aHJlYWRfaW5mbyAqdHApCisJ eworCSAgaWYgKHplX3RocmVhZF9zdG9wcGVkICh0cCkpCisJICAgIHJldHVybjsKKworCSAgemVf dGhyZWFkX2luZm8gKnpldHAgPSB6ZV90aHJlYWQgKHRwKTsKKwkgIGdkYl9hc3NlcnQgKHpldHAg IT0gbnVsbHB0cik7CisKKwkgIHpldHAtPmV4ZWNfc3RhdGUgPSBaRV9USFJFQURfU1RBVEVfVU5B VkFJTEFCTEU7CisJICB6ZXRwLT53YWl0c3RhdHVzLnNldF91bmF2YWlsYWJsZSAoKTsKKwl9KTsK KwlicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciAoXygiRmFpbGVkIHRvIGludGVy cnVwdCAlcyBvbiAlczogJXguIiksCisJICAgICB6ZV90aHJlYWRfaWRfc3RyICh0aHJlYWQpLmNf c3RyICgpLCBkZXZpY2UucHJvcGVydGllcy5uYW1lLAorCSAgICAgc3RhdHVzKTsKKyAgICB9Cit9 CisKK2Jvb2wKK3plX3RhcmdldDo6aXNfcmFuZ2Vfc3RlcHBpbmcgKHRocmVhZF9pbmZvICp0cCkK K3sKKyAgY29uc3QgemVfdGhyZWFkX2luZm8gKnpldHAgPSB6ZV90aHJlYWQgKHRwKTsKKyAgZ2Ri X2Fzc2VydCAoemV0cCAhPSBudWxscHRyKTsKKworICBpZiAoemVfdGhyZWFkX3N0b3BwZWQgKHRw KQorICAgICAgJiYgKHpldHAtPnJlc3VtZV9zdGF0ZSA9PSBaRV9USFJFQURfUkVTVU1FX1NURVAp CisgICAgICAmJiAoemV0cC0+c3RvcF9yZWFzb24gPT0gVEFSR0VUX1NUT1BQRURfQllfU0lOR0xF X1NURVApKQorICAgIHsKKyAgICAgIHJlZ2NhY2hlICpyZWdjYWNoZSA9IGdldF90aHJlYWRfcmVn Y2FjaGUgKHRwLCAvKiBmZXRjaCA9ICovIHRydWUpOworICAgICAgQ09SRV9BRERSIHBjID0gcmVh ZF9wYyAocmVnY2FjaGUpOworCisgICAgICByZXR1cm4gKChwYyA+PSB6ZXRwLT5zdGVwX3Jhbmdl X3N0YXJ0KQorCSAgICAgICYmIChwYyA8IHpldHAtPnN0ZXBfcmFuZ2VfZW5kKSk7CisgICAgfQor CisgIHJldHVybiBmYWxzZTsKK30KKworaW50Cit6ZV90YXJnZXQ6OmF0dGFjaF90b19kZXZpY2Ug KHVpbnQzMl90IHBpZCwgemVfZGV2aWNlX2hhbmRsZV90IGRldmljZSkKK3sKKyAgemVfZGV2aWNl X3Byb3BlcnRpZXNfdCBwcm9wZXJ0aWVzOworCisgIG1lbXNldCAoJnByb3BlcnRpZXMsIDAsIHNp emVvZiAocHJvcGVydGllcykpOworICBwcm9wZXJ0aWVzLnN0eXBlID0gWkVfU1RSVUNUVVJFX1RZ UEVfREVWSUNFX1BST1BFUlRJRVM7CisgIHByb3BlcnRpZXMucE5leHQgPSBudWxscHRyOworCisg IHplX3Jlc3VsdF90IHN0YXR1cyA9IHplRGV2aWNlR2V0UHJvcGVydGllcyAoZGV2aWNlLCAmcHJv cGVydGllcyk7CisgIGlmIChzdGF0dXMgIT0gWkVfUkVTVUxUX1NVQ0NFU1MpCisgICAgeworICAg ICAgd2FybmluZyAoXygiRmFpbGVkIHRvIG9idGFpbiBkZXZpY2UgcHJvcGVydGllcyAoJXgpLiIp LAorCSAgICAgICBzdGF0dXMpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIFdlJ3Jl IGEgYml0IHBhcmFub2lkLiAgKi8KKyAgcHJvcGVydGllcy5uYW1lW1pFX01BWF9ERVZJQ0VfTkFN RS0xXSA9IDA7CisKKyAgaW50IG5hdHRhY2hlZCA9IDA7CisgIHVpbnQzMl90IG5zdWJfZGV2aWNl cyA9IDA7CisgIHN0YXR1cyA9IHplRGV2aWNlR2V0U3ViRGV2aWNlcyAoZGV2aWNlLCAmbnN1Yl9k ZXZpY2VzLCBudWxscHRyKTsKKyAgaWYgKHN0YXR1cyAhPSBaRV9SRVNVTFRfU1VDQ0VTUykKKyAg ICB3YXJuaW5nIChfKCJGYWlsZWQgdG8gZ2V0IG51bWJlciBvZiBzdWItZGV2aWNlcyBpbiAlcyAo JXgpLiIpLAorCSAgICAgcHJvcGVydGllcy5uYW1lLCBzdGF0dXMpOworICBlbHNlIGlmIChuc3Vi X2RldmljZXMgPiAwKQorICAgIHsKKyAgICAgIHN0ZDo6dmVjdG9yPHplX2RldmljZV9oYW5kbGVf dD4gc3ViX2RldmljZXMgKG5zdWJfZGV2aWNlcyk7CisgICAgICBzdGF0dXMgPSB6ZURldmljZUdl dFN1YkRldmljZXMgKGRldmljZSwgJm5zdWJfZGV2aWNlcywKKwkJCQkgICAgICBzdWJfZGV2aWNl cy5kYXRhICgpKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gWkVfUkVTVUxUX1NVQ0NFU1MpCisJd2Fy bmluZyAoXygiRmFpbGVkIHRvIGVudW1lcmF0ZSBzdWItZGV2aWNlcyBpbiAlcyAoJXgpLiIpLAor CQkgcHJvcGVydGllcy5uYW1lLCBzdGF0dXMpOworICAgICAgZWxzZQorCWZvciAoemVfZGV2aWNl X2hhbmRsZV90IHN1Yl9kZXZpY2UgOiBzdWJfZGV2aWNlcykKKwkgIG5hdHRhY2hlZCArPSBhdHRh Y2hfdG9fZGV2aWNlIChwaWQsIHN1Yl9kZXZpY2UpOworICAgIH0KKworICAvKiBJZiB3ZSBhdHRh Y2hlZCB0byBhIHN1Yi1kZXZpY2UsIHdlJ3JlIGRvbmUuICBXZSB3b24ndCBiZSBhYmxlIHRvIGF0 dGFjaCB0bworICAgICBhIHBhcmVudCBkZXZpY2UsIGFueW1vcmUuICAqLworICBpZiAobmF0dGFj aGVkID4gMCkKKyAgICByZXR1cm4gbmF0dGFjaGVkOworCisgIC8qIEFsbG93IGFmZmVjdGluZyB0 aGUgbm9ybWFsIGF0dGFjaCBiZWhhdmlvdXIgdmlhIGVudmlyb25tZW50IHZhcmlhYmxlcyBieQor ICAgICBkaXNhbGxvd2luZyBhdHRhY2hpbmcgdG8gZGV2aWNlcyBvciBzdWItZGV2aWNlcy4gICov CisgIGlmIChwcm9wZXJ0aWVzLmZsYWdzICYgWkVfREVWSUNFX1BST1BFUlRZX0ZMQUdfU1VCREVW SUNFKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCBkaXNhbGxvd19zdWJfZGV2CisJ PSBzdGQ6OmdldGVudiAoIlpFX0dEQl9ET19OT1RfQVRUQUNIX1RPX1NVQl9ERVZJQ0UiKTsKKyAg ICAgIGlmIChkaXNhbGxvd19zdWJfZGV2ICE9IG51bGxwdHIgJiYgKmRpc2FsbG93X3N1Yl9kZXYg IT0gMCkKKwlyZXR1cm4gbmF0dGFjaGVkOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNv bnN0IGNoYXIgKiBjb25zdCBkaXNhbGxvd19kZXYKKwk9IHN0ZDo6Z2V0ZW52ICgiWkVfR0RCX0RP X05PVF9BVFRBQ0hfVE9fREVWSUNFIik7CisgICAgICBpZiAoZGlzYWxsb3dfZGV2ICE9IG51bGxw dHIgJiYgKmRpc2FsbG93X2RldiAhPSAwKQorCXJldHVybiBuYXR0YWNoZWQ7CisgICAgfQorCisg IHVpbnQzMl90IG5yZWdzZXRzID0gMDsKKyAgc3RhdHVzID0gemV0RGVidWdHZXRSZWdpc3RlclNl dFByb3BlcnRpZXMgKGRldmljZSwgJm5yZWdzZXRzLCBudWxscHRyKTsKKyAgaWYgKHN0YXR1cyAh PSBaRV9SRVNVTFRfU1VDQ0VTUykKKyAgICB7CisgICAgICB3YXJuaW5nIChfKCJGYWlsZWQgdG8g b2J0YWluIG51bWJlciBvZiByZWdpc3RlciBzZXRzIGluICVzICgleCkuIiksCisJICAgICAgIHBy b3BlcnRpZXMubmFtZSwgc3RhdHVzKTsKKyAgICAgIHJldHVybiBuYXR0YWNoZWQ7CisgICAgfQor CisgIHN0ZDo6dmVjdG9yPHpldF9kZWJ1Z19yZWdzZXRfcHJvcGVydGllc190PiByZWdzZXRzIChu cmVnc2V0cyk7CisgIHN0YXR1cyA9IHpldERlYnVnR2V0UmVnaXN0ZXJTZXRQcm9wZXJ0aWVzIChk ZXZpY2UsICZucmVnc2V0cywKKwkJCQkJICAgICByZWdzZXRzLmRhdGEgKCkpOworICBpZiAoc3Rh dHVzICE9IFpFX1JFU1VMVF9TVUNDRVNTKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKF8oIkZhaWxl ZCB0byBvYnRhaW4gcmVnaXN0ZXIgc2V0cyBpbiAlcyAoJXgpLiIpLAorCSAgICAgICBwcm9wZXJ0 aWVzLm5hbWUsIHN0YXR1cyk7CisgICAgICByZXR1cm4gbmF0dGFjaGVkOworICAgIH0KKworICAv KiBDaGVjayB3aXRoIHRoZSBhY3R1YWwgdGFyZ2V0IGltcGxlbWVudGF0aW9uIHdoZXRoZXIgaXQg c3VwcG9ydHMgdGhpcyBraW5kCisgICAgIG9mIGRldmljZS4gICovCisgIGlmICghaXNfZGV2aWNl X3N1cHBvcnRlZCAocHJvcGVydGllcywgcmVnc2V0cykpCisgICAgeworICAgICAgZHByaW50ZiAo InNraXBwaW5nIHVuc3VwcG9ydGVkIGRldmljZSAlcy4iLCBwcm9wZXJ0aWVzLm5hbWUpOworICAg ICAgcmV0dXJuIG5hdHRhY2hlZDsKKyAgICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPHplX2Rldmlj ZV9pbmZvPiBkaW5mbyB7IG5ldyB6ZV9kZXZpY2VfaW5mbyB9OworICBkaW5mby0+Y29uZmlnLnBp ZCA9IHBpZDsKKyAgZGluZm8tPmhhbmRsZSA9IGRldmljZTsKKyAgZGluZm8tPnByb3BlcnRpZXMg PSBwcm9wZXJ0aWVzOworCisgIHplX3BjaV9leHRfcHJvcGVydGllc190IHBjaV9wcm9wZXJ0aWVz IHt9OworICBzdGF0dXMgPSB6ZURldmljZVBjaUdldFByb3BlcnRpZXNFeHQgKGRldmljZSwgJnBj aV9wcm9wZXJ0aWVzKTsKKyAgaWYgKHN0YXR1cyAhPSBaRV9SRVNVTFRfU1VDQ0VTUykKKyAgICB7 CisgICAgICB3YXJuaW5nIChfKCJGYWlsZWQgdG8gb2J0YWluIFBDSSBwcm9wZXJ0aWVzIGluICVz ICgleCkuIiksCisJICAgICAgIHByb3BlcnRpZXMubmFtZSwgc3RhdHVzKTsKKyAgICAgIHBjaV9w cm9wZXJ0aWVzLmFkZHJlc3MuZG9tYWluID0gMDsKKyAgICAgIHBjaV9wcm9wZXJ0aWVzLmFkZHJl c3MuYnVzID0gMDsKKyAgICAgIHBjaV9wcm9wZXJ0aWVzLmFkZHJlc3MuZGV2aWNlID0gMDsKKyAg ICAgIHBjaV9wcm9wZXJ0aWVzLmFkZHJlc3MuZnVuY3Rpb24gPSAwOworICAgIH0KKworICB0YXJn ZXRfZGVzYyAqdGRlc2MgPSBjcmVhdGVfdGRlc2MgKGRpbmZvLmdldCAoKSwgcmVnc2V0cywKKwkJ CQkgICAgIHBjaV9wcm9wZXJ0aWVzKTsKKyAgZGluZm8tPnRkZXNjLnJlc2V0ICh0ZGVzYyk7CisK KyAgdW5zaWduZWQgbG9uZyBvcmRpbmFsID0gdGhpcy0+b3JkaW5hbCArIDE7CisgIGlmIChvcmRp bmFsID09IDApCisgICAgaW50ZXJuYWxfZXJyb3IgKF8oImRldmljZSBvcmRpbmFsIG92ZXJmbG93 LiIpKTsKKworICBkaW5mby0+b3JkaW5hbCA9IG9yZGluYWw7CisKKyAgdHJ5CisgICAgeworICAg ICAgcHJvY2Vzc19pbmZvICpwcm9jZXNzID0gemVfYXR0YWNoIChkaW5mby5nZXQgKCkpOworICAg ICAgaWYgKHByb2Nlc3MgPT0gbnVsbHB0cikKKwlyZXR1cm4gbmF0dGFjaGVkOworICAgIH0KKyAg Y2F0Y2ggKGNvbnN0IGdkYl9leGNlcHRpb25fZXJyb3IgJmV4Y2VwdCkKKyAgICB7CisgICAgICB3 YXJuaW5nICgiJXMiLCBleGNlcHQud2hhdCAoKSk7CisgICAgfQorCisgIC8qIEFkZCB0aGUgZGV2 aWNlIGV2ZW4gaWYgd2Ugd2VyZSBub3QgYWJsZSB0byBhdHRhY2ggdG8gYWxsb3cgYXR0ZW1wdGlu ZyB0bworICAgICBhdHRhY2ggdG8gaXQgZXhwbGljaXRseSBsYXRlciBvbi4gICovCisgIGRldmlj ZXMucHVzaF9iYWNrIChkaW5mby5yZWxlYXNlICgpKTsKKyAgdGhpcy0+b3JkaW5hbCA9IG9yZGlu YWw7CisKKyAgbmF0dGFjaGVkICs9IDE7CisgIHJldHVybiBuYXR0YWNoZWQ7Cit9CisKK2ludAor emVfdGFyZ2V0OjphdHRhY2hfdG9fZGV2aWNlcyAodWludDMyX3QgcGlkKQoreworICB1aW50MzJf dCBuZHJpdmVycyA9IDA7CisgIHplX3Jlc3VsdF90IHN0YXR1cyA9IHplRHJpdmVyR2V0ICgmbmRy aXZlcnMsIG51bGxwdHIpOworICBpZiAoc3RhdHVzICE9IFpFX1JFU1VMVF9TVUNDRVNTKQorICAg IGVycm9yIChfKCJGYWlsZWQgdG8gZ2V0IG51bWJlciBvZiBkZXZpY2UgZHJpdmVycyAoJXgpLiIp LCBzdGF0dXMpOworCisgIHN0ZDo6dmVjdG9yPHplX2RyaXZlcl9oYW5kbGVfdD4gZHJpdmVycyAo bmRyaXZlcnMpOworICBzdGF0dXMgPSB6ZURyaXZlckdldCAoJm5kcml2ZXJzLCBkcml2ZXJzLmRh dGEgKCkpOworICBpZiAoc3RhdHVzICE9IFpFX1JFU1VMVF9TVUNDRVNTKQorICAgIGVycm9yIChf KCJGYWlsZWQgdG8gZW51bWVyYXRlIGRldmljZSBkcml2ZXJzICgleCkuIiksIHN0YXR1cyk7CisK KyAgaW50IG5hdHRhY2hlZCA9IDA7CisgIGZvciAoemVfZHJpdmVyX2hhbmRsZV90IGRyaXZlciA6 IGRyaXZlcnMpCisgICAgeworICAgICAgemVfZHJpdmVyX3Byb3BlcnRpZXNfdCBwcm9wZXJ0aWVz OworCisgICAgICBtZW1zZXQgKCZwcm9wZXJ0aWVzLCAwLCBzaXplb2YgKHByb3BlcnRpZXMpKTsK KyAgICAgIHByb3BlcnRpZXMuc3R5cGUgPSBaRV9TVFJVQ1RVUkVfVFlQRV9EUklWRVJfUFJPUEVS VElFUzsKKyAgICAgIHByb3BlcnRpZXMucE5leHQgPSBudWxscHRyOworCisgICAgICBzdGF0dXMg PSB6ZURyaXZlckdldFByb3BlcnRpZXMgKGRyaXZlciwgJnByb3BlcnRpZXMpOworICAgICAgaWYg KHN0YXR1cyAhPSBaRV9SRVNVTFRfU1VDQ0VTUykKKwl7CisJICB3YXJuaW5nIChfKCJGYWlsZWQg dG8gb2J0YWluIGRyaXZlciBwcm9wZXJ0aWVzICgleCkuIiksCisJCSAgIHN0YXR1cyk7CisJICBj b250aW51ZTsKKwl9CisKKyAgICAgIHplX2FwaV92ZXJzaW9uX3QgdmVyc2lvbjsKKyAgICAgIHN0 YXR1cyA9IHplRHJpdmVyR2V0QXBpVmVyc2lvbiAoZHJpdmVyLCAmdmVyc2lvbik7CisgICAgICBp ZiAoc3RhdHVzICE9IFpFX1JFU1VMVF9TVUNDRVNTKQorCXsKKwkgIHdhcm5pbmcgKF8oIkZhaWxl ZCB0byBvYnRhaW4gQVBJIHZlcnNpb24gaW4gJXMgKCV4KS4iKSwKKwkJICAgZHJpdmVyX3V1aWRf c3RyIChwcm9wZXJ0aWVzLnV1aWQpLmNfc3RyICgpLAorCQkgICBzdGF0dXMpOworCSAgY29udGlu dWU7CisJfQorCisgICAgICBzd2l0Y2ggKFpFX01BSk9SX1ZFUlNJT04gKHZlcnNpb24pKQorCXsK KwljYXNlIDE6CisJICAvKiBXZSBzaG91bGQgYmUgT0sgd2l0aCBhbGwgbWlub3IgdmVyc2lvbnMu ICAqLworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgd2FybmluZyAoXygiVW5zdXBwb3J0ZWQg QVBJIHZlcnNpb24gaW4gJXMgKCV4KS4iKSwKKwkJICAgZHJpdmVyX3V1aWRfc3RyIChwcm9wZXJ0 aWVzLnV1aWQpLmNfc3RyICgpLAorCQkgICBaRV9NQUpPUl9WRVJTSU9OICh2ZXJzaW9uKSk7CisJ ICBjb250aW51ZTsKKwl9CisKKyAgICAgIHVpbnQzMl90IG5kZXZpY2VzID0gMDsKKyAgICAgIHN0 YXR1cyA9IHplRGV2aWNlR2V0IChkcml2ZXIsICZuZGV2aWNlcywgbnVsbHB0cik7CisgICAgICBp ZiAoc3RhdHVzICE9IFpFX1JFU1VMVF9TVUNDRVNTKQorCXsKKwkgIHdhcm5pbmcgKF8oIkZhaWxl ZCB0byBnZXQgbnVtYmVyIG9mIGRldmljZXMgaW4gJXMgKCV4KS4iKSwKKwkJICAgZHJpdmVyX3V1 aWRfc3RyIChwcm9wZXJ0aWVzLnV1aWQpLmNfc3RyICgpLAorCQkgICBzdGF0dXMpOworCSAgY29u dGludWU7CisJfQorCisgICAgICBzdGQ6OnZlY3Rvcjx6ZV9kZXZpY2VfaGFuZGxlX3Q+IGRldmlj ZXMgKG5kZXZpY2VzKTsKKyAgICAgIHN0YXR1cyA9IHplRGV2aWNlR2V0IChkcml2ZXIsICZuZGV2 aWNlcywgZGV2aWNlcy5kYXRhICgpKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gWkVfUkVTVUxUX1NV Q0NFU1MpCisJeworCSAgd2FybmluZyAoXygiRmFpbGVkIHRvIGVudW1lcmF0ZSBkZXZpY2VzIGlu ICVzICgleCkuIiksCisJCSAgIGRyaXZlcl91dWlkX3N0ciAocHJvcGVydGllcy51dWlkKS5jX3N0 ciAoKSwKKwkJICAgc3RhdHVzKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgZHByaW50ZiAo InNjYW5uaW5nIGRyaXZlciAlcyAoJSIgUFJJdTMyICIgZGV2aWNlcykiLAorCSAgICAgICBkcml2 ZXJfdXVpZF9zdHIgKHByb3BlcnRpZXMudXVpZCkuY19zdHIgKCksIG5kZXZpY2VzKTsKKworICAg ICAgZm9yICh6ZV9kZXZpY2VfaGFuZGxlX3QgZGV2aWNlIDogZGV2aWNlcykKKwluYXR0YWNoZWQg Kz0gYXR0YWNoX3RvX2RldmljZSAocGlkLCBkZXZpY2UpOworICAgIH0KKworICByZXR1cm4gbmF0 dGFjaGVkOworfQorCit1aW50NjRfdAoremVfdGFyZ2V0OjpmZXRjaF9ldmVudHMgKHplX2Rldmlj ZV9pbmZvICZkZXZpY2UpCit7CisgIC8qIFRoZXJlIGFyZSBubyBldmVudHMgaWYgd2UncmUgbm90 IGF0dGFjaGVkLiAgKi8KKyAgaWYgKGRldmljZS5zZXNzaW9uID09IG51bGxwdHIpCisgICAgcmV0 dXJuIDA7CisKKyAgdWludDY0X3QgbmV2ZW50cyA9IDA7CisgIGZvciAoOzspCisgICAgeworICAg ICAgemV0X2RlYnVnX2V2ZW50X3QgZXZlbnQgPSB7fTsKKyAgICAgIHplX3Jlc3VsdF90IHN0YXR1 cyA9IHpldERlYnVnUmVhZEV2ZW50IChkZXZpY2Uuc2Vzc2lvbiwgMHVsbCwgJmV2ZW50KTsKKyAg ICAgIHN3aXRjaCAoc3RhdHVzKQorCXsKKwljYXNlIFpFX1JFU1VMVF9TVUNDRVNTOgorCSAgbmV2 ZW50cyArPSAxOworCSAgYnJlYWs7CisKKwljYXNlIFpFX1JFU1VMVF9OT1RfUkVBRFk6CisJICBy ZXR1cm4gbmV2ZW50czsKKworCWRlZmF1bHQ6CisJICBlcnJvciAoXygiZXJyb3IgZmV0Y2hpbmcg ZXZlbnRzIGZyb20gJXM6ICV4LiIpLAorCQkgZGV2aWNlLnByb3BlcnRpZXMubmFtZSwgc3RhdHVz KTsKKwl9CisKKyAgICAgIGRwcmludGYgKCJyZWNlaXZlZCBldmVudCBmcm9tIGRldmljZSAlbHU6 ICVzIiwgZGV2aWNlLm9yZGluYWwsCisJICAgICAgIHplX2V2ZW50X3N0ciAoZXZlbnQpLmNfc3Ry ICgpKTsKKworICAgICAgc3dpdGNoIChldmVudC50eXBlKQorCXsKKwljYXNlIFpFVF9ERUJVR19F VkVOVF9UWVBFX0lOVkFMSUQ6CisJICBicmVhazsKKworCWNhc2UgWkVUX0RFQlVHX0VWRU5UX1RZ UEVfREVUQUNIRUQ6CisJICB7CisJICAgIHByb2Nlc3NfaW5mbyAqcHJvY2VzcyA9IGRldmljZS5w cm9jZXNzOworCSAgICBpZiAocHJvY2VzcyAhPSBudWxscHRyKQorCSAgICAgIHplX2RldmljZV9k ZXRhY2hlZCAocHJvY2VzcywgZXZlbnQuaW5mby5kZXRhY2hlZC5yZWFzb24pOworCisJICAgIC8q IFdlJ3JlIGRldGFjaGVkLCBub3cuICAqLworCSAgICBkZXZpY2Uuc2Vzc2lvbiA9IG51bGxwdHI7 CisJICB9CisJICByZXR1cm4gbmV2ZW50czsKKworCWNhc2UgWkVUX0RFQlVHX0VWRU5UX1RZUEVf UFJPQ0VTU19FTlRSWToKKwkgIHplX2Fja19ldmVudCAoZGV2aWNlLCBldmVudCk7CisJICB6ZV9z aG93X3Byb2Nlc3MgKGRldmljZS5wcm9jZXNzKTsKKwkgIGNvbnRpbnVlOworCisJY2FzZSBaRVRf REVCVUdfRVZFTlRfVFlQRV9QUk9DRVNTX0VYSVQ6CisJICB6ZV9hY2tfZXZlbnQgKGRldmljZSwg ZXZlbnQpOworCSAgemVfaGlkZV9wcm9jZXNzIChkZXZpY2UucHJvY2Vzcyk7CisJICBjb250aW51 ZTsKKworCWNhc2UgWkVUX0RFQlVHX0VWRU5UX1RZUEVfTU9EVUxFX0xPQUQ6CisJICB7CisJICAg IC8qIFdlIHdvdWxkIG5vdCByZW1haW4gYXR0YWNoZWQgd2l0aG91dCBhIHByb2Nlc3MuICAqLwor CSAgICBwcm9jZXNzX2luZm8gKnByb2Nlc3MgPSBkZXZpY2UucHJvY2VzczsKKwkgICAgZ2RiX2Fz c2VydCAocHJvY2VzcyAhPSBudWxscHRyKTsKKworCSAgICBib29sIG5lZWRfYWNrCisJICAgICAg PSAoKGV2ZW50LmZsYWdzICYgWkVUX0RFQlVHX0VWRU5UX0ZMQUdfTkVFRF9BQ0spICE9IDApOwor CSAgICBsb2FkZWRfZGxsIChwcm9jZXNzLCBldmVudC5pbmZvLm1vZHVsZS5tb2R1bGVCZWdpbiwK KwkJCWV2ZW50LmluZm8ubW9kdWxlLm1vZHVsZUVuZCwKKwkJCWV2ZW50LmluZm8ubW9kdWxlLmxv YWQsIG5lZWRfYWNrKTsKKworCSAgICAvKiBJZiBMZXZlbC1aZXJvIGlzIG5vdCByZXF1ZXN0aW5n IHRoZSBldmVudCB0byBiZQorCSAgICAgICBhY2tub3dsZWRnZWQsIHdlJ3JlIGRvbmUuCisKKwkg ICAgICAgVGhpcyBoYXBwZW5zIHdoZW4gYXR0YWNoaW5nIHRvIGFuIGFscmVhZHkgcnVubmluZyBw cm9jZXNzLAorCSAgICAgICBmb3IgZXhhbXBsZS4gIFdlIHdpbGwgcmVjZWl2ZSBtb2R1bGUgbG9h ZCBldmVudHMgZm9yCisJICAgICAgIG1vZHVsZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBsb2Fk ZWQuCisKKwkgICAgICAgTm8gbmVlZCB0byBpbmZvcm0gR0RCLCBlaXRoZXIsIGFzIHdlIGV4cGVj dCBHREIgdG8gcXVlcnkKKwkgICAgICAgc2hhcmVkIGxpYnJhcmllcyBhZnRlciBhdHRhY2guICAq LworCSAgICBpZiAoIW5lZWRfYWNrKQorCSAgICAgIGNvbnRpbnVlOworCisJICAgIGRldmljZS5h Y2tfcGVuZGluZy5lbXBsYWNlX2JhY2sgKGV2ZW50KTsKKworCSAgICAvKiBMb2FkaW5nIGEgbmV3 IG1vZHVsZSBpcyBhIHByb2Nlc3MgZXZlbnQuICBXZSBkbyBub3Qgd2FudCB0bworCSAgICAgICBv dmVyd3JpdGUgb3RoZXIgcHJvY2VzcyBldmVudHMsIGhvd2V2ZXIsIGFzIG1vZHVsZSBsb2Fkcwor CSAgICAgICBjYW4gYWxzbyBiZSBjb21tdW5pY2F0ZWQgYXMgcGFydCBvZiBvdGhlciBldmVudHMu ICAqLworCSAgICBwcm9jZXNzX2luZm9fcHJpdmF0ZSAqemVwcm9jID0gcHJvY2Vzcy0+cHJpdjsK KwkgICAgZ2RiX2Fzc2VydCAoemVwcm9jICE9IG51bGxwdHIpOworCisJICAgIGlmICh6ZXByb2Mt PndhaXRzdGF0dXMua2luZCAoKSAhPSBUQVJHRVRfV0FJVEtJTkRfSUdOT1JFKQorCSAgICAgIGNv bnRpbnVlOworCisJICAgIC8qIFdlIHVzZSBVTkFWQUlMQUJMRSByYXRoZXIgdGhhbiBMT0FERUQg YXMgdGhlIGxhdHRlciBpbXBsaWVzCisJICAgICAgIHRoYXQgdGhlIHRhcmdldCBoYXMgc3RvcHBl ZC4gICovCisJICAgIHplcHJvYy0+d2FpdHN0YXR1cy5zZXRfdW5hdmFpbGFibGUgKCk7CisJICB9 CisJICBjb250aW51ZTsKKworCWNhc2UgWkVUX0RFQlVHX0VWRU5UX1RZUEVfTU9EVUxFX1VOTE9B RDoKKwkgIHsKKwkgICAgLyogV2Ugd291bGQgbm90IHJlbWFpbiBhdHRhY2hlZCB3aXRob3V0IGEg cHJvY2Vzcy4gICovCisJICAgIHByb2Nlc3NfaW5mbyAqcHJvY2VzcyA9IGRldmljZS5wcm9jZXNz OworCSAgICBnZGJfYXNzZXJ0IChwcm9jZXNzICE9IG51bGxwdHIpOworCisJICAgIHVubG9hZGVk X2RsbCAocHJvY2VzcywgZXZlbnQuaW5mby5tb2R1bGUubW9kdWxlQmVnaW4sCisJCQkgIGV2ZW50 LmluZm8ubW9kdWxlLm1vZHVsZUVuZCwKKwkJCSAgZXZlbnQuaW5mby5tb2R1bGUubG9hZCk7CisK KwkgICAgLyogV2UgZG9uJ3QgbmVlZCBhbiBhY2ssIGhlcmUsIGJ1dCBtYXliZSBMZXZlbC1aZXJv IGRvZXMuICAqLworCSAgICB6ZV9hY2tfZXZlbnQgKGRldmljZSwgZXZlbnQpOworCisJICAgIC8q IFdlIGRvIG5vdCBub3RpZnkgR0RCIGltbWVkaWF0ZWx5IGFib3V0IHRoZSBtb2R1bGUgdW5sb2Fk LgorCSAgICAgICBUaGlzIGlzIGhhcm1sZXNzIHVudGlsIHdlIHJlY2xhaW0gdGhlIG1lbW9yeSBm b3Igc29tZXRoaW5nCisJICAgICAgIGVsc2UuICBJbiBvdXIgY2FzZSwgdGhpcyBjYW4gb25seSBi ZSBhbm90aGVyIG1vZHVsZSBhbmQgd2UKKwkgICAgICAgd2lsbCBub3RpZnkgR0RCIGluIHRoYXQg Y2FzZS4gICovCisJICB9CisJICBjb250aW51ZTsKKworCWNhc2UgWkVUX0RFQlVHX0VWRU5UX1RZ UEVfVEhSRUFEX1NUT1BQRUQ6CisJICB7CisJICAgIHplX2RldmljZV90aHJlYWRfdCB0aWQgPSBl dmVudC5pbmZvLnRocmVhZC50aHJlYWQ7CisJICAgIHplX2Fja19ldmVudCAoZGV2aWNlLCBldmVu dCk7CisKKwkgICAgLyogV2Ugd291bGQgbm90IHJlbWFpbiBhdHRhY2hlZCB3aXRob3V0IGEgcHJv Y2Vzcy4gICovCisJICAgIHByb2Nlc3NfaW5mbyAqcHJvY2VzcyA9IGRldmljZS5wcm9jZXNzOwor CSAgICBnZGJfYXNzZXJ0IChwcm9jZXNzICE9IG51bGxwdHIpOworCisJICAgIHVpbnQzMl90IG5z dG9wcGVkID0gMDsKKwkgICAgZm9yX2VhY2hfdGhyZWFkIChkZXZpY2UsIHRpZCwgWyZdICh0aHJl YWRfaW5mbyAqdHApCisJICAgICAgeworCQkvKiBJZ25vcmUgdGhyZWFkcyB3ZSBrbm93IHRvIGJl IHN0b3BwZWQuCisKKwkJICAgV2UgYWxyZWFkeSBhbmFseXplZCB0aGUgc3RvcCByZWFzb24gYW5k IHByb2JhYmx5CisJCSAgIGRlc3Ryb3llZCBpdCBpbiB0aGUgcHJvY2Vzcy4gICovCisJCWlmICh6 ZV90aHJlYWRfc3RvcHBlZCAodHApKQorCQkgIHJldHVybjsKKworCQkvKiBQcmV2ZW50IHVuZGVy Zmxvd2luZy4gICovCisJCWlmIChkZXZpY2UubnJlc3VtZWQgPiAwKQorCQkgIGRldmljZS5ucmVz dW1lZC0tOworCisJCXplX3RocmVhZF9pbmZvICp6ZXRwID0gemVfdGhyZWFkICh0cCk7CisJCWdk Yl9hc3NlcnQgKHpldHAgIT0gbnVsbHB0cik7CisKKwkJLyogRGlzY2FyZCBhbnkgcmVnaXN0ZXJz IHdlIG1heSBoYXZlIGZldGNoZWQgd2hpbGUgVFAgd2FzCisJCSAgIHVuYXZhaWxhYmxlLiAgKi8K KwkJemVfZGlzY2FyZF9yZWdjYWNoZSAodHApOworCQl0cnkKKwkJICB7CisJCSAgICBnZGJfc2ln bmFsIHNpZ25hbCA9IEdEQl9TSUdOQUxfMDsKKworCQkgICAgLyogSWYgdGhpcyBpcyBhbiB1bmF2 YWlsYWJsZSB0aHJlYWQgd2l0aCBhICdzdG9wJworCQkgICAgICAgcmVzdW1lIHN0YXRlLCBmcm9t IEdEQidzIHBvaW50IG9mIHZpZXcgdGhlCisJCSAgICAgICB0aHJlYWQgd2FzIGludGVycnVwdGVk LiAgSW4gYWxsLXN0b3AgbW9kZSwgd2UKKwkJICAgICAgIGtlZXAgdGhlIGV2ZW50IGhlbGQgdG8g bm90IGNvbmZ1c2UgR0RCLgorCisJCSAgICAgICBEbyB0aGUgc3RhdGUgdXBkYXRlIGJlZm9yZSBn ZXRfc3RvcF9yZWFzb24KKwkJICAgICAgIGJlbG93LCBzbyB0aGF0IGluIGNhc2Ugd2UgYWNjZXNz IG1lbW9yeSwgd2UKKwkJICAgICAgIHdpbGwgZG8gdGhhdCB1c2luZyB0aGUgcmlnaHQgdGhyZWFk CisJCSAgICAgICBjb250ZXh0LiAgKi8KKwkJICAgIGlmICghbm9uX3N0b3AKKwkJCSYmICh6ZXRw LT5leGVjX3N0YXRlID09IFpFX1RIUkVBRF9TVEFURV9VTkFWQUlMQUJMRSkKKwkJCSYmICh6ZXRw LT5yZXN1bWVfc3RhdGUgPT0gWkVfVEhSRUFEX1JFU1VNRV9TVE9QKSkKKwkJICAgICAgemV0cC0+ ZXhlY19zdGF0ZSA9IFpFX1RIUkVBRF9TVEFURV9IRUxEOworCQkgICAgZWxzZQorCQkgICAgICB6 ZXRwLT5leGVjX3N0YXRlID0gWkVfVEhSRUFEX1NUQVRFX1NUT1BQRUQ7CisKKwkJICAgIHRhcmdl dF9zdG9wX3JlYXNvbiByZWFzb24gPSBnZXRfc3RvcF9yZWFzb24gKHRwLCBzaWduYWwpOworCisJ CSAgICB6ZXRwLT5zdG9wX3JlYXNvbiA9IHJlYXNvbjsKKwkJICAgIHpldHAtPndhaXRzdGF0dXMu c2V0X3N0b3BwZWQgKHNpZ25hbCk7CisJCSAgICBuc3RvcHBlZCArPSAxOworCQkgIH0KKwkJLyog RklYTUU6IGV4Y2VwdGlvbnMKKworCQkgICBXZSdkIHJlYWxseSBsaWtlIHRvIGNhdGNoIHNvbWUg J3RocmVhZF91bmF2YWlsYWJsZScKKwkJICAgZXhjZXB0aW9uIHJhdGhlciB0aGFuIGFzc3VtaW5n IHRoYXQgYW55IGV4Y2VwdGlvbiBpcworCQkgICBkdWUgdG8gdGhyZWFkIGF2YWlsYWJpbGl0eS4g ICovCisJCWNhdGNoICguLi4pCisJCSAgeworCQkgICAgemV0cC0+ZXhlY19zdGF0ZSA9IFpFX1RI UkVBRF9TVEFURV9VTkFWQUlMQUJMRTsKKwkJICAgIHpldHAtPndhaXRzdGF0dXMuc2V0X3VuYXZh aWxhYmxlICgpOworCQkgIH0KKwkgICAgICB9KTsKKworCSAgICBkcHJpbnRmICgiZGV2aWNlICVs dSdzIG5yZXN1bWVkPSVsZCVzIiwKKwkJICAgICBkZXZpY2Uub3JkaW5hbCwgZGV2aWNlLm5yZXN1 bWVkLAorCQkgICAgICgoZGV2aWNlLm5yZXN1bWVkID09IGRldmljZS5udGhyZWFkcykgPyAiIChh bGwpIiA6ICIiKSk7CisKKwkgICAgLyogVGhpcyBpcyB0aGUgcmVzcG9uc2UgdG8gYW4gaW50ZXJy dXB0IGlmIFRJRCBpcyAiYWxsIi4gICovCisJICAgIGlmICh6ZV9pc190aHJlYWRfaWRfYWxsICh0 aWQpKQorCSAgICAgIHsKKwkJaWYgKGRldmljZS5uaW50ZXJydXB0cyA+IDApCisJCSAgZGV2aWNl Lm5pbnRlcnJ1cHRzLS07CisJCWVsc2UKKwkJICB3YXJuaW5nIChfKCJpZ25vcmluZyBzcHVyaW91 cyBzdG9wLWFsbCBldmVudCBvbiAiCisJCQkgICAgICJkZXZpY2UgJWx1IiksIGRldmljZS5vcmRp bmFsKTsKKwkgICAgICB9CisKKwkgICAgLyogQSB0aHJlYWQgZXZlbnQgdHVybnMgYSBwcm9jZXNz IHZpc2libGUuICAqLworCSAgICBpZiAobnN0b3BwZWQgPiAwKQorCSAgICAgIHplX3Nob3dfcHJv Y2VzcyAocHJvY2Vzcyk7CisJICB9CisJICBjb250aW51ZTsKKworCWNhc2UgWkVUX0RFQlVHX0VW RU5UX1RZUEVfVEhSRUFEX1VOQVZBSUxBQkxFOgorCSAgeworCSAgICB6ZV9kZXZpY2VfdGhyZWFk X3QgdGlkID0gZXZlbnQuaW5mby50aHJlYWQudGhyZWFkOworCSAgICB6ZV9hY2tfZXZlbnQgKGRl dmljZSwgZXZlbnQpOworCisJICAgIC8qIFdlIHdvdWxkIG5vdCByZW1haW4gYXR0YWNoZWQgd2l0 aG91dCBhIHByb2Nlc3MuICAqLworCSAgICBwcm9jZXNzX2luZm8gKnByb2Nlc3MgPSBkZXZpY2Uu cHJvY2VzczsKKwkgICAgZ2RiX2Fzc2VydCAocHJvY2VzcyAhPSBudWxscHRyKTsKKworCSAgICBm b3JfZWFjaF90aHJlYWQgKGRldmljZSwgdGlkLCBbJl0gKHRocmVhZF9pbmZvICp0cCkKKwkgICAg ICB7CisJCS8qIElnbm9yZSB0aHJlYWRzIHdlIGtub3cgdG8gYmUgc3RvcHBlZC4KKworCQkgICBU aGV5IHdvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGluIHRoZSByZXNwb25zZSBldmVudCBmb3IKKwkJ ICAgYW4gaW50ZXJydXB0IHJlcXVlc3QuICAqLworCQlpZiAoemVfdGhyZWFkX3N0b3BwZWQgKHRw KSkKKwkJICByZXR1cm47CisKKwkJLyogUHJldmVudCB1bmRlcmZsb3dpbmcuICAqLworCQlpZiAo ZGV2aWNlLm5yZXN1bWVkID4gMCkKKwkJICBkZXZpY2UubnJlc3VtZWQtLTsKKworCQl6ZV90aHJl YWRfaW5mbyAqemV0cCA9IHplX3RocmVhZCAodHApOworCQlnZGJfYXNzZXJ0ICh6ZXRwICE9IG51 bGxwdHIpOworCisJCXpldHAtPmV4ZWNfc3RhdGUgPSBaRV9USFJFQURfU1RBVEVfVU5BVkFJTEFC TEU7CisJCXpldHAtPndhaXRzdGF0dXMuc2V0X3VuYXZhaWxhYmxlICgpOworCSAgICAgIH0pOwor CisJICAgIGRwcmludGYgKCJkZXZpY2UgJWx1J3MgbnJlc3VtZWQ9JWxkJXMiLAorCQkgICAgIGRl dmljZS5vcmRpbmFsLCBkZXZpY2UubnJlc3VtZWQsCisJCSAgICAgKChkZXZpY2UubnJlc3VtZWQg PT0gZGV2aWNlLm50aHJlYWRzKSA/ICIgKGFsbCkiIDogIiIpKTsKKworCSAgICAvKiBUaGlzIGlz IHRoZSByZXNwb25zZSB0byBhbiBpbnRlcnJ1cHQgaWYgVElEIGlzICJhbGwiLiAgKi8KKwkgICAg aWYgKHplX2lzX3RocmVhZF9pZF9hbGwgKHRpZCkpCisJICAgICAgeworCQlpZiAoZGV2aWNlLm5p bnRlcnJ1cHRzID4gMCkKKwkJICBkZXZpY2UubmludGVycnVwdHMtLTsKKwkJZWxzZQorCQkgIHdh cm5pbmcgKF8oImlnbm9yaW5nIHNwdXJpb3VzIHVuYXZhaWxhYmxlLWFsbCBldmVudCBvbiAiCisJ CQkgICAgICJkZXZpY2UgJWx1IiksIGRldmljZS5vcmRpbmFsKTsKKwkgICAgICB9CisJICB9CisJ ICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIFdlIG9ubHkgZ2V0IGhlcmUgaWYgd2UgaGF2ZSBu b3QgcHJvY2Vzc2VkIEVWRU5ULiAgKi8KKyAgICAgIHdhcm5pbmcgKF8oImlnbm9yaW5nIGV2ZW50 ICclcycgb24gJXMuIiksCisJICAgICAgIHplX2V2ZW50X3N0ciAoZXZlbnQpLmNfc3RyICgpLAor CSAgICAgICBkZXZpY2UucHJvcGVydGllcy5uYW1lKTsKKworICAgICAgLyogQWNrbm93bGVkZ2Ug dGhlIGlnbm9yZWQgZXZlbnQgc28gd2UgZG9uJ3QgZ2V0IHN0dWNrLiAgKi8KKyAgICAgIHplX2Fj a19ldmVudCAoZGV2aWNlLCBldmVudCk7CisgICAgfQorfQorCit2b2lkCit6ZV90YXJnZXQ6OmZl dGNoX2V2ZW50c19hbGxfZGV2aWNlc19ub19yZXN1bWVkICgpCit7CisgIHVpbnQ2NF90IG5yZXN1 bWVkID0gMDsKKyAgZG8geworICAgIG5yZXN1bWVkID0gMDsKKyAgICBmb3IgKHplX2RldmljZV9p bmZvICpkZXZpY2UgOiBkZXZpY2VzKQorICAgICAgeworCWdkYl9hc3NlcnQgKGRldmljZSAhPSBu dWxscHRyKTsKKworCS8qIElnbm9yZSBkZXZpY2VzIHdlJ3JlIG5vdCBtb2RlbGxpbmcgYXMgcHJv Y2Vzc2VzLiAgKi8KKwlpZiAoZGV2aWNlLT5wcm9jZXNzID09IG51bGxwdHIpCisJICBjb250aW51 ZTsKKworCS8qIEV2ZW50IHByb2Nlc3NpbmcgbWFpbnRhaW5zIHRoZSBudW1iZXIgb2YgcmVzdW1l ZCB0aHJlYWRzLiAgKi8KKwlmZXRjaF9ldmVudHMgKCpkZXZpY2UpOworCW5yZXN1bWVkICs9IGRl dmljZS0+bnJlc3VtZWQ7CisgICAgICB9CisgIH0KKyAgd2hpbGUgKG5yZXN1bWVkICE9IDApOwor fQorCit2b2lkCit6ZV90YXJnZXQ6OmluaXQgKCkKK3sKKyAgemVfcmVzdWx0X3Qgc3RhdHVzID0g emVJbml0ICgwKTsKKyAgc3dpdGNoIChzdGF0dXMpCisgICAgeworICAgIGNhc2UgWkVfUkVTVUxU X1NVQ0NFU1M6CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciAoXygi RmFpbGVkIHRvIGluaXRpYWxpemUgTGV2ZWwtWmVybzogJXgiKSwgc3RhdHVzKTsKKyAgICB9Cit9 CisKK2Jvb2wKK3plX3RhcmdldDo6YXN5bmMgKGJvb2wgZW5hYmxlKQoreworICBib29sIHByZXZp b3VzID0gemVfaXNfYXN5bmMgKCk7CisgIGlmIChwcmV2aW91cyAhPSBlbmFibGUpCisgICAgewor I2lmbmRlZiBVU0VfV0lOMzJBUEkKKyAgICAgIGlmIChlbmFibGUpCisJeworCSAgdHJ5CisJICAg IHsKKwkgICAgICBlcnJubyA9IDA7CisJICAgICAgaW50IHN0YXR1cyA9IHBpcGUgKHplX2V2ZW50 X3BpcGUpOworCSAgICAgIGlmIChzdGF0dXMgPT0gLTEpCisJCWVycm9yIChfKCJGYWlsZWQgdG8g Y3JlYXRlIGV2ZW50IHBpcGU6ICVzLiIpLAorCQkgICAgICAgc2FmZV9zdHJlcnJvciAoZXJybm8p KTsKKworCSAgICAgIHN0YXR1cyA9IGZjbnRsICh6ZV9ldmVudF9waXBlWzBdLCBGX1NFVEZMLCBP X05PTkJMT0NLKTsKKwkgICAgICBpZiAoc3RhdHVzID09IC0xKQorCQllcnJvciAoXygiRmFpbGVk IHRvIHNldCBwaXBlWzBdIHRvIG5vbi1ibG9ja2luZzogJXMuIiksCisJCSAgICAgICBzYWZlX3N0 cmVycm9yIChlcnJubykpOworCisJICAgICAgc3RhdHVzID0gZmNudGwgKHplX2V2ZW50X3BpcGVb MV0sIEZfU0VURkwsIE9fTk9OQkxPQ0spOworCSAgICAgIGlmIChzdGF0dXMgPT0gLTEpCisJCWVy cm9yIChfKCJGYWlsZWQgdG8gc2V0IHBpcGVbMV0gdG8gbm9uLWJsb2NraW5nOiAlcy4iKSwKKwkJ ICAgICAgIHNhZmVfc3RyZXJyb3IgKGVycm5vKSk7CisKKwkgICAgICAvKiBSZWdpc3RlciB0aGUg ZXZlbnQgbG9vcCBoYW5kbGVyLiAgKi8KKwkgICAgICBhZGRfZmlsZV9oYW5kbGVyICh6ZV9ldmVu dF9waXBlWzBdLAorCQkJCWhhbmRsZV90YXJnZXRfZXZlbnQsIE5VTEwsCisJCQkJInplLWxvdyIp OworCisJICAgICAgLyogQWx3YXlzIHRyaWdnZXIgYSB3YWl0LiAgKi8KKwkgICAgICB6ZV9hc3lu Y19tYXJrICgpOworCSAgICB9CisJICBjYXRjaCAoc3RkOjpleGNlcHRpb24gJmV4KQorCSAgICB7 CisJICAgICAgd2FybmluZyAoIiVzIiwgZXgud2hhdCAoKSk7CisKKwkgICAgICBpZiAoemVfZXZl bnRfcGlwZVswXSAhPSAtMSkKKwkJeworCQkgIGNsb3NlICh6ZV9ldmVudF9waXBlWzBdKTsKKwkJ ICB6ZV9ldmVudF9waXBlWzBdID0gLTE7CisJCX0KKworCSAgICAgIGlmICh6ZV9ldmVudF9waXBl WzFdICE9IC0xKQorCQl7CisJCSAgY2xvc2UgKHplX2V2ZW50X3BpcGVbMV0pOworCQkgIHplX2V2 ZW50X3BpcGVbMV0gPSAtMTsKKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGRl bGV0ZV9maWxlX2hhbmRsZXIgKHplX2V2ZW50X3BpcGVbMF0pOworCisJICBjbG9zZSAoemVfZXZl bnRfcGlwZVswXSk7CisJICBjbG9zZSAoemVfZXZlbnRfcGlwZVsxXSk7CisJICB6ZV9ldmVudF9w aXBlWzBdID0gLTE7CisJICB6ZV9ldmVudF9waXBlWzFdID0gLTE7CisJfQorI2Vsc2UKKyAgICAg IGVycm9yIChfKCIlczogdGJkIiksIF9fRlVOQ1RJT05fXyk7CisjZW5kaWYKKyAgICB9CisKKyAg cmV0dXJuIHByZXZpb3VzOworfQorCitpbnQKK3plX3RhcmdldDo6Y3JlYXRlX2luZmVyaW9yIChj b25zdCBjaGFyICpwcm9ncmFtLAorCQkJICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZhcmdzKQorewor ICAvKiBMZXZlbC16ZXJvIGRvZXMgbm90IHN1cHBvcnQgY3JlYXRpbmcgaW5mZXJpb3JzLiAgKi8K KyAgcmV0dXJuIC0xOworfQorCitpbnQKK3plX3RhcmdldDo6YXR0YWNoIChpbnQgcGlkKQorewor ICBpZiAoIWRldmljZXMuZW1wdHkgKCkpCisgICAgZXJyb3IgKF8oIkFscmVhZHkgYXR0YWNoZWQu IikpOworCisgIHVpbnQzMl90IGhvc3RwaWQgPSAodWludDMyX3QpIHBpZDsKKyAgaWYgKChpbnQp IGhvc3RwaWQgIT0gcGlkKQorICAgIGVycm9yIChfKCJIb3N0IHByb2Nlc3MgaWQgaXMgbm90IHN1 cHBvcnRlZC4iKSk7CisKKyAgaW50IG5kZXZpY2VzID0gYXR0YWNoX3RvX2RldmljZXMgKGhvc3Rw aWQpOworICBpZiAobmRldmljZXMgPT0gMCkKKyAgICBlcnJvciAoXygiTm8gc3VwcG9ydGVkIGRl dmljZXMgZm91bmQuIikpOworCisgIC8qIExldCdzIGNoZWNrIGlmIHdlIHdlcmUgYWJsZSB0byBh dHRhY2ggdG8gYXQgbGVhc3Qgb25lIGRldmljZS4gICovCisgIGludCBuYXR0YWNoZWQgPSAwOwor ICBzdGQ6OnN0cmluZ3N0cmVhbSBzc3RyZWFtOworICBzc3RyZWFtIDw8ICJGYWlsZWQgdG8gYXR0 YWNoIHRvIGFueSBkZXZpY2UuIjsKKyAgZm9yICh6ZV9kZXZpY2VfaW5mbyAqZGV2aWNlIDogZGV2 aWNlcykKKyAgICB7CisgICAgICBnZGJfYXNzZXJ0IChkZXZpY2UgIT0gbnVsbHB0cik7CisgICAg ICBzd2l0Y2ggKGRldmljZS0+ZGVidWdfYXR0YWNoX3N0YXRlKQorCXsKKwljYXNlIFpFX1JFU1VM VF9TVUNDRVNTOgorCSAgaWYgKGRldmljZS0+c2Vzc2lvbiA9PSBudWxscHRyKQorCSAgICB7CisJ ICAgICAgc3N0cmVhbSA8PCAiXG5EZXZpY2UgIiA8PCBkZXZpY2UtPm9yZGluYWwgPDwgIiBbIgor CQkgICAgICA8PCBkZXZpY2UtPnByb3BlcnRpZXMubmFtZSA8PCAiXSA6ICIKKwkJICAgICAgPDwg ImZhaWxlZCB0byBpbml0aWFsaXplIGRlYnVnIHNlc3Npb24iOworCSAgICAgIGNvbnRpbnVlOwor CSAgICB9CisKKwkgIC8qIEdEQiAoYW5kIGhpZ2hlciBsYXllcnMgb2YgZ2Ric2VydmVyKSBleHBl Y3RzIHRocmVhZHMgc3RvcHBlZCBvbgorCSAgICAgYXR0YWNoIGluIGFsbC1zdG9wIG1vZGUuICBJ biBub24tc3RvcCBtb2RlLCBHREIgZXhwbGljaXRseQorCSAgICAgc2VuZHMgYSBzdG9wIHJlcXVl c3QuICAqLworCSAgaWYgKCFub25fc3RvcCkKKwkgICAgeworCSAgICAgIGRldmljZS0+cHJvY2Vz cy0+Zm9yX2VhY2hfdGhyZWFkIChbdGhpc10gKHRocmVhZF9pbmZvICp0cCkKKwkJeworCQkgIHpl X3NldF9yZXN1bWVfc3RhdGUgKHRwLCByZXN1bWVfc3RvcCk7CisJCSAgYm9vbCBzaG91bGRfc3Rv cCA9IHplX3ByZXBhcmVfZm9yX3N0b3BwaW5nICh0cCk7CisJCSAgZ2RiX2Fzc2VydCAoc2hvdWxk X3N0b3ApOworCQl9KTsKKworCSAgICAgIHplX2RldmljZV90aHJlYWRfdCBhbGwgPSB6ZV90aHJl YWRfaWRfYWxsICgpOworCSAgICAgIHplX2ludGVycnVwdCAoKmRldmljZSwgYWxsKTsKKwkgICAg fQorCisJICBuYXR0YWNoZWQgKz0gMTsKKwkgIGJyZWFrOworCWNhc2UgWkVfUkVTVUxUX05PVF9S RUFEWToKKwkgIHNzdHJlYW0gPDwgIlxuRGV2aWNlICIgPDwgZGV2aWNlLT5vcmRpbmFsIDw8ICIg WyIKKwkJICA8PCBkZXZpY2UtPnByb3BlcnRpZXMubmFtZSA8PCAiXSA6ICIKKwkJICA8PCAiYXR0 ZW1wdGluZyB0byBhdHRhY2ggdG9vIGVhcmx5IjsKKwkgIGJyZWFrOworCWNhc2UgWkVfUkVTVUxU X0VSUk9SX1VOU1VQUE9SVEVEX0ZFQVRVUkU6CisJICBzc3RyZWFtIDw8ICJcbkRldmljZSAiIDw8 IGRldmljZS0+b3JkaW5hbCA8PCAiIFsiCisJCSAgPDwgZGV2aWNlLT5wcm9wZXJ0aWVzLm5hbWUg PDwgIl0gOiAiCisJCSAgPDwgImF0dGFjaGluZyBpcyBub3Qgc3VwcG9ydGVkIjsKKwkgIGJyZWFr OworCWNhc2UgWkVfUkVTVUxUX0VSUk9SX0lOU1VGRklDSUVOVF9QRVJNSVNTSU9OUzoKKwkgIHNz dHJlYW0gPDwgIlxuRGV2aWNlICIgPDwgZGV2aWNlLT5vcmRpbmFsIDw8ICIgWyIKKwkJICA8PCBk ZXZpY2UtPnByb3BlcnRpZXMubmFtZSA8PCAiXSA6ICIKKwkJICA8PCAiYXR0YWNoaW5nIGlzIG5v dCBwZXJtaXR0ZWQiOworCSAgYnJlYWs7CisJY2FzZSBaRV9SRVNVTFRfRVJST1JfTk9UX0FWQUlM QUJMRToKKwkgIHNzdHJlYW0gPDwgIlxuRGV2aWNlICIgPDwgZGV2aWNlLT5vcmRpbmFsIDw8ICIg WyIKKwkJICA8PCBkZXZpY2UtPnByb3BlcnRpZXMubmFtZSA8PCAiXSA6ICIKKwkJICA8PCAiYSBk ZWJ1Z2dlciBpcyBhbHJlYWR5IGF0dGFjaGVkIjsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBz c3RyZWFtIDw8ICJcbkRldmljZSAiIDw8IGRldmljZS0+b3JkaW5hbCA8PCAiIFsiCisJCSAgPDwg ZGV2aWNlLT5wcm9wZXJ0aWVzLm5hbWUgPDwgIl0gOiAiCisJCSAgPDwgImZhaWxlZCB0byBhdHRh Y2ggd2l0aCBlcnJvciBjb2RlICciCisJCSAgPDwgc3RkOjpoZXggPDwgZGV2aWNlLT5kZWJ1Z19h dHRhY2hfc3RhdGUKKwkJICA8PCBzdGQ6OnJlc2V0aW9zZmxhZ3MgKHN0ZDo6aW9zOjpiYXNlZmll bGQpCisJCSAgPDwgIiciOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBpZiAobmF0dGFjaGVk ID09IDApCisgICAgZXJyb3IgKF8oIiVzIiksIHNzdHJlYW0uc3RyICgpLmNfc3RyICgpKTsKKwor ICAvKiBJbiBhbGwtc3RvcCBtb2RlIGFib3ZlLCB3ZSBpbnRlcnJ1cHRlZCB0aGUgZGV2aWNlcy4g IE5vdyB3ZSBtYWtlIHN1cmUKKyAgICAgdGhleSBjb21lIHRvIGEgc3RvcCBzdGF0ZS4gIFNvLCB3 ZSBmZXRjaCBldmVudHMgdW50aWwgbm8gZGV2aWNlIGhhcyBhbnkKKyAgICAgcmVzdW1lZCB0aHJl YWRzIGxlZnQuICBUaGVyZSBtaWdodCBiZSBsb3cgcHJpb3JpdHkgZXZlbnRzIChlLmcuCisgICAg ICdtb2R1bGUgbG9hZCcsICdwcm9jZXNzIGVudHJ5Jykgd2Ugc2hvdWxkIGZldGNoIGJlZm9yZSBm ZXRjaGluZyBoaWdoZXIKKyAgICAgcHJpb3JpdHkgZXZlbnRzIGluIHRoZSBzdWJzZXF1ZW50IGNh bGwgb2YgJ3dhaXQgKCknLiAgSWYgbm90IGRvbmUgaGVyZSwKKyAgICAgd2UgZmV0Y2ggdGhlIGxv d2VyIHByaW9yaXR5IGV2ZW50cyBpbiAnd2FpdCAoKScsIHJlcG9ydCBhbiBVTkFWQUlMQUJMRQor ICAgICBzdGF0dXMgdG8gR0RCIGFuZCB0aGVuIGZldGNoIHRoZSBoaWdoZXIgcHJpb3JpdHkgZXZl bnRzIGluICdwYXVzZV9hbGwnLgorICAgICBJbiBhIGxpdmUgYXR0YWNoIHNjZW5hcmlvLCB3ZSBk b24ndCByZWNlaXZlIGEgJ2NvbnRpbnVlJyByZXN1bWUgcmVxdWVzdAorICAgICBhbmQgd291bGQg bWlzcyB0aGUgdGhyZWFkIHN0b3BwZWQgZXZlbnQuICAqLworICBpZiAoIW5vbl9zdG9wKQorICAg IGZldGNoX2V2ZW50c19hbGxfZGV2aWNlc19ub19yZXN1bWVkICgpOworCisgIC8qIFJldHVybiB0 aGUgSUQgb2YgdGhlIGxhc3QgZGV2aWNlIHdlIGF0dGFjaGVkIHRvLiAgKi8KKyAgaW50IGRldmlj ZV9waWQgPSB6ZV9kZXZpY2VfcGlkICgqKGRldmljZXMuYmFjayAoKSkpOworICByZXR1cm4gZGV2 aWNlX3BpZDsKK30KKworaW50Cit6ZV90YXJnZXQ6OmRldGFjaCAocHJvY2Vzc19pbmZvICpwcm9j KQoreworICBnZGJfYXNzZXJ0IChwcm9jICE9IG51bGxwdHIpOworCisgIHByb2Nlc3NfaW5mb19w cml2YXRlICpwcml2ID0gcHJvYy0+cHJpdjsKKyAgZ2RiX2Fzc2VydCAocHJpdiAhPSBudWxscHRy KTsKKworICB6ZV9kZXZpY2VfaW5mbyAqZGV2aWNlID0gcHJpdi0+ZGV2aWNlOworICBpZiAoZGV2 aWNlICE9IG51bGxwdHIpCisgICAgeworICAgICAgLyogUmVzdW1lIGFsbCB0aGUgdGhyZWFkcyBv biB0aGUgZGV2aWNlLiAgR0RCIG11c3QgaGF2ZSBhbHJlYWR5CisJIHJlbW92ZWQgYWxsIHRoZSBi cmVha3BvaW50cy4gICovCisgICAgICB0cnkKKwl7CisJICAvKiBDbGVhciBhbGwgdGhlIHBlbmRp bmcgZXZlbnRzIGZpcnN0LiAgKi8KKwkgIHByb2MtPmZvcl9lYWNoX3RocmVhZCAoW10gKHRocmVh ZF9pbmZvICp0cCkKKwkgICAgeworCSAgICAgICh2b2lkKSB6ZV9tb3ZlX3dhaXRzdGF0dXMgKHRw KTsKKwkgICAgfSk7CisKKwkgIHJlc3VtZSAoKmRldmljZSk7CisJfQorICAgICAgY2F0Y2ggKGNv bnN0IGdkYl9leGNlcHRpb25fZXJyb3IgJmV4Y2VwdCkKKwl7CisJICAvKiBTd2FsbG93IHRoZSBl cnJvci4gIFdlIGFyZSBkZXRhY2hpbmcgYW55d2F5LiAgKi8KKwkgIGRwcmludGYgKCIlcyIsIGV4 Y2VwdC53aGF0ICgpKTsKKwl9CisKKyAgICAgIHplX2RldGFjaCAoZGV2aWNlKTsKKyAgICB9CisK KyAgbW91cm4gKHByb2MpOworICByZXR1cm4gMDsKK30KKworaW50Cit6ZV90YXJnZXQ6OmtpbGwg KHByb2Nlc3NfaW5mbyAqcHJvYykKK3sKKyAgLyogTGV2ZWwtemVybyBkb2VzIG5vdCBzdXBwb3J0 IGtpbGxpbmcgaW5mZXJpb3JzLiAgKi8KKyAgcmV0dXJuIC0xOworfQorCit2b2lkCit6ZV90YXJn ZXQ6Om1vdXJuIChwcm9jZXNzX2luZm8gKnByb2MpCit7CisgIHplX3JlbW92ZV9wcm9jZXNzIChw cm9jKTsKK30KKwordm9pZAoremVfdGFyZ2V0Ojpqb2luIChpbnQgcGlkKQoreworICAvKiBOb3Ro aW5nIHRvIGRvIGZvciBMZXZlbC1aZXJvIHRhcmdldHMuICAqLworfQorCit2b2lkCit6ZV90YXJn ZXQ6OnJlc3VtZSAoemVfZGV2aWNlX2luZm8gJmRldmljZSkKK3sKKyAgZ2RiX2Fzc2VydCAoZGV2 aWNlLnByb2Nlc3MgIT0gbnVsbHB0cik7CisKKyAgYm9vbCBoYXNfdGhyZWFkX3RvX3Jlc3VtZSA9 IGZhbHNlOworICBkZXZpY2UucHJvY2Vzcy0+Zm9yX2VhY2hfdGhyZWFkIChbJl0gKHRocmVhZF9p bmZvICp0cCkKKyAgICB7CisgICAgICB6ZV9zZXRfcmVzdW1lX3N0YXRlICh0cCwgcmVzdW1lX2Nv bnRpbnVlKTsKKyAgICAgIGlmICh6ZV9wcmVwYXJlX2Zvcl9yZXN1bWluZyAodHApKQorCXsKKwkg IHByZXBhcmVfdGhyZWFkX3Jlc3VtZSAodHApOworCSAgcmVnY2FjaGVfaW52YWxpZGF0ZV90aHJl YWQgKHRwKTsKKwkgIGhhc190aHJlYWRfdG9fcmVzdW1lID0gdHJ1ZTsKKwl9CisgICAgfSk7CisK KyAgLyogVGhlcmUgaXMgbm90aGluZyB0byByZXN1bWUgaWYgbm90aGluZyBpcyBzdG9wcGVkLiAg Ki8KKyAgaWYgKCFoYXNfdGhyZWFkX3RvX3Jlc3VtZSkKKyAgICByZXR1cm47CisKKyAgemVfZGV2 aWNlX3RocmVhZF90IGFsbCA9IHplX3RocmVhZF9pZF9hbGwgKCk7CisgIHplX3Jlc3VtZSAoZGV2 aWNlLCBhbGwpOworfQorCit2b2lkCit6ZV90YXJnZXQ6OnJlc3VtZV9zaW5nbGVfdGhyZWFkICh0 aHJlYWRfaW5mbyAqdGhyZWFkKQoreworICB6ZV9kZXZpY2VfaW5mbyAqZGV2aWNlID0gemVfdGhy ZWFkX2RldmljZSAodGhyZWFkKTsKKyAgZ2RiX2Fzc2VydCAoZGV2aWNlICE9IG51bGxwdHIpOwor ICB6ZV90aHJlYWRfaW5mbyAqemV0cCA9IHplX3RocmVhZCAodGhyZWFkKTsKKyAgZ2RiX2Fzc2Vy dCAoemV0cCAhPSBudWxscHRyKTsKKworICBib29sIHNob3VsZF9yZXN1bWUgPSB6ZV9wcmVwYXJl X2Zvcl9yZXN1bWluZyAodGhyZWFkKTsKKyAgZ2RiX2Fzc2VydCAoc2hvdWxkX3Jlc3VtZSk7Cisg IHByZXBhcmVfdGhyZWFkX3Jlc3VtZSAodGhyZWFkKTsKKyAgcmVnY2FjaGVfaW52YWxpZGF0ZV90 aHJlYWQgKHRocmVhZCk7CisgIHplX3Jlc3VtZSAoKmRldmljZSwgemV0cC0+aWQpOworfQorCitz aXplX3QKK3plX3RhcmdldDo6bWFya19ldmVudGluZ190aHJlYWRzIChwdGlkX3QgcmVzdW1lX3B0 aWQsIHJlc3VtZV9raW5kIHJraW5kKQoreworICAvKiBOb3RlIHRoYXQgZXZlbiBpZiB3ZSBzdG9w cGVkIGFsbCwgdW5hdmFpbGFibGUgdGhyZWFkcyBtYXkgc3RpbGwKKyAgICAgcmVwb3J0IG5ldyBl dmVudHMgYXMgd2Ugd2VyZSBub3QgYWJsZSB0byBzdG9wIHRoZW0uCisKKyAgICAgV2UgaWdub3Jl IHRob3NlIHRocmVhZHMgYW5kIHRoZSB1bmF2YWlsYWJsZSBldmVudCB0aGV5IHJlcG9ydC4gICov CisKKyAgc2l6ZV90IG51bV9ldmVudGluZyA9IDA7CisgIGZvcl9lYWNoX3RocmVhZCAoWz0sICZu dW1fZXZlbnRpbmddICh0aHJlYWRfaW5mbyAqdHApCisgICAgeworICAgICAgaWYgKCF0cC0+aWQu bWF0Y2hlcyAocmVzdW1lX3B0aWQpKQorCXJldHVybjsKKworICAgICAgaWYgKCF6ZV9oYXNfcHJp b3JpdHlfd2FpdHN0YXR1cyAodHApKQorCXsKKwkgICh2b2lkKSB6ZV9tb3ZlX3dhaXRzdGF0dXMg KHRwKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIHplX3RocmVhZF9pbmZvICp6ZXRwID0gemVf dGhyZWFkICh0cCk7CisgICAgICBnZGJfYXNzZXJ0ICh6ZXRwICE9IG51bGxwdHIpOworCisgICAg ICAvKiBJZiB0aGUgdGhyZWFkJ3Mgc3RvcCBldmVudCB3YXMgYmVpbmcgaGVsZCwgaXQgaXMgbm93 IHRoZSB0aW1lCisJIHRvIGNvbnZlcnQgdGhlIHN0YXRlIHRvICdzdG9wcGVkJyB0byB1bmxlYXNo IHRoZSBldmVudC4gICovCisgICAgICBpZiAoemV0cC0+ZXhlY19zdGF0ZSA9PSBaRV9USFJFQURf U1RBVEVfSEVMRCkKKwl6ZXRwLT5leGVjX3N0YXRlID0gWkVfVEhSRUFEX1NUQVRFX1NUT1BQRUQ7 CisKKyAgICAgIC8qIFRQIG1heSBoYXZlIHN0b3BwZWQgYXQgYSBicmVha3BvaW50IHRoYXQgaXMg YWxyZWFkeSBkZWxldGVkCisJIGJ5IEdEQi4gIENvbnNpZGVyIFRQIGFzIGFuIGV2ZW50aW5nIHRo cmVhZCBvbmx5IGlmIHRoZSBCUCBpcworCSBzdGlsbCB0aGVyZS4gIEJlY2F1c2Ugd2UgYXJlIGlu c2lkZSB0aGUgJ3Jlc3VtZScgcmVxdWVzdCwgaWYKKwkgdGhlIEJQIGlzIHZhbGlkLCBHREIgbXVz dCBoYXZlIGFscmVhZHkgcmUtaW5zZXJ0ZWQgaXQuCisKKwkgRklYTUU6IEtlZXAgdHJhY2sgb2Yg dGhlIHN0b3BfcGMgYW5kIGNvbXBhcmUgaXQgd2l0aCB0aGUKKwkgY3VycmVudCAoaS5lLiB0by1i ZS1yZXN1bWVkKSBwYy4gICovCisgICAgICBpZiAoKHpldHAtPmV4ZWNfc3RhdGUgPT0gWkVfVEhS RUFEX1NUQVRFX1NUT1BQRUQpCisJICAmJiAoemV0cC0+c3RvcF9yZWFzb24gPT0gVEFSR0VUX1NU T1BQRURfQllfU1dfQlJFQUtQT0lOVCkKKwkgICYmICFpc19hdF9icmVha3BvaW50ICh0cCkpCisJ eworCSAgLyogVGhlIEJQIGlzIGdvbmUuICBDbGVhciB0aGUgd2FpdHN0YXR1cywgdG9vLiAgKi8K KwkgIHRhcmdldF93YWl0c3RhdHVzIHdhaXRzdGF0dXMgPSB6ZV9tb3ZlX3dhaXRzdGF0dXMgKHRw KTsKKwkgIGlmICh3YWl0c3RhdHVzLmtpbmQgKCkgIT0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQp CisJICAgIHdhcm5pbmcgKF8oInRocmVhZCAlcyBoYXMgd2FpdHN0YXR1cyAlcywgZXhwZWN0ZWQg J1NUT1BQRUQnLiIpLAorCQkgICAgIHRwLT5pZC50b19zdHJpbmcgKCkuY19zdHIgKCksCisJCSAg ICAgd2FpdHN0YXR1cy50b19zdHJpbmcgKCkuY19zdHIgKCkpOworCSAgcmV0dXJuOworCX0KKwor ICAgICAgLyogVFAgbWF5IGhhdmUgc3RvcHBlZCBkdXJpbmcgcmFuZ2Utc3RlcHBpbmcsIGJ1dCB3 ZSByZXBvcnRlZAorCSBhbm90aGVyIHRocmVhZCB0byBHREIuICBUaGlzIG1lYW5zIHRoZSByYW5n ZS1zdGVwcGluZyBzdGF0ZQorCSBvZiBUUCBpcyBjYW5jZWxlZC4KKworCSBUaGUgY29uZGl0aW9u IGhlcmUgaXMgc2ltaWxhciB0bywgYnV0IG5vdCB0aGUgc2FtZSBhcworCSBpc19yYW5nZV9zdGVw cGluZy4gIFdlIGRvIG5vdCBjaGVjayBoZXJlIGlmIHRoZSB0aHJlYWQncyBzdG9wCisJIHBjIGlz IHdpdGhpbiB0aGUgc3RlcHBpbmcgcmFuZ2UuICBXZSByYXRoZXIgb25seSBjaGVjayBpZiB0aGVy ZQorCSB3YXMgYSByYW5nZSB0byBzdGVwLCBiZWNhdXNlIHRoZSB0aHJlYWQgbWF5IGhhdmUgc3Rv cHBlZCBqdXN0CisJIHdoZW4gaXQgY2FtZSBvdXQgb2YgdGhlIHJhbmdlLiAgV2Ugc2hvdWxkIGNh bmNlbCB0aGUgZXZlbnQgaW4KKwkgdGhhdCBjYXNlLCB0b28uICAqLworICAgICAgaWYgKHplX3Ro cmVhZF9zdG9wcGVkICh0cCkKKwkgICYmICh6ZXRwLT5zdG9wX3JlYXNvbiA9PSBUQVJHRVRfU1RP UFBFRF9CWV9TSU5HTEVfU1RFUCkKKwkgICYmICh6ZXRwLT5zdGVwX3JhbmdlX2VuZCA+IHpldHAt PnN0ZXBfcmFuZ2Vfc3RhcnQpKQorCXsKKwkgIHRhcmdldF93YWl0c3RhdHVzIHdhaXRzdGF0dXMg PSB6ZV9tb3ZlX3dhaXRzdGF0dXMgKHRwKTsKKwkgIGRwcmludGYgKCJUaHJlYWQgJXMgKCVzKSB3 YXMgcmFuZ2Utc3RlcHBpbmcsICIKKwkJICAgImNhbmNlbGluZyB0aGUgcGVuZGluZyBldmVudCIs CisJCSAgIHRwLT5pZC50b19zdHJpbmcgKCkuY19zdHIgKCksCisJCSAgIHplX3RocmVhZF9pZF9z dHIgKHpldHAtPmlkKS5jX3N0ciAoKSk7CisJICByZXR1cm47CisJfQorCisgICAgICAvKiBSZWNv dmVyIHRoZSByZXN1bWUgc3RhdGUgc28gdGhhdCB0aGUgdGhyZWFkIGNhbiBiZSBwaWNrZWQgdXAK KwkgYnkgJ3dhaXQnLiAgKi8KKyAgICAgIHplX3NldF9yZXN1bWVfc3RhdGUgKHRwLCBya2luZCk7 CisgICAgICBudW1fZXZlbnRpbmcrKzsKKyAgICB9KTsKKworICBkcHJpbnRmICgidGhlcmUgYXJl ICV6dSBldmVudGluZyB0aHJlYWRzIGZvciBwdGlkICVzIiwgbnVtX2V2ZW50aW5nLAorCSAgIHJl c3VtZV9wdGlkLnRvX3N0cmluZyAoKS5jX3N0ciAoKSk7CisKKyAgcmV0dXJuIG51bV9ldmVudGlu ZzsKK30KKworLyogRGlzcGxheSBhIHJlc3VtZSByZXF1ZXN0IGZvciBsb2dnaW5nIHB1cnBvc2Vz LiAgKi8KKworc3RhdGljIHZvaWQKK3ByaW50X3Jlc3VtZV9pbmZvIChjb25zdCB0aHJlYWRfcmVz dW1lICZyaW5mbykKK3sKKyAgcHRpZF90IHJwdGlkID0gcmluZm8udGhyZWFkOworCisgIHN3aXRj aCAocmluZm8ua2luZCkKKyAgICB7CisgICAgY2FzZSByZXN1bWVfY29udGludWU6CisgICAgICBk cHJpbnRmICgicmVjZWl2ZWQgJ2NvbnRpbnVlJyByZXN1bWUgcmVxdWVzdCBmb3IgKCVzKSIsCisJ ICAgICAgIHJwdGlkLnRvX3N0cmluZyAoKS5jX3N0ciAoKSk7CisgICAgICByZXR1cm47CisKKyAg ICBjYXNlIHJlc3VtZV9zdGVwOgorICAgICAgZHByaW50ZiAoInJlY2VpdmVkICdzdGVwJyByZXN1 bWUgcmVxdWVzdCBmb3IgKCVzKSIKKwkgICAgICAgIiBpbiByYW5nZSBbMHglIiBQUkl4NjQgIiwg MHglIiBQUkl4NjQgIikiLAorCSAgICAgICBycHRpZC50b19zdHJpbmcgKCkuY19zdHIgKCksCisJ ICAgICAgIHJpbmZvLnN0ZXBfcmFuZ2Vfc3RhcnQsIHJpbmZvLnN0ZXBfcmFuZ2VfZW5kKTsKKyAg ICAgIHJldHVybjsKKworICAgIGNhc2UgcmVzdW1lX3N0b3A6CisgICAgICBkcHJpbnRmICgicmVj ZWl2ZWQgJ3N0b3AnIHJlc3VtZSByZXF1ZXN0IGZvciAoJXMpIiwKKwkgICAgICAgcnB0aWQudG9f c3RyaW5nICgpLmNfc3RyICgpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaW50ZXJuYWxf ZXJyb3IgKF8oImJhZCByZXN1bWUga2luZDogJWQuIiksIHJpbmZvLmtpbmQpOworfQorCisvKiBO b3JtYWxpemUgdGhlIHJlc3VtZSByZXF1ZXN0cyBmb3IgZWFzaWVyIHByb2Nlc3NpbmcgbGF0ZXIg b24uICAqLworCitzdGF0aWMgdm9pZAorbm9ybWFsaXplX3Jlc3VtZV9pbmZvcyAodGhyZWFkX3Jl c3VtZSAqcmVzdW1lX2luZm8sIHNpemVfdCBuKQoreworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8 IG47ICsraSkKKyAgICB7CisgICAgICB0aHJlYWRfcmVzdW1lICZyaW5mbyA9IHJlc3VtZV9pbmZv W2ldOworICAgICAgcHRpZF90IHJwdGlkID0gcmluZm8udGhyZWFkOworCisgICAgICAvKiBMb2cg dGhlIG9yaWdpbmFsIHJlcXVlc3RzLiAgKi8KKyAgICAgIHByaW50X3Jlc3VtZV9pbmZvIChyaW5m byk7CisKKyAgICAgIC8qIFdlIGNvbnZlcnQgcHRpZHMgb2YgdGhlIGZvcm0gKHAsIC0xLCAwKSB0 byAocCwgMCwgMCkgdG8gbWFrZQorCSAncHRpZC5tYXRjaGVzJyB3b3JrLiAgVGhpcyB0cmFuc2Zv cm1hdGlvbiBpcyBzYWZlIGJlY2F1c2Ugd2UKKwkgZW51bWVyYXRlIHRoZSB0aHJlYWRzIHN0YXJ0 aW5nIGF0IDEuICAqLworICAgICAgaWYgKChycHRpZC5sd3AgKCkgPT0gLTEpICYmIChycHRpZC5w aWQgKCkgPiAwKSkKKwlyaW5mby50aHJlYWQgPSBwdGlkX3QgKHJwdGlkLnBpZCAoKSwgMCwgMCk7 CisKKyAgICAgIGlmIChyaW5mby5zaWcgIT0gMCkKKwl7CisJICAvKiAgQ2xlYXIgb3V0IHRoZSBz aWduYWwuICBPdXIgdGFyZ2V0IGRvZXMgbm90IGFjY2VwdAorCSAgICAgIHNpZ25hbHMuICAqLwor CSAgd2FybmluZyAoXygiSWdub3Jpbmcgc2lnbmFsIG9uIHJlc3VtZSByZXF1ZXN0IGZvciAlcyIp LAorCQkgICByaW5mby50aHJlYWQudG9fc3RyaW5nICgpLmNfc3RyICgpKTsKKwkgIHJpbmZvLnNp ZyA9IDA7CisJfQorICAgIH0KK30KKworLyogUmVzdW1pbmcgdGhyZWFkcyBvZiBhIGRldmljZSBh bGwgYXQgb25jZSB3aXRoIGEgc2luZ2xlIEFQSSBjYWxsCisgICBpcyBwcmVmZXJhYmxlIHRvIHJl c3VtaW5nIHRocmVhZHMgaW5kaXZpZHVhbGx5LiAgVGhlcmVmb3JlLCB3ZQorICAgd2FudCB0byBj b21iaW5lIGluZGl2aWR1YWwgcmVzdW1lIHJlcXVlc3RzIHdpdGggd2lsZGNhcmQgcmVzdW1lcywK KyAgIGlmIHBvc3NpYmxlLgorCisgICBGb3IgaW5zdGFuY2UsIGlmIHdlIHJlY2VpdmUgInZDb250 O3M6MTtzOjI7YyIsIHdlIHdvdWxkIGxpa2UgdG8KKyAgIG1ha2UgYSBzaW5nbGUgemVfcmVzdW1l IGNhbGwgd2l0aCB0aGUgJ2FsbC5hbGwuYWxsLmFsbCcgdGhyZWFkIGlkCisgICBhZnRlciBwcmVw YXJpbmcgdGhyZWFkcyAxIGFuZCAyIGZvciBzdGVwcGluZyBhbmQgdGhlIG90aGVycyBmb3IKKyAg IGNvbnRpbnVpbmcuCisKKyAgIFdlIHByZXByb2Nlc3MgdGhlIHJlc3VtZSByZXF1ZXN0cyB0byBm aW5kIGZvciB3aGljaCBkZXZpY2VzIHdlCisgICBzaGFsbCBjb21iaW5lIHRoZSByZXF1ZXN0cy4g IFdlIGF0dGVtcHQgYSBtZXJnZSBpbiBhbGwtc3RvcCBtb2RlCisgICB3aGVuIHRoZSByZXF1ZXN0 cyBjb250YWluIGNvbnRpbnVlL3N0ZXAgcmVxdWVzdHMgb25seS4gICovCisKK3N0YXRpYyBzdGQ6 OnNldDx6ZV9kZXZpY2VfaW5mbyAqPgorZmluZF93aWxkY2FyZF9kZXZpY2VzICh0aHJlYWRfcmVz dW1lICpyZXN1bWVfaW5mbywgc2l6ZV90IG4sCisJCSAgICAgICBjb25zdCBzdGQ6Omxpc3Q8emVf ZGV2aWNlX2luZm8gKj4gJmRldmljZXMpCit7CisgIHN0ZDo6c2V0PHplX2RldmljZV9pbmZvICo+ IHdpbGRjYXJkX2RldmljZXM7CisKKyAgaWYgKG5vbl9zdG9wKQorICAgIHJldHVybiB3aWxkY2Fy ZF9kZXZpY2VzOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgKytpKQorICAgIHsKKyAg ICAgIGlmIChyZXN1bWVfaW5mb1tpXS5raW5kID09IHJlc3VtZV9zdG9wKQorCXsKKwkgIHdpbGRj YXJkX2RldmljZXMuY2xlYXIgKCk7CisJICBicmVhazsKKwl9CisKKyAgICAgIHB0aWRfdCBycHRp ZCA9IHJlc3VtZV9pbmZvW2ldLnRocmVhZDsKKyAgICAgIGlmIChycHRpZCA9PSBtaW51c19vbmVf cHRpZCkKKwl7CisJICBmb3IgKHplX2RldmljZV9pbmZvICpkZXZpY2UgOiBkZXZpY2VzKQorCSAg ICB3aWxkY2FyZF9kZXZpY2VzLmluc2VydCAoZGV2aWNlKTsKKwkgIGJyZWFrOworCX0KKworICAg ICAgaWYgKHJwdGlkLmlzX3BpZCAoKSkKKwl7CisJICBwcm9jZXNzX2luZm8gKnByb2MgPSBmaW5k X3Byb2Nlc3NfcGlkIChycHRpZC5waWQgKCkpOworCSAgemVfZGV2aWNlX2luZm8gKmRldmljZSA9 IHplX3Byb2Nlc3NfZGV2aWNlIChwcm9jKTsKKwkgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikKKwkg ICAgd2lsZGNhcmRfZGV2aWNlcy5pbnNlcnQgKGRldmljZSk7CisJfQorICAgIH0KKworICByZXR1 cm4gd2lsZGNhcmRfZGV2aWNlczsKK30KKwordm9pZAoremVfdGFyZ2V0OjpyZXN1bWUgKHRocmVh ZF9yZXN1bWUgKnJlc3VtZV9pbmZvLCBzaXplX3QgbikKK3sKKyAgaWYgKGZyb3plbikKKyAgICBy ZXR1cm47CisKKyAgLyogSW4gYWxsLXN0b3AgbW9kZSwgYSBuZXcgcmVzdW1lIHJlcXVlc3Qgb3Zl cndyaXRlcyBhbnkgcHJldmlvdXMKKyAgICAgcmVxdWVzdC4gIFdlJ3JlIGdvaW5nIHRvIHNldCB0 aGUgcmVxdWVzdCBmb3IgYWZmZWN0ZWQgdGhyZWFkcyBiZWxvdy4KKyAgICAgQ2xlYXIgaXQgZm9y IGFsbCB0aHJlYWRzLCBoZXJlLgorCisgICAgIEluIHRoZSByZXN1bWUtYWxsIGNhc2UsIHRoaXMg d2lsbCBpdGVyYXRlIG92ZXIgYWxsIHRocmVhZHMgdHdpY2UgdG8KKyAgICAgZmlyc3QgY2xlYXIg YW5kIHRoZW4gc2V0IHRoZSByZXN1bWUgcmVxdWVzdC4gIE5vdCBpZGVhbCwgYnV0IGlmIHdlCisg ICAgIGZpcnN0IGl0ZXJhdGVkIG92ZXIgYWxsIHRocmVhZHMgdG8gc2V0IHRoZSByZXN1bWUgc3Rh dGUsIHdlJ2QgYWxzbworICAgICBoYXZlIHRvIGl0ZXJhdGUgb3ZlciBhbGwgdGhyZWFkcyBhZ2Fp biBpbiBvcmRlciB0byBhY3R1YWxseSByZXN1bWUKKyAgICAgdGhlbS4KKworICAgICBBbmQgaWYg d2UgaW52ZXJ0ZWQgdGhlIGxvb3BzIChpLmUuIGl0ZXJhdGUgb3ZlciB0aHJlYWRzLCB0aGVuIG92 ZXIKKyAgICAgcmVzdW1lIHJlcXVlc3RzKSwgd2UnZCBtaXNzIG91dCBvbiB0aGUgb3Bwb3J0dW5p dHkgdG8gcmVzdW1lIGFsbAorICAgICB0aHJlYWRzIGF0IG9uY2UuICAqLworICBpZiAoIW5vbl9z dG9wKQorICAgIGZvcl9lYWNoX3RocmVhZCAoW10gKHRocmVhZF9pbmZvICp0cCkKKyAgICAgIHsK Kwl6ZV9jbGVhcl9yZXN1bWVfc3RhdGUgKHRwKTsKKyAgICAgIH0pOworCisgIG5vcm1hbGl6ZV9y ZXN1bWVfaW5mb3MgKHJlc3VtZV9pbmZvLCBuKTsKKworICAvKiBDaGVjayBpZiB0aGVyZSBpcyBh IHRocmVhZCB3aXRoIGEgcGVuZGluZyBldmVudCBmb3IgYW55IG9mIHRoZQorICAgICByZXN1bWUg cmVxdWVzdHMuICBJbiBhbGwtc3RvcCBtb2RlLCB3ZSB3b3VsZCBvbWl0IGFjdHVhbGx5CisgICAg IHJlc3VtaW5nIHRoZSB0YXJnZXQgaWYgdGhlcmUgaXMgc3VjaCBhIHRocmVhZC4gIEluIG5vbi1z dG9wIG1vZGUsCisgICAgIHdlIG9taXQgcmVzdW1pbmcgdGhlIHRocmVhZCBpdHNlbGYuICAqLwor ICBzaXplX3QgbnVtX2V2ZW50aW5nID0gMDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyAr K2kpCisgICAgeworICAgICAgY29uc3QgdGhyZWFkX3Jlc3VtZSAmcmluZm8gPSByZXN1bWVfaW5m b1tpXTsKKyAgICAgIHJlc3VtZV9raW5kIHJraW5kID0gcmluZm8ua2luZDsKKyAgICAgIHB0aWRf dCBycHRpZCA9IHJpbmZvLnRocmVhZDsKKworICAgICAgaWYgKHJraW5kID09IHJlc3VtZV9zdG9w KQorCWNvbnRpbnVlOworCisgICAgICBudW1fZXZlbnRpbmcgKz0gbWFya19ldmVudGluZ190aHJl YWRzIChycHRpZCwgcmtpbmQpOworICAgIH0KKworICBpZiAoKG51bV9ldmVudGluZyA+IDApICYm ICFub25fc3RvcCkKKyAgICByZXR1cm47CisKKyAgc3RkOjpzZXQ8emVfZGV2aWNlX2luZm8gKj4g d2lsZGNhcmRfZGV2aWNlcworICAgID0gZmluZF93aWxkY2FyZF9kZXZpY2VzIChyZXN1bWVfaW5m bywgbiwgZGV2aWNlcyk7CisKKyAgc3RkOjpzZXQ8emVfZGV2aWNlX2luZm8gKj4gZGV2aWNlc190 b19yZXN1bWU7CisKKyAgLyogTGFtYmRhIGZvciBhcHBseWluZyBhIHJlc3VtZSBpbmZvIG9uIGEg c2luZ2xlIHRocmVhZC4gICovCisgIGF1dG8gYXBwbHlfcmVzdW1lX2luZm8gPSAoWyZdIChjb25z dCB0aHJlYWRfcmVzdW1lICZyaW5mbywKKwkJCQkgdGhyZWFkX2luZm8gKnRwKQorICAgIHsKKyAg ICAgIGlmICh6ZV9oYXNfcHJpb3JpdHlfd2FpdHN0YXR1cyAodHApKQorCXJldHVybjsKKworICAg ICAgemVfc2V0X3Jlc3VtZV9zdGF0ZSAodHAsIHJpbmZvLmtpbmQpOworICAgICAgemVfZGV2aWNl X2luZm8gKmRldmljZSA9IHplX3RocmVhZF9kZXZpY2UgKHRwKTsKKyAgICAgIHplX2RldmljZV90 aHJlYWRfdCB0aWQgPSB6ZV90aHJlYWRfaWQgKHRwKTsKKworICAgICAgc3dpdGNoIChyaW5mby5r aW5kKQorCXsKKwljYXNlIHJlc3VtZV9zdG9wOgorCSAgaWYgKHplX3ByZXBhcmVfZm9yX3N0b3Bw aW5nICh0cCkpCisJICAgIHplX2ludGVycnVwdCAoKmRldmljZSwgdGlkKTsKKwkgIGJyZWFrOwor CisJY2FzZSByZXN1bWVfc3RlcDoKKwkgIHsKKwkgICAgemVfdGhyZWFkX2luZm8gKnpldHAgPSB6 ZV90aHJlYWQgKHRwKTsKKwkgICAgZ2RiX2Fzc2VydCAoemV0cCAhPSBudWxscHRyKTsKKworCSAg ICByZWdjYWNoZSAqcmVnY2FjaGUKKwkgICAgICA9IGdldF90aHJlYWRfcmVnY2FjaGUgKHRwLCAv KiBmZXRjaCA9ICovIHRydWUpOworCSAgICBDT1JFX0FERFIgcGMgPSByZWFkX3BjIChyZWdjYWNo ZSk7CisKKwkgICAgLyogRm9yIHNpbmdsZS1zdGVwcGluZywgc3RhcnQgPT0gZW5kLiAgVHlwaWNh bGx5LCBib3RoIGFyZSAwLgorCSAgICAgICBGb3IgcmFuZ2Utc3RlcHBpbmcsIHRoZSBQQyBtdXN0 IGJlIHdpdGhpbiB0aGUgcmFuZ2UuICAqLworCSAgICBDT1JFX0FERFIgc3RhcnQgPSByaW5mby5z dGVwX3JhbmdlX3N0YXJ0OworCSAgICBDT1JFX0FERFIgZW5kID0gcmluZm8uc3RlcF9yYW5nZV9l bmQ7CisJICAgIGdkYl9hc3NlcnQgKChzdGFydCA9PSBlbmQpIHx8ICgocGMgPj0gc3RhcnQpICYm IChwYyA8IGVuZCkpKTsKKworCSAgICB6ZXRwLT5zdGVwX3JhbmdlX3N0YXJ0ID0gc3RhcnQ7CisJ ICAgIHpldHAtPnN0ZXBfcmFuZ2VfZW5kID0gZW5kOworCSAgfQorCisJICBbW2ZhbGx0aHJvdWdo XV07CisJY2FzZSByZXN1bWVfY29udGludWU6CisJICBpZiAoemVfcHJlcGFyZV9mb3JfcmVzdW1p bmcgKHRwKSkKKwkgICAgeworCSAgICAgIHByZXBhcmVfdGhyZWFkX3Jlc3VtZSAodHApOworCSAg ICAgIHJlZ2NhY2hlX2ludmFsaWRhdGVfdGhyZWFkICh0cCk7CisKKwkgICAgICAvKiBJZiB0aGUg ZGV2aWNlIGNhbiBiZSByZXN1bWVkIGFzIGEgd2hvbGUsCisJCSBvbWl0IHJlc3VtaW5nIHRoZSB0 aHJlYWQgaW5kaXZpZHVhbGx5LiAgKi8KKwkgICAgICBpZiAod2lsZGNhcmRfZGV2aWNlcy5jb3Vu dCAoZGV2aWNlKSA9PSAwKQorCQl6ZV9yZXN1bWUgKCpkZXZpY2UsIHRpZCk7CisJICAgICAgZWxz ZQorCQlkZXZpY2VzX3RvX3Jlc3VtZS5pbnNlcnQgKGRldmljZSk7CisJICAgIH0KKwkgIGJyZWFr OworCX0KKyAgICB9KTsKKworICAvKiBXZSBtYXkgcmVjZWl2ZSBtdWx0aXBsZSByZXF1ZXN0cyB0 aGF0IGFwcGx5IHRvIGEgdGhyZWFkLiAgRS5nLgorICAgICAidkNvbnQ7cjB4ZmYxMCwweGZmYTA6 cDEuOTtjIiBjb3VsZCBiZSBzZW50IHRvIG1ha2UgdGhyZWFkIDEuOSBkbworICAgICByYW5nZS1z dGVwcGluZyBmcm9tIDB4ZmYxMCB0byAweGZmYTAsIHdoaWxlIGNvbnRpbnVpbmcgb3RoZXJzLgor ICAgICBBY2NvcmRpbmcgdG8gdGhlIFJlbW90ZSBQcm90b2NvbCBTZWN0aW9uIEUuMiAoUGFja2V0 cyksCisgICAgICJGb3IgZWFjaCBpbmZlcmlvciB0aHJlYWQsIHRoZSBsZWZ0bW9zdCBhY3Rpb24g d2l0aCBhIG1hdGNoaW5nCisgICAgIHRocmVhZC1pZCBpcyBhcHBsaWVkLiIgIEZvciB0aGlzIHJl YXNvbiwgd2Uga2VlcCB0cmFjayBvZiB3aGljaAorICAgICB0aHJlYWRzIGhhdmUgYmVlbiByZXN1 bWVkIGluZGl2aWR1YWxseSBzbyB0aGF0IHdlIGNhbiBza2lwIHRoZW0KKyAgICAgd2hlbiBwcm9j ZXNzaW5nIHdpbGRjYXJkIHJlcXVlc3RzLgorCisgICAgIEFsdGVybmF0aXZlbHksIHdlIGNvdWxk IGhhdmUgdGhlIG91dGVyIGxvb3AgaXRlcmF0ZSBvdmVyIHRocmVhZHMKKyAgICAgYW5kIHRoZSBp bm5lciBsb29wIGl0ZXJhdGUgb3ZlciByZXN1bWUgaW5mb3MgdG8gZmluZCB0aGUgZmlyc3QKKyAg ICAgbWF0Y2hpbmcgcmVzdW1lIGluZm8gZm9yIGVhY2ggdGhyZWFkLiAgVGhlcmUgbWF5LCBob3dl dmVyLCBiZSBhCisgICAgIGxhcmdlIG51bWJlciBvZiB0aHJlYWRzIGFuZCBhIGhhbmRmdWwgb2Yg cmVzdW1lIGluZm9zIHRoYXQgYXBwbHkKKyAgICAgdG8gYSBmZXcgdGhyZWFkcyBvbmx5LiAgRm9y IHBlcmZvcm1hbmNlIHJlYXNvbnMsIHdlIHByZWZlciB0bworICAgICBpdGVyYXRlIG92ZXIgcmVz dW1lIGluZm9zIGluIHRoZSBvdXRlciBsb29wLiAgKi8KKyAgc3RkOjpzZXQ8dGhyZWFkX2luZm8g Kj4gaW5kaXZpZHVhbGx5X3Jlc3VtZWRfdGhyZWFkczsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkg PCBuOyArK2kpCisgICAgeworICAgICAgY29uc3QgdGhyZWFkX3Jlc3VtZSAmcmluZm8gPSByZXN1 bWVfaW5mb1tpXTsKKyAgICAgIGdkYl9hc3NlcnQgKHJpbmZvLnNpZyA9PSAwKTsKKyAgICAgIHB0 aWRfdCBycHRpZCA9IHJpbmZvLnRocmVhZDsKKyAgICAgIGludCBycGlkID0gcnB0aWQucGlkICgp OworICAgICAgaWYgKChycHRpZCA9PSBtaW51c19vbmVfcHRpZCkKKwkgIHx8IHJwdGlkLmlzX3Bp ZCAoKQorCSAgfHwgKHJwdGlkLmx3cCAoKSA9PSAtMSkpCisJeworCSAgZm9yICh6ZV9kZXZpY2Vf aW5mbyAqZGV2aWNlIDogZGV2aWNlcykKKwkgICAgeworCSAgICAgIGdkYl9hc3NlcnQgKGRldmlj ZSAhPSBudWxscHRyKTsKKworCSAgICAgIGludCBwaWQgPSB6ZV9kZXZpY2VfcGlkICgqZGV2aWNl KTsKKwkgICAgICBpZiAoKHJwaWQgIT0gLTEpICYmIChycGlkICE9IHBpZCkpCisJCWNvbnRpbnVl OworCisJICAgICAgZGV2aWNlLT5wcm9jZXNzLT5mb3JfZWFjaF90aHJlYWQgKFsmXSAodGhyZWFk X2luZm8gKnRwKQorCQl7CisJCSAgLyogV2UgdHJ1c3QgdGhhdCBHREIgd2lsbCBub3Qgc2VuZCB1 cyB3aWxkY2FyZCByZXN1bWUKKwkJICAgICByZXF1ZXN0cyB3aXRoIG92ZXJsYXBwaW5nIHBpZHMu ICBIZW5jZSwgd2UgdHJhY2sKKwkJICAgICBvbmx5IGluZGl2aWR1YWxseS1yZXN1bWVkIHRocmVh ZHMuICAqLworCQkgIGlmIChpbmRpdmlkdWFsbHlfcmVzdW1lZF90aHJlYWRzLmNvdW50ICh0cCkg PT0gMCkKKwkJICAgIGFwcGx5X3Jlc3VtZV9pbmZvIChyaW5mbywgdHApOworCQl9KTsKKwkgICAg fQorCX0KKyAgICAgIGVsc2UKKwl7CisJICB0aHJlYWRfaW5mbyAqdHAgPSBmaW5kX3RocmVhZF9w dGlkIChycHRpZCk7CisJICBhcHBseV9yZXN1bWVfaW5mbyAocmluZm8sIHRwKTsKKwkgIGluZGl2 aWR1YWxseV9yZXN1bWVkX3RocmVhZHMuaW5zZXJ0ICh0cCk7CisJfQorICAgIH0KKworICAvKiBG aW5hbGx5LCByZXN1bWUgdGhlIHdob2xlIGRldmljZXMuICAqLworICB6ZV9kZXZpY2VfdGhyZWFk X3QgYWxsID0gemVfdGhyZWFkX2lkX2FsbCAoKTsKKyAgZm9yICh6ZV9kZXZpY2VfaW5mbyAqZGV2 aWNlIDogZGV2aWNlc190b19yZXN1bWUpCisgICAgemVfcmVzdW1lICgqZGV2aWNlLCBhbGwpOwor fQorCisvKiBMb29rIGZvciBhIHRocmVhZCBwcmVmZXJhYmx5IHdpdGggYSBwcmlvcml0eSBzdG9w CisgICBldmVudC4gIElmIHdlIGNhbm5vdCBmaW5kIHN1Y2ggYW4gZXZlbnQsIHdlIGxvb2sgZm9y IGFuCisgICBpbnRlcnJ1cHQtcmVsYXRlZCBzdG9wIGV2ZW50LCBlLmcuICBhIHN0b3AgYmVjYXVz ZSBvZiBhbgorICAgZXh0ZXJuYWwgQ3RybC1DIG9yIGFuIGludGVybmFsIHBhdXNlX2FsbCByZXF1 ZXN0LiAgV2UgcGljaworICAgYSBUSFJFQURfVU5BVkFJTEFCTEUgZXZlbnQgZm9yIHJlcG9ydGlu ZyBhcyB0aGUgbGFzdCByZXNvcnQuCisKKyAgIFdlIGZpcnN0IG1ha2UgYW4gaXRlcmF0aW9uIG92 ZXIgdGhlIHRocmVhZHMgdG8gZmlndXJlIG91dAorICAgd2hhdCBraW5kIG9mIGFuIGV2ZW50IHdl IGNhbiByZXBvcnQuICBPbmNlIGZvdW5kLCB3ZSBzZWxlY3QKKyAgIGEgdGhyZWFkIHJhbmRvbWx5 LgorCisgICBJbiBhbGwtc3RvcCBtb2RlLCB3ZSB3aWxsIGlnbm9yZSB1bmF2YWlsYWJsZSB0aHJl YWRzIHdoZW4KKyAgIHJlc3VtaW5nIHRoZSB0YXJnZXQuICBTbywgdW5sZXNzIHdlIGV4cGxpY2l0 bHkgdHJ5IHRvIGludGVyYWN0CisgICB3aXRoIHRoZW0sIHVuYXZhaWxhYmxlIHRocmVhZHMgc2hv dWxkIGJlIHRyYW5zcGFyZW50IHRvIGFuCisgICBhbGwtc3RvcCB0YXJnZXQuCisKKyAgIEluIG5v bi1zdG9wIG1vZGUsIHdlIGdpdmUgbW9yZSB0aW1lIGZvciB1bmF2YWlsYWJsZSB0aHJlYWRzIHRv CisgICBiZWNvbWUgYXZhaWxhYmxlIGFuZCByZXBvcnQgYW4gZXZlbnQuICAqLworCitzdGF0aWMg dGhyZWFkX2luZm8gKgoremVfZmluZF9ldmVudGluZ190aHJlYWQgKHB0aWRfdCBwdGlkKQorewor ICB1c2luZyB0aHJlYWRfcHJlZGljYXRlID0gYm9vbCAoKikgKGNvbnN0IHRocmVhZF9pbmZvICop OworICB0aHJlYWRfcHJlZGljYXRlIGlzX3N0b3BwZWQgPSBbXSAoY29uc3QgdGhyZWFkX2luZm8g KnRwKQorICB7CisgICAgcmV0dXJuICh6ZV90aHJlYWQgKHRwKS0+d2FpdHN0YXR1cy5raW5kICgp ID09IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEKTsKKyAgfTsKKworICB0aHJlYWRfcHJlZGljYXRl IHByZWRpY2F0ZSA9IG51bGxwdHI7CisgIGZpbmRfdGhyZWFkIChwdGlkLCBbJl0gKHRocmVhZF9p bmZvICp0cCkKKyAgICB7CisgICAgICAvKiBPbmx5IGNvbnNpZGVyIHRocmVhZHMgdGhhdCB3ZXJl IHJlc3VtZWQuICAqLworICAgICAgemVfdGhyZWFkX3Jlc3VtZV9zdGF0ZV90IHN0YXRlID0gemVf cmVzdW1lX3N0YXRlICh0cCk7CisgICAgICBpZiAoc3RhdGUgPT0gWkVfVEhSRUFEX1JFU1VNRV9O T05FKQorCXJldHVybiBmYWxzZTsKKworICAgICAgLyogSWYgdGhpcyB0aHJlYWQncyBldmVudCBp cyBiZWluZyBoZWxkLCB3ZSBkbyBub3QgcGljayBpdCBmb3IKKwkgcmVwb3J0aW5nLiAgKi8KKyAg ICAgIHplX3RocmVhZF9leGVjX3N0YXRlX3QgZXhlY19zdGF0ZSA9IHplX2V4ZWNfc3RhdGUgKHRw KTsKKyAgICAgIGlmIChleGVjX3N0YXRlID09IFpFX1RIUkVBRF9TVEFURV9IRUxEKQorCXJldHVy biBmYWxzZTsKKworICAgICAgaWYgKHplX2hhc19wcmlvcml0eV93YWl0c3RhdHVzICh0cCkpCisJ eworCSAgcHJlZGljYXRlID0gemVfaGFzX3ByaW9yaXR5X3dhaXRzdGF0dXM7CisJICByZXR1cm4g dHJ1ZTsKKwl9CisKKyAgICAgIGlmIChpc19zdG9wcGVkICh0cCkpCisJcHJlZGljYXRlID0gaXNf c3RvcHBlZDsKKyAgICAgIGVsc2UgaWYgKChwcmVkaWNhdGUgPT0gbnVsbHB0cikgJiYgemVfaGFz X3dhaXRzdGF0dXMgKHRwKSkKKwlwcmVkaWNhdGUgPSB6ZV9oYXNfd2FpdHN0YXR1czsKKworICAg ICAgcmV0dXJuIGZhbHNlOworICAgIH0pOworCisgIHRocmVhZF9pbmZvICp0aHJlYWQgPSBudWxs cHRyOworICBpZiAocHJlZGljYXRlICE9IG51bGxwdHIpCisgICAgdGhyZWFkID0gZmluZF90aHJl YWRfaW5fcmFuZG9tIChwdGlkLCBbcHJlZGljYXRlXSAodGhyZWFkX2luZm8gKnRwKQorICAgICAg eworCS8qIE9ubHkgY29uc2lkZXIgdGhyZWFkcyB0aGF0IHdlcmUgcmVzdW1lZC4gICovCisJemVf dGhyZWFkX3Jlc3VtZV9zdGF0ZV90IHN0YXRlID0gemVfcmVzdW1lX3N0YXRlICh0cCk7CisJaWYg KHN0YXRlID09IFpFX1RIUkVBRF9SRVNVTUVfTk9ORSkKKwkgIHJldHVybiBmYWxzZTsKKworCS8q IFRocmVhZHMgd2l0aCBoZWxkIGV2ZW50cyBhcmUgbm90IHBpY2tlZC4gICovCisJemVfdGhyZWFk X2V4ZWNfc3RhdGVfdCBleGVjX3N0YXRlID0gemVfZXhlY19zdGF0ZSAodHApOworCWlmIChleGVj X3N0YXRlID09IFpFX1RIUkVBRF9TVEFURV9IRUxEKQorCSAgcmV0dXJuIGZhbHNlOworCisJcmV0 dXJuIHByZWRpY2F0ZSAodHApOworICAgICAgfSk7CisgIHJldHVybiB0aHJlYWQ7Cit9CisKK3B0 aWRfdAoremVfdGFyZ2V0Ojp3YWl0IChwdGlkX3QgcHRpZCwgdGFyZ2V0X3dhaXRzdGF0dXMgKnN0 YXR1cywKKwkJIHRhcmdldF93YWl0X2ZsYWdzIG9wdGlvbnMpCit7CisgIC8qIFdlIG5lZWQgdG8g d2FpdCBmb3IgZnVydGhlciBldmVudHMuICAqLworICB6ZV9hc3luY19tYXJrICgpOworCisgIGRv CisgICAgeworICAgICAgLyogV2Ugc3RhcnQgYnkgZmV0Y2hpbmcgYWxsIGV2ZW50cy4KKworCSBU aGlzIHdpbGwgbWFyayB0aHJlYWRzIHN0b3BwZWQgYW5kIGFsc28gcHJvY2VzcyBzb2xpc3QgdXBk YXRlcy4gIFdlIG1heQorCSBnZXQgc29saXN0IHVwZGF0ZXMgZXZlbiBpZiBhbGwgZGV2aWNlIHRo cmVhZHMgYXJlIHJ1bm5pbmcuCisKKwkgRm9yIGFsbC1zdG9wLCB3ZSBhbnl3YXkgd2FudCB0byBz dG9wIGFsbCB0aHJlYWRzIGFuZCBkcmFpbiBldmVudHMKKwkgYmVmb3JlIHJlcG9ydGluZyB0aGUg c3RvcCB0byBHREIuCisKKwkgRm9yIG5vbi1zdG9wLCB0aGlzIHdpbGwgYWxsb3cgdXMgdG8gZ3Jv dXAgc3RvcCBldmVudHMgZm9yIG11bHRpcGxlCisJIHRocmVhZHMuICAqLworICAgICAgdWludDY0 X3QgbmV2ZW50czsKKyAgICAgIGRvCisJeworCSAgbmV2ZW50cyA9IDA7CisKKwkgIGZvciAoemVf ZGV2aWNlX2luZm8gKmRldmljZSA6IGRldmljZXMpCisJICAgIHsKKwkgICAgICBnZGJfYXNzZXJ0 IChkZXZpY2UgIT0gbnVsbHB0cik7CisJICAgICAgLyogRmV0Y2ggZnJvbSBhbnkgZGV2aWNlLCBy ZWdhcmRsZXNzIG9mIFBUSUQsIHNvIHRoYXQgd2UKKwkJIGRyYWluIHRoZSBldmVudCBxdWV1ZXMg YXMgbXVjaCBhcyBwb3NzaWJsZS4gIFdlIHVzZQorCQkgUFRJRCBkb3duIGJlbG93IHRvIGZpbHRl ciB0aGUgZXZlbnRzIGFueXdheS4gICovCisJICAgICAgbmV2ZW50cyArPSBmZXRjaF9ldmVudHMg KCpkZXZpY2UpOworCSAgICB9CisJfQorICAgICAgd2hpbGUgKG5ldmVudHMgPiAwKTsKKworICAg ICAgLyogTmV4dCwgZmluZCBhIG1hdGNoaW5nIGVudGl0eSwgd2hvc2UgZXZlbnQgd2UnbGwgcmVw b3J0LgorCisJIFdlIHByaW9yaXRpemUgcHJvY2VzcyBldmVudHMgc2luY2UgdGhleSBhcmUgdHlw aWNhbGx5IGEgbG90IHJhcmVyIGFuZAorCSBmdXJ0aGVyIGhhdmUgaGlnaGVyIGltcGFjdCBhbmQg c2hvdWxkIGJlIGhhbmRsZWQgYmVmb3JlIGFueSB0aHJlYWQKKwkgZXZlbnRzIG9mIHRoYXQgcHJv Y2Vzcy4KKworCSBQcm9jZXNzIGV2ZW50cyBhcmUgbm8gc3RvcCBldmVudHMuICBUaGV5IGxlYXZl IHRocmVhZHMgcnVubmluZywKKwkgZXZlbiBpbiBhbGwtc3RvcCBtb2RlLiAgKi8KKyAgICAgIHBy b2Nlc3NfaW5mbyAqcHJvY2VzcworCT0gZmluZF9wcm9jZXNzIChbcHRpZCwgdGhpc10gKHByb2Nl c3NfaW5mbyAqcHJvYykKKwkgIHsKKwkgICAgaWYgKCFwdGlkX3QgKHByb2MtPnBpZCkubWF0Y2hl cyAocHRpZCkpCisJICAgICAgcmV0dXJuIGZhbHNlOworCisJICAgIHByb2Nlc3NfaW5mb19wcml2 YXRlICp6ZXByb2MgPSBwcm9jLT5wcml2OworCSAgICBnZGJfYXNzZXJ0ICh6ZXByb2MgIT0gbnVs bHB0cik7CisKKwkgICAgcmV0dXJuICh6ZXByb2MtPndhaXRzdGF0dXMua2luZCAoKSAhPSBUQVJH RVRfV0FJVEtJTkRfSUdOT1JFKTsKKwkgIH0pOworCisgICAgICAvKiBJZiB3ZSBmb3VuZCBhIHBy b2Nlc3MgZXZlbnQsIGl0IGlzIG91ciBwcmltYXJ5IGNhbmRpZGF0ZS4KKworCSBQcm9jZXNzIGV2 ZW50cyB3aXRoIGEgbG93IHByaW9yaXR5IFVOQVZBSUxBQkxFIHdhaXRzdGF0dXMgZG8gbm90CisJ IHN0b3AgdGhlIHRhcmdldCBpbiBhbGwtc3RvcCwgYnV0IHNvbWUgb2YgaXRzIHRocmVhZHMgbWln aHQgaGF2ZSBhCisJIHBlbmRpbmcgd2FpdHN0YXR1cywgd2hpY2ggcmVxdWlyZXMgdGhlIHN0b3Au ICBJZiBzdWNoIFRIUkVBRCBpcworCSBmb3VuZCwgd2UgcHJpb3JpdGl6ZSBpdCwgY2xlYW4gdGhl IHByb2Nlc3Mgd2FpdHN0YXR1cywgYW5kIGZhbGwKKwkgdGhyb3VnaCB0byB0aGUgdGhyZWFkIHJl cG9ydGluZy4gIFRoZSBwcm9jZXNzIGV2ZW50IHdpbGwKKwkgcGlnZ3liYWNrIG9uIGl0LgorCisJ IFdlIGRvIG5vdCB0YWtlIGFueSBzcGVjaWFsIGNhcmUgYWJvdXQgZmFpcm5lc3MgYXMgd2UgZXhw ZWN0IHByb2Nlc3MKKwkgZXZlbnRzIHRvIGJlIHJhdGhlciByYXJlLiAgKi8KKyAgICAgIHRocmVh ZF9pbmZvICp0aHJlYWQgPSBudWxscHRyOworICAgICAgaWYgKHByb2Nlc3MgIT0gbnVsbHB0cikK Kwl7CisJICBwcm9jZXNzX2luZm9fcHJpdmF0ZSAqemVwcm9jID0gcHJvY2Vzcy0+cHJpdjsKKwkg IGdkYl9hc3NlcnQgKHplcHJvYyAhPSBudWxscHRyKTsKKwkgIHB0aWRfdCBwcm9jZXNzX3B0aWQg PSBwdGlkX3QgKHByb2Nlc3MtPnBpZCk7CisKKwkgIC8qIElmIHdlIGdvdCBhbiB1bmF2YWlsYWJs ZSBwcm9jZXNzIGV2ZW50LCB0cnkgdG8gZmluZCBhbm90aGVyCisJICAgICBldmVudGluZyB0aHJl YWQgZm9yIHRoaXMgcHJvY2Vzcy4gICovCisJICBpZiAoemVwcm9jLT53YWl0c3RhdHVzLmtpbmQg KCkgPT0gVEFSR0VUX1dBSVRLSU5EX1VOQVZBSUxBQkxFKQorCSAgICB0aHJlYWQgPSB6ZV9maW5k X2V2ZW50aW5nX3RocmVhZCAocHJvY2Vzc19wdGlkKTsKKworCSAgLyogSWYgbm90IGZvdW5kLCBy ZXR1cm4gdGhlIHByb2Nlc3MgYW5kIGNsZWFuIGl0cyB3YWl0c3RhdHVzLiAgKi8KKwkgIGlmICh0 aHJlYWQgPT0gbnVsbHB0cikKKwkgICAgeworCSAgICAgICpzdGF0dXMgPSB6ZXByb2MtPndhaXRz dGF0dXM7CisJICAgICAgemVwcm9jLT53YWl0c3RhdHVzLnNldF9pZ25vcmUgKCk7CisKKwkgICAg ICByZXR1cm4gcHJvY2Vzc19wdGlkOworCSAgICB9CisKKwkgIC8qIFRIUkVBRCBzaG91bGQgYWx3 YXlzIG1hdGNoIHRoZSBQVElEOiB3ZSBnb3QgYSBwcm9jZXNzIGV2ZW50LAorCSAgICAgc28gUFRJ RCBtdXN0IGJlIGVpdGhlciBtaW51c19vbmUgb3IgdGhlIHByb2Nlc3MncyBwdGlkLiAgKi8KKwkg IGdkYl9hc3NlcnQgKHRocmVhZC0+aWQubWF0Y2hlcyAocHRpZCkpOworCisJICAvKiBUaGUgcHJv Y2VzcyBldmVudCB3aWxsIHBpZ2d5YmFjayBvbnRvIHRoZSBUSFJFQUQgZXZlbnQuCisJICAgICBI b3dldmVyLCB3ZSBzdGlsbCBuZWVkIHRvIGNsZWFuIHRoZSBwcm9jZXNzIHN0YXR1cy4gICovCisJ ICB6ZXByb2MtPndhaXRzdGF0dXMuc2V0X2lnbm9yZSAoKTsKKwl9CisKKyAgICAgIC8qIElmIHdl IGhhdmUgcHJldmlvdXNseSBmb3VuZCBUSFJFQUQgZm9yIHRoZSBQUk9DRVNTLCB3ZSB1c2UgaXQu CisgICAgICAgICBPdGhlcndpc2UsIHByb2NlZWQgd2l0aCBzZWFyY2hpbmcgZm9yIGEgdGhyZWFk IGV2ZW50IGZvciBQVElELiAgKi8KKyAgICAgIGlmICh0aHJlYWQgPT0gbnVsbHB0cikKKwl0aHJl YWQgPSB6ZV9maW5kX2V2ZW50aW5nX3RocmVhZCAocHRpZCk7CisKKyAgICAgIGlmICh0aHJlYWQg IT0gbnVsbHB0cikKKwl7CisJICB6ZV90aHJlYWRfaW5mbyAqemV0cCA9IHplX3RocmVhZCAodGhy ZWFkKTsKKwkgIGdkYl9hc3NlcnQgKHpldHAgIT0gbnVsbHB0cik7CisKKwkgIGlmIChpc19yYW5n ZV9zdGVwcGluZyAodGhyZWFkKSkKKwkgICAgeworCSAgICAgIC8qIFdlIGFyZSBpbnNpZGUgdGhl IHN0ZXBwaW5nIHJhbmdlLiAgUmVzdW1lIHRoZSB0aHJlYWQKKwkJIGFuZCBnbyBiYWNrIHRvIGZl dGNoaW5nIGV2ZW50cy4gICovCisJICAgICAgZHByaW50ZiAoInRocmVhZCAlcyBpcyBzdGVwcGlu ZyBpbiByYW5nZSAiCisJCSAgICAgICAiWzB4JSIgUFJJeDY0ICIsIDB4JSIgUFJJeDY0ICIpIiwK KwkJICAgICAgIHplX3RocmVhZF9pZF9zdHIgKHpldHAtPmlkKS5jX3N0ciAoKSwKKwkJICAgICAg IHpldHAtPnN0ZXBfcmFuZ2Vfc3RhcnQsIHpldHAtPnN0ZXBfcmFuZ2VfZW5kKTsKKworCSAgICAg IHpldHAtPndhaXRzdGF0dXMuc2V0X2lnbm9yZSAoKTsKKwkgICAgICBnZGJfYXNzZXJ0ICh6ZXRw LT5yZXN1bWVfc3RhdGUgPT0gWkVfVEhSRUFEX1JFU1VNRV9TVEVQKTsKKworCSAgICAgIHJlc3Vt ZV9zaW5nbGVfdGhyZWFkICh0aHJlYWQpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkg IC8qIFJlc3VtZSBhbnkgdGhyZWFkIHdlIGRpZG4ndCB3YW50IHN0b3BwZWQuICAqLworCSAgaWYg KCh6ZXRwLT5zdG9wX3JlYXNvbiA9PSBUQVJHRVRfU1RPUFBFRF9CWV9OT19SRUFTT04pCisJICAg ICAgJiYgKHpldHAtPndhaXRzdGF0dXMua2luZCAoKSA9PSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBF RCkKKwkgICAgICAmJiAoemV0cC0+d2FpdHN0YXR1cy5zaWcgKCkgPT0gR0RCX1NJR05BTF8wKSkK KwkgICAgeworCSAgICAgIGRwcmludGYgKCJzaWxlbnRseSByZXN1bWluZyB0aHJlYWQgJXMgKCVz KSIsCisJCSAgICAgICB0aHJlYWQtPmlkLnRvX3N0cmluZyAoKS5jX3N0ciAoKSwKKwkJICAgICAg IHplX3RocmVhZF9pZF9zdHIgKHpldHAtPmlkKS5jX3N0ciAoKSk7CisKKwkgICAgICAvKiBVbmRv IGFueSBwcmV2aW91cyBob2xkaW5nIG9mIHRoZSBldmVudC4gICovCisJICAgICAgemV0cC0+ZXhl Y19zdGF0ZSA9IFpFX1RIUkVBRF9TVEFURV9TVE9QUEVEOworCSAgICAgIHpldHAtPndhaXRzdGF0 dXMuc2V0X2lnbm9yZSAoKTsKKwkgICAgICB6ZV9zZXRfcmVzdW1lX3N0YXRlICh0aHJlYWQsIHJl c3VtZV9jb250aW51ZSk7CisKKwkgICAgICByZXN1bWVfc2luZ2xlX3RocmVhZCAodGhyZWFkKTsK KwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICAvKiBTdG9wIGFsbCBvdGhlciB0aHJlYWRz LgorCisJICAgICBTYXZlIHRoZSB3YWl0c3RhdHVzIGJlZm9yZSwgYmVjYXVzZSBwYXVzZV9hbGwg Y2xlYXJzIGFsbAorCSAgICAgbG93LXByaW9yaXR5IGV2ZW50cy4gICovCisJICAqc3RhdHVzID0g emV0cC0+d2FpdHN0YXR1czsKKworCSAgaWYgKCFub25fc3RvcCkKKwkgICAgcGF1c2VfYWxsIChm YWxzZSk7CisKKwkgIC8qIE5vdyBhbHNvIGNsZWFyIHRoZSB0aHJlYWQncyBldmVudCwgcmVnYXJk bGVzcyBvZiBpdHMKKwkgICAgIHByaW9yaXR5LiAgKi8KKwkgIHpldHAtPndhaXRzdGF0dXMuc2V0 X2lnbm9yZSAoKTsKKwkgIHpldHAtPnN0ZXBfcmFuZ2Vfc3RhcnQgPSAwOworCSAgemV0cC0+c3Rl cF9yYW5nZV9lbmQgPSAwOworCisJICAvKiBGSVhNRTogc3dpdGNoX3RvX3RocmVhZAorCisJICAg ICBXaHkgaXNuJ3QgdGhlIGNhbGxlciBzd2l0Y2hpbmcgYmFzZWQgb24gdGhlIHJldHVybmVkIHB0 aWQ/ICAqLworCSAgc3dpdGNoX3RvX3RocmVhZCAodGhyZWFkKTsKKwkgIHJldHVybiB0aHJlYWQt PmlkOworCX0KKworICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQgKCk7CisgICAgfQorICB3 aGlsZSAoKG9wdGlvbnMgJiBUQVJHRVRfV05PSEFORykgPT0gMCk7CisKKyAgLyogV2Ugb25seSBn ZXQgaGVyZSBpZiB3ZSBkaWQgbm90IGZpbmQgYW55IGV2ZW50IHRvIHJlcG9ydC4gICovCisKKyAg c3RhdHVzLT5zZXRfaWdub3JlICgpOworICByZXR1cm4gbnVsbF9wdGlkOworfQorCit2b2lkCit6 ZV90YXJnZXQ6OmZldGNoX3JlZ2lzdGVycyAocmVnY2FjaGUgKnJlZ2NhY2hlLCBpbnQgcmVnbm8p Cit7CisgIHplX2RldmljZV90aHJlYWRfdCB0aWQgPSB6ZV90aHJlYWRfaWQgKHJlZ2NhY2hlLT50 aHJlYWQpOworICB6ZV9kZXZpY2VfaW5mbyAqZGV2aWNlID0gemVfdGhyZWFkX2RldmljZSAocmVn Y2FjaGUtPnRocmVhZCk7CisgIGdkYl9hc3NlcnQgKGRldmljZSAhPSBudWxscHRyKTsKKworICBp ZiAocmVnbm8gPT0gLTEpCisgICAgemVfZmV0Y2hfYWxsX3JlZ2lzdGVycyAoKmRldmljZSwgdGlk LCByZWdjYWNoZSk7CisgIGVsc2UKKyAgICB6ZV9mZXRjaF9yZWdpc3RlciAoKmRldmljZSwgdGlk LCByZWdjYWNoZSwgcmVnbm8pOworfQorCit2b2lkCit6ZV90YXJnZXQ6OnN0b3JlX3JlZ2lzdGVy cyAocmVnY2FjaGUgKnJlZ2NhY2hlLCBpbnQgcmVnbm8pCit7CisgIHplX2RldmljZV90aHJlYWRf dCB0aWQgPSB6ZV90aHJlYWRfaWQgKHJlZ2NhY2hlLT50aHJlYWQpOworICB6ZV9kZXZpY2VfaW5m byAqZGV2aWNlID0gemVfdGhyZWFkX2RldmljZSAocmVnY2FjaGUtPnRocmVhZCk7CisgIGdkYl9h c3NlcnQgKGRldmljZSAhPSBudWxscHRyKTsKKworICBpZiAocmVnbm8gPT0gLTEpCisgICAgemVf c3RvcmVfYWxsX3JlZ2lzdGVycyAoKmRldmljZSwgdGlkLCByZWdjYWNoZSk7CisgIGVsc2UKKyAg ICB6ZV9zdG9yZV9yZWdpc3RlciAoKmRldmljZSwgdGlkLCByZWdjYWNoZSwgcmVnbm8pOworfQor CisvKiBEZXRlcm1pbmUgdGhlIHRocmVhZCBpZCBhbmQgZGV2aWNlIGNvbnRleHQgZm9yIGFjY2Vz c2luZyBBRERSX1NQQUNFCisgICBmcm9tIFRIUkVBRC4gICovCitzdGF0aWMgc3RkOjpwYWlyPHpl X2RldmljZV90aHJlYWRfdCwgemVfZGV2aWNlX2luZm8gKj4KK3plX21lbW9yeV9hY2Nlc3NfY29u dGV4dCAodGhyZWFkX2luZm8gKnRocmVhZCwgdW5zaWduZWQgaW50IGFkZHJfc3BhY2UpCit7Cisg IC8qIFdpdGggYSBzdG9wcGVkIHRocmVhZCwgd2UgY2FuIGFjY2VzcyBhbGwgYWRkcmVzcyBzcGFj ZXMsIGFuZCB3ZQorICAgICBzaG91bGQgYmUgYWJsZSB0byBkZXRlcm1pbmUgdGhlIGRldmljZSBm b3IgdGhhdCB0aHJlYWQuICAqLworICBpZiAoemVfdGhyZWFkX3N0b3BwZWQgKHRocmVhZCkpCisg ICAgcmV0dXJuIHN0ZDo6cGFpcjx6ZV9kZXZpY2VfdGhyZWFkX3QsIHplX2RldmljZV9pbmZvICo+ CisgICAgICB7IHplX3RocmVhZF9pZCAodGhyZWFkKSwgemVfdGhyZWFkX2RldmljZSAodGhyZWFk KSB9OworCisgIC8qIFdpdGhvdXQgYSBzdG9wcGVkIHRocmVhZCwgd2UgbWF5IG9ubHkgYWNjZXNz IHRoZSBkZWZhdWx0IGFkZHJlc3MKKyAgICAgc3BhY2UgYW5kIG9ubHkgaW4gdGhlIGNvbnRleHQg b2YgdGhyZWFkIEFMTC4gICovCisgIGlmIChhZGRyX3NwYWNlICE9IFpFVF9ERUJVR19NRU1PUllf U1BBQ0VfVFlQRV9ERUZBVUxUKQorICAgIGVycm9yIChfKCJuZWVkIHRocmVhZCB0byBhY2Nlc3Mg bm9uLWRlZmF1bHQgYWRkcmVzcyBzcGFjZS4iKSk7CisKKyAgLyogVHJ5IHRvIGRldGVybWluZSB0 aGUgZGV2aWNlIHVzaW5nIFRIUkVBRCBidXQgZmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50CisgICAg IHByb2Nlc3MnIGRldmljZSwgZS5nLiBpZiBUSFJFQUQgaXMgbnVsbHB0ci4gICovCisgIHplX2Rl dmljZV9pbmZvICpkZXZpY2UgPSB6ZV90aHJlYWRfZGV2aWNlICh0aHJlYWQpOworICBpZiAoZGV2 aWNlID09IG51bGxwdHIpCisgICAgeworICAgICAgcHJvY2Vzc19pbmZvICpwcm9jZXNzID0gY3Vy cmVudF9wcm9jZXNzICgpOworICAgICAgZGV2aWNlID0gemVfcHJvY2Vzc19kZXZpY2UgKHByb2Nl c3MpOworCisgICAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpCisJZXJyb3IgKF8oImNhbm5vdCBk ZXRlcm1pbmUgZGV2aWNlIGZvciBtZW1vcnkgYWNjZXNzLiIpKTsKKyAgICB9CisKKyAgcmV0dXJu IHN0ZDo6cGFpcjx6ZV9kZXZpY2VfdGhyZWFkX3QsIHplX2RldmljZV9pbmZvICo+CisgICAgeyB6 ZV90aHJlYWRfaWRfYWxsICgpLCBkZXZpY2UgfTsKK30KKworaW50Cit6ZV90YXJnZXQ6OnJlYWRf bWVtb3J5ICh0aHJlYWRfaW5mbyAqdHAsIENPUkVfQUREUiBtZW1hZGRyLAorCQkJdW5zaWduZWQg Y2hhciAqbXlhZGRyLCBpbnQgbGVuKQoreworICB1bnNpZ25lZCBpbnQgYWRkcl9zcGFjZSA9IDA7 IC8qIE9ubHkgdGhlIGRlZmF1bHQgc3BhY2UgZm9yIG5vdy4gICovCisgIHpldF9kZWJ1Z19tZW1v cnlfc3BhY2VfZGVzY190IGRlc2M7CisKKyAgbWVtc2V0ICgmZGVzYywgMCwgc2l6ZW9mIChkZXNj KSk7CisgIGRlc2Muc3R5cGUgPSBaRVRfU1RSVUNUVVJFX1RZUEVfREVCVUdfTUVNT1JZX1NQQUNF X0RFU0M7CisgIGRlc2MucE5leHQgPSBudWxscHRyOworICBkZXNjLnR5cGUgPSAoemV0X2RlYnVn X21lbW9yeV9zcGFjZV90eXBlX3QpIGFkZHJfc3BhY2U7CisgIGRlc2MuYWRkcmVzcyA9ICh1aW50 NjRfdCkgbWVtYWRkcjsKKworICBzdGQ6OnBhaXI8emVfZGV2aWNlX3RocmVhZF90LCB6ZV9kZXZp Y2VfaW5mbyAqPiBjb250ZXh0CisgICAgPSB6ZV9tZW1vcnlfYWNjZXNzX2NvbnRleHQgKHRwLCBh ZGRyX3NwYWNlKTsKKyAgemVfZGV2aWNlX3RocmVhZF90IHRocmVhZCA9IGNvbnRleHQuZmlyc3Q7 CisgIHplX2RldmljZV9pbmZvICpkZXZpY2UgPSBjb250ZXh0LnNlY29uZDsKKyAgZ2RiX2Fzc2Vy dCAoZGV2aWNlICE9IG51bGxwdHIpOworCisgIHplX3Jlc3VsdF90IHN0YXR1cyA9IHpldERlYnVn UmVhZE1lbW9yeSAoZGV2aWNlLT5zZXNzaW9uLCB0aHJlYWQsICZkZXNjLAorCQkJCQkgICBsZW4s IG15YWRkcik7CisgIHN3aXRjaCAoc3RhdHVzKQorICAgIHsKKyAgICBjYXNlIFpFX1JFU1VMVF9T VUNDRVNTOgorICAgICAgcmV0dXJuIDA7CisKKyAgICBkZWZhdWx0OgorICAgICAgZHByaW50ZiAo ImVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgb2YgbWVtb3J5IGZyb20gJXMgd2l0aCAlczogJXgiLAor CSAgICAgICBsZW4sIGNvcmVfYWRkcl90b19zdHJpbmdfbnogKG1lbWFkZHIpLAorCSAgICAgICB6 ZV90aHJlYWRfaWRfc3RyICh0aHJlYWQpLmNfc3RyICgpLCBzdGF0dXMpOworCisgICAgICByZXR1 cm4gRUlPOworICAgIH0KK30KKworaW50Cit6ZV90YXJnZXQ6OnJlYWRfbWVtb3J5IChDT1JFX0FE RFIgbWVtYWRkciwgdW5zaWduZWQgY2hhciAqbXlhZGRyLCBpbnQgbGVuKQoreworICByZXR1cm4g cmVhZF9tZW1vcnkgKGN1cnJlbnRfdGhyZWFkLCBtZW1hZGRyLCBteWFkZHIsIGxlbik7Cit9CisK K2ludAoremVfdGFyZ2V0Ojp3cml0ZV9tZW1vcnkgKHRocmVhZF9pbmZvICp0cCwgQ09SRV9BRERS IG1lbWFkZHIsCisJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqbXlhZGRyLCBpbnQgbGVuKQorewor ICB1bnNpZ25lZCBpbnQgYWRkcl9zcGFjZSA9IDA7IC8qIE9ubHkgdGhlIGRlZmF1bHQgc3BhY2Ug Zm9yIG5vdy4gICovCisgIHpldF9kZWJ1Z19tZW1vcnlfc3BhY2VfZGVzY190IGRlc2M7CisKKyAg bWVtc2V0ICgmZGVzYywgMCwgc2l6ZW9mIChkZXNjKSk7CisgIGRlc2Muc3R5cGUgPSBaRVRfU1RS VUNUVVJFX1RZUEVfREVCVUdfTUVNT1JZX1NQQUNFX0RFU0M7CisgIGRlc2MucE5leHQgPSBudWxs cHRyOworICBkZXNjLnR5cGUgPSAoemV0X2RlYnVnX21lbW9yeV9zcGFjZV90eXBlX3QpIGFkZHJf c3BhY2U7CisgIGRlc2MuYWRkcmVzcyA9ICh1aW50NjRfdCkgbWVtYWRkcjsKKworICBzdGQ6OnBh aXI8emVfZGV2aWNlX3RocmVhZF90LCB6ZV9kZXZpY2VfaW5mbyAqPiBjb250ZXh0CisgICAgPSB6 ZV9tZW1vcnlfYWNjZXNzX2NvbnRleHQgKHRwLCBhZGRyX3NwYWNlKTsKKyAgemVfZGV2aWNlX3Ro cmVhZF90IHRocmVhZCA9IGNvbnRleHQuZmlyc3Q7CisgIHplX2RldmljZV9pbmZvICpkZXZpY2Ug PSBjb250ZXh0LnNlY29uZDsKKyAgZ2RiX2Fzc2VydCAoZGV2aWNlICE9IG51bGxwdHIpOworCisg IGRwcmludGYgKCJ3cml0aW5nICVkIGJ5dGVzIG9mIG1lbW9yeSB0byAlcyB3aXRoICVzIiwKKwkg ICBsZW4sIGNvcmVfYWRkcl90b19zdHJpbmdfbnogKG1lbWFkZHIpLAorCSAgIHplX3RocmVhZF9p ZF9zdHIgKHRocmVhZCkuY19zdHIgKCkpOworCisgIHplX3Jlc3VsdF90IHN0YXR1cyA9IHpldERl YnVnV3JpdGVNZW1vcnkgKGRldmljZS0+c2Vzc2lvbiwgdGhyZWFkLCAmZGVzYywKKwkJCQkJICAg IGxlbiwgbXlhZGRyKTsKKyAgc3dpdGNoIChzdGF0dXMpCisgICAgeworICAgIGNhc2UgWkVfUkVT VUxUX1NVQ0NFU1M6CisgICAgICByZXR1cm4gMDsKKworICAgIGRlZmF1bHQ6CisgICAgICBkcHJp bnRmICgiZXJyb3Igd3JpdGluZyAlZCBieXRlcyBvZiBtZW1vcnkgdG8gJXMgd2l0aCAlczogJXgi LAorCSAgICAgICBsZW4sIGNvcmVfYWRkcl90b19zdHJpbmdfbnogKG1lbWFkZHIpLAorCSAgICAg ICB6ZV90aHJlYWRfaWRfc3RyICh0aHJlYWQpLmNfc3RyICgpLCBzdGF0dXMpOworCisgICAgICBy ZXR1cm4gRUlPOworICAgIH0KK30KKworaW50Cit6ZV90YXJnZXQ6OndyaXRlX21lbW9yeSAoQ09S RV9BRERSIG1lbWFkZHIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm15YWRkciwKKwkJCSBpbnQgbGVu KQoreworICByZXR1cm4gd3JpdGVfbWVtb3J5IChjdXJyZW50X3RocmVhZCwgbWVtYWRkciwgbXlh ZGRyLCBsZW4pOworfQorCitib29sCit6ZV90YXJnZXQ6OnRocmVhZF9zdG9wcGVkIChzdHJ1Y3Qg dGhyZWFkX2luZm8gKnRwKQoreworICBjb25zdCB6ZV90aHJlYWRfaW5mbyAqemV0cCA9IHplX3Ro cmVhZCAodHApOworICBnZGJfYXNzZXJ0ICh6ZXRwICE9IG51bGxwdHIpOworCisgIHJldHVybiAo emV0cC0+ZXhlY19zdGF0ZSA9PSBaRV9USFJFQURfU1RBVEVfU1RPUFBFRCk7Cit9CisKK3ZvaWQK K3plX3RhcmdldDo6cmVxdWVzdF9pbnRlcnJ1cHQgKCkKK3sKKyAgaWYgKGN1cnJlbnRfcHJvY2Vz cyAoKSA9PSBudWxscHRyKQorICAgIGVycm9yIChfKCJubyBjdXJyZW50IHByb2Nlc3MuIikpOwor CisgIHByb2Nlc3NfaW5mbyAqcHJvY2VzcyA9IGN1cnJlbnRfcHJvY2VzcyAoKTsKKyAgZ2RiX2Fz c2VydCAocHJvY2VzcyAhPSBudWxscHRyKTsKKworICBwcm9jZXNzX2luZm9fcHJpdmF0ZSAqcHJp diA9IHByb2Nlc3MtPnByaXY7CisgIGdkYl9hc3NlcnQgKHByaXYgIT0gbnVsbHB0cik7CisKKyAg LyogVGhlIG9ubHkgcmVhc29uIHdoeSB3ZSB3b3VsZCBub3QgaGF2ZSBhIGRldmljZSBpcyBpZiB3 ZSBnb3QgZGV0YWNoZWQuCisKKyAgICAgVGhlcmUgaXMgbm90aGluZyB0byBpbnRlcnJ1cHQgaW4g dGhhdCBjYXNlLiAgKi8KKyAgemVfZGV2aWNlX2luZm8gKmRldmljZSA9IHByaXYtPmRldmljZTsK KyAgaWYgKGRldmljZSA9PSBudWxscHRyKQorICAgIHJldHVybjsKKworICAvKiBJbnRlcnJ1cHQg aXMgbm90IGEgcmVzdW1lIHJlcXVlc3QuICAqLworCisgIHplX2RldmljZV90aHJlYWRfdCBhbGwg PSB6ZV90aHJlYWRfaWRfYWxsICgpOworICB6ZV9pbnRlcnJ1cHQgKCpkZXZpY2UsIGFsbCk7Cit9 CisKK3ZvaWQKK3plX3RhcmdldDo6cGF1c2VfYWxsIChib29sIGZyZWV6ZSkKK3sKKyAgZHByaW50 ZiAoImZyZWV6ZTogJWQiLCBmcmVlemUpOworCisgIGlmIChmcmVlemUpCisgICAgeworICAgICAg aWYgKGZyb3plbiA9PSBVSU5UMzJfTUFYKQorCWludGVybmFsX2Vycm9yIChfKCJmcmVlemUgY291 bnQgb3ZlcmZsb3ciKSk7CisgICAgICBmcm96ZW4gKz0gMTsKKyAgICB9CisKKyAgLyogTm90aGlu ZyB0byBzdG9wIGlmIHdlIHdlcmUgZnJvemVuIGFscmVhZHkuICAqLworICBpZiAoZnJvemVuID4g MSkKKyAgICByZXR1cm47CisKKyAgLyogSW50ZXJydXB0aW5nIGFsbCB0aHJlYWRzIG9uIGRldmlj ZXMgdGhhdCBoYXZlIGFueSByZXN1bWVkIHRocmVhZHMuCisKKyAgICAgVGhyZWFkcyB0aGF0IGFy ZSBhbHJlYWR5IHN0b3BwZWQgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBpbnRlcnJ1cHQuICAqLwor ICB6ZV9kZXZpY2VfdGhyZWFkX3QgYWxsID0gemVfdGhyZWFkX2lkX2FsbCAoKTsKKyAgZm9yICh6 ZV9kZXZpY2VfaW5mbyAqZGV2aWNlIDogZGV2aWNlcykKKyAgICB7CisgICAgICBnZGJfYXNzZXJ0 IChkZXZpY2UgIT0gbnVsbHB0cik7CisKKyAgICAgIC8qIElnbm9yZSBkZXZpY2VzIHdlJ3JlIG5v dCBtb2RlbGxpbmcgYXMgcHJvY2Vzc2VzLiAgKi8KKyAgICAgIGlmIChkZXZpY2UtPnByb2Nlc3Mg PT0gbnVsbHB0cikKKwljb250aW51ZTsKKworICAgICAgaWYgKChkZXZpY2UtPm5yZXN1bWVkICE9 IDApICYmIChkZXZpY2UtPm5pbnRlcnJ1cHRzID09IDApKQorCXplX2ludGVycnVwdCAoKmRldmlj ZSwgYWxsKTsKKyAgICB9CisKKyAgLyogRmV0Y2ggZXZlbnRzIHVudGlsIG5vIGRldmljZSBoYXMg YW55IHJlc3VtZWQgdGhyZWFkcyBsZWZ0LiAgKi8KKyAgZmV0Y2hfZXZlbnRzX2FsbF9kZXZpY2Vz X25vX3Jlc3VtZWQgKCk7CisKKyAgLyogTWFyayB0aHJlYWRzIHdlIGludGVycnVwdGVkIHBhdXNl ZCBzbyB1bnBhdXNlX2FsbCBjYW4gZmluZCB0aGVuLiAgKi8KKyAgZm9yX2VhY2hfdGhyZWFkIChb XSAodGhyZWFkX2luZm8gKnRwKQorICAgIHsKKyAgICAgIC8qIEEgdGhyZWFkIHdpdGhvdXQgd2Fp dHN0YXR1cyBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBieSBhCisJIHByZXZpb3VzIHBhdXNl X2FsbCBvciBpdCBoYXMgcmVwb3J0ZWQgaXRzIGV2ZW50IHRvIGhpZ2hlciBsYXllcnMKKwkgdmlh IHdhaXQuCisKKwkgRG9uJ3QgbWFyayBpdCBwYXVzZWQuICBJdCBlaXRoZXIgYWxyZWFkeSBpcywg aWYgaXQgd2FzIHN0b3BwZWQgYnkKKwkgYSBwcmV2aW91cyBwYXVzZV9hbGwsIG9yIGhpZ2hlciBs YXllcnMgYXNzdW1lIGl0IHRvIGJlIHN0b3BwZWQgc28KKwkgd2UgZG9uJ3Qgd2FudCBpdCBzbyBi ZSByZXN1bWVkIGJ5IHVucGF1c2VfYWxsLiAgKi8KKyAgICAgIGlmICghemVfaGFzX3dhaXRzdGF0 dXMgKHRwKSkKKwlyZXR1cm47CisKKyAgICAgIC8qIERvIG5vdCBtYXJrIHRocmVhZHMgdGhhdCB3 YWl0IHdvdWxkIHBpY2ssIGV2ZW4gaWYgdGhlaXIgZXZlbnQgd2FzCisJIG9ubHkganVzdCBmZXRj aGVkLiAgKi8KKyAgICAgIGlmICh6ZV9oYXNfcHJpb3JpdHlfd2FpdHN0YXR1cyAodHApKQorCXJl dHVybjsKKworICAgICAgemVfdGhyZWFkX2luZm8gKnpldHAgPSB6ZV90aHJlYWQgKHRwKTsKKyAg ICAgIGdkYl9hc3NlcnQgKHpldHAgIT0gbnVsbHB0cik7CisKKyAgICAgIC8qIENsZWFyIHRoZSBu b24tcHJpb3JpdHkgd2FpdHN0YXR1cyBzbyB3YWl0IGRvZXNuJ3QgcGljayB0aGUgdGhyZWFkCisJ IHRvIHJlcG9ydCBhbiAodW5hdmFpbGFibGUpIGV2ZW50IHdlIGp1c3QgZmV0Y2hlZC4gICovCisg ICAgICB6ZXRwLT53YWl0c3RhdHVzLnNldF9pZ25vcmUgKCk7CisKKyAgICAgIC8qIElnbm9yZSB0 aHJlYWRzIHRoYXQgYXJlbid0IHN0b3BwZWQsIG1vc3QgbGlrZWx5IGJlY2F1c2UgdGhleSBhcmUK KwkgdW5hdmFpbGFibGUuCisKKwkgRXZlbiB0aG91Z2ggYW4gdW5hdmFpbGFibGUgdGhyZWFkIG1h eSBoYXZlIHJlc3BvbmRlZCB0byBvdXIKKwkgaW50ZXJydXB0LCB3ZSBkbyBub3QgbWFyayBpdCBw YXVzZWQgYmVjYXVzZSB3ZSBuZWVkIHRvIHRyZWF0CisJIHVuYXZhaWxhYmxlIGFuZCBzdG9wcGVk IHRocmVhZHMgZGlmZmVyZW50bHkgaW4gdW5wYXVzZV9hbGwuICAqLworICAgICAgaWYgKHplX3Ro cmVhZF9zdG9wcGVkICh0cCkpCisJemV0cC0+ZXhlY19zdGF0ZSA9IFpFX1RIUkVBRF9TVEFURV9Q QVVTRUQ7CisgICAgfSk7Cit9CisKK3ZvaWQKK3plX3RhcmdldDo6dW5wYXVzZV9hbGwgKGJvb2wg dW5mcmVlemUpCit7CisgIGRwcmludGYgKCJmcmVlemU6ICVkIiwgdW5mcmVlemUpOworCisgIGlm ICh1bmZyZWV6ZSkKKyAgICB7CisgICAgICBpZiAoZnJvemVuID09IDApCisJaW50ZXJuYWxfZXJy b3IgKF8oImZyZWV6ZSBjb3VudCB1bmRlcmZsb3ciKSk7CisgICAgICBmcm96ZW4gLT0gMTsKKyAg ICB9CisKKyAgLyogTm90aGluZyB0byByZXN1bWUgaWYgd2UncmUgc3RpbGwgZnJvemVuLiAgKi8K KyAgaWYgKGZyb3plbiA+IDEpCisgICAgcmV0dXJuOworCisgIC8qIFJlc3VtZSB0aHJlYWRzIHRo YXQgd2VyZSBtYXJrZWQgYnkgcGF1c2VfYWxsIGFzIHdlbGwgYXMgdW5hdmFpbGFibGUKKyAgICAg dGhyZWFkcyB0aGF0IHdlcmUgbm90IHJlcXVlc3RlZCB0byBzdG9wLgorCisgICAgIFBhdXNlX2Fs bCBsZWF2ZXMgdGhlIGxhdHRlciBtYXJrZWQgdW5hdmFpbGFibGUuICBXZSBkb24ndCByZWFsbHkK KyAgICAgcmVzdW1lIHRoZW0gYXMgdGhleSB3ZXJlIG5vdCBhY3R1YWxseSBzdG9wcGVkIG9uIHRo ZSB0YXJnZXQsIGJ1dCB3ZQorICAgICBuZWVkIHRvIHVwZGF0ZSB0aGUgdGhyZWFkIHN0YXRlIGFu ZCBzb21lIHN0YXRpc3RpY3MuICAqLworCisgIC8qIENoZWNrIHdoaWNoIGRldmljZXMgYXJlIHNh ZmUgdG8gYmUgcmVzdW1lZCBhbmQgd2hpY2ggbmVlZCB0byBiZQorICAgICBjaGVja2VkIGZvciBp bmRpdmlkdWFsIHRocmVhZHMgdG8gYmUgcmVzdW1lZC4KKworICAgICBJbiBhbGwtc3RvcCBtb2Rl LCBmaW5kaW5nIGEgc2luZ2xlIHRocmVhZCB3b3VsZCBhbHJlYWR5IGJsb2NrIHRoZQorICAgICB1 bnBhdXNlLiAgV2UgZG8gbm90IGV4cGVjdCB0aGlzIHRvIGJlIHBlcmZvcm1hbmNlIGNyaXRpY2Fs IChvciB1c2VkCisgICAgIGF0IGFsbCksIGhvd2V2ZXIsIHNvIGxldCdzIHVuaWZ5IGFsbC1zdG9w IGFuZCBub24tc3RvcCBhcyBtdWNoIGFzCisgICAgIHBvc3NpYmxlLiAgKi8KKyAgc3RkOjpzZXQ8 emVfZGV2aWNlX2luZm8gKj4gZGV2aWNlc190b19jaGVjazsKKyAgc3RkOjpzZXQ8emVfZGV2aWNl X2luZm8gKj4gZGV2aWNlc190b19yZXN1bWUge2RldmljZXMuYmVnaW4gKCksCisgICAgZGV2aWNl cy5lbmQgKCl9OworCisgIGZvcl9lYWNoX3RocmVhZCAoWyZdICh0aHJlYWRfaW5mbyAqdHApCisg ICAgeworICAgICAgemVfdGhyZWFkX2V4ZWNfc3RhdGVfdCBzdGF0ZSA9IHplX2V4ZWNfc3RhdGUg KHRwKTsKKyAgICAgIHN3aXRjaCAoc3RhdGUpCisJeworCWNhc2UgWkVfVEhSRUFEX1NUQVRFX1BB VVNFRDoKKwkgIHJldHVybjsKKworCWNhc2UgWkVfVEhSRUFEX1NUQVRFX1VOQVZBSUxBQkxFOgor CSAgeworCSAgICAvKiBEaXN0aW5ndWlzaCB1bmF2YWlsYWJsZSB0aHJlYWRzIHRoYXQgd2UgdHJp ZWQgdG8gaW50ZXJydXB0CisJICAgICAgIGluIHBhdXNlX2FsbCBmcm9tIHRob3NlIHRoYXQgR0RC IHRyaWVkIHRvIGludGVycnVwdCB3aXRoIGEKKwkgICAgICAgc3RvcCByZXN1bWUgcmVxdWVzdC4g ICovCisJICAgIHplX3RocmVhZF9yZXN1bWVfc3RhdGVfdCByZXN1bWVfc3RhdGUgPSB6ZV9yZXN1 bWVfc3RhdGUgKHRwKTsKKwkgICAgaWYgKHJlc3VtZV9zdGF0ZSAhPSBaRV9USFJFQURfUkVTVU1F X1NUT1ApCisJICAgICAgcmV0dXJuOworCSAgfQorCisJICBbW2ZhbGx0aHJvdWdoXV07CisJY2Fz ZSBaRV9USFJFQURfU1RBVEVfU1RPUFBFRDoKKwljYXNlIFpFX1RIUkVBRF9TVEFURV9IRUxEOgor CSAgeworCSAgICB6ZV9kZXZpY2VfaW5mbyAqZGV2aWNlID0gemVfdGhyZWFkX2RldmljZSAodHAp OworCSAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpCisJICAgICAgcmV0dXJuOworCisJICAgIGRl dmljZXNfdG9fY2hlY2suaW5zZXJ0IChkZXZpY2UpOworCSAgICBkZXZpY2VzX3RvX3Jlc3VtZS5l cmFzZSAoZGV2aWNlKTsKKwkgIH0KKwkgIHJldHVybjsKKworCWNhc2UgWkVfVEhSRUFEX1NUQVRF X1JVTk5JTkc6CisJICB3YXJuaW5nIChfKCJ0aHJlYWQgJWQuJWxkIHJ1bm5pbmcgaW4gdW5wYXVz ZSIpLCB0cC0+aWQucGlkICgpLAorCQkgICB0cC0+aWQubHdwICgpKTsKKwkgIHJldHVybjsKKwor CWNhc2UgWkVfVEhSRUFEX1NUQVRFX1VOS05PV046CisJICB3YXJuaW5nIChfKCJ0aHJlYWQgJWQu JWxkIGhhcyB1bmtub3duIGV4ZWN1dGlvbiAiCisJCSAgICAgInN0YXRlIiksIHRwLT5pZC5waWQg KCksIHRwLT5pZC5sd3AgKCkpOworCSAgcmV0dXJuOworCX0KKworICAgICAgaW50ZXJuYWxfZXJy b3IgKF8oImJhZCBleGVjdXRpb24gc3RhdGU6ICVkLiIpLCBzdGF0ZSk7CisgICAgfSk7CisKKyAg LyogSW4gYWxsLXN0b3AgbW9kZSwgYW55IGRldmljZSB0aGF0IGNhbm5vdCBiZSByZXN1bWVkIGFi b3J0cyB1bnBhdXNlLiAgKi8KKyAgaWYgKCFub25fc3RvcCAmJiAhZGV2aWNlc190b19jaGVjay5l bXB0eSAoKSkKKyAgICByZXR1cm47CisKKyAgLyogUmVzdW1lIGluZGl2aWR1YWwgdGhyZWFkcy4K KworICAgICBJbiBhbGwtc3RvcCBtb2RlLCB0aGlzIHdpbGwgYmUgZW1wdHkuICAqLworICBmb3Ig KHplX2RldmljZV9pbmZvICpkZXZpY2UgOiBkZXZpY2VzX3RvX2NoZWNrKQorICAgIHsKKyAgICAg IGdkYl9hc3NlcnQgKGRldmljZSAhPSBudWxscHRyKTsKKworICAgICAgZGV2aWNlLT5wcm9jZXNz LT5mb3JfZWFjaF90aHJlYWQgKFt0aGlzXSAodGhyZWFkX2luZm8gKnRwKQorCXsKKwkgIHplX3Ro cmVhZF9pbmZvICp6ZXRwID0gemVfdGhyZWFkICh0cCk7CisJICBnZGJfYXNzZXJ0ICh6ZXRwICE9 IG51bGxwdHIpOworCisJICB6ZV90aHJlYWRfZXhlY19zdGF0ZV90IHN0YXRlID0gemV0cC0+ZXhl Y19zdGF0ZTsKKwkgIHN3aXRjaCAoc3RhdGUpCisJICAgIHsKKwkgICAgY2FzZSBaRV9USFJFQURf U1RBVEVfU1RPUFBFRDoKKwkgICAgY2FzZSBaRV9USFJFQURfU1RBVEVfSEVMRDoKKwkgICAgY2Fz ZSBaRV9USFJFQURfU1RBVEVfUlVOTklORzoKKwkgICAgY2FzZSBaRV9USFJFQURfU1RBVEVfVU5L Tk9XTjoKKwkgICAgICAvKiBXZSBhbHJlYWR5IGRpYWdub3NlZCB1bmV4cGVjdGVkIHN0YXRlcyBh Ym92ZS4gICovCisJICAgICAgcmV0dXJuOworCisJICAgIGNhc2UgWkVfVEhSRUFEX1NUQVRFX1VO QVZBSUxBQkxFOgorCSAgICAgIHsKKwkJLyogRG9uJ3QgdG91Y2ggdGhyZWFkcyB0aGF0IEdEQiB3 YW50cyBzdG9wcGVkLiAgKi8KKwkJemVfdGhyZWFkX3Jlc3VtZV9zdGF0ZV90IHJlc3VtZV9zdGF0 ZSA9IHplX3Jlc3VtZV9zdGF0ZSAodHApOworCQlpZiAocmVzdW1lX3N0YXRlID09IFpFX1RIUkVB RF9SRVNVTUVfU1RPUCkKKwkJICByZXR1cm47CisKKwkJLyogV2UgZG9uJ3QgcGxhbiB0byByZXN1 bWUgYnV0IHdlIHN0aWxsIG5lZWQgdG8gcHJlcGFyZSBUUAorCQkgICBmb3IgbnJlc3VtZWQgdHJh Y2tpbmcgYW5kIHRocmVhZCBzdGF0ZSBtYW5hZ2VtZW50LiAgKi8KKwkJYm9vbCBzaG91bGRfcmVz dW1lID0gemVfcHJlcGFyZV9mb3JfcmVzdW1pbmcgKHRwKTsKKwkJZ2RiX2Fzc2VydCAoIXNob3Vs ZF9yZXN1bWUpOworCSAgICAgIH0KKwkgICAgICByZXR1cm47CisKKwkgICAgY2FzZSBaRV9USFJF QURfU1RBVEVfUEFVU0VEOgorCSAgICAgIHJlc3VtZV9zaW5nbGVfdGhyZWFkICh0cCk7CisJICAg ICAgcmV0dXJuOworCSAgICB9CisJfSk7CisgICAgfQorCisgIC8qIFJlc3VtZSBlbnRpcmUgZGV2 aWNlcyBhdCBvbmNlLiAgKi8KKyAgZm9yICh6ZV9kZXZpY2VfaW5mbyAqZGV2aWNlIDogZGV2aWNl c190b19yZXN1bWUpCisgICAgeworICAgICAgZ2RiX2Fzc2VydCAoZGV2aWNlICE9IG51bGxwdHIp OworCisgICAgICAvKiBTa2lwIGRldmljZXMgd2UncmUgbm90IG1vZGVsaW5nIGFzIHByb2Nlc3Nl cy4gICovCisgICAgICBpZiAoZGV2aWNlLT5wcm9jZXNzID09IG51bGxwdHIpCisJY29udGludWU7 CisKKyAgICAgIHJlc3VtZSAoKmRldmljZSk7CisgICAgfQorfQorCit2b2lkCit6ZV90YXJnZXQ6 OmFja19saWJyYXJ5IChwcm9jZXNzX2luZm8gKnByb2Nlc3MsIGNvbnN0IGNoYXIgKm5hbWUpCit7 CisgIC8qIEFsbCBsaWJyYXJpZXMgYXJlIGluLW1lbW9yeS4gICovCisgIHdhcm5pbmcgKF8oInVu ZXhwZWN0ZWQgYWNrbm93bGVkZ2VtZW50IHJlcXVlc3RlZCBmb3IgbGlicmFyeSAlcy4iKSwgbmFt ZSk7Cit9CisKK3ZvaWQKK3plX3RhcmdldDo6YWNrX2luX21lbW9yeV9saWJyYXJ5IChwcm9jZXNz X2luZm8gKnByb2Nlc3MsCisJCQkJICBDT1JFX0FERFIgYmVnaW4sIENPUkVfQUREUiBlbmQpCit7 CisgIGdkYl9hc3NlcnQgKHByb2Nlc3MgIT0gbnVsbHB0cik7CisKKyAgcHJvY2Vzc19pbmZvX3By aXZhdGUgKnplcHJvYyA9IHByb2Nlc3MtPnByaXY7CisgIGdkYl9hc3NlcnQgKHplcHJvYyAhPSBu dWxscHRyKTsKKworICAvKiBUaGUgb25seSByZWFzb24gd2h5IHdlIHdvdWxkIG5vdCBoYXZlIGEg ZGV2aWNlIGlzIGlmIHdlIGdvdCBkZXRhY2hlZC4KKworICAgICBUaGVyZSBpcyBub3RoaW5nIHRv IGFja25vd2xlZGdlIGluIHRoYXQgY2FzZS4gICovCisgIHplX2RldmljZV9pbmZvICpkZXZpY2Ug PSB6ZXByb2MtPmRldmljZTsKKyAgaWYgKGRldmljZSA9PSBudWxscHRyKQorICAgIHsKKyAgICAg IGRwcmludGYgKCJbJXM7JXMpIGRldmljZSBub3QgZm91bmQuIiwgY29yZV9hZGRyX3RvX3N0cmlu Z19ueiAoYmVnaW4pLAorCSAgICAgICBjb3JlX2FkZHJfdG9fc3RyaW5nX256IChlbmQpKTsKKyAg ICAgIHJldHVybjsKKyAgICB9CisKKyAgZXZlbnRzX3QgJmV2ZW50cyA9IGRldmljZS0+YWNrX3Bl bmRpbmc7CisgIGV2ZW50c190OjppdGVyYXRvciBpdAorICAgID0gc3RkOjpmaW5kX2lmIChldmVu dHMuYmVnaW4gKCksIGV2ZW50cy5lbmQgKCksCisJCSAgICBbYmVnaW4sIGVuZF0gKGNvbnN0IHpl dF9kZWJ1Z19ldmVudF90ICZldikKKwl7CisJICByZXR1cm4gKChldi50eXBlID09IFpFVF9ERUJV R19FVkVOVF9UWVBFX01PRFVMRV9MT0FEKQorCQkgICYmIChldi5pbmZvLm1vZHVsZS5tb2R1bGVC ZWdpbiA9PSBiZWdpbikKKwkJICAmJiAoZXYuaW5mby5tb2R1bGUubW9kdWxlRW5kID09IGVuZCkp OworCX0pOworCisgIGlmIChpdCA9PSBldmVudHMuZW5kICgpKQorICAgIHsKKyAgICAgIGRwcmlu dGYgKCJbJXM7JXMpIG5vdCBmb3VuZC4iLCBjb3JlX2FkZHJfdG9fc3RyaW5nX256IChiZWdpbiks CisJICAgICAgIGNvcmVfYWRkcl90b19zdHJpbmdfbnogKGVuZCkpOworICAgICAgcmV0dXJuOwor ICAgIH0KKworICB6ZV9hY2tfZXZlbnQgKCpkZXZpY2UsICppdCk7CisgIGV2ZW50cy5lcmFzZSAo aXQpOworCisgIGRwcmludGYgKCJbJXM7JXMpIGFja25vd2xlZGdlZC4iLCBjb3JlX2FkZHJfdG9f c3RyaW5nX256IChiZWdpbiksCisJICAgY29yZV9hZGRyX3RvX3N0cmluZ19ueiAoZW5kKSk7Cit9 CmRpZmYgLS1naXQgYS9nZGJzZXJ2ZXIvemUtbG93LmggYi9nZGJzZXJ2ZXIvemUtbG93LmgKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMC4uOWY0Y2U5YTE5OTA1MjJlNWMwOWVhYTc5MTg3MDg0NjBkMDk0N2JlYgotLS0gL2Rl di9udWxsCisrKyBiL2dkYnNlcnZlci96ZS1sb3cuaApAQCAtMCwwICsxLDQ5NiBAQAorLyogVGFy Z2V0IGludGVyZmFjZSBmb3IgTGV2ZWwtWmVybyBiYXNlZCB0YXJnZXRzIGZvciBnZGJzZXJ2ZXIu CisgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL29uZWFwaS1zcmMvbGV2ZWwtemVyby5naXQuCisK KyAgIENvcHlyaWdodCAoQykgMjAyMC0yMDI1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j LgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBm cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBp dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp b24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl cnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0 IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNl aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3 aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5z ZXMvPi4gICovCisKKyNpZm5kZWYgR0RCU0VSVkVSX0xFVkVMX1pFUk9fTE9XX0gKKyNkZWZpbmUg R0RCU0VSVkVSX0xFVkVMX1pFUk9fTE9XX0gKKworI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1 ZGUgInRkZXNjLmgiCisKKyNpbmNsdWRlIDxsZXZlbF96ZXJvL3pldF9hcGkuaD4KKyNpbmNsdWRl IDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisKKworLyogSW5m b3JtYXRpb24gYWJvdXQgcmVnaXN0ZXIgc2V0cyByZXBvcnRlZCBpbiB0YXJnZXQgZGVzY3JpcHRp b25zLgorCisgICBUaGUgbWFpbiB1c2Ugb2YgdGhpcyBpcyB0byBmaW5kIHRoZSBpbmZvcm1hdGlv biByZWxldmFudCBmb3IgZmV0Y2hpbmcKKyAgIGFuZCBzdG9yaW5nIHJlZ2lzdGVycyB2aWEgTGV2 ZWwtWmVybyBiYXNlZCBvbiByZWdpc3RlciBudW1iZXJzLiAgKi8KK3N0cnVjdCB6ZV9yZWdzZXRf aW5mbworeworICAvKiBUaGUgZGV2aWNlLXNwZWNpZmljIExldmVsLVplcm8gcmVnaXN0ZXIgc2V0 IHR5cGUuICAqLworICB1aW50MzJfdCB0eXBlOworCisgIC8qIFRoZSByZWdpc3RlciBzaXplIGlu IGJ5dGVzIGZvciByZWFkaW5nL3dyaXRpbmcuICAqLworICB1aW50MzJfdCBzaXplOworCisgIC8q IFRoZSBiZWdpbiAoaW5jbHVzaXZlKSBhbmQgZW5kIChleGNsdXNpdmUpIHJlZ2lzdGVyIG51bWJl cnMgZm9yIHRoaXMKKyAgICAgcmVnc2V0LgorCisgICAgIFRoaXMgaXMgdXNlZCB0byBtYXAgcmVn aXN0ZXIgbnVtYmVycyB0byByZWdzZXQgdHlwZXMuICAqLworICBsb25nIGJlZ2luLCBlbmQ7CisK KyAgLyogV2hldGhlciB0aGUgcmVnc2V0IGlzIHdyaXRhYmxlLiAgV2UgYXNzdW1lIGFsbCBhcmUg cmVhZGFibGUuICAqLworICBib29sIGlzX3dyaXRlYWJsZTsKK307CisKKy8qIEEgdmVjdG9yIG9m IHJlZ3NldCBpbmZvcy4gICovCit0eXBlZGVmIHN0ZDo6dmVjdG9yPHplX3JlZ3NldF9pbmZvPiB6 ZV9yZWdzZXRfaW5mb190OworCisvKiBBIHZlY3RvciBvZiBleHBlZGl0ZSByZWdpc3RlciBuYW1l cy4KKworICAgVGhlIG5hbWVzIGFyZSBleHBlY3RlZCB0byBiZSBzdHJpbmcgbGl0ZXJhbHMuICBU aGUgdmVjdG9yIG11c3QgYmUKKyAgIHRlcm1pbmF0ZWQgd2l0aCBhIHNpbmdsZSBudWxscHRyIGVu dHJ5LiAgKi8KK3R5cGVkZWYgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBleHBlZGl0ZV90Owor CisvKiBBIGxpc3Qgb2YgZGVidWcgZXZlbnRzLiAgKi8KKwordHlwZWRlZiBzdGQ6Omxpc3Q8emV0 X2RlYnVnX2V2ZW50X3Q+IGV2ZW50c190OworCisvKiBJbmZvcm1hdGlvbiBhYm91dCBkZXZpY2Vz IHdlJ3JlIGF0dGFjaGVkIHRvLgorCisgICBUaGlzIGlzIHByZXR0eSBzaW1pbGFyIHRvIHByb2Nl c3NfaW5mby4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgd2Ugb25seQorICAgd2FudCB0byB0ZWxs IEdEQiBhYm91dCBkZXZpY2VzIHRoYXQgdGhlIGhvc3QgYXBwbGljYXRpb24gYWN0dWFsbHkgdXNl cy4KKyAgIFRvIGtub3cgdGhhdCwgaG93ZXZlciwgd2UgbmVlZCB0byBhdHRhY2ggdG8gYWxsIGF2 YWlsYWJsZSBkZXZpY2VzLiAgKi8KKworc3RydWN0IHplX2RldmljZV9pbmZvCit7CisgIC8qIFRo ZSBkZWJ1ZyBzZXNzaW9uIGNvbmZpZ3VyYXRpb24uICAqLworICB6ZXRfZGVidWdfY29uZmlnX3Qg Y29uZmlnID0ge307CisKKyAgLyogVGhlIGRldmljZSBoYW5kbGUuICBUaGlzIG11c3Qgbm90IGJl IG51bGxwdHIuICAqLworICB6ZV9kZXZpY2VfaGFuZGxlX3QgaGFuZGxlID0gbnVsbHB0cjsKKwor ICAvKiBUaGUgZGV2aWNlJ3MgcHJvcGVydGllcy4gICovCisgIHplX2RldmljZV9wcm9wZXJ0aWVz X3QgcHJvcGVydGllcyA9IHt9OworCisgIC8qIFRoZSBkZWJ1ZyBzZXNzaW9uIGhhbmRsZS4KKwor ICAgICBUaGlzIGlzIG51bGxwdHIgaWYgd2UgYXJlIG5vdCBjdXJyZW50bHkgYXR0YWNoZWQuICAq LworICB6ZXRfZGVidWdfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uID0gbnVsbHB0cjsKKworICAv KiBUaGUgc3RhdGUgZm9yIGRlYnVnIGF0dGFjaCBhdHRlbXB0LgorCisgICAgIFRoaXMgaXMgY29t cGxlbWVudGFyeSBpbmZvcm1hdGlvbiBmb3IgZGVidWcgc2Vzc2lvbiBoYW5kbGUuICBUaGUKKyAg ICAgZGVidWcgc2Vzc2lvbiBoYW5kbGUgaXMgbnVsbCwgd2hlbiBkZWJ1ZyBhdHRhY2ggYXR0ZW1w dCBmYWlscy4KKyAgICAgSW4gdGhpcyBjYXNlLCBkZWJ1ZyBhdHRhY2ggc3RhdGUgY29udGFpbnMg bW9yZSBpbmZvcm1hdGlvbiBvbgorICAgICB0aGUgbGFzdCBlcnJvci4gICovCisgIHplX3Jlc3Vs dF90IGRlYnVnX2F0dGFjaF9zdGF0ZTsKKworICAvKiBUaGUgdGFyZ2V0IGRlc2NyaXB0aW9uIGZv ciB0aGlzIGRldmljZS4gICovCisgIHRhcmdldF9kZXNjX3VwIHRkZXNjOworCisgIC8qIFRoZSBy ZWdpc3RlciBzZXRzIHJlcG9ydGVkIGluIHRoZSBkZXZpY2UncyB0YXJnZXQgZGVzY3JpcHRpb24u ICAqLworICB6ZV9yZWdzZXRfaW5mb190IHJlZ3NldHM7CisKKyAgLyogVGhlIGV4cGVkaXRlIHJl Z2lzdGVycyB1c2VkIGZvciB0aGlzIGRldmljZSdzIHRhcmdldCBkZXNjcmlwdGlvbi4gICovCisg IGV4cGVkaXRlX3QgZXhwZWRpdGU7CisKKyAgLyogVGhlIGRldmljZSBlbnVtZXJhdGlvbiBvcmRp bmFsIG51bWJlci4gICovCisgIHVuc2lnbmVkIGxvbmcgb3JkaW5hbCA9IDA7CisKKyAgLyogVGhl IHByb2Nlc3MgZm9yIHRoaXMgZGV2aWNlLgorCisgICAgIFdlIG1vZGVsIGRldmljZXMgd2UncmUg YXR0YWNoZWQgdG8gYXMgaW5mZXJpb3IgcHJvY2Vzcy4gIEluIEdEQiwgd2UKKyAgICAgaGlkZSBp bmZlcmlvcnMgcmVwcmVzZW50aW5nIGRldmljZXMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSB1c2Vk IGFuZAorICAgICBvbmx5IHNob3cgaW5mZXJpb3JzIGZvciBkZXZpY2VzIHRoYXQgYXJlIGluIHVz ZS4KKworICAgICBJZiB3ZSBhcmUgbm90IGF0dGFjaGVkIHRvIHRoaXMgZGV2aWNlLCBQUk9DRVNT IHdpbGwgYmUgbnVsbHB0ci4gICovCisgIHByb2Nlc3NfaW5mbyAqcHJvY2VzcyA9IG51bGxwdHI7 CisKKyAgLyogQSBsaXN0IG9mIHRvLWJlLWFja25vd2xlZGdlZCBldmVudHMuICAqLworICBldmVu dHNfdCBhY2tfcGVuZGluZzsKKworICAvKiBUb3RhbCBudW1iZXIgb2YgdGhyZWFkcyBvbiB0aGlz IGRldmljZS4gICovCisgIHVuc2lnbmVkIGxvbmcgbnRocmVhZHMgPSAwOworCisgIC8qIE51bWJl ciBvZiByZXN1bWVkIHRocmVhZHMuICBUaGUgdmFsdWUgaXMgdXNlZnVsIGZvciBkZWNpZGluZyBp ZgorICAgICB3ZSBjYW4gb21pdCBzZW5kaW5nIGFuIGFjdHVhbCBpbnRlcnJ1cHQgcmVxdWVzdCB3 aGVuIHdlIHdhbnQgYWxsCisgICAgIHRocmVhZHMgdG8gYmUgc3RvcHBlZCBpbiBhbGwtc3RvcCBt b2RlLgorCisgICAgIFRoZSB2YWx1ZSBjYW4gdW5kZXJmbG93IGJlY2F1c2Ugb2YgdW5hdmFpbGFi bGUgdGhyZWFkcyBiZWNvbWluZworICAgICBhdmFpbGFibGUgYW5kIGdlbmVyYXRpbmcgc3RvcCBl dmVudHMuICBUaGVyZWZvcmUgd2UgcGF5IGNhcmUgdG8KKyAgICAgcHJldmVudCB1bmRlcmZsb3dp bmcuICAqLworICB1bnNpZ25lZCBsb25nIG5yZXN1bWVkID0gMDsKKworICAvKiBOdW1iZXIgb2Yg aW50ZXJydXB0cyBzZW50IHRvIHRoaXMgdGFyZ2V0LiAgKi8KKyAgdW5zaWduZWQgbG9uZyBuaW50 ZXJydXB0cyA9IDA7Cit9OworCisvKiBBIHRocmVhZCdzIHJlc3VtZSBzdGF0ZS4KKworICAgVGhp cyBpcyB2ZXJ5IHNpbWlsYXIgdG8gZW51bSByZXN1bWVfa2luZCBleGNlcHQgdGhhdCB3ZSBuZWVk IGFuCisgICBhZGRpdGlvbmFsIG5vbmUgY2FzZSB0byBtb2RlbCB0aGUgdGhyZWFkIG5vdCBiZWlu ZyBtZW50aW9uZWQgaW4gYW55CisgICByZXN1bWUgcmVxdWVzdC4gICovCisKK2VudW0gemVfdGhy ZWFkX3Jlc3VtZV9zdGF0ZV90Cit7CisgIC8qIEdkYnNlcnZlciBkaWQgbm90IGFzayBhbnl0aGlu ZyBvZiB0aGlzIHRocmVhZC4gICovCisgIFpFX1RIUkVBRF9SRVNVTUVfTk9ORSwKKworICAvKiBU aGUgdGhyZWFkIHNoYWxsIHN0b3AuICAqLworICBaRV9USFJFQURfUkVTVU1FX1NUT1AsCisKKyAg LyogVGhlIHRocmVhZCBzaGFsbCBydW4uICAqLworICBaRV9USFJFQURfUkVTVU1FX1JVTiwKKwor ICAvKiBUaGUgdGhyZWFkIHNoYWxsIHN0ZXAuICAqLworICBaRV9USFJFQURfUkVTVU1FX1NURVAK K307CisKKy8qIEEgdGhyZWFkJ3MgZXhlY3V0aW9uIHN0YXRlLiAgKi8KKworZW51bSB6ZV90aHJl YWRfZXhlY19zdGF0ZV90Cit7CisgIC8qIFdlIGRvIG5vdCBrbm93IHRoZSB0aHJlYWQgc3RhdGUu ICBUaGlzIGlzIGxpa2VseSBhbiBlcnJvciBjb25kaXRpb24uICAqLworICBaRV9USFJFQURfU1RB VEVfVU5LTk9XTiwKKworICAvKiBUaGUgdGhyZWFkIGlzIHN0b3BwZWQgYW5kIGlzIGV4cGVjdGVk IHRvIHJlbWFpbiBzdG9wcGVkIHVudGlsIHdlCisgICAgIHJlc3VtZSBpdC4gICovCisgIFpFX1RI UkVBRF9TVEFURV9TVE9QUEVELAorCisgIC8qIFRoZSB0aHJlYWQgaXMgc3RvcHBlZCBidXQgd2Ug YXJlIGhvbGRpbmcgaXRzIHN0b3AgZXZlbnQgdW50aWwgd2UKKyAgICAgcmVzdW1lIGl0LiAgKi8K KyAgWkVfVEhSRUFEX1NUQVRFX0hFTEQsCisKKyAgLyogVGhlIHRocmVhZCBpcyBzdG9wcGVkIGJ5 IHBhdXNlX2FsbCAoKS4gIEluIHVucGF1c2VfYWxsICgpLCB3ZSBuZWVkIHRvCisgICAgIHJlc3Vt ZSBqdXN0IHRoZSBwYXVzZWQgdGhyZWFkcy4KKworICAgICBJbiBwYXJ0aWN1bGFyLCB3ZSBuZWVk IHRvIGRpc3Rpbmd1aXNoIHRocmVhZHMgdGhhdCByZXBvcnRlZCB0aGVpcgorICAgICBldmVudCB0 byBoaWdoZXIgbGF5ZXJzIGluIGdkYnNlcnZlciBhbmQgaGVuY2UgaGF2ZSB0aGVpciB3YWl0c3Rh dHVzCisgICAgIGNsZWFyIChzZXQgdG8gaWdub3JlKSBmcm9tIHRocmVhZHMgdGhhdCB3ZXJlIHBh dXNlZCBhbmQgaGFkIHRoZWlyCisgICAgIHdhaXRzdGF0dXMgY2xlYXJlZCBieSBwYXVzZV9hbGwg KCkuCisKKyAgICAgVW5hdmFpbGFibGUgdGhyZWFkcyB3aWxsIG5vdCBiZSByZXN1bWVkLCBzbyB3 ZSBrZWVwIHRob3NlIGluIHN0YXRlCisgICAgIHVuYXZhaWxhYmxlIGFuZCBvbmx5IGNsZWFyIHRo ZWlyIHdhaXRzdGF0dXMgdG8gcHJldmVudCB0aGVtIGZyb20KKyAgICAgZ2V0dGluZyByZXBvcnRl ZCBieSB3YWl0ICgpLiAgKi8KKyAgWkVfVEhSRUFEX1NUQVRFX1BBVVNFRCwKKworICAvKiBUaGUg dGhyZWFkIGlzIHJ1bm5pbmcuICBXZSBkbyBub3Qga25vdyB3aGV0aGVyIGl0IGlzIHN0aWxsIGF2 YWlsYWJsZQorICAgICB0byB1cyBhbmQgd2UncmUgYWJsZSB0byBzdG9wIGl0IG9yIHdoZXRoZXIg aXQgd291bGQgZXZlbnR1YWxseSBoaXQgYQorICAgICBicmVha3BvaW50LgorCisgICAgIFdoZW4g YSB0aHJlYWQgY29tcGxldGVzIGV4ZWN1dGluZyBhIGtlcm5lbCBpdCBiZWNvbWVzIGlkbGUgYW5k IG1heQorICAgICBwaWNrIHVwIG90aGVyIHdvcmtsb2FkcywgZWl0aGVyIGluIHRoaXMgY29udGV4 dCBvciBpbiBhbm90aGVyCisgICAgIHByb2Nlc3MnIGNvbnRleHQuCisKKyAgICAgSW4gdGhlIGZv cm1lciBjYXNlLCBpdCB3b3VsZCBzdGlsbCBiZSBjb25zaWRlcmVkIFJVTk5JTkcgZnJvbSBvdXIK KyAgICAgcG9pbnQgb2YgdmlldywgZXZlbiB0aG91Z2ggaXQgc3RhcnRlZCBvdmVyIGFnYWluIHdp dGggYSBuZXcgc2V0IG9mCisgICAgIGFyZ3VtZW50cy4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgaXQg d291bGQgYmUgVU5BVkFJTEFCTEUuICAqLworICBaRV9USFJFQURfU1RBVEVfUlVOTklORywKKwor ICAvKiBUaGUgdGhyZWFkIGlzIGN1cnJlbnRseSBub3QgYXZhaWxhYmxlIHRvIHVzLiAgSXQgbWF5 IGJlIGlkbGUgb3IgaXQKKyAgICAgbWF5IGJlIGV4ZWN1dGluZyB3b3JrIG9uIGJlaGFsZiBvZiBh IGRpZmZlcmVudCBwcm9jZXNzLgorCisgICAgIFdlIGNhbm5vdCBkaXN0aW5ndWlzaCB0aG9zZSBj YXNlcy4gIFdlJ3JlIG5vdCBhYmxlIHRvIGludGVyYWN0IHdpdGgKKyAgICAgdGhhdCB0aHJlYWQu ICBJdCBtYXkgYmVjb21lIGF2YWlsYWJsZSBhZ2FpbiBhdCBhbnkgdGltZSwgdGhvdWdoLgorCisg ICAgIEZyb20gR0RCJ3MgdmlldywgYSB0aHJlYWQgbWF5IHN3aXRjaCBiZXR3ZWVuIFJVTk5JTkcg YW5kIFVOQVZBSUxBQkxFLgorICAgICBXZSB3aWxsIG9ubHkga25vdyB0aGUgZGlmZmVyZW5jZSB3 aGVuIHdlIHRyeSB0byBzdG9wIGl0LiAgSXQncyBub3QKKyAgICAgZW50aXJlbHkgY2xlYXIgd2hl dGhlciB3ZSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28sIGF0IGFsbC4gICovCisgIFpFX1RI UkVBRF9TVEFURV9VTkFWQUlMQUJMRQorfTsKKworLyogVGhyZWFkIHByaXZhdGUgZGF0YSBmb3Ig TGV2ZWwtWmVybyB0YXJnZXRzLiAgKi8KKworc3RydWN0IHplX3RocmVhZF9pbmZvCit7CisgIC8q IFRoZSB0aHJlYWQgaWRlbnRpZmllci4gICovCisgIHplX2RldmljZV90aHJlYWRfdCBpZDsKKwor ICAvKiBUaGUgdGhyZWFkJ3MgcmVzdW1lIHN0YXRlLgorCisgICAgIFdoYXQgZG9lcyBnZGJzZXJ2 ZXIgd2FudCB0aGlzIHRocmVhZCB0byBkby4gICovCisgIGVudW0gemVfdGhyZWFkX3Jlc3VtZV9z dGF0ZV90IHJlc3VtZV9zdGF0ZSA9IFpFX1RIUkVBRF9SRVNVTUVfTk9ORTsKKworICAvKiBUaGUg c3RhcnQvZW5kIGFkZHJlc3NlcyBmb3IgcmFuZ2Utc3RlcHBpbmcuICAqLworICBDT1JFX0FERFIg c3RlcF9yYW5nZV9zdGFydCA9IDA7CisgIENPUkVfQUREUiBzdGVwX3JhbmdlX2VuZCA9IDA7CisK KyAgLyogVGhlIHRocmVhZCdzIGV4ZWN1dGlvbiBzdGF0ZS4KKworICAgICBXaGF0IGlzIHRoaXMg dGhyZWFkIGFjdHVhbGx5IGRvaW5nLiAgKi8KKyAgZW51bSB6ZV90aHJlYWRfZXhlY19zdGF0ZV90 IGV4ZWNfc3RhdGUgPSBaRV9USFJFQURfU1RBVEVfVU5LTk9XTjsKKworICAvKiBUaGUgdGhyZWFk J3Mgc3RvcCByZWFzb24uCisKKyAgICAgVGhpcyBpcyBvbmx5IHZhbGlkIGlmIEVYRUNfU1RBVEUg PT0gWkVfVEhSRUFEX1NUQVRFX1NUT1BQRUQKKyAgICAgb3IgRVhFQ19TVEFURSA9PSBaRV9USFJF QURfU1RBVEVfSEVMRC4gICovCisgIHRhcmdldF9zdG9wX3JlYXNvbiBzdG9wX3JlYXNvbiA9IFRB UkdFVF9TVE9QUEVEX0JZX05PX1JFQVNPTjsKKworICAvKiBUaGUgd2FpdHN0YXR1cyBmb3IgdGhp cyB0aHJlYWQncyBsYXN0IGV2ZW50LgorCisgICAgIFRBUkdFVF9XQUlUS0lORF9JR05PUkUgbWVh bnMgdGhhdCB0aGVyZSBpcyBubyBsYXN0IGV2ZW50LiAgKi8KKyAgdGFyZ2V0X3dhaXRzdGF0dXMg d2FpdHN0YXR1cyB7fTsKK307CisKKy8qIFJldHVybiB0aGUgWkUgdGhyZWFkIGluZm8gZm9yIFRQ LiAgKi8KKworc3RhdGljIGlubGluZQoremVfdGhyZWFkX2luZm8gKgoremVfdGhyZWFkICh0aHJl YWRfaW5mbyAqdHApCit7CisgIGlmICh0cCA9PSBudWxscHRyKQorICAgIHJldHVybiBudWxscHRy OworCisgIHJldHVybiAoemVfdGhyZWFkX2luZm8gKikgdHAtPnRhcmdldF9kYXRhICgpOworfQor CisvKiBSZXR1cm4gdGhlIFpFIHRocmVhZCBpbmZvIGZvciBjb25zdCBUUC4gICovCisKK3N0YXRp YyBpbmxpbmUKK2NvbnN0IHplX3RocmVhZF9pbmZvICoKK3plX3RocmVhZCAoY29uc3QgdGhyZWFk X2luZm8gKnRwKQoreworICBpZiAodHAgPT0gbnVsbHB0cikKKyAgICByZXR1cm4gbnVsbHB0cjsK KworICByZXR1cm4gKGNvbnN0IHplX3RocmVhZF9pbmZvICopIHRwLT50YXJnZXRfZGF0YSAoKTsK K30KKworLyogUmV0dXJuIHRoZSBMZXZlbC1aZXJvIHRocmVhZCBpZCBmb3IgYWxsIHRocmVhZHMu ICAqLworCitzdGF0aWMgaW5saW5lIHplX2RldmljZV90aHJlYWRfdAoremVfdGhyZWFkX2lkX2Fs bCAoKQoreworICB6ZV9kZXZpY2VfdGhyZWFkX3QgYWxsOworICBhbGwuc2xpY2UgPSBVSU5UMzJf TUFYOworICBhbGwuc3Vic2xpY2UgPSBVSU5UMzJfTUFYOworICBhbGwuZXUgPSBVSU5UMzJfTUFY OworICBhbGwudGhyZWFkID0gVUlOVDMyX01BWDsKKworICByZXR1cm4gYWxsOworfQorCisvKiBS ZXR1cm4gdHJ1ZSBpZiBUSUQgaXMgdGhlIGFsbCB0aHJlYWQgaWQuICAqLworCitzdGF0aWMgaW5s aW5lIGJvb2wKK3plX2lzX3RocmVhZF9pZF9hbGwgKHplX2RldmljZV90aHJlYWRfdCB0aWQpCit7 CisgIHJldHVybiAodGlkLnNsaWNlID09IFVJTlQzMl9NQVgKKwkgICYmIHRpZC5zdWJzbGljZSA9 PSBVSU5UMzJfTUFYCisJICAmJiB0aWQuZXUgPT0gVUlOVDMyX01BWAorCSAgJiYgdGlkLnRocmVh ZCA9PSBVSU5UMzJfTUFYKTsKK30KKworLyogUmV0dXJuIHRoZSBMZXZlbC1aZXJvIHRocmVhZCBp ZCBmb3IgVEhSRUFELiAgKi8KKworc3RhdGljIGlubGluZSB6ZV9kZXZpY2VfdGhyZWFkX3QKK3pl X3RocmVhZF9pZCAoY29uc3QgdGhyZWFkX2luZm8gKnRocmVhZCkKK3sKKyAgY29uc3QgemVfdGhy ZWFkX2luZm8gKnpldHAgPSB6ZV90aHJlYWQgKHRocmVhZCk7CisgIGlmICh6ZXRwID09IG51bGxw dHIpCisgICAgZXJyb3IgKF8oIk5vIHRocmVhZC4iKSk7CisKKyAgcmV0dXJuIHpldHAtPmlkOwor fQorCisvKiBSZXR1cm4gYSBodW1hbi1yZWFkYWJsZSBkZXZpY2UgdGhyZWFkIGlkIHN0cmluZy4g ICovCisKK2V4dGVybiBzdGQ6OnN0cmluZyB6ZV90aHJlYWRfaWRfc3RyIChjb25zdCB6ZV9kZXZp Y2VfdGhyZWFkX3QgJnRocmVhZCk7CisKKy8qIFJldHVybiB0aGUgZGV2aWNlIGZvciBUSFJFQUQu ICAqLworCitleHRlcm4gemVfZGV2aWNlX2luZm8gKnplX3RocmVhZF9kZXZpY2UgKGNvbnN0IHRo cmVhZF9pbmZvICp0aHJlYWQpOworCisvKiBUaGUgc3RhdGUgb2YgYSBwcm9jZXNzLiAgKi8KKwor ZW51bSB6ZV9wcm9jZXNzX3N0YXRlCit7CisgIC8qIFRoZSBwcm9jZXNzIGlzIHZpc2libGUgdG8g dGhlIHVzZXIuICAqLworICBaRV9QUk9DRVNTX1ZJU0lCTEUsCisKKyAgLyogVGhlIHByb2Nlc3Mg aXMgaGlkZGVuIGZyb20gdGhlIHVzZXIuICAqLworICBaRV9QUk9DRVNTX0hJRERFTgorfTsKKwor LyogUHJvY2VzcyBpbmZvIHByaXZhdGUgZGF0YSBmb3IgTGV2ZWwtWmVybyB0YXJnZXRzLiAgKi8K Kworc3RydWN0IHByb2Nlc3NfaW5mb19wcml2YXRlCit7CisgIC8qIFRoZSBkZXZpY2Ugd2UncmUg bW9kZWxsaW5nIGFzIHByb2Nlc3MuCisKKyAgICAgSW4gY2FzZSB3ZSBnZXQgZm9yY2VmdWxseSBk ZXRhY2hlZCBmcm9tIHRoZSBkZXZpY2UgdGhpcyBwcm9jZXNzCisgICAgIHJlcHJlc2VudHMsIERF VklDRSB3aWxsIGJlIG51bGxwdHIuICBUaGUgcHJvY2VzcyB3aWxsIHJlbWFpbiB1bnRpbAorICAg ICB0aGUgZGV0YWNoIGV2ZW50IGNhbiBiZSByZXBvcnRlZCB0byBHREIuICAqLworICB6ZV9kZXZp Y2VfaW5mbyAqZGV2aWNlOworCisgIC8qIFRoZSBzdGF0ZSBvZiB0aGlzIHByb2Nlc3MuICAqLwor ICB6ZV9wcm9jZXNzX3N0YXRlIHN0YXRlOworCisgIC8qIFRoZSB3YWl0c3RhdHVzIGZvciB0aGlz IHByb2Nlc3MncyBsYXN0IGV2ZW50LgorCisgICAgIFdoaWxlIHN0b3AgZXZlbnRzIGFyZSByZXBv cnRlZCBvbiB0aHJlYWRzLCBtb2R1bGUgbG9hZHMgYW5kIHVubG9hZHMKKyAgICAgYXMgd2VsbCBh cyBlbnRyeSBhbmQgZXhpdCBhcmUgcmVwb3J0cyBvbiB0aGUgcHJvY2VzcyBpdHNlbGYuCisKKyAg ICAgTmVpdGhlciBvZiB0aGVzZSBldmVudHMgaW1wbGllcyB0aGF0IGFueSBvZiB0aGUgcHJvY2Vz cycgdGhyZWFkcworICAgICBzdG9wcGVkIG9yIGlzIGV2ZW4gYXZhaWxhYmxlLgorCisgICAgIFRB UkdFVF9XQUlUS0lORF9JR05PUkUgbWVhbnMgdGhhdCB0aGVyZSBpcyBub3RoaW5nIHRvIHJlcG9y dC4gICovCisgIHRhcmdldF93YWl0c3RhdHVzIHdhaXRzdGF0dXMge307CisKKyAgcHJvY2Vzc19p bmZvX3ByaXZhdGUgKHplX2RldmljZV9pbmZvICpkZXYsIHplX3Byb2Nlc3Nfc3RhdGUgc3QpCisg ICAgOiBkZXZpY2UgKGRldiksIHN0YXRlIChzdCkKKyAgICB7fQorfTsKKworLyogVGFyZ2V0IG9w IGRlZmluaXRpb25zIGZvciBMZXZlbC1aZXJvIGJhc2VkIHRhcmdldHMuICAqLworCitjbGFzcyB6 ZV90YXJnZXQgOiBwdWJsaWMgcHJvY2Vzc19zdHJhdHVtX3RhcmdldAoreworcHVibGljOgorICAv KiBJbml0aWFsaXplIHRoZSBMZXZlbC1aZXJvIHRhcmdldC4KKworICAgICBXZSBjYW5ub3QgZG8g dGhpcyBpbnNpZGUgdGhlIGN0b3Igc2luY2UgemVJbml0KCkgd291bGQgZ2VuZXJhdGUgYQorICAg ICB3b3JrZXIgdGhyZWFkIHRoYXQgd291bGQgaW5oZXJpdCB0aGUgdW5pbml0aWFsaXplZCBhc3lu YyBJL08KKyAgICAgc3RhdGUuCisKKyAgICAgUG9zdHBvbmUgaW5pdGlhbGl6YXRpb24gdW50aWwg YWZ0ZXIgYXN5bmMgSS9PIGhhcyBiZWVuCisgICAgIGluaXRpYWxpemVkLiAgKi8KKyAgdm9pZCBp bml0ICgpOworCisgIGJvb2wgc3VwcG9ydHNfaGFyZHdhcmVfc2luZ2xlX3N0ZXAgKCkgb3ZlcnJp ZGUgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIHN1cHBvcnRzX3JhbmdlX3N0ZXBwaW5nICgpIG92 ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCBzdXBwb3J0c19tdWx0aV9wcm9jZXNzICgp IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCBzdXBwb3J0c19ub25fc3RvcCAoKSBv dmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgIGludCBzdGFydF9ub25fc3RvcCAoYm9vbCBlbmFi bGUpIG92ZXJyaWRlIHsgYXN5bmMgKGVuYWJsZSk7IHJldHVybiAwOyB9CisKKyAgYm9vbCBhc3lu YyAoYm9vbCBlbmFibGUpIG92ZXJyaWRlOworCisgIGludCBjcmVhdGVfaW5mZXJpb3IgKGNvbnN0 IGNoYXIgKnByb2dyYW0sCisJCSAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmYXJncykgb3ZlcnJp ZGU7CisKKyAgaW50IGF0dGFjaCAoaW50IHBpZCkgb3ZlcnJpZGU7CisgIGludCBkZXRhY2ggKHBy b2Nlc3NfaW5mbyAqcHJvYykgb3ZlcnJpZGU7CisKKyAgaW50IGtpbGwgKHByb2Nlc3NfaW5mbyAq cHJvYykgb3ZlcnJpZGU7CisgIHZvaWQgbW91cm4gKHByb2Nlc3NfaW5mbyAqcHJvYykgb3ZlcnJp ZGU7CisgIHZvaWQgam9pbiAoaW50IHBpZCkgb3ZlcnJpZGU7CisKKyAgdm9pZCByZXN1bWUgKHRo cmVhZF9yZXN1bWUgKnJlc3VtZV9pbmZvLCBzaXplX3Qgbikgb3ZlcnJpZGU7CisgIHB0aWRfdCB3 YWl0IChwdGlkX3QgcHRpZCwgdGFyZ2V0X3dhaXRzdGF0dXMgKnN0YXR1cywKKwkgICAgICAgdGFy Z2V0X3dhaXRfZmxhZ3Mgb3B0aW9ucykgb3ZlcnJpZGU7CisKKyAgdm9pZCBmZXRjaF9yZWdpc3Rl cnMgKHJlZ2NhY2hlICpyZWdjYWNoZSwgaW50IHJlZ25vKSBvdmVycmlkZTsKKyAgdm9pZCBzdG9y ZV9yZWdpc3RlcnMgKHJlZ2NhY2hlICpyZWdjYWNoZSwgaW50IHJlZ25vKSBvdmVycmlkZTsKKwor ICBpbnQgcmVhZF9tZW1vcnkgKENPUkVfQUREUiBtZW1hZGRyLCB1bnNpZ25lZCBjaGFyICpteWFk ZHIsCisJCSAgIGludCBsZW4pIG92ZXJyaWRlOworCisgIGludCB3cml0ZV9tZW1vcnkgKENPUkVf QUREUiBtZW1hZGRyLCBjb25zdCB1bnNpZ25lZCBjaGFyICpteWFkZHIsCisJCSAgICBpbnQgbGVu KSBvdmVycmlkZTsKKworICAvKiBXZSBtb2RlbCBoL3cgdGhyZWFkcyAtIHRoZXkgZG8gbm90IGV4 aXQuICAqLworICBib29sIHRocmVhZF9hbGl2ZSAocHRpZF90IHB0aWQpIG92ZXJyaWRlIHsgcmV0 dXJuIHRydWU7IH0KKyAgYm9vbCBzdXBwb3J0c190aHJlYWRfc3RvcHBlZCAoKSBvdmVycmlkZSB7 IHJldHVybiB0cnVlOyB9CisgIGJvb2wgdGhyZWFkX3N0b3BwZWQgKHN0cnVjdCB0aHJlYWRfaW5m byAqdHApIG92ZXJyaWRlOworCisgIHZvaWQgcmVxdWVzdF9pbnRlcnJ1cHQgKCkgb3ZlcnJpZGU7 CisKKyAgdm9pZCBwYXVzZV9hbGwgKGJvb2wgZnJlZXplKSBvdmVycmlkZTsKKyAgdm9pZCB1bnBh dXNlX2FsbCAoYm9vbCB1bmZyZWV6ZSkgb3ZlcnJpZGU7CisKKyAgYm9vbCBzdXBwb3J0c19waWRf dG9fZXhlY19maWxlICgpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgY29uc3QgY2hhciAq cGlkX3RvX2V4ZWNfZmlsZSAoaW50IHBpZCkgb3ZlcnJpZGUgeyByZXR1cm4gIiI7IH0KKworICB2 b2lkIGFja19saWJyYXJ5IChwcm9jZXNzX2luZm8gKnByb2Nlc3MsIGNvbnN0IGNoYXIgKm5hbWUp IG92ZXJyaWRlOworICB2b2lkIGFja19pbl9tZW1vcnlfbGlicmFyeSAocHJvY2Vzc19pbmZvICpw cm9jZXNzLCBDT1JFX0FERFIgYmVnaW4sCisJCQkgICAgICBDT1JFX0FERFIgZW5kKSBvdmVycmlk ZTsKKworcHJpdmF0ZToKKyAgdHlwZWRlZiBzdGQ6Omxpc3Q8emVfZGV2aWNlX2luZm8gKj4gZGV2 aWNlc190OworCisgIC8qIFRoZSBkZXZpY2VzIHdlIGNhcmUgYWJvdXQuICAqLworICBkZXZpY2Vz X3QgZGV2aWNlczsKKworICAvKiBUaGUgY3VycmVudCBkZXZpY2Ugb3JkaW5hbCBudW1iZXIgdXNl ZCBmb3IgZW51bWVyYXRpbmcgZGV2aWNlcy4gICovCisgIHVuc2lnbmVkIGxvbmcgb3JkaW5hbCA9 IDA7CisKKyAgLyogVGhlIGZyZWV6ZSBjb3VudCBmb3IgcGF1c2VfYWxsICgpLiAgKi8KKyAgdWlu dDMyX3QgZnJvemVuID0gMDsKKworICAvKiBBdHRhY2ggdG8gUElEIG9uIGRldmljZXMgaW4gdGhl IGRldmljZSB0cmVlIHJvb3RlZCBhdCBERVZJQ0UuCisgICAgIFJldHVybnMgdGhlIG51bWJlciBv ZiBkZXZpY2VzIHdlIGF0dGFjaGVkIHRvLiAgKi8KKyAgaW50IGF0dGFjaF90b19kZXZpY2UgKHVp bnQzMl90IHBpZCwgemVfZGV2aWNlX2hhbmRsZV90IGRldmljZSk7CisKKyAgLyogQXR0YWNoIHRv IGFsbCBhdmFpbGFibGUgZGV2aWNlcyBmb3IgcHJvY2VzcyBQSUQgYW5kIHN0b3JlIHRoZW0gaW4K KyAgICAgdGhpcyBvYmplY3QuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGV2aWNlcyB3ZSBhdHRh Y2hlZCB0by4gICovCisgIGludCBhdHRhY2hfdG9fZGV2aWNlcyAodWludDMyX3QgcGlkKTsKKwor ICAvKiBGZXRjaCBhbmQgcHJvY2VzcyBldmVudHMgZnJvbSBERVZJQ0UuICBSZXR1cm4gbnVtYmVy IG9mIGV2ZW50cy4gICovCisgIHVpbnQ2NF90IGZldGNoX2V2ZW50cyAoemVfZGV2aWNlX2luZm8g JmRldmljZSk7CisKKyAgLyogRmV0Y2ggZXZlbnRzIHVudGlsIG5vIGRldmljZSBoYXMgYW55IHJl c3VtZWQgdGhyZWFkcyBsZWZ0LiAgKi8KKyAgdm9pZCBmZXRjaF9ldmVudHNfYWxsX2RldmljZXNf bm9fcmVzdW1lZCAoKTsKKworICAvKiBSZXR1cm4gdGhlIG51bWJlciBvZiB0aHJlYWRzIHRoYXQg bWF0Y2ggdGhlIFJFU1VNRV9QVElEIGFuZCBoYXZlCisgICAgIG5ldyBldmVudHMgdG8gcmVwb3J0 LiAgQWxzbyByZWNvdmVyIHRoZXNlIHRocmVhZHMnIHJlc3VtZSBzdGF0ZQorICAgICB0byBSS0lO RC4gICovCisgIHNpemVfdCBtYXJrX2V2ZW50aW5nX3RocmVhZHMgKHB0aWRfdCByZXN1bWVfcHRp ZCwgZW51bSByZXN1bWVfa2luZCBya2luZCk7CisKKyAgLyogUmVzdW1lIGFsbCB0aHJlYWRzIG9u IERFVklDRS4gICovCisgIHZvaWQgcmVzdW1lICh6ZV9kZXZpY2VfaW5mbyAmZGV2aWNlKTsKKwor ICAvKiBSZXN1bWUgYSBzaW5nbGUgdGhyZWFkLiAgVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgdGhh dCBwcmVwYXJlcworICAgICB0aGUgdGhyZWFkIGZvciByZXN1bWluZywgaW52YWxpZGF0ZXMgaXRz IHJlZ2NhY2hlLCBhbmQgdGhlbgorICAgICByZXN1bWVzLiAgVGhlIG1ldGhvZCBzaG91bGQgYmUg Y2FsbGVkIG9ubHkgd2hlbiB3ZSBhcmUgc3VyZSB0aGUKKyAgICAgdGhyZWFkIHNob3VsZCBiZSBy ZXN1bWVkLiAgKi8KKyAgdm9pZCByZXN1bWVfc2luZ2xlX3RocmVhZCAodGhyZWFkX2luZm8gKnRo cmVhZCk7CisKKyAgLyogUmV0dXJuIHRydWUgaWYgVFAgaGFzIHNpbmdsZS1zdGVwcGVkIHdpdGhp biBpdHMgc3RlcHBpbmcgcmFuZ2UuICAqLworICBib29sIGlzX3JhbmdlX3N0ZXBwaW5nICh0aHJl YWRfaW5mbyAqdHApOworCitwcm90ZWN0ZWQ6CisgIC8qIENoZWNrIHdoZXRoZXIgYSBkZXZpY2Ug aXMgc3VwcG9ydGVkIGJ5IHRoaXMgdGFyZ2V0LiAgKi8KKyAgdmlydHVhbCBib29sIGlzX2Rldmlj ZV9zdXBwb3J0ZWQKKyAgICAoY29uc3QgemVfZGV2aWNlX3Byb3BlcnRpZXNfdCAmLAorICAgICBj b25zdCBzdGQ6OnZlY3Rvcjx6ZXRfZGVidWdfcmVnc2V0X3Byb3BlcnRpZXNfdD4gJikgPSAwOwor CisgIC8qIENyZWF0ZSBhIHRhcmdldCBkZXNjcmlwdGlvbiBmb3IgYSBkZXZpY2UgYW5kIHBvcHVs YXRlIHRoZQorICAgICBjb3JyZXNwb25kaW5nIHJlZ3NldCBpbmZvcm1hdGlvbi4gICovCisgIHZp cnR1YWwgdGFyZ2V0X2Rlc2MgKmNyZWF0ZV90ZGVzYworICAgICh6ZV9kZXZpY2VfaW5mbyAqZGlu Zm8sCisgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHpldF9kZWJ1Z19yZWdzZXRfcHJvcGVydGllc190 PiAmLAorICAgICBjb25zdCB6ZV9wY2lfZXh0X3Byb3BlcnRpZXNfdCAmKSA9IDA7CisKKyAgLyog UmV0dXJuIHdoZXRoZXIgVFAgaXMgYXQgYSBicmVha3BvaW50LiAgKi8KKyAgdmlydHVhbCBib29s IGlzX2F0X2JyZWFrcG9pbnQgKHRocmVhZF9pbmZvICp0cCkgPSAwOworCisgIC8qIFRQIHN0b3Bw ZWQuICBGaW5kIG91dCB3aHkgYW5kIHJldHVybiB0aGUgc3RvcCByZWFzb24uICBPcHRpb25hbGx5 CisgICAgIGZpbGwgaW4gU0lHTkFMLiAgKi8KKyAgdmlydHVhbCB0YXJnZXRfc3RvcF9yZWFzb24g Z2V0X3N0b3BfcmVhc29uICh0aHJlYWRfaW5mbyAqdHAsCisJCQkJCSAgICAgIGdkYl9zaWduYWwg JnNpZ25hbCkgPSAwOworCisgIC8qIFByZXBhcmUgVFAgZm9yIHJlc3VtaW5nIHVzaW5nIFRQJ3Mg UkVTVU1FX1NUQVRFLgorCisgICAgIFRoaXMgc2V0cyB0aGUgemUgZXhlY3V0aW9uIHN0YXRlLCB0 eXBpY2FsbHkgdG8gcnVubmluZy4gICovCisgIHZpcnR1YWwgdm9pZCBwcmVwYXJlX3RocmVhZF9y ZXN1bWUgKHRocmVhZF9pbmZvICp0cCkgPSAwOworCisgIC8qIFJlYWQgdGhlIG1lbW9yeSBpbiB0 aGUgY29udGV4dCBvZiB0aHJlYWQgVFAuICAqLworICBpbnQgcmVhZF9tZW1vcnkgKHRocmVhZF9p bmZvICp0cCwgQ09SRV9BRERSIG1lbWFkZHIsCisJCSAgIHVuc2lnbmVkIGNoYXIgKm15YWRkciwg aW50IGxlbik7CisKKyAgLyogV3JpdGUgdGhlIG1lbW9yeSBpbiB0aGUgY29udGV4dCBvZiB0aHJl YWQgVFAuICAqLworICBpbnQgd3JpdGVfbWVtb3J5ICh0aHJlYWRfaW5mbyAqdHAsIENPUkVfQURE UiBtZW1hZGRyLAorCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbXlhZGRyLCBpbnQgbGVuKTsK K307CisKKyNlbmRpZiAvKiBHREJTRVJWRVJfTEVWRUxfWkVST19MT1dfSCAqLwoKLS0gCjIuMzQu MQoKSW50ZWwgRGV1dHNjaGxhbmQgR21iSA0KUmVnaXN0ZXJlZCBBZGRyZXNzOiBBbSBDYW1wZW9u IDEwLCA4NTU3OSBOZXViaWJlcmcsIEdlcm1hbnkNClRlbDogKzQ5IDg5IDk5IDg4NTMtMCwgd3d3 LmludGVsLmRlDQpNYW5hZ2luZyBEaXJlY3RvcnM6IFNlYW4gRmVubmVsbHksIEplZmZyZXkgU2No bmVpZGVybWFuLCBUaWZmYW55IERvb24gU2lsdmENCkNoYWlycGVyc29uIG9mIHRoZSBTdXBlcnZp c29yeSBCb2FyZDogTmljb2xlIExhdQ0KUmVnaXN0ZXJlZCBPZmZpY2U6IE11bmljaA0KQ29tbWVy Y2lhbCBSZWdpc3RlcjogQW10c2dlcmljaHQgTXVlbmNoZW4gSFJCIDE4NjkyOAo=