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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8F84DC7619A for ; Wed, 5 Apr 2023 15:56:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238713AbjDEP4B (ORCPT ); Wed, 5 Apr 2023 11:56:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46858 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239060AbjDEPz7 (ORCPT ); Wed, 5 Apr 2023 11:55:59 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7B6CE65B6; Wed, 5 Apr 2023 08:55:55 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id DEADC63F2D; Wed, 5 Apr 2023 15:55:54 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C5650C433EF; Wed, 5 Apr 2023 15:55:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1680710154; bh=Eyh3fJb85+zx6l+94QYojk41ERMF1Znarh0oquShuMY=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=Bb9vvl29v+4+t1OiRHphJCnmmaWhQR5WEtTJx2K8v+QS7YnJYznmpzczsaPBQmLTG B1R67IoUlfhlnriUqHF8JhmcfL9uow+OMforn79WjvDh51XEXvb6WIYTQ90OK4uD0P vmfHZuAZM66ltX7C46eu2S/XRO47n0NopdV2IiA3O+dJtxmo04Q/B16eX3/Q7r/Mjx GlBrWqYLPkBCSR3kTlOeRZtsPjaPq0qO+LpojLVhXGINKK05FSok3UUTn5Inp2yGlJ f8REnF7HjDcK5daM4S2WJGw22Jlv7qOk64uMlbH0X8aAMsD5mZCtmfOUXZtgoBqCk+ LAyzaRrRhlxdQ== Date: Wed, 5 Apr 2023 17:55:48 +0200 From: Lorenzo Pieralisi To: Hongxing Zhu Cc: Bjorn Helgaas , "l.stach@pengutronix.de" , "bhelgaas@google.com" , "linux-pci@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "kernel@pengutronix.de" , dl-linux-imx , Serge Semin Subject: Re: [PATCH v2] PCI: imx6: Save and restore MSI control of RC in suspend and resume Message-ID: References: <20230317222436.GA1978818@bhelgaas> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org [+Cc Sergey] On Mon, Mar 27, 2023 at 12:22:04AM +0000, Hongxing Zhu wrote: > > -----Original Message----- > > From: Lorenzo Pieralisi > > Sent: 2023年3月24日 23:59 > > To: Hongxing Zhu > > Cc: Bjorn Helgaas ; l.stach@pengutronix.de; > > bhelgaas@google.com; linux-pci@vger.kernel.org; > > linux-arm-kernel@lists.infradead.org; linux-kernel@vger.kernel.org; > > kernel@pengutronix.de; dl-linux-imx > > Subject: Re: [PATCH v2] PCI: imx6: Save and restore MSI control of RC in suspend > > and resume > > > > On Mon, Mar 20, 2023 at 07:02:35AM +0000, Hongxing Zhu wrote: > > > > -----Original Message----- > > > > From: Bjorn Helgaas > > > > Sent: 2023年3月18日 6:25 > > > > To: Hongxing Zhu > > > > Cc: Lorenzo Pieralisi ; > > > > l.stach@pengutronix.de; bhelgaas@google.com; > > > > linux-pci@vger.kernel.org; linux-arm-kernel@lists.infradead.org; > > > > linux-kernel@vger.kernel.org; kernel@pengutronix.de; dl-linux-imx > > > > > > > > Subject: Re: [PATCH v2] PCI: imx6: Save and restore MSI control of > > > > RC in suspend and resume > > > > > > > > On Fri, Mar 17, 2023 at 07:38:02AM +0000, Hongxing Zhu wrote: > > > > > > -----Original Message----- > > > > > > From: Lorenzo Pieralisi > > > > > > Sent: 2023年3月16日 16:11 > > > > > > To: Hongxing Zhu > > > > > > Cc: Bjorn Helgaas ; l.stach@pengutronix.de; > > > > > > bhelgaas@google.com; linux-pci@vger.kernel.org; > > > > > > linux-arm-kernel@lists.infradead.org; > > > > > > linux-kernel@vger.kernel.org; kernel@pengutronix.de; > > > > > > dl-linux-imx > > > > > > Subject: Re: [PATCH v2] PCI: imx6: Save and restore MSI control > > > > > > of RC in suspend and resume > > > > > > > > > > > > On Thu, Mar 16, 2023 at 07:37:41AM +0000, Hongxing Zhu wrote: > > > > > > > > > > > > [...] > > > > > > > > > > > > > > > > > It's not a separate register. > > > > > > > > > > > > > > > > > > > > > > The bit I manipulated is the MSI Enable bit of the > > > > > > > > > > > Message Control Register for MSI (Offset 02h) > > > > > > > > > > > contained in the MSI-capability of Root Complex. > > > > > > > > > > > > > > > > > > > > > > In addition, on i.MX6, the MSI Enable bit controls > > > > > > > > > > > delivery of MSI interrupts from components below the Root Port. > > > > > > > > > > > > > > > > > > > > > > So, set MSI Enable in imx6q-pcie to let the MSI from > > > > > > > > > > > downstream components works. > > > > > > > > > > > > > > > > > > > > My confusion is about this "MSI Capability" found by > > > > > > > > > > "dw_pcie_find_capability(pci, PCI_CAP_ID_MSI)" in your patch. > > > > > > > > > > > > > > > > > > > > The i.MX6 manual might refer to that as an "MSI Capability" > > > > > > > > > > but as far as I know, the PCIe base spec doesn't > > > > > > > > > > document a Root Complex MSI > > > > > > > > Capability. > > > > > > > > > > > > > > > > > > > > I don't think it's the same as the one documented in > > > > > > > > > > PCIe r6.0, sec 7.7.2. I think it's different because: > > > > > > > > > > > > > > > > > > > > (1) I *think* "pci" here refers to the RC, not to a Root Port. > > > > > > > > > > > > > > > > > > > > (2) The semantics are different. The MSI-X Enable bit in 7.7.2 > > only > > > > > > > > > > determines whether the Function itself is permitted to use > > MSI-X. > > > > > > > > > > It has nothing to do with devices *below* a Root Port > > > > > > > > > > can use > > > > > > MSI-X. > > > > > > > > > > It also has nothing to do with whether a Root Port can forward > > MSI > > > > > > > > > > transactions from those downstream devices. > > > > > > > > > > > > > > > > > > > > This part of my confusion could be easily resolved via a comment. > > > > > > > > > > > > > > > > > > > > I do have a follow-on question, though: the patch seems > > > > > > > > > > to enable MSI-related functionality using a register in > > > > > > > > > > the DesignWare IP, not something in the i.MX6-specific > > > > > > > > > > IP. If that's true, why don't other DesignWare-based > > > > > > > > > > drivers need something > > > > > > similar? > > > > > > > > > Hi Bjorn: > > > > > > > > > Thanks a lot for you reply. > > > > > > > > > This behavior is specific for i.MX PCIe. > > > > > > > > > > > > > > > > Which behaviour ? It can't be the root port MSI capability, > > > > > > > > that would be a HW bug (ie disabling root port MSIs would > > > > > > > > imply disabling MSIs for all downstream components). > > > > > > > > > > > > > > > > > > > > > > i.MX PCIe designer use this MSI_EN bit to control the MSI > > > > > > > trigger when integrate Design Ware PCIe IP. > > > > > > > Without the MSI_EN bit assertion (1b'1), the devices below > > > > > > > this RC can't trigger the MSI successfully. > > > > > > > Yes, you're right. It should not be the root port MSI capability. > > > > > > > > > > > > The question is, it is or it is not the root port MSI capability ? > > > > > > > > > > > > If it is, that's a HW bug. > > > > > > > > > > > > If it is not there is nothing to do and this patch can be merged. > > > > > Hi Lorenzo: > > > > > Thanks for your reply. > > > > > I think it is not the root port MSI capability actually. > > > > > Refer to my understands, designer just use the msi_en bit to > > > > > control the delivery of MSI interrupts from components below the Root > > Port. > > > > > > > > > > > > > > > i.MX PCIe designer use this MSI_EN bit to control the MSI > > > > > > > > > trigger when integrate Design Ware PCIe IP. > > > > > > > > > > > > > > > > Fair enough but that can't be the MSI Enable bit in the Root > > > > > > > > Port MSI capability "Message Control" field I am afraid. > > > > > > > > > > > > > > > > It is what Bjorn mentioned quite clearly, a root complex > > > > > > > > configuration register dressed as an MSI capability, the > > > > > > > > root complex is not a PCI device; either that or that's an HW bug. > > > > > > > Yes, it is. I agree with you. Had report this situation to the design team. > > > > > > > Hope to correct this bug in HW design if it's possible. > > > > > > > > > > > > I don't understand if it is a HW bug or not, see above. I think > > > > > > it is legitimate to have MMIO register space that *looks* like > > > > > > an MSI capability for the root complex to control delivery of > > > > > > MSI interrupts, as long as it is not the actual root port MSI > > > > > > capability, in the root port PCI config space in which case this > > > > > > would be a HW > > > > bug from what you are reporting. > > > > > I just provide the following suggestions. > > > > > - Root complex shouldn't have the MSI capability refer to the PCIe Spec > > > > > 7.7.1 chapter. > > > > > - Root port MSIs should not imply disabling MSIs for all > > > > > downstream > > > > components. > > > > > > > > I think this is all a lot of confusion, mostly on my part, sorry about that. > > > > > > > > Root Complex configuration and behavior is not specified by the PCIe > > > > spec, so that's completely up to the i.MX designer. It's fine for > > > > the Root Complex to have an MSI Capability, and it's fine for that > > > > capability to enable/disable the RC fielding of MSI MemWr > > > > transactions from downstream devices and triggering MSI interrupts. > > > > > > > > It's also fine for the RC MSI Capability to be identified with a > > > > Capability ID of 0x5, although it is slightly confusing to use > > > > PCI_CAP_ID_MSI to find it. It's also slightly confusing to use the > > PCI_MSI_FLAGS offset into the RC MSI Capability. > > > > > > > > Using the PCI_CAP_ID_MSI, PCI_MSI_FLAGS, and PCI_MSI_FLAGS_ENABLE > > > > macros suggests to the reader that this RC MSI capability is the > > > > same as the the MSI Capability defined by PCIe r6.0, sec 7.7.1. > > > > Obviously it is *not* the same, because we're talking about a *Root > > > > Complex* capability, while the sec 7.7.1 capability can only appear > > > > on PCIe functions (Root Ports, Endpoints, Switch Ports, etc). > > > > > > > > I suggest a comment to the effect that this is a Root Complex MSI > > > > Capability, not the MSI Capability defined by PCIe r6.0, sec 7.7.1. > > > > > > > > Possibly even add new #defines in pci-imx6.c with different names, > > > > even though the values happen to be the same as the PCI_MSI_* > > > > #defines. That would be a convenient place to put a comment about what > > they are. > > > Hi Bjorn: > > > Thanks a lot for your dispelling doubts. > > > How about to add the following comments in the new add function to clarify it? > > > > > > --- a/drivers/pci/controller/dwc/pci-imx6.c > > > +++ b/drivers/pci/controller/dwc/pci-imx6.c > > > @@ -1036,6 +1036,18 @@ static void pci_imx_set_msi_en(struct dw_pcie > > *pci) > > > u8 offset; > > > u16 val; > > > > > > + /* > > > + * When i.MX DM PCIe controller is configured as RC mode, it has one > > > + * MSI Capability Structure, although PCIe r6.0, sec 7.7.1 doesn't > > > + * specify the MSI Capability Structures for Root Complex. > > > > That's because a PCI root complex is not a PCI device (and this is not an MSI > > capability, which lives in PCI config space). > > > > I will reword it (and the commit log with it) and merge it in the coming weeks for > > v6.4 > Hi Lorenzo: > Thanks a lot for your kindly help. I am getting back to this since I am still not convinced and I want to understand this once for all. We do use dw_pcie_find_capability() in most DWC drivers to find and peek/poke at eg PCI express capability of the *Root port* (?), eg dw_pcie_wait_for_link() so I assume that for iMX6 dw_pcie_find_capability() does just the same, which would mean that we are poking the "Message Control" field of the Root port MSI capability. Either that (which would mean that iMX6 has a HW bug because the RP Message Control field does not control the delivery of MSIs from endpoints but just for the root port itself ) or all DWC controllers modelled the root complex MMIO space as a set of PCI/PCIe capabilities that are NOT necessarily mappable to PCI specifications defined ones. Can anyone please shed some light on this ? I don't have DWC HW, we need to know before merging this code. Thanks, Lorenzo > > Best Regards > Richard Zhu > > > > Thanks, > > Lorenzo > > > > > + * > > > + * The MSI_EN bit of MSI control register contained in this MSI-CAP > > > + * is used control the MSI delivery of MSI interrupts from components > > > + * below the Root Port. > > > + * > > > + * Find it by PCI_CAP_ID_MSI here, and assert the MSI_EN bit to > > allow > > > + * the MSI delivery below the Root Port, if the PCI MSI is enabled. > > > + */ > > > if (pci_msi_enabled()) { > > > offset = dw_pcie_find_capability(pci, PCI_CAP_ID_MSI); > > > dw_pcie_dbi_ro_wr_en(pci); Best Regards Richard Zhu > > > > > > > > Bjorn 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 1BFA0C7619A for ; Wed, 5 Apr 2023 15:57:01 +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:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=DiKOw/P3+AIp5gtDbNPdNzBvKhtlPnFCVHOzSW8MxBU=; b=yPFYeH2FrQvv11 fcp3Wvo3VXegofgel9j4of+Fmr0cnaXnxvgp498/TiG1hxzPbT60ZwuIAysAYW5clwtmd/JiQuM6y nWyGBggOPSAW0mVjCp8jvOYQNSQQkwY/fGBc/c1l9w7Yz1PIe1ATukWAsxYI4lpxoCnRKib21eYiL 49FhiOxYxijhUTznFc4o4P+8TpEh2IBLY/UE7Kj2BOGfDPaLGfTlu5SjFmrNONiDk3RZeuVmzWccq fdzmlL+I5scAWI2Pgn4aBFTuEaIjPi3I6RUCUXFKwT/rjehulsCS/d8HyaGyDtOIz04AsNrGR0O5Q yPsGHq8hMMB9LBYujD1g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1pk5UV-0052dh-2b; Wed, 05 Apr 2023 15:56:07 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1pk5US-0052ay-1q for linux-arm-kernel@lists.infradead.org; Wed, 05 Apr 2023 15:56:06 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id DEDC363F2A; Wed, 5 Apr 2023 15:55:54 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C5650C433EF; Wed, 5 Apr 2023 15:55:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1680710154; bh=Eyh3fJb85+zx6l+94QYojk41ERMF1Znarh0oquShuMY=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=Bb9vvl29v+4+t1OiRHphJCnmmaWhQR5WEtTJx2K8v+QS7YnJYznmpzczsaPBQmLTG B1R67IoUlfhlnriUqHF8JhmcfL9uow+OMforn79WjvDh51XEXvb6WIYTQ90OK4uD0P vmfHZuAZM66ltX7C46eu2S/XRO47n0NopdV2IiA3O+dJtxmo04Q/B16eX3/Q7r/Mjx GlBrWqYLPkBCSR3kTlOeRZtsPjaPq0qO+LpojLVhXGINKK05FSok3UUTn5Inp2yGlJ f8REnF7HjDcK5daM4S2WJGw22Jlv7qOk64uMlbH0X8aAMsD5mZCtmfOUXZtgoBqCk+ LAyzaRrRhlxdQ== Date: Wed, 5 Apr 2023 17:55:48 +0200 From: Lorenzo Pieralisi To: Hongxing Zhu Cc: Bjorn Helgaas , "l.stach@pengutronix.de" , "bhelgaas@google.com" , "linux-pci@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "kernel@pengutronix.de" , dl-linux-imx , Serge Semin Subject: Re: [PATCH v2] PCI: imx6: Save and restore MSI control of RC in suspend and resume Message-ID: References: <20230317222436.GA1978818@bhelgaas> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230405_085604_688444_F6272B30 X-CRM114-Status: GOOD ( 72.92 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org WytDYyBTZXJnZXldCgpPbiBNb24sIE1hciAyNywgMjAyMyBhdCAxMjoyMjowNEFNICswMDAwLCBI b25neGluZyBaaHUgd3JvdGU6Cj4gPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQo+ID4gRnJv bTogTG9yZW56byBQaWVyYWxpc2kgPGxwaWVyYWxpc2lAa2VybmVsLm9yZz4KPiA+IFNlbnQ6IDIw MjPlubQz5pyIMjTml6UgMjM6NTkKPiA+IFRvOiBIb25neGluZyBaaHUgPGhvbmd4aW5nLnpodUBu eHAuY29tPgo+ID4gQ2M6IEJqb3JuIEhlbGdhYXMgPGhlbGdhYXNAa2VybmVsLm9yZz47IGwuc3Rh Y2hAcGVuZ3V0cm9uaXguZGU7Cj4gPiBiaGVsZ2Fhc0Bnb29nbGUuY29tOyBsaW51eC1wY2lAdmdl ci5rZXJuZWwub3JnOwo+ID4gbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnOyBs aW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnOwo+ID4ga2VybmVsQHBlbmd1dHJvbml4LmRlOyBk bC1saW51eC1pbXggPGxpbnV4LWlteEBueHAuY29tPgo+ID4gU3ViamVjdDogUmU6IFtQQVRDSCB2 Ml0gUENJOiBpbXg2OiBTYXZlIGFuZCByZXN0b3JlIE1TSSBjb250cm9sIG9mIFJDIGluIHN1c3Bl bmQKPiA+IGFuZCByZXN1bWUKPiA+IAo+ID4gT24gTW9uLCBNYXIgMjAsIDIwMjMgYXQgMDc6MDI6 MzVBTSArMDAwMCwgSG9uZ3hpbmcgWmh1IHdyb3RlOgo+ID4gPiA+IC0tLS0tT3JpZ2luYWwgTWVz c2FnZS0tLS0tCj4gPiA+ID4gRnJvbTogQmpvcm4gSGVsZ2FhcyA8aGVsZ2Fhc0BrZXJuZWwub3Jn Pgo+ID4gPiA+IFNlbnQ6IDIwMjPlubQz5pyIMTjml6UgNjoyNQo+ID4gPiA+IFRvOiBIb25neGlu ZyBaaHUgPGhvbmd4aW5nLnpodUBueHAuY29tPgo+ID4gPiA+IENjOiBMb3JlbnpvIFBpZXJhbGlz aSA8bHBpZXJhbGlzaUBrZXJuZWwub3JnPjsKPiA+ID4gPiBsLnN0YWNoQHBlbmd1dHJvbml4LmRl OyBiaGVsZ2Fhc0Bnb29nbGUuY29tOwo+ID4gPiA+IGxpbnV4LXBjaUB2Z2VyLmtlcm5lbC5vcmc7 IGxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZzsKPiA+ID4gPiBsaW51eC1rZXJu ZWxAdmdlci5rZXJuZWwub3JnOyBrZXJuZWxAcGVuZ3V0cm9uaXguZGU7IGRsLWxpbnV4LWlteAo+ ID4gPiA+IDxsaW51eC1pbXhAbnhwLmNvbT4KPiA+ID4gPiBTdWJqZWN0OiBSZTogW1BBVENIIHYy XSBQQ0k6IGlteDY6IFNhdmUgYW5kIHJlc3RvcmUgTVNJIGNvbnRyb2wgb2YKPiA+ID4gPiBSQyBp biBzdXNwZW5kIGFuZCByZXN1bWUKPiA+ID4gPgo+ID4gPiA+IE9uIEZyaSwgTWFyIDE3LCAyMDIz IGF0IDA3OjM4OjAyQU0gKzAwMDAsIEhvbmd4aW5nIFpodSB3cm90ZToKPiA+ID4gPiA+ID4gLS0t LS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPiA+ID4gPiA+ID4gRnJvbTogTG9yZW56byBQaWVyYWxp c2kgPGxwaWVyYWxpc2lAa2VybmVsLm9yZz4KPiA+ID4gPiA+ID4gU2VudDogMjAyM+W5tDPmnIgx NuaXpSAxNjoxMQo+ID4gPiA+ID4gPiBUbzogSG9uZ3hpbmcgWmh1IDxob25neGluZy56aHVAbnhw LmNvbT4KPiA+ID4gPiA+ID4gQ2M6IEJqb3JuIEhlbGdhYXMgPGhlbGdhYXNAa2VybmVsLm9yZz47 IGwuc3RhY2hAcGVuZ3V0cm9uaXguZGU7Cj4gPiA+ID4gPiA+IGJoZWxnYWFzQGdvb2dsZS5jb207 IGxpbnV4LXBjaUB2Z2VyLmtlcm5lbC5vcmc7Cj4gPiA+ID4gPiA+IGxpbnV4LWFybS1rZXJuZWxA bGlzdHMuaW5mcmFkZWFkLm9yZzsKPiA+ID4gPiA+ID4gbGludXgta2VybmVsQHZnZXIua2VybmVs Lm9yZzsga2VybmVsQHBlbmd1dHJvbml4LmRlOwo+ID4gPiA+ID4gPiBkbC1saW51eC1pbXggPGxp bnV4LWlteEBueHAuY29tPgo+ID4gPiA+ID4gPiBTdWJqZWN0OiBSZTogW1BBVENIIHYyXSBQQ0k6 IGlteDY6IFNhdmUgYW5kIHJlc3RvcmUgTVNJIGNvbnRyb2wKPiA+ID4gPiA+ID4gb2YgUkMgaW4g c3VzcGVuZCBhbmQgcmVzdW1lCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IE9uIFRodSwgTWFyIDE2 LCAyMDIzIGF0IDA3OjM3OjQxQU0gKzAwMDAsIEhvbmd4aW5nIFpodSB3cm90ZToKPiA+ID4gPiA+ ID4KPiA+ID4gPiA+ID4gWy4uLl0KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+ID4gPiA+IEl0 J3Mgbm90IGEgc2VwYXJhdGUgcmVnaXN0ZXIuCj4gPiA+ID4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gVGhlIGJpdCBJIG1hbmlwdWxhdGVkIGlzIHRoZSBNU0kgRW5hYmxlIGJp dCBvZiB0aGUKPiA+ID4gPiA+ID4gPiA+ID4gPiA+IE1lc3NhZ2UgQ29udHJvbCBSZWdpc3RlciBm b3IgTVNJIChPZmZzZXQgMDJoKQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gY29udGFpbmVkIGluIHRo ZSBNU0ktY2FwYWJpbGl0eSBvZiBSb290IENvbXBsZXguCj4gPiA+ID4gPiA+ID4gPiA+ID4gPgo+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gSW4gYWRkaXRpb24sIG9uIGkuTVg2LCB0aGUgTVNJIEVuYWJs ZSBiaXQgY29udHJvbHMKPiA+ID4gPiA+ID4gPiA+ID4gPiA+IGRlbGl2ZXJ5IG9mIE1TSSBpbnRl cnJ1cHRzIGZyb20gY29tcG9uZW50cyBiZWxvdyB0aGUgUm9vdCBQb3J0Lgo+ID4gPiA+ID4gPiA+ ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+ID4gPiA+IFNvLCBzZXQgTVNJIEVuYWJsZSBpbiBpbXg2 cS1wY2llIHRvIGxldCB0aGUgTVNJIGZyb20KPiA+ID4gPiA+ID4gPiA+ID4gPiA+IGRvd25zdHJl YW0gY29tcG9uZW50cyB3b3Jrcy4KPiA+ID4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4g PiA+IE15IGNvbmZ1c2lvbiBpcyBhYm91dCB0aGlzICJNU0kgQ2FwYWJpbGl0eSIgZm91bmQgYnkK PiA+ID4gPiA+ID4gPiA+ID4gPiAiZHdfcGNpZV9maW5kX2NhcGFiaWxpdHkocGNpLCBQQ0lfQ0FQ X0lEX01TSSkiIGluIHlvdXIgcGF0Y2guCj4gPiA+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4g PiA+ID4gPiBUaGUgaS5NWDYgbWFudWFsIG1pZ2h0IHJlZmVyIHRvIHRoYXQgYXMgYW4gIk1TSSBD YXBhYmlsaXR5Igo+ID4gPiA+ID4gPiA+ID4gPiA+IGJ1dCBhcyBmYXIgYXMgSSBrbm93LCB0aGUg UENJZSBiYXNlIHNwZWMgZG9lc24ndAo+ID4gPiA+ID4gPiA+ID4gPiA+IGRvY3VtZW50IGEgUm9v dCBDb21wbGV4IE1TSQo+ID4gPiA+ID4gPiA+ID4gQ2FwYWJpbGl0eS4KPiA+ID4gPiA+ID4gPiA+ ID4gPgo+ID4gPiA+ID4gPiA+ID4gPiA+IEkgZG9uJ3QgdGhpbmsgaXQncyB0aGUgc2FtZSBhcyB0 aGUgb25lIGRvY3VtZW50ZWQgaW4KPiA+ID4gPiA+ID4gPiA+ID4gPiBQQ0llIHI2LjAsIHNlYyA3 LjcuMi4gIEkgdGhpbmsgaXQncyBkaWZmZXJlbnQgYmVjYXVzZToKPiA+ID4gPiA+ID4gPiA+ID4g Pgo+ID4gPiA+ID4gPiA+ID4gPiA+ICAgKDEpIEkgKnRoaW5rKiAicGNpIiBoZXJlIHJlZmVycyB0 byB0aGUgUkMsIG5vdCB0byBhIFJvb3QgUG9ydC4KPiA+ID4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ ID4gPiA+ID4gPiA+ICAgKDIpIFRoZSBzZW1hbnRpY3MgYXJlIGRpZmZlcmVudC4gIFRoZSBNU0kt WCBFbmFibGUgYml0IGluIDcuNy4yCj4gPiBvbmx5Cj4gPiA+ID4gPiA+ID4gPiA+ID4gICBkZXRl cm1pbmVzIHdoZXRoZXIgdGhlIEZ1bmN0aW9uIGl0c2VsZiBpcyBwZXJtaXR0ZWQgdG8gdXNlCj4g PiBNU0ktWC4KPiA+ID4gPiA+ID4gPiA+ID4gPiAgIEl0IGhhcyBub3RoaW5nIHRvIGRvIHdpdGgg ZGV2aWNlcyAqYmVsb3cqIGEgUm9vdCBQb3J0Cj4gPiA+ID4gPiA+ID4gPiA+ID4gY2FuIHVzZQo+ ID4gPiA+ID4gPiBNU0ktWC4KPiA+ID4gPiA+ID4gPiA+ID4gPiAgIEl0IGFsc28gaGFzIG5vdGhp bmcgdG8gZG8gd2l0aCB3aGV0aGVyIGEgUm9vdCBQb3J0IGNhbiBmb3J3YXJkCj4gPiBNU0kKPiA+ ID4gPiA+ID4gPiA+ID4gPiAgIHRyYW5zYWN0aW9ucyBmcm9tIHRob3NlIGRvd25zdHJlYW0gZGV2 aWNlcy4KPiA+ID4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gPiA+IFRoaXMgcGFydCBv ZiBteSBjb25mdXNpb24gY291bGQgYmUgZWFzaWx5IHJlc29sdmVkIHZpYSBhIGNvbW1lbnQuCj4g PiA+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+ID4gPiBJIGRvIGhhdmUgYSBmb2xsb3ct b24gcXVlc3Rpb24sIHRob3VnaDogdGhlIHBhdGNoIHNlZW1zCj4gPiA+ID4gPiA+ID4gPiA+ID4g dG8gZW5hYmxlIE1TSS1yZWxhdGVkIGZ1bmN0aW9uYWxpdHkgdXNpbmcgYSByZWdpc3RlciBpbgo+ ID4gPiA+ID4gPiA+ID4gPiA+IHRoZSBEZXNpZ25XYXJlIElQLCBub3Qgc29tZXRoaW5nIGluIHRo ZSBpLk1YNi1zcGVjaWZpYwo+ID4gPiA+ID4gPiA+ID4gPiA+IElQLiAgSWYgdGhhdCdzIHRydWUs IHdoeSBkb24ndCBvdGhlciBEZXNpZ25XYXJlLWJhc2VkCj4gPiA+ID4gPiA+ID4gPiA+ID4gZHJp dmVycyBuZWVkIHNvbWV0aGluZwo+ID4gPiA+ID4gPiBzaW1pbGFyPwo+ID4gPiA+ID4gPiA+ID4g PiBIaSBCam9ybjoKPiA+ID4gPiA+ID4gPiA+ID4gVGhhbmtzIGEgbG90IGZvciB5b3UgcmVwbHku Cj4gPiA+ID4gPiA+ID4gPiA+IFRoaXMgYmVoYXZpb3IgaXMgc3BlY2lmaWMgZm9yIGkuTVggUENJ ZS4KPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiBXaGljaCBiZWhhdmlvdXIgPyBJdCBj YW4ndCBiZSB0aGUgcm9vdCBwb3J0IE1TSSBjYXBhYmlsaXR5LAo+ID4gPiA+ID4gPiA+ID4gdGhh dCB3b3VsZCBiZSBhIEhXIGJ1ZyAoaWUgZGlzYWJsaW5nIHJvb3QgcG9ydCBNU0lzIHdvdWxkCj4g PiA+ID4gPiA+ID4gPiBpbXBseSBkaXNhYmxpbmcgTVNJcyBmb3IgYWxsIGRvd25zdHJlYW0gY29t cG9uZW50cykuCj4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gaS5N WCBQQ0llIGRlc2lnbmVyIHVzZSB0aGlzIE1TSV9FTiBiaXQgdG8gY29udHJvbCB0aGUgTVNJCj4g PiA+ID4gPiA+ID4gdHJpZ2dlciB3aGVuIGludGVncmF0ZSAgRGVzaWduIFdhcmUgUENJZSBJUC4K PiA+ID4gPiA+ID4gPiBXaXRob3V0IHRoZSBNU0lfRU4gYml0IGFzc2VydGlvbiAoMWInMSksIHRo ZSBkZXZpY2VzIGJlbG93Cj4gPiA+ID4gPiA+ID4gdGhpcyBSQyBjYW4ndCB0cmlnZ2VyICB0aGUg TVNJIHN1Y2Nlc3NmdWxseS4KPiA+ID4gPiA+ID4gPiBZZXMsIHlvdSdyZSByaWdodC4gSXQgc2hv dWxkIG5vdCBiZSB0aGUgcm9vdCBwb3J0IE1TSSBjYXBhYmlsaXR5Lgo+ID4gPiA+ID4gPgo+ID4g PiA+ID4gPiBUaGUgcXVlc3Rpb24gaXMsIGl0IGlzIG9yIGl0IGlzIG5vdCB0aGUgcm9vdCBwb3J0 IE1TSSBjYXBhYmlsaXR5ID8KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gSWYgaXQgaXMsIHRoYXQn cyBhIEhXIGJ1Zy4KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gSWYgaXQgaXMgbm90IHRoZXJlIGlz IG5vdGhpbmcgdG8gZG8gYW5kIHRoaXMgcGF0Y2ggY2FuIGJlIG1lcmdlZC4KPiA+ID4gPiA+IEhp IExvcmVuem86Cj4gPiA+ID4gPiBUaGFua3MgZm9yIHlvdXIgcmVwbHkuCj4gPiA+ID4gPiBJIHRo aW5rIGl0IGlzIG5vdCB0aGUgcm9vdCBwb3J0IE1TSSBjYXBhYmlsaXR5IGFjdHVhbGx5Lgo+ID4g PiA+ID4gUmVmZXIgdG8gbXkgdW5kZXJzdGFuZHMsIGRlc2lnbmVyIGp1c3QgdXNlIHRoZSBtc2lf ZW4gYml0IHRvCj4gPiA+ID4gPiBjb250cm9sIHRoZSAgZGVsaXZlcnkgb2YgTVNJIGludGVycnVw dHMgZnJvbSBjb21wb25lbnRzIGJlbG93IHRoZSBSb290Cj4gPiBQb3J0Lgo+ID4gPiA+ID4gPgo+ ID4gPiA+ID4gPiA+ID4gPiBpLk1YIFBDSWUgZGVzaWduZXIgdXNlIHRoaXMgTVNJX0VOIGJpdCB0 byBjb250cm9sIHRoZSBNU0kKPiA+ID4gPiA+ID4gPiA+ID4gdHJpZ2dlciB3aGVuIGludGVncmF0 ZSBEZXNpZ24gV2FyZSBQQ0llIElQLgo+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+IEZh aXIgZW5vdWdoIGJ1dCB0aGF0IGNhbid0IGJlIHRoZSBNU0kgRW5hYmxlIGJpdCBpbiB0aGUgUm9v dAo+ID4gPiA+ID4gPiA+ID4gUG9ydCBNU0kgY2FwYWJpbGl0eSAiTWVzc2FnZSBDb250cm9sIiBm aWVsZCBJIGFtIGFmcmFpZC4KPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiBJdCBpcyB3 aGF0IEJqb3JuIG1lbnRpb25lZCBxdWl0ZSBjbGVhcmx5LCBhIHJvb3QgY29tcGxleAo+ID4gPiA+ ID4gPiA+ID4gY29uZmlndXJhdGlvbiByZWdpc3RlciBkcmVzc2VkIGFzIGFuIE1TSSBjYXBhYmls aXR5LCB0aGUKPiA+ID4gPiA+ID4gPiA+IHJvb3QgY29tcGxleCBpcyBub3QgYSBQQ0kgZGV2aWNl OyBlaXRoZXIgdGhhdCBvciB0aGF0J3MgYW4gSFcgYnVnLgo+ID4gPiA+ID4gPiA+IFllcywgaXQg aXMuIEkgYWdyZWUgd2l0aCB5b3UuIEhhZCByZXBvcnQgdGhpcyBzaXR1YXRpb24gdG8gdGhlIGRl c2lnbiB0ZWFtLgo+ID4gPiA+ID4gPiA+IEhvcGUgdG8gY29ycmVjdCB0aGlzIGJ1ZyBpbiBIVyBk ZXNpZ24gaWYgaXQncyBwb3NzaWJsZS4KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gSSBkb24ndCB1 bmRlcnN0YW5kIGlmIGl0IGlzIGEgSFcgYnVnIG9yIG5vdCwgc2VlIGFib3ZlLiBJIHRoaW5rCj4g PiA+ID4gPiA+IGl0IGlzIGxlZ2l0aW1hdGUgdG8gaGF2ZSBNTUlPIHJlZ2lzdGVyIHNwYWNlIHRo YXQgKmxvb2tzKiBsaWtlCj4gPiA+ID4gPiA+IGFuIE1TSSBjYXBhYmlsaXR5IGZvciB0aGUgcm9v dCBjb21wbGV4IHRvIGNvbnRyb2wgZGVsaXZlcnkgb2YKPiA+ID4gPiA+ID4gTVNJIGludGVycnVw dHMsIGFzIGxvbmcgYXMgaXQgaXMgbm90IHRoZSBhY3R1YWwgcm9vdCBwb3J0IE1TSQo+ID4gPiA+ ID4gPiBjYXBhYmlsaXR5LCBpbiB0aGUgcm9vdCBwb3J0IFBDSSBjb25maWcgc3BhY2UgaW4gd2hp Y2ggY2FzZSB0aGlzCj4gPiA+ID4gPiA+IHdvdWxkIGJlIGEgSFcKPiA+ID4gPiBidWcgZnJvbSB3 aGF0IHlvdSBhcmUgcmVwb3J0aW5nLgo+ID4gPiA+ID4gSSBqdXN0IHByb3ZpZGUgdGhlIGZvbGxv d2luZyBzdWdnZXN0aW9ucy4KPiA+ID4gPiA+IC0gUm9vdCBjb21wbGV4IHNob3VsZG4ndCBoYXZl IHRoZSBNU0kgY2FwYWJpbGl0eSByZWZlciB0byB0aGUgUENJZSBTcGVjCj4gPiA+ID4gPiAgIDcu Ny4xIGNoYXB0ZXIuCj4gPiA+ID4gPiAtIFJvb3QgcG9ydCBNU0lzIHNob3VsZCBub3QgaW1wbHkg ZGlzYWJsaW5nIE1TSXMgZm9yIGFsbAo+ID4gPiA+ID4gZG93bnN0cmVhbQo+ID4gPiA+IGNvbXBv bmVudHMuCj4gPiA+ID4KPiA+ID4gPiBJIHRoaW5rIHRoaXMgaXMgYWxsIGEgbG90IG9mIGNvbmZ1 c2lvbiwgbW9zdGx5IG9uIG15IHBhcnQsIHNvcnJ5IGFib3V0IHRoYXQuCj4gPiA+ID4KPiA+ID4g PiBSb290IENvbXBsZXggY29uZmlndXJhdGlvbiBhbmQgYmVoYXZpb3IgaXMgbm90IHNwZWNpZmll ZCBieSB0aGUgUENJZQo+ID4gPiA+IHNwZWMsIHNvIHRoYXQncyBjb21wbGV0ZWx5IHVwIHRvIHRo ZSBpLk1YIGRlc2lnbmVyLiAgSXQncyBmaW5lIGZvcgo+ID4gPiA+IHRoZSBSb290IENvbXBsZXgg dG8gaGF2ZSBhbiBNU0kgQ2FwYWJpbGl0eSwgYW5kIGl0J3MgZmluZSBmb3IgdGhhdAo+ID4gPiA+ IGNhcGFiaWxpdHkgdG8gZW5hYmxlL2Rpc2FibGUgdGhlIFJDIGZpZWxkaW5nIG9mIE1TSSBNZW1X cgo+ID4gPiA+IHRyYW5zYWN0aW9ucyBmcm9tIGRvd25zdHJlYW0gZGV2aWNlcyBhbmQgdHJpZ2dl cmluZyBNU0kgaW50ZXJydXB0cy4KPiA+ID4gPgo+ID4gPiA+IEl0J3MgYWxzbyBmaW5lIGZvciB0 aGUgUkMgTVNJIENhcGFiaWxpdHkgdG8gYmUgaWRlbnRpZmllZCB3aXRoIGEKPiA+ID4gPiBDYXBh YmlsaXR5IElEIG9mIDB4NSwgYWx0aG91Z2ggaXQgaXMgc2xpZ2h0bHkgY29uZnVzaW5nIHRvIHVz ZQo+ID4gPiA+IFBDSV9DQVBfSURfTVNJIHRvIGZpbmQgaXQuICBJdCdzIGFsc28gc2xpZ2h0bHkg Y29uZnVzaW5nIHRvIHVzZSB0aGUKPiA+IFBDSV9NU0lfRkxBR1Mgb2Zmc2V0IGludG8gdGhlIFJD IE1TSSBDYXBhYmlsaXR5Lgo+ID4gPiA+Cj4gPiA+ID4gVXNpbmcgdGhlIFBDSV9DQVBfSURfTVNJ LCBQQ0lfTVNJX0ZMQUdTLCBhbmQgUENJX01TSV9GTEFHU19FTkFCTEUKPiA+ID4gPiBtYWNyb3Mg c3VnZ2VzdHMgdG8gdGhlIHJlYWRlciB0aGF0IHRoaXMgUkMgTVNJIGNhcGFiaWxpdHkgaXMgdGhl Cj4gPiA+ID4gc2FtZSBhcyB0aGUgdGhlIE1TSSBDYXBhYmlsaXR5IGRlZmluZWQgYnkgUENJZSBy Ni4wLCBzZWMgNy43LjEuCj4gPiA+ID4gT2J2aW91c2x5IGl0IGlzICpub3QqIHRoZSBzYW1lLCBi ZWNhdXNlIHdlJ3JlIHRhbGtpbmcgYWJvdXQgYSAqUm9vdAo+ID4gPiA+IENvbXBsZXgqIGNhcGFi aWxpdHksIHdoaWxlIHRoZSBzZWMgNy43LjEgY2FwYWJpbGl0eSBjYW4gb25seSBhcHBlYXIKPiA+ ID4gPiBvbiBQQ0llIGZ1bmN0aW9ucyAoUm9vdCBQb3J0cywgRW5kcG9pbnRzLCBTd2l0Y2ggUG9y dHMsIGV0YykuCj4gPiA+ID4KPiA+ID4gPiBJIHN1Z2dlc3QgYSBjb21tZW50IHRvIHRoZSBlZmZl Y3QgdGhhdCB0aGlzIGlzIGEgUm9vdCBDb21wbGV4IE1TSQo+ID4gPiA+IENhcGFiaWxpdHksIG5v dCB0aGUgTVNJIENhcGFiaWxpdHkgZGVmaW5lZCBieSBQQ0llIHI2LjAsIHNlYyA3LjcuMS4KPiA+ ID4gPgo+ID4gPiA+IFBvc3NpYmx5IGV2ZW4gYWRkIG5ldyAjZGVmaW5lcyBpbiBwY2ktaW14Ni5j IHdpdGggZGlmZmVyZW50IG5hbWVzLAo+ID4gPiA+IGV2ZW4gdGhvdWdoIHRoZSB2YWx1ZXMgaGFw cGVuIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBQQ0lfTVNJXyoKPiA+ID4gPiAjZGVmaW5lcy4gIFRo YXQgd291bGQgYmUgYSBjb252ZW5pZW50IHBsYWNlIHRvIHB1dCBhIGNvbW1lbnQgYWJvdXQgd2hh dAo+ID4gdGhleSBhcmUuCj4gPiA+IEhpIEJqb3JuOgo+ID4gPiBUaGFua3MgYSBsb3QgZm9yIHlv dXIgZGlzcGVsbGluZyBkb3VidHMuCj4gPiA+IEhvdyBhYm91dCB0byBhZGQgdGhlIGZvbGxvd2lu ZyBjb21tZW50cyBpbiB0aGUgbmV3IGFkZCBmdW5jdGlvbiB0byBjbGFyaWZ5IGl0Pwo+ID4gPgo+ ID4gPiAtLS0gYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL2R3Yy9wY2ktaW14Ni5jCj4gPiA+ICsr KyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdjL3BjaS1pbXg2LmMKPiA+ID4gQEAgLTEwMzYs NiArMTAzNiwxOCBAQCBzdGF0aWMgdm9pZCBwY2lfaW14X3NldF9tc2lfZW4oc3RydWN0IGR3X3Bj aWUKPiA+ICpwY2kpCj4gPiA+ICAgICAgICAgdTggb2Zmc2V0Owo+ID4gPiAgICAgICAgIHUxNiB2 YWw7Cj4gPiA+Cj4gPiA+ICsgICAgICAgLyoKPiA+ID4gKyAgICAgICAgKiBXaGVuIGkuTVggRE0g UENJZSBjb250cm9sbGVyIGlzIGNvbmZpZ3VyZWQgYXMgUkMgbW9kZSwgaXQgaGFzIG9uZQo+ID4g PiArICAgICAgICAqIE1TSSBDYXBhYmlsaXR5IFN0cnVjdHVyZSwgYWx0aG91Z2ggUENJZSByNi4w LCBzZWMgNy43LjEgZG9lc24ndAo+ID4gPiArICAgICAgICAqIHNwZWNpZnkgdGhlIE1TSSBDYXBh YmlsaXR5IFN0cnVjdHVyZXMgZm9yIFJvb3QgQ29tcGxleC4KPiA+IAo+ID4gVGhhdCdzIGJlY2F1 c2UgYSBQQ0kgcm9vdCBjb21wbGV4IGlzIG5vdCBhIFBDSSBkZXZpY2UgKGFuZCB0aGlzIGlzIG5v dCBhbiBNU0kKPiA+IGNhcGFiaWxpdHksIHdoaWNoIGxpdmVzIGluIFBDSSBjb25maWcgc3BhY2Up Lgo+ID4gCj4gPiBJIHdpbGwgcmV3b3JkIGl0IChhbmQgdGhlIGNvbW1pdCBsb2cgd2l0aCBpdCkg YW5kIG1lcmdlIGl0IGluIHRoZSBjb21pbmcgd2Vla3MgZm9yCj4gPiB2Ni40Cj4gSGkgTG9yZW56 bzoKPiBUaGFua3MgYSBsb3QgZm9yIHlvdXIga2luZGx5IGhlbHAuCgpJIGFtIGdldHRpbmcgYmFj ayB0byB0aGlzIHNpbmNlIEkgYW0gc3RpbGwgbm90IGNvbnZpbmNlZCBhbmQgSSB3YW50IHRvCnVu ZGVyc3RhbmQgdGhpcyBvbmNlIGZvciBhbGwuCgpXZSBkbyB1c2UgZHdfcGNpZV9maW5kX2NhcGFi aWxpdHkoKSBpbiBtb3N0IERXQyBkcml2ZXJzIHRvIGZpbmQgYW5kCnBlZWsvcG9rZSBhdCBlZyBQ Q0kgZXhwcmVzcyBjYXBhYmlsaXR5IG9mIHRoZSAqUm9vdCBwb3J0KiAoPyksCgplZyBkd19wY2ll X3dhaXRfZm9yX2xpbmsoKQoKc28gSSBhc3N1bWUgdGhhdCBmb3IgaU1YNiBkd19wY2llX2ZpbmRf Y2FwYWJpbGl0eSgpIGRvZXMganVzdCB0aGUgc2FtZSwKd2hpY2ggd291bGQgbWVhbiB0aGF0IHdl IGFyZSBwb2tpbmcgdGhlICJNZXNzYWdlIENvbnRyb2wiIGZpZWxkIG9mIHRoZQpSb290IHBvcnQg TVNJIGNhcGFiaWxpdHkuCgpFaXRoZXIgdGhhdCAod2hpY2ggd291bGQgbWVhbiB0aGF0IGlNWDYg aGFzIGEgSFcgYnVnIGJlY2F1c2UgdGhlIFJQCk1lc3NhZ2UgQ29udHJvbCBmaWVsZCBkb2VzIG5v dCBjb250cm9sIHRoZSBkZWxpdmVyeSBvZiBNU0lzIGZyb20KZW5kcG9pbnRzIGJ1dCBqdXN0IGZv ciB0aGUgcm9vdCBwb3J0IGl0c2VsZiApIG9yIGFsbCBEV0MgY29udHJvbGxlcnMKbW9kZWxsZWQg dGhlIHJvb3QgY29tcGxleCBNTUlPIHNwYWNlIGFzIGEgc2V0IG9mIFBDSS9QQ0llIGNhcGFiaWxp dGllcwp0aGF0IGFyZSBOT1QgbmVjZXNzYXJpbHkgbWFwcGFibGUgdG8gUENJIHNwZWNpZmljYXRp b25zIGRlZmluZWQgb25lcy4KCkNhbiBhbnlvbmUgcGxlYXNlIHNoZWQgc29tZSBsaWdodCBvbiB0 aGlzID8gSSBkb24ndCBoYXZlIERXQyBIVywgd2UgbmVlZAp0byBrbm93IGJlZm9yZSBtZXJnaW5n IHRoaXMgY29kZS4KClRoYW5rcywKTG9yZW56bwoKPiAKPiBCZXN0IFJlZ2FyZHMKPiBSaWNoYXJk IFpodQo+ID4gCj4gPiBUaGFua3MsCj4gPiBMb3JlbnpvCj4gPiAKPiA+ID4gKyAgICAgICAgKgo+ ID4gPiArICAgICAgICAqIFRoZSBNU0lfRU4gYml0IG9mIE1TSSBjb250cm9sIHJlZ2lzdGVyIGNv bnRhaW5lZCBpbiB0aGlzIE1TSS1DQVAKPiA+ID4gKyAgICAgICAgKiBpcyB1c2VkIGNvbnRyb2wg dGhlIE1TSSBkZWxpdmVyeSBvZiBNU0kgaW50ZXJydXB0cyBmcm9tIGNvbXBvbmVudHMKPiA+ID4g KyAgICAgICAgKiBiZWxvdyB0aGUgUm9vdCBQb3J0Lgo+ID4gPiArICAgICAgICAqCj4gPiA+ICsg ICAgICAgICogRmluZCBpdCBieSBQQ0lfQ0FQX0lEX01TSSBoZXJlLCBhbmQgYXNzZXJ0IHRoZSBN U0lfRU4gYml0IHRvCj4gPiBhbGxvdwo+ID4gPiArICAgICAgICAqIHRoZSBNU0kgZGVsaXZlcnkg YmVsb3cgdGhlIFJvb3QgUG9ydCwgaWYgdGhlIFBDSSBNU0kgaXMgZW5hYmxlZC4KPiA+ID4gKyAg ICAgICAgKi8KPiA+ID4gICAgICAgICBpZiAocGNpX21zaV9lbmFibGVkKCkpIHsKPiA+ID4gICAg ICAgICAgICAgICAgIG9mZnNldCA9IGR3X3BjaWVfZmluZF9jYXBhYmlsaXR5KHBjaSwgUENJX0NB UF9JRF9NU0kpOwo+ID4gPiAgICAgICAgICAgICAgICAgZHdfcGNpZV9kYmlfcm9fd3JfZW4ocGNp KTsgQmVzdCBSZWdhcmRzIFJpY2hhcmQgWmh1Cj4gPiA+ID4KPiA+ID4gPiBCam9ybgoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5l bCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6 Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=