From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DB8A44756AB for ; Fri, 7 Aug 2026 15:26:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786116414; cv=none; b=ABuowSXovTxrQfbymh9UWpHv7kM6bOyjXl0enORU44wJxF0LyZu1r1l6Ezte+dwIjI7pmfiAeCx+/LWSXpEc7q7r6bjqkBPYrgL3ECYfMZq4OQpvr65W/r55qG/65uUjxbJ+G+7EVRGyLuJ9Eb/YR2D7e5KGJZAjq9ir8e6+qxo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786116414; c=relaxed/simple; bh=yZkKHiK4Mgh+GC1Fi3tFP328yXtBeBViDtawa98+kzo=; h=From:Subject:To:Cc:In-Reply-To:References:Content-Type:Date: Message-Id; b=TBHZdkHMvdufa/bCL4XVHztB1QTQk8eDkHyDjxvDPv5WbpMV4ENFYycOmmWf7SjQoxiITKF4tdfhivjc1APP4b/YtqKQwbkiDBxD38yoi5HV0p2xJPXwx963iZ1Y8bttFQnCis/+juNpSu6xl/Au6d4ibjEKmTdR9H9tRcBEwEk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ODKXERnA; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ODKXERnA" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D73EA1F00A3A; Fri, 7 Aug 2026 15:26:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786116412; bh=tjoL1P0VLWdpJPH2opD9TVkxhURrfC0eqWluaf/3ii4=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=ODKXERnAHXuJgji0ztzHFg79Vz2vBEN8mNC1NxMVlJoH0CHM7lSgcoyFFoxDoIl2G nww+t3lvo9xSDFJJRhnrm8rrf0b0A70zgaxWcdDMUB/i6Z7Ekt2UQYUOo2OdapH8YP BYex+xFj92fx/3DxnngImOyMuxnPg9Yh9KtrWJ/9qmhm8Cj4Q7zR/oL9h6czQVLacA cKYlYq35bKwRwm/i+KP8LZRCUOdHjIIf3s4HWrs6IgewLyONIvZ11aS4YFeaiA14Oj Kv4WPvsGlYKOb5zga4ciZj5bKgugCacfJovdH709hwAdafwvSVJrlP0/sC+OdO4kMK p/14Yixhb3x1A== From: sashiko-bot@kernel.org Subject: Re: [PATCH V5 01/14] i3c: master: Fix recursive locking during device registration Reply-To: sashiko-reviews@lists.linux.dev To: "Adrian Hunter" Cc: "Alexandre Belloni" , Frank.Li@kernel.org, linux-pci@vger.kernel.org, linux-i3c@lists.infradead.org In-Reply-To: <20260807145638.168865-2-adrian.hunter@intel.com> References: <20260807145638.168865-1-adrian.hunter@intel.com> <20260807145638.168865-2-adrian.hunter@intel.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Fri, 07 Aug 2026 15:26:51 +0000 Message-Id: <20260807152651.D73EA1F00A3A@smtp.kernel.org> Precedence: bulk X-Mailing-List: linux-pci@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Thank you for your contribution! Sashiko AI review found 2 potential issue(= s) to consider: New issues: - [High] Dropping the bus lock during device_register() allows concurrent D= ynamic Address Assignment (DAA) to free the underlying I3C device descripto= r (i3cdev->desc), leading to a Use-After-Free in the uevent callback. Pre-existing issues: - [High] Unbalanced fwnode_handle_put in i3c_device_release leads to a refc= ount underflow of the boardinfo fwnode on device registration failure. -- --- Patch [1]: [PATCH V5 01/14] i3c: master: Fix recursive locking during d= evice registration --- commit 7ad9b7134d768d59739289af1d4be93dc5d74a13 Author: Adrian Hunter i3c: master: Fix recursive locking during device registration =20 i3c_master_register_new_i3c_devs() registers newly discovered devices while holding i3c_bus_normaluse_lock(), leading to a recursive acquisition of the same rwsem. Fix this by separating device creation from device registration. > diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c > index f485b98805cf6..d2fb1a1105218 100644 > --- a/drivers/i3c/master.c > +++ b/drivers/i3c/master.c [ ... ] > @@ -2104,25 +2113,37 @@ i3c_master_register_new_i3c_devs(struct i3c_maste= r_controller *master) > if (desc->boardinfo) > device_set_node(&desc->dev->dev, desc->boardinfo->fwnode); > =20 [Severity: High] This is a pre-existing issue, but does device_set_node() take a reference to the fwnode here? When an i3c boardinfo is added, a reference to the fwnode is acquired. However, it appears device_set_node() assigns this fwnode without incrementing the reference count. When the device is freed, the reference is unconditionally dropped: drivers/i3c/master.c:i3c_device_release() { ... fwnode_handle_put(dev->fwnode); ... } If device_register() fails, put_device() will invoke i3c_device_release() and drop the fwnode reference. If the device is subsequently rediscovered, a new device is created with the same fwnode assigned, potentially leading to= a refcount underflow and a use-after-free. > - ret =3D device_register(&desc->dev->dev); > - if (ret) { > - dev_err(&master->dev, > - "Failed to add I3C device (err =3D %d)\n", ret); > - desc->dev->desc =3D NULL; > - put_device(&desc->dev->dev); > - desc->dev =3D NULL; > - } > + list_add_tail(&desc->dev->node, &i3c_unreg_devs); > + } > + > + i3c_bus_maintenance_unlock(&master->bus); > + > + list_for_each_entry_safe(i3cdev, tmp, &i3c_unreg_devs, node) { > + ret =3D device_register(&i3cdev->dev); [Severity: High] Could dropping the bus lock around device_register() allow a concurrent dynamic address assignment operation to free the i3c device descriptor? During device_register(), the driver core invokes i3c_device_uevent(), which accesses the descriptor without taking the bus lock: drivers/i3c/master.c:i3c_device_uevent() { ... if (i3cdev->desc) devinfo =3D i3cdev->desc->info; ... } If a concurrent dynamic address assignment operation (like a hot-join) executes, it takes the bus lock in write mode. If it detects the device as a duplicate, it replaces the descriptor and frees the old one: drivers/i3c/master.c:__i3c_master_add_i3c_dev_locked() { ... newdev->dev->desc =3D newdev; ... i3c_master_free_i3c_dev(olddev); ... } If i3c_device_uevent() fetches i3cdev->desc before the swap and dereferences it after the free, is it possible this leads to a use-after-free? > + if (ret) > + dev_err(&master->dev, "Failed to add I3C device (err =3D %d)\n", ret); > + else > + list_del_init(&i3cdev->node); > + } --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260807145638.1688= 65-1-adrian.hunter@intel.com?part=3D1 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 9E941C5AC7A for ; Fri, 7 Aug 2026 15:26:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Reply-To:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Message-Id:Date: References:In-Reply-To:Cc:To:Subject:From:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=JmU5DdZJvy88Qvi2t2vXbGsHo/hawdXUJUcgiAJE0YM=; b=KCJAQsbG4WJorw 7W5w9Mhxgn1V9QzvvQgiiSmvJpWnACHu6k2Jj2NtpPtnkO3r6gClFgrWC7TPvuun5Jll4XkWWGR8T TBeOo6DlQF9+UMvU3oaJ+faMJuo4NR4FLYxAluveNVArk//1rg44AZ+5O/V/5tTSPrgOb5QIQB0W/ 2sQ481yiCPE91plNJn5MlX2b4JGErP0rARoYMOpZP7usmbYHnS73iwUDzRD6m58R9KRYEeeoWlA44 pe2/lgFKw+kbm3VSP1mjWk21umPa7CPYCat8Tlt8cSbJOZ+biblklEkegbECA+xl4AVifGmYH2acv llTALbLMBXcWaSgO5SbA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wsMTF-00000008KpA-1feg; Fri, 07 Aug 2026 15:26:53 +0000 Received: from sea.source.kernel.org ([172.234.252.31]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wsMTF-00000008Kp4-0XZH for linux-i3c@lists.infradead.org; Fri, 07 Aug 2026 15:26:53 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id A71E6436C4; Fri, 7 Aug 2026 15:26:52 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D73EA1F00A3A; Fri, 7 Aug 2026 15:26:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786116412; bh=tjoL1P0VLWdpJPH2opD9TVkxhURrfC0eqWluaf/3ii4=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=ODKXERnAHXuJgji0ztzHFg79Vz2vBEN8mNC1NxMVlJoH0CHM7lSgcoyFFoxDoIl2G nww+t3lvo9xSDFJJRhnrm8rrf0b0A70zgaxWcdDMUB/i6Z7Ekt2UQYUOo2OdapH8YP BYex+xFj92fx/3DxnngImOyMuxnPg9Yh9KtrWJ/9qmhm8Cj4Q7zR/oL9h6czQVLacA cKYlYq35bKwRwm/i+KP8LZRCUOdHjIIf3s4HWrs6IgewLyONIvZ11aS4YFeaiA14Oj Kv4WPvsGlYKOb5zga4ciZj5bKgugCacfJovdH709hwAdafwvSVJrlP0/sC+OdO4kMK p/14Yixhb3x1A== From: sashiko-bot@kernel.org Subject: Re: [PATCH V5 01/14] i3c: master: Fix recursive locking during device registration To: "Adrian Hunter" Cc: "Alexandre Belloni" , Frank.Li@kernel.org, linux-pci@vger.kernel.org, linux-i3c@lists.infradead.org In-Reply-To: <20260807145638.168865-2-adrian.hunter@intel.com> References: <20260807145638.168865-1-adrian.hunter@intel.com> <20260807145638.168865-2-adrian.hunter@intel.com> Date: Fri, 07 Aug 2026 15:26:51 +0000 Message-Id: <20260807152651.D73EA1F00A3A@smtp.kernel.org> X-BeenThere: linux-i3c@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: sashiko-reviews@lists.linux.dev MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-i3c" Errors-To: linux-i3c-bounces+linux-i3c=archiver.kernel.org@lists.infradead.org VGhhbmsgeW91IGZvciB5b3VyIGNvbnRyaWJ1dGlvbiEgU2FzaGlrbyBBSSByZXZpZXcgZm91bmQg MiBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6CgpOZXcgaXNzdWVzOgotIFtIaWdoXSBE cm9wcGluZyB0aGUgYnVzIGxvY2sgZHVyaW5nIGRldmljZV9yZWdpc3RlcigpIGFsbG93cyBjb25j dXJyZW50IER5bmFtaWMgQWRkcmVzcyBBc3NpZ25tZW50IChEQUEpIHRvIGZyZWUgdGhlIHVuZGVy bHlpbmcgSTNDIGRldmljZSBkZXNjcmlwdG9yIChpM2NkZXYtPmRlc2MpLCBsZWFkaW5nIHRvIGEg VXNlLUFmdGVyLUZyZWUgaW4gdGhlIHVldmVudCBjYWxsYmFjay4KClByZS1leGlzdGluZyBpc3N1 ZXM6Ci0gW0hpZ2hdIFVuYmFsYW5jZWQgZndub2RlX2hhbmRsZV9wdXQgaW4gaTNjX2RldmljZV9y ZWxlYXNlIGxlYWRzIHRvIGEgcmVmY291bnQgdW5kZXJmbG93IG9mIHRoZSBib2FyZGluZm8gZndu b2RlIG9uIGRldmljZSByZWdpc3RyYXRpb24gZmFpbHVyZS4KLS0KCi0tLSBQYXRjaCBbMV06IFtQ QVRDSCBWNSAwMS8xNF0gaTNjOiBtYXN0ZXI6IEZpeCByZWN1cnNpdmUgbG9ja2luZyBkdXJpbmcg ZGV2aWNlIHJlZ2lzdHJhdGlvbiAtLS0KY29tbWl0IDdhZDliNzEzNGQ3NjhkNTk3MzkyODlhZjFk NGJlOTNkYzVkNzRhMTMKQXV0aG9yOiBBZHJpYW4gSHVudGVyIDxhZHJpYW4uaHVudGVyQGludGVs LmNvbT4KCmkzYzogbWFzdGVyOiBGaXggcmVjdXJzaXZlIGxvY2tpbmcgZHVyaW5nIGRldmljZSBy ZWdpc3RyYXRpb24KICAgIAppM2NfbWFzdGVyX3JlZ2lzdGVyX25ld19pM2NfZGV2cygpIHJlZ2lz dGVycyBuZXdseSBkaXNjb3ZlcmVkIGRldmljZXMKd2hpbGUgaG9sZGluZyBpM2NfYnVzX25vcm1h bHVzZV9sb2NrKCksIGxlYWRpbmcgdG8gYSByZWN1cnNpdmUKYWNxdWlzaXRpb24gb2YgdGhlIHNh bWUgcndzZW0uIEZpeCB0aGlzIGJ5IHNlcGFyYXRpbmcgZGV2aWNlIGNyZWF0aW9uCmZyb20gZGV2 aWNlIHJlZ2lzdHJhdGlvbi4KCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTNjL21hc3Rlci5jIGIv ZHJpdmVycy9pM2MvbWFzdGVyLmMKPiBpbmRleCBmNDg1Yjk4ODA1Y2Y2Li5kMmZiMWExMTA1MjE4 IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvaTNjL21hc3Rlci5jCj4gKysrIGIvZHJpdmVycy9pM2Mv bWFzdGVyLmMKClsgLi4uIF0KCj4gQEAgLTIxMDQsMjUgKzIxMTMsMzcgQEAgaTNjX21hc3Rlcl9y ZWdpc3Rlcl9uZXdfaTNjX2RldnMoc3RydWN0IGkzY19tYXN0ZXJfY29udHJvbGxlciAqbWFzdGVy KQo+ICAJCWlmIChkZXNjLT5ib2FyZGluZm8pCj4gIAkJCWRldmljZV9zZXRfbm9kZSgmZGVzYy0+ ZGV2LT5kZXYsIGRlc2MtPmJvYXJkaW5mby0+Zndub2RlKTsKPiAgCgpbU2V2ZXJpdHk6IEhpZ2hd ClRoaXMgaXMgYSBwcmUtZXhpc3RpbmcgaXNzdWUsIGJ1dCBkb2VzIGRldmljZV9zZXRfbm9kZSgp IHRha2UgYSByZWZlcmVuY2UgdG8KdGhlIGZ3bm9kZSBoZXJlPwoKV2hlbiBhbiBpM2MgYm9hcmRp bmZvIGlzIGFkZGVkLCBhIHJlZmVyZW5jZSB0byB0aGUgZndub2RlIGlzIGFjcXVpcmVkLgpIb3dl dmVyLCBpdCBhcHBlYXJzIGRldmljZV9zZXRfbm9kZSgpIGFzc2lnbnMgdGhpcyBmd25vZGUgd2l0 aG91dAppbmNyZW1lbnRpbmcgdGhlIHJlZmVyZW5jZSBjb3VudC4gV2hlbiB0aGUgZGV2aWNlIGlz IGZyZWVkLCB0aGUgcmVmZXJlbmNlIGlzCnVuY29uZGl0aW9uYWxseSBkcm9wcGVkOgoKZHJpdmVy cy9pM2MvbWFzdGVyLmM6aTNjX2RldmljZV9yZWxlYXNlKCkgewogICAgLi4uCiAgICBmd25vZGVf aGFuZGxlX3B1dChkZXYtPmZ3bm9kZSk7CiAgICAuLi4KfQoKSWYgZGV2aWNlX3JlZ2lzdGVyKCkg ZmFpbHMsIHB1dF9kZXZpY2UoKSB3aWxsIGludm9rZSBpM2NfZGV2aWNlX3JlbGVhc2UoKQphbmQg ZHJvcCB0aGUgZndub2RlIHJlZmVyZW5jZS4gSWYgdGhlIGRldmljZSBpcyBzdWJzZXF1ZW50bHkg cmVkaXNjb3ZlcmVkLCBhCm5ldyBkZXZpY2UgaXMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIGZ3bm9k ZSBhc3NpZ25lZCwgcG90ZW50aWFsbHkgbGVhZGluZyB0byBhCnJlZmNvdW50IHVuZGVyZmxvdyBh bmQgYSB1c2UtYWZ0ZXItZnJlZS4KCj4gLQkJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZkZXNjLT5k ZXYtPmRldik7Cj4gLQkJaWYgKHJldCkgewo+IC0JCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwKPiAt CQkJCSJGYWlsZWQgdG8gYWRkIEkzQyBkZXZpY2UgKGVyciA9ICVkKVxuIiwgcmV0KTsKPiAtCQkJ ZGVzYy0+ZGV2LT5kZXNjID0gTlVMTDsKPiAtCQkJcHV0X2RldmljZSgmZGVzYy0+ZGV2LT5kZXYp Owo+IC0JCQlkZXNjLT5kZXYgPSBOVUxMOwo+IC0JCX0KPiArCQlsaXN0X2FkZF90YWlsKCZkZXNj LT5kZXYtPm5vZGUsICZpM2NfdW5yZWdfZGV2cyk7Cj4gKwl9Cj4gKwo+ICsJaTNjX2J1c19tYWlu dGVuYW5jZV91bmxvY2soJm1hc3Rlci0+YnVzKTsKPiArCj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5 X3NhZmUoaTNjZGV2LCB0bXAsICZpM2NfdW5yZWdfZGV2cywgbm9kZSkgewo+ICsJCXJldCA9IGRl dmljZV9yZWdpc3RlcigmaTNjZGV2LT5kZXYpOwoKW1NldmVyaXR5OiBIaWdoXQpDb3VsZCBkcm9w cGluZyB0aGUgYnVzIGxvY2sgYXJvdW5kIGRldmljZV9yZWdpc3RlcigpIGFsbG93IGEgY29uY3Vy cmVudApkeW5hbWljIGFkZHJlc3MgYXNzaWdubWVudCBvcGVyYXRpb24gdG8gZnJlZSB0aGUgaTNj IGRldmljZSBkZXNjcmlwdG9yPwoKRHVyaW5nIGRldmljZV9yZWdpc3RlcigpLCB0aGUgZHJpdmVy IGNvcmUgaW52b2tlcyBpM2NfZGV2aWNlX3VldmVudCgpLCB3aGljaAphY2Nlc3NlcyB0aGUgZGVz Y3JpcHRvciB3aXRob3V0IHRha2luZyB0aGUgYnVzIGxvY2s6Cgpkcml2ZXJzL2kzYy9tYXN0ZXIu YzppM2NfZGV2aWNlX3VldmVudCgpIHsKICAgIC4uLgogICAgaWYgKGkzY2Rldi0+ZGVzYykKICAg ICAgICBkZXZpbmZvID0gaTNjZGV2LT5kZXNjLT5pbmZvOwogICAgLi4uCn0KCklmIGEgY29uY3Vy cmVudCBkeW5hbWljIGFkZHJlc3MgYXNzaWdubWVudCBvcGVyYXRpb24gKGxpa2UgYSBob3Qtam9p bikKZXhlY3V0ZXMsIGl0IHRha2VzIHRoZSBidXMgbG9jayBpbiB3cml0ZSBtb2RlLiBJZiBpdCBk ZXRlY3RzIHRoZSBkZXZpY2UgYXMgYQpkdXBsaWNhdGUsIGl0IHJlcGxhY2VzIHRoZSBkZXNjcmlw dG9yIGFuZCBmcmVlcyB0aGUgb2xkIG9uZToKCmRyaXZlcnMvaTNjL21hc3Rlci5jOl9faTNjX21h c3Rlcl9hZGRfaTNjX2Rldl9sb2NrZWQoKSB7CiAgICAuLi4KICAgIG5ld2Rldi0+ZGV2LT5kZXNj ID0gbmV3ZGV2OwogICAgLi4uCiAgICBpM2NfbWFzdGVyX2ZyZWVfaTNjX2RldihvbGRkZXYpOwog ICAgLi4uCn0KCklmIGkzY19kZXZpY2VfdWV2ZW50KCkgZmV0Y2hlcyBpM2NkZXYtPmRlc2MgYmVm b3JlIHRoZSBzd2FwIGFuZCBkZXJlZmVyZW5jZXMKaXQgYWZ0ZXIgdGhlIGZyZWUsIGlzIGl0IHBv c3NpYmxlIHRoaXMgbGVhZHMgdG8gYSB1c2UtYWZ0ZXItZnJlZT8KCj4gKwkJaWYgKHJldCkKPiAr CQkJZGV2X2VycigmbWFzdGVyLT5kZXYsICJGYWlsZWQgdG8gYWRkIEkzQyBkZXZpY2UgKGVyciA9 ICVkKVxuIiwgcmV0KTsKPiArCQllbHNlCj4gKwkJCWxpc3RfZGVsX2luaXQoJmkzY2Rldi0+bm9k ZSk7Cj4gKwl9CgotLSAKU2FzaGlrbyBBSSByZXZpZXcgwrcgaHR0cHM6Ly9zYXNoaWtvLmRldi8j L3BhdGNoc2V0LzIwMjYwODA3MTQ1NjM4LjE2ODg2NS0xLWFkcmlhbi5odW50ZXJAaW50ZWwuY29t P3BhcnQ9MQoKLS0gCmxpbnV4LWkzYyBtYWlsaW5nIGxpc3QKbGludXgtaTNjQGxpc3RzLmluZnJh ZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51 eC1pM2MK