From mboxrd@z Thu Jan 1 00:00:00 1970 From: mark.rutland@arm.com (Mark Rutland) Date: Thu, 8 Nov 2018 15:54:05 +0000 Subject: [RFC 0/2] Add RISC-V cpu topology In-Reply-To: References: <1541113468-22097-1-git-send-email-atish.patra@wdc.com> <866dedbc78ab4fa0e3b040697e112106@mailhost.ics.forth.gr> <20181106141331.GA28458@e107155-lin> <969fc2a5198984e0dfe8c3f585dc65f9@mailhost.ics.forth.gr> <20181106162051.w7fyweuxrl7ujzuz@lakrids.cambridge.arm.com> <20181107120645.sc3wjgr2yakvxktl@lakrids.cambridge.arm.com> Message-ID: <20181108155404.32ja7bbxu62nyytt@lakrids.cambridge.arm.com> To: linux-riscv@lists.infradead.org List-Id: linux-riscv.lists.infradead.org On Thu, Nov 08, 2018 at 03:45:36PM +0200, Nick Kossifidis wrote: > ???? 2018-11-07 14:06, Mark Rutland ??????: > > On Wed, Nov 07, 2018 at 04:31:34AM +0200, Nick Kossifidis wrote: > > > Mark and Sundeep thanks a lot for your feedback, I guess you convinced > > > me that having a device tree binding for the scheduler is not a > > > correct approach. It's not a device after all and I agree that the > > > device tree shouldn't become an OS configuration file. > > > > Good to hear. > > > > > Regarding multiple levels of shared resources my point is that since > > > cpu-map doesn't contain any information of what is shared among the > > > cluster/core members it's not easy to do any further translation. Last > > > time I checked the arm code that uses cpu-map, it only defines one > > > domain for SMT, one for MC and then everything else is ignored. No > > > matter how many clusters have been defined, anything above the core > > > level is the same (and then I guess you started talking about adding > > > "packages" on the representation side). > > > > While cpu-map doesn't contain that information today, we can *add* that > > information to the cpu-map binding if necessary. > > > > > The reason I proposed to have a binding for the scheduler directly is > > > not only because it's simpler and closer to what really happens in the > > > code, it also makes more sense to me than the combination of cpu-map > > > with all the related mappings e.g. for numa or caches or power > > > domains etc. > > > > > > However you are right we could definitely augment cpu-map to include > > > support for what I'm saying and clean things up, and since you are > > > open about improving it here is a proposal that I hope you find > > > interesting: > > > > > > At first let's get rid of the nodes, they don't make sense: > > > > > > thread0 { > > > cpu = <&CPU0>; > > > }; > > > > > > A thread node can't have more than one cpu entry and any properties > > > should be on the cpu node itself, so it doesn't / can't add any > > > more information. We could just have an array of cpu nodes on the > > > node, it's much cleaner this way. > > > > > > core0 { > > > members = <&CPU0>, <&CPU1>; > > > }; > > > > Hold on. Rather than reinventing things from first principles, can we > > please discuss what you want to *achieve*, i.e. what information you > > need? > > > > Having a node is not a significant cost, and there are reasons we may > > want thread nodes. For example, it means that we can always refer to any > > level of topology with a phandle, and we might want to describe > > thread-affine devices in future. > > You can use the phandle of the cpu node, the thread node doesn't add > anything more than complexity to the representation. That adds complexity elsewhere, because the phandle of a CPU node is not a child of the cpu-map node, and you can't simply walk up the tree hierarchy to find parent nodes. I see no reason to change this part of the binding. Given it's already out there, with existing parsing code, changing it only serves to add complexity to any common code which has to parse this. Can we please drop the idea of dropping the thread node? > > There are a tonne of existing bindings that are ugly, but re-inventing > > them for taste reasons alone is more costly to the ecosystem than simply > > using the existing bindings. We avoid re-inventing bindings unless there > > is a functional problem e.g. cases which they cannot possibly describe. > > We are talking about using something for RISC-V and possibly common across > different archs and, I don't see why we should keep the ugliness of a > binding spec plus in this case the node can't possibly describe > anything else than a cpu= alias, it's redundant. While it may be ugly, removing it only serves to add complexity for common parsing code, and removes flexibility that we may want in future. Its presence does not cause any technical problem. For better or worse we're all sharing the same codebase here. The common case matters, as does the complexity of the codebase as a whole. I realise it can be frustrating to have to use something you feel is sub-optimal, but putting up with a few nodes which you personally feel are redundant is of much lower cost to the ecosystem than having incompatible bindings where we could have one. If you put up with that, you can focus your efforts on more worthwhile technical exercises. > > > Then let's allow the cluster and core nodes to accept attributes > > > that are > > > common for the cpus they contain. Right now this is considered > > > invalid. > > > > > > For power domains we have a generic binding described on > > > Documentation/devicetree/bindings/power/power_domain.txt > > > which basically says that we need to put power-domains = > > specifiers> > > > attribute on each of the cpu nodes. > > > > FWIW, given this is arguably topological, I'm not personally averse to > > describing this in the cpu-map, if that actually gains us more than the > > complexity require to support it. > > > > Given we don't do this for device power domains, I suspect that it's > > simpler to stick with the existing binding. > > > > > The same happens with the capacity binding specified for arm on > > > Documentation/devicetree/bindings/arm/cpu-capacity.txt > > > which says we should add the capacity-dmips-mhz on each of the cpu > > > nodes. > > > > The cpu-map was intended to expose topological dtails, and this isn't > > really a topological property. For example, Arm DynamIQ systems can have > > heterogeneous CPUs within clusters. > > > > I do not think it's worth moving this, tbh. > > > > > The same also happens with the generic numa binding on > > > Documentation/devicetree/bindings/numa.txt > > > which says we should add the nuna-node-id on each of the cpu nodes. > > > > Is there a strong gain from moving this? > > > > [...] > > Right now with the device tree spec and the above bindings we can > use the information from cpu nodes to infer the cache topology, > the memory topology, the power domain topology etc. > > We have of_find_next_cache_node and of_find_last_cache_level for example > that use "next-level-cache" and are used on powerpc (where this spec comes > from), that we can further build on top of them (since this is now part > of the device tree spec anyway), to e.g. populate the levels of cache, > the levels of shared cache and finally create cpu masks for the different > cache sharing levels. The cpu-map binding does not describe cache topology. I never suggested that it did. > This is standards-compliant, arch-independent (they are on of/base.c), and > it provides a concrete hint on CPU topology rather grouping harts to classes > like "core", "package", "socket", "cluster" etc that don't mean anything > specific and we assume to map to specific levels of cache sharing. Please note that I have never suggested "package", and I'm not sure what that's in response to. Please also not that while the cache topology and CPU topology are somewhat related, in general (this is at least true on ARM systems) there's no strict mapping between the two, which is why we have separate bindings in the first place. Distinct CPU topologies could look identical in cache topology, and vice-versa. > The same goes for the power domain topology, numa topology, or for > understanding how the cpus are grouped in terms of capacity, we can > always just use the above bindings on cpu nodes and be done with it. > > The way I see it cpu-map doesn't add anything new to the spec at this > point, it's just there for convenience so that people don't have to add all > these infos on the cpu nodes. Instead of adding cache nodes and use the > next-level-cache property like the device tree spec says, we have cpu-map > that presents how the harts are "packed" inside the chip, assuming that > their packing also aligns on how they share their caches (they say > nothing about how they share their power domain or other attributes). The cpu-map and cache bindings describe separate topological details, and neither is intended to replace the other. There are plenty of DT files with both. > In a sense it goes against your rule of "re-inventing them for taste > reasons alone is more costly to the ecosystem than simply using the > existing bindings", I fail to see anything else than "taste reasons" > when it comes to cpu-map, since there are existing bindings for > inferring the CPU topology already, they are just not that convenient. If you believe that's the case, then you can perfectly use the existing cache and NUMA bindings, and not describe the cpu topology at all, no need to change cpu-map or come up with a new binding. > I'm proposing to add the option (not enforce) of adding those > attributes that are meant to be used on cpu nodes, on the various > groups/classes of the cpu-map, this way cpu-map will provide something > more meaningful and at least improve the representation side of > things. On the implementation side it might save us the burden of > infering the topology from parsing all cpu nodes each time. It's also > backwards compatible with what you already have, the only thing that's > not backwards compatible is the removal of the node, which I > don't think is such a big deal to fix. Sorry, but as I have stated repeatedly, this complicates the common code for what you admit is a matter of taste. I would rather maintain the simplicity of this binding and existing parsing code, and not potentially break other parsers, if the only cost is a few nodes which you personally consider to be redundant. > > > Finally from the examples above I'd like to stress out that the > > > distinction between a cluster and a core doesn't make much sense > > > and it also makes the representation more complicated. To begin > > > with, how would you call the setup on HiFive Unleashed ? A cluster > > > of 4 cores that share the same L3 cache ? > > > > Not knowing much about the hardware, I can't really say. > > > > I'm not sure I follow why the distinction between a cluster and a core > > is non-sensical. A cluster is always a collection of cores. > > > > A hart could be a core in its own right, or it could be a thread under a > > core, which shares functional units with other harts within that core. > > > > Arguably, we could have mandated that the topology always needed to > > describe down to a thread, even if a core only had a single thread. That > > ship has sailed, however. > > So we agree, the "core" doesn't say anything useful regarding the > topology, why keep using this distinction on a binding for RISC-V and > possibly other archs (since we are also talking on an arch-independent > approach) ? We keep it because the binding has already been finalised and is use in practice. The existing binding and parsing code is *sufficient* for your needs. Personal taste and minor savings in the number of nodes in a DT are not compelling reasons to change this when the cost is complexity that we have to maintain *forever*. Thanks, Mark. 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 X-Spam-Level: X-Spam-Status: No, score=-4.5 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_PASS, URIBL_BLOCKED,USER_AGENT_NEOMUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 522D6ECDE4B for ; Thu, 8 Nov 2018 15:54:29 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 23AE02077B for ; Thu, 8 Nov 2018 15:54:29 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="sp8cRodq"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="CdcSa6eM" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 23AE02077B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+infradead-linux-riscv=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject: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=n7w9YrNYN4juWfPlDpBb6wAb1RBiS7uUGWg9mt2llcI=; b=sp8cRodqH6Dbwp KNT7HQHjPW88H+2kYhiLzNSSEPL5WNI7/1GvWFl9VxxouZOgmTO8Kxxy5lQ56hLXTkPFlBoPE3QfT 6iDf0jzaq34ZDazgEuZzyglCFvVvBJ0Fydq1/9fTlxutTYT+xNFw6+XUdHU7pdvKg6kbQt4JVNdt4 XLz9ZacLES2+FoCwnRv9rMYMsCjHCLzEL0jPHB+6wPU1oZLndLDo1mk2aFpUamXqfaxoOYyGM2Dao wqTJ37zjFFkDxTgH1zKmW9YwsL3AWwbfbP1z1wl7E6op+u7Je/9trraR+pfH9+U5dnRmnGkL3gVzo cAc1PfGufPYOfXaPS/KA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1gKmdY-0006Vz-7B; Thu, 08 Nov 2018 15:54:28 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1gKmdX-0006Vs-CD for linux-riscv@bombadil.infradead.org; Thu, 08 Nov 2018 15:54:27 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=In-Reply-To:Content-Transfer-Encoding: Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date: Sender:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=W3D1jKTMpJW6fd10hQaEasBNWSYmO6KqQ4Wr7TpcOm8=; b=CdcSa6eM21tnheWck+vo9D/img uLnNGRCs/ON6wUwnnrtXfQyca48e9d9ERyzN6Dn+k1ngboEoxnb7RvMTM7TB0f9OpGD95zQOh/Mkz Q+p/arYREzGNyvNJkmgQUsLrum0DFHPnFhz/NHyd54KPX6xy7lki/WdAGCSPSFCA/51/ei4PDOtrW 0zcUfJVWQ9lMv3srI9kBx1SNnCsNF/t8jAMCx1p49R6KBPcJUFxzwESkpEOG4AI7LoeMTKf9Uj8jL 6SXHls1k0khAOtXyQr+/SWNrwkmx9R9Z9PJTB0QPrqyExL9wuqS7BMIePqYYWM0yy1zouYvgmJGLI 2jGy8S0A==; Received: from foss.arm.com ([217.140.101.70]) by casper.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1gKmdT-000864-Ho for linux-riscv@lists.infradead.org; Thu, 08 Nov 2018 15:54:25 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 7B04380D; Thu, 8 Nov 2018 07:54:12 -0800 (PST) Received: from lakrids.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.72.51.249]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 233E53F5CF; Thu, 8 Nov 2018 07:54:09 -0800 (PST) Date: Thu, 8 Nov 2018 15:54:05 +0000 From: Mark Rutland To: Nick Kossifidis Subject: Re: [RFC 0/2] Add RISC-V cpu topology Message-ID: <20181108155404.32ja7bbxu62nyytt@lakrids.cambridge.arm.com> References: <1541113468-22097-1-git-send-email-atish.patra@wdc.com> <866dedbc78ab4fa0e3b040697e112106@mailhost.ics.forth.gr> <20181106141331.GA28458@e107155-lin> <969fc2a5198984e0dfe8c3f585dc65f9@mailhost.ics.forth.gr> <20181106162051.w7fyweuxrl7ujzuz@lakrids.cambridge.arm.com> <20181107120645.sc3wjgr2yakvxktl@lakrids.cambridge.arm.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20170113 (1.7.2) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20181108_155423_945249_6AB9D09D X-CRM114-Status: GOOD ( 81.04 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, Damien.LeMoal@wdc.com, alankao@andestech.com, hch@infradead.org, anup@brainfault.org, palmer@sifive.com, linux-kernel@vger.kernel.org, zong@andestech.com, Atish Patra , robh+dt@kernel.org, Sudeep Holla , linux-riscv@lists.infradead.org, tglx@linutronix.de Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+infradead-linux-riscv=archiver.kernel.org@lists.infradead.org Message-ID: <20181108155405.6X4YNlaQ34gb5cMv-ZSE2HZdSVoNrtekQd399lhxtg4@z> T24gVGh1LCBOb3YgMDgsIDIwMTggYXQgMDM6NDU6MzZQTSArMDIwMCwgTmljayBLb3NzaWZpZGlz IHdyb3RlOgo+IM6jz4TOuc+CIDIwMTgtMTEtMDcgMTQ6MDYsIE1hcmsgUnV0bGFuZCDOrc6zz4HO sc+IzrU6Cj4gPiBPbiBXZWQsIE5vdiAwNywgMjAxOCBhdCAwNDozMTozNEFNICswMjAwLCBOaWNr IEtvc3NpZmlkaXMgd3JvdGU6Cj4gPiA+IE1hcmsgYW5kIFN1bmRlZXAgdGhhbmtzIGEgbG90IGZv ciB5b3VyIGZlZWRiYWNrLCBJIGd1ZXNzIHlvdSBjb252aW5jZWQKPiA+ID4gbWUgdGhhdCBoYXZp bmcgYSBkZXZpY2UgdHJlZSBiaW5kaW5nIGZvciB0aGUgc2NoZWR1bGVyIGlzIG5vdCBhCj4gPiA+ IGNvcnJlY3QgYXBwcm9hY2guIEl0J3Mgbm90IGEgZGV2aWNlIGFmdGVyIGFsbCBhbmQgSSBhZ3Jl ZSB0aGF0IHRoZQo+ID4gPiBkZXZpY2UgdHJlZSBzaG91bGRuJ3QgYmVjb21lIGFuIE9TIGNvbmZp Z3VyYXRpb24gZmlsZS4KPiA+IAo+ID4gR29vZCB0byBoZWFyLgo+ID4gCj4gPiA+IFJlZ2FyZGlu ZyBtdWx0aXBsZSBsZXZlbHMgb2Ygc2hhcmVkIHJlc291cmNlcyBteSBwb2ludCBpcyB0aGF0IHNp bmNlCj4gPiA+IGNwdS1tYXAgZG9lc24ndCBjb250YWluIGFueSBpbmZvcm1hdGlvbiBvZiB3aGF0 IGlzIHNoYXJlZCBhbW9uZyB0aGUKPiA+ID4gY2x1c3Rlci9jb3JlIG1lbWJlcnMgaXQncyBub3Qg ZWFzeSB0byBkbyBhbnkgZnVydGhlciB0cmFuc2xhdGlvbi4gTGFzdAo+ID4gPiB0aW1lIEkgY2hl Y2tlZCB0aGUgYXJtIGNvZGUgdGhhdCB1c2VzIGNwdS1tYXAsIGl0IG9ubHkgZGVmaW5lcyBvbmUK PiA+ID4gZG9tYWluIGZvciBTTVQsIG9uZSBmb3IgTUMgYW5kIHRoZW4gZXZlcnl0aGluZyBlbHNl IGlzIGlnbm9yZWQuIE5vCj4gPiA+IG1hdHRlciBob3cgbWFueSBjbHVzdGVycyBoYXZlIGJlZW4g ZGVmaW5lZCwgYW55dGhpbmcgYWJvdmUgdGhlIGNvcmUKPiA+ID4gbGV2ZWwgaXMgdGhlIHNhbWUg KGFuZCB0aGVuIEkgZ3Vlc3MgeW91IHN0YXJ0ZWQgdGFsa2luZyBhYm91dCBhZGRpbmcKPiA+ID4g InBhY2thZ2VzIiBvbiB0aGUgcmVwcmVzZW50YXRpb24gc2lkZSkuCj4gPiAKPiA+IFdoaWxlIGNw dS1tYXAgZG9lc24ndCBjb250YWluIHRoYXQgaW5mb3JtYXRpb24gdG9kYXksIHdlIGNhbiAqYWRk KiB0aGF0Cj4gPiBpbmZvcm1hdGlvbiB0byB0aGUgY3B1LW1hcCBiaW5kaW5nIGlmIG5lY2Vzc2Fy eS4KPiA+IAo+ID4gPiBUaGUgcmVhc29uIEkgcHJvcG9zZWQgdG8gaGF2ZSBhIGJpbmRpbmcgZm9y IHRoZSBzY2hlZHVsZXIgZGlyZWN0bHkgaXMKPiA+ID4gbm90IG9ubHkgYmVjYXVzZSBpdCdzIHNp bXBsZXIgYW5kIGNsb3NlciB0byB3aGF0IHJlYWxseSBoYXBwZW5zIGluIHRoZQo+ID4gPiBjb2Rl LCBpdCBhbHNvIG1ha2VzIG1vcmUgc2Vuc2UgdG8gbWUgdGhhbiB0aGUgY29tYmluYXRpb24gb2Yg Y3B1LW1hcAo+ID4gPiB3aXRoIGFsbCB0aGUgcmVsYXRlZCBtYXBwaW5ncyBlLmcuICBmb3IgbnVt YSBvciBjYWNoZXMgb3IgcG93ZXIKPiA+ID4gZG9tYWlucyBldGMuCj4gPiA+IAo+ID4gPiBIb3dl dmVyIHlvdSBhcmUgcmlnaHQgd2UgY291bGQgZGVmaW5pdGVseSBhdWdtZW50IGNwdS1tYXAgdG8g aW5jbHVkZQo+ID4gPiBzdXBwb3J0IGZvciB3aGF0IEknbSBzYXlpbmcgYW5kIGNsZWFuIHRoaW5n cyB1cCwgYW5kIHNpbmNlIHlvdSBhcmUKPiA+ID4gb3BlbiBhYm91dCBpbXByb3ZpbmcgaXQgaGVy ZSBpcyBhIHByb3Bvc2FsIHRoYXQgSSBob3BlIHlvdSBmaW5kCj4gPiA+IGludGVyZXN0aW5nOgo+ ID4gPiAKPiA+ID4gQXQgZmlyc3QgbGV0J3MgZ2V0IHJpZCBvZiB0aGUgPHRocmVhZD4gbm9kZXMs IHRoZXkgZG9uJ3QgbWFrZSBzZW5zZToKPiA+ID4gCj4gPiA+IHRocmVhZDAgewo+ID4gPiAgY3B1 ID0gPCZDUFUwPjsKPiA+ID4gfTsKPiA+ID4gCj4gPiA+IEEgdGhyZWFkIG5vZGUgY2FuJ3QgaGF2 ZSBtb3JlIHRoYW4gb25lIGNwdSBlbnRyeSBhbmQgYW55IHByb3BlcnRpZXMKPiA+ID4gc2hvdWxk IGJlIG9uIHRoZSBjcHUgbm9kZSBpdHNlbGYsIHNvIGl0IGRvZXNuJ3QgLyBjYW4ndCBhZGQgYW55 Cj4gPiA+IG1vcmUgaW5mb3JtYXRpb24uIFdlIGNvdWxkIGp1c3QgaGF2ZSBhbiBhcnJheSBvZiBj cHUgbm9kZXMgb24gdGhlCj4gPiA+IDxjb3JlPiBub2RlLCBpdCdzIG11Y2ggY2xlYW5lciB0aGlz IHdheS4KPiA+ID4gCj4gPiA+IGNvcmUwIHsKPiA+ID4gIG1lbWJlcnMgPSA8JkNQVTA+LCA8JkNQ VTE+Owo+ID4gPiB9Owo+ID4gCj4gPiBIb2xkIG9uLiBSYXRoZXIgdGhhbiByZWludmVudGluZyB0 aGluZ3MgZnJvbSBmaXJzdCBwcmluY2lwbGVzLCBjYW4gd2UKPiA+IHBsZWFzZSBkaXNjdXNzIHdo YXQgeW91IHdhbnQgdG8gKmFjaGlldmUqLCBpLmUuIHdoYXQgaW5mb3JtYXRpb24geW91Cj4gPiBu ZWVkPwo+ID4gCj4gPiBIYXZpbmcgYSBub2RlIGlzIG5vdCBhIHNpZ25pZmljYW50IGNvc3QsIGFu ZCB0aGVyZSBhcmUgcmVhc29ucyB3ZSBtYXkKPiA+IHdhbnQgdGhyZWFkIG5vZGVzLiBGb3IgZXhh bXBsZSwgaXQgbWVhbnMgdGhhdCB3ZSBjYW4gYWx3YXlzIHJlZmVyIHRvIGFueQo+ID4gbGV2ZWwg b2YgdG9wb2xvZ3kgd2l0aCBhIHBoYW5kbGUsIGFuZCB3ZSBtaWdodCB3YW50IHRvIGRlc2NyaWJl Cj4gPiB0aHJlYWQtYWZmaW5lIGRldmljZXMgaW4gZnV0dXJlLgo+IAo+IFlvdSBjYW4gdXNlIHRo ZSBwaGFuZGxlIG9mIHRoZSBjcHUgbm9kZSwgdGhlIHRocmVhZCBub2RlIGRvZXNuJ3QgYWRkCj4g YW55dGhpbmcgbW9yZSB0aGFuIGNvbXBsZXhpdHkgdG8gdGhlIHJlcHJlc2VudGF0aW9uLgoKVGhh dCBhZGRzIGNvbXBsZXhpdHkgZWxzZXdoZXJlLCBiZWNhdXNlIHRoZSBwaGFuZGxlIG9mIGEgQ1BV IG5vZGUgaXMgbm90CmEgY2hpbGQgb2YgdGhlIGNwdS1tYXAgbm9kZSwgYW5kIHlvdSBjYW4ndCBz aW1wbHkgd2FsayB1cCB0aGUgdHJlZQpoaWVyYXJjaHkgdG8gZmluZCBwYXJlbnQgbm9kZXMuCgpJ IHNlZSBubyByZWFzb24gdG8gY2hhbmdlIHRoaXMgcGFydCBvZiB0aGUgYmluZGluZy4gR2l2ZW4g aXQncyBhbHJlYWR5Cm91dCB0aGVyZSwgd2l0aCBleGlzdGluZyBwYXJzaW5nIGNvZGUsIGNoYW5n aW5nIGl0IG9ubHkgc2VydmVzIHRvIGFkZApjb21wbGV4aXR5IHRvIGFueSBjb21tb24gY29kZSB3 aGljaCBoYXMgdG8gcGFyc2UgdGhpcy4KCkNhbiB3ZSBwbGVhc2UgZHJvcCB0aGUgaWRlYSBvZiBk cm9wcGluZyB0aGUgdGhyZWFkIG5vZGU/Cgo+ID4gVGhlcmUgYXJlIGEgdG9ubmUgb2YgZXhpc3Rp bmcgYmluZGluZ3MgdGhhdCBhcmUgdWdseSwgYnV0IHJlLWludmVudGluZwo+ID4gdGhlbSBmb3Ig dGFzdGUgcmVhc29ucyBhbG9uZSBpcyBtb3JlIGNvc3RseSB0byB0aGUgZWNvc3lzdGVtIHRoYW4g c2ltcGx5Cj4gPiB1c2luZyB0aGUgZXhpc3RpbmcgYmluZGluZ3MuIFdlIGF2b2lkIHJlLWludmVu dGluZyBiaW5kaW5ncyB1bmxlc3MgdGhlcmUKPiA+IGlzIGEgZnVuY3Rpb25hbCBwcm9ibGVtIGUu Zy4gY2FzZXMgd2hpY2ggdGhleSBjYW5ub3QgcG9zc2libHkgZGVzY3JpYmUuCj4gCj4gV2UgYXJl IHRhbGtpbmcgYWJvdXQgdXNpbmcgc29tZXRoaW5nIGZvciBSSVNDLVYgYW5kIHBvc3NpYmx5IGNv bW1vbiBhY3Jvc3MKPiBkaWZmZXJlbnQgYXJjaHMgYW5kLCBJIGRvbid0IHNlZSB3aHkgd2Ugc2hv dWxkIGtlZXAgdGhlIHVnbGluZXNzIG9mIGEKPiBiaW5kaW5nIHNwZWMgcGx1cyBpbiB0aGlzIGNh c2UgdGhlIDx0cmhlYWQ+IG5vZGUgY2FuJ3QgcG9zc2libHkgZGVzY3JpYmUKPiBhbnl0aGluZyBl bHNlIHRoYW4gYSBjcHU9PG5vZGU+IGFsaWFzLCBpdCdzIHJlZHVuZGFudC4KCldoaWxlIGl0IG1h eSBiZSB1Z2x5LCByZW1vdmluZyBpdCBvbmx5IHNlcnZlcyB0byBhZGQgY29tcGxleGl0eSBmb3IK Y29tbW9uIHBhcnNpbmcgY29kZSwgYW5kIHJlbW92ZXMgZmxleGliaWxpdHkgdGhhdCB3ZSBtYXkg d2FudCBpbiBmdXR1cmUuCkl0cyBwcmVzZW5jZSBkb2VzIG5vdCBjYXVzZSBhbnkgdGVjaG5pY2Fs IHByb2JsZW0uCgpGb3IgYmV0dGVyIG9yIHdvcnNlIHdlJ3JlIGFsbCBzaGFyaW5nIHRoZSBzYW1l IGNvZGViYXNlIGhlcmUuIFRoZSBjb21tb24KY2FzZSBtYXR0ZXJzLCBhcyBkb2VzIHRoZSBjb21w bGV4aXR5IG9mIHRoZSBjb2RlYmFzZSBhcyBhIHdob2xlLgoKSSByZWFsaXNlIGl0IGNhbiBiZSBm cnVzdHJhdGluZyB0byBoYXZlIHRvIHVzZSBzb21ldGhpbmcgeW91IGZlZWwgaXMKc3ViLW9wdGlt YWwsIGJ1dCBwdXR0aW5nIHVwIHdpdGggYSBmZXcgbm9kZXMgd2hpY2ggeW91IHBlcnNvbmFsbHkg ZmVlbAphcmUgcmVkdW5kYW50IGlzIG9mIG11Y2ggbG93ZXIgY29zdCB0byB0aGUgZWNvc3lzdGVt IHRoYW4gaGF2aW5nCmluY29tcGF0aWJsZSBiaW5kaW5ncyB3aGVyZSB3ZSBjb3VsZCBoYXZlIG9u ZS4gSWYgeW91IHB1dCB1cCB3aXRoIHRoYXQsCnlvdSBjYW4gZm9jdXMgeW91ciBlZmZvcnRzIG9u IG1vcmUgd29ydGh3aGlsZSB0ZWNobmljYWwgZXhlcmNpc2VzLgoKPiA+ID4gVGhlbiBsZXQncyBh bGxvdyB0aGUgY2x1c3RlciBhbmQgY29yZSBub2RlcyB0byBhY2NlcHQgYXR0cmlidXRlcwo+ID4g PiB0aGF0IGFyZQo+ID4gPiBjb21tb24gZm9yIHRoZSBjcHVzIHRoZXkgY29udGFpbi4gUmlnaHQg bm93IHRoaXMgaXMgY29uc2lkZXJlZAo+ID4gPiBpbnZhbGlkLgo+ID4gPiAKPiA+ID4gRm9yIHBv d2VyIGRvbWFpbnMgd2UgaGF2ZSBhIGdlbmVyaWMgYmluZGluZyBkZXNjcmliZWQgb24KPiA+ID4g RG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3Bvd2VyX2RvbWFpbi50eHQK PiA+ID4gd2hpY2ggYmFzaWNhbGx5IHNheXMgdGhhdCB3ZSBuZWVkIHRvIHB1dCBwb3dlci1kb21h aW5zID0gPHBvd2VyIGRvbWFpbgo+ID4gPiBzcGVjaWZpZXJzPgo+ID4gPiBhdHRyaWJ1dGUgb24g ZWFjaCBvZiB0aGUgY3B1IG5vZGVzLgo+ID4gCj4gPiBGV0lXLCBnaXZlbiB0aGlzIGlzIGFyZ3Vh Ymx5IHRvcG9sb2dpY2FsLCBJJ20gbm90IHBlcnNvbmFsbHkgYXZlcnNlIHRvCj4gPiBkZXNjcmli aW5nIHRoaXMgaW4gdGhlIGNwdS1tYXAsIGlmIHRoYXQgYWN0dWFsbHkgZ2FpbnMgdXMgbW9yZSB0 aGFuIHRoZQo+ID4gY29tcGxleGl0eSByZXF1aXJlIHRvIHN1cHBvcnQgaXQuCj4gPiAKPiA+IEdp dmVuIHdlIGRvbid0IGRvIHRoaXMgZm9yIGRldmljZSBwb3dlciBkb21haW5zLCBJIHN1c3BlY3Qg dGhhdCBpdCdzCj4gPiBzaW1wbGVyIHRvIHN0aWNrIHdpdGggdGhlIGV4aXN0aW5nIGJpbmRpbmcu Cj4gPiAKPiA+ID4gVGhlIHNhbWUgaGFwcGVucyB3aXRoIHRoZSBjYXBhY2l0eSBiaW5kaW5nIHNw ZWNpZmllZCBmb3IgYXJtIG9uCj4gPiA+IERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5n cy9hcm0vY3B1LWNhcGFjaXR5LnR4dAo+ID4gPiB3aGljaCBzYXlzIHdlIHNob3VsZCBhZGQgdGhl IGNhcGFjaXR5LWRtaXBzLW1oeiBvbiBlYWNoIG9mIHRoZSBjcHUKPiA+ID4gbm9kZXMuCj4gPiAK PiA+IFRoZSBjcHUtbWFwIHdhcyBpbnRlbmRlZCB0byBleHBvc2UgdG9wb2xvZ2ljYWwgZHRhaWxz LCBhbmQgdGhpcyBpc24ndAo+ID4gcmVhbGx5IGEgdG9wb2xvZ2ljYWwgcHJvcGVydHkuIEZvciBl eGFtcGxlLCBBcm0gRHluYW1JUSBzeXN0ZW1zIGNhbiBoYXZlCj4gPiBoZXRlcm9nZW5lb3VzIENQ VXMgd2l0aGluIGNsdXN0ZXJzLgo+ID4gCj4gPiBJIGRvIG5vdCB0aGluayBpdCdzIHdvcnRoIG1v dmluZyB0aGlzLCB0YmguCj4gPiAKPiA+ID4gVGhlIHNhbWUgYWxzbyBoYXBwZW5zIHdpdGggdGhl IGdlbmVyaWMgbnVtYSBiaW5kaW5nIG9uCj4gPiA+IERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9i aW5kaW5ncy9udW1hLnR4dAo+ID4gPiB3aGljaCBzYXlzIHdlIHNob3VsZCBhZGQgdGhlIG51bmEt bm9kZS1pZCBvbiBlYWNoIG9mIHRoZSBjcHUgbm9kZXMuCj4gPiAKPiA+IElzIHRoZXJlIGEgc3Ry b25nIGdhaW4gZnJvbSBtb3ZpbmcgdGhpcz8KPiA+IAo+ID4gWy4uLl0KPiAKPiBSaWdodCBub3cg d2l0aCB0aGUgZGV2aWNlIHRyZWUgc3BlYyBhbmQgdGhlIGFib3ZlIGJpbmRpbmdzIHdlIGNhbgo+ IHVzZSB0aGUgaW5mb3JtYXRpb24gZnJvbSBjcHUgbm9kZXMgdG8gaW5mZXIgdGhlIGNhY2hlIHRv cG9sb2d5LAo+IHRoZSBtZW1vcnkgdG9wb2xvZ3ksIHRoZSBwb3dlciBkb21haW4gdG9wb2xvZ3kg ZXRjLgo+IAo+IFdlIGhhdmUgb2ZfZmluZF9uZXh0X2NhY2hlX25vZGUgYW5kIG9mX2ZpbmRfbGFz dF9jYWNoZV9sZXZlbCBmb3IgZXhhbXBsZQo+IHRoYXQgdXNlICJuZXh0LWxldmVsLWNhY2hlIiBh bmQgYXJlIHVzZWQgb24gcG93ZXJwYyAod2hlcmUgdGhpcyBzcGVjIGNvbWVzCj4gZnJvbSksIHRo YXQgd2UgY2FuIGZ1cnRoZXIgYnVpbGQgb24gdG9wIG9mIHRoZW0gKHNpbmNlIHRoaXMgaXMgbm93 IHBhcnQKPiBvZiB0aGUgIGRldmljZSB0cmVlIHNwZWMgYW55d2F5KSwgdG8gZS5nLiBwb3B1bGF0 ZSB0aGUgbGV2ZWxzIG9mIGNhY2hlLAo+IHRoZSBsZXZlbHMgb2Ygc2hhcmVkIGNhY2hlIGFuZCBm aW5hbGx5IGNyZWF0ZSBjcHUgbWFza3MgZm9yIHRoZSBkaWZmZXJlbnQKPiBjYWNoZSBzaGFyaW5n IGxldmVscy4KClRoZSBjcHUtbWFwIGJpbmRpbmcgZG9lcyBub3QgZGVzY3JpYmUgY2FjaGUgdG9w b2xvZ3kuIEkgbmV2ZXIgc3VnZ2VzdGVkCnRoYXQgaXQgZGlkLgoKPiBUaGlzIGlzIHN0YW5kYXJk cy1jb21wbGlhbnQsIGFyY2gtaW5kZXBlbmRlbnQgKHRoZXkgYXJlIG9uIG9mL2Jhc2UuYyksIGFu ZAo+IGl0IHByb3ZpZGVzIGEgY29uY3JldGUgaGludCBvbiBDUFUgdG9wb2xvZ3kgcmF0aGVyIGdy b3VwaW5nIGhhcnRzIHRvIGNsYXNzZXMKPiBsaWtlICJjb3JlIiwgInBhY2thZ2UiLCAic29ja2V0 IiwgImNsdXN0ZXIiIGV0YyB0aGF0IGRvbid0IG1lYW4gYW55dGhpbmcKPiBzcGVjaWZpYyBhbmQg d2UgYXNzdW1lIHRvIG1hcCB0byBzcGVjaWZpYyBsZXZlbHMgb2YgY2FjaGUgc2hhcmluZy4KClBs ZWFzZSBub3RlIHRoYXQgSSBoYXZlIG5ldmVyIHN1Z2dlc3RlZCAicGFja2FnZSIsIGFuZCBJJ20g bm90IHN1cmUgd2hhdAp0aGF0J3MgaW4gcmVzcG9uc2UgdG8uCgpQbGVhc2UgYWxzbyBub3QgdGhh dCB3aGlsZSB0aGUgY2FjaGUgdG9wb2xvZ3kgYW5kIENQVSB0b3BvbG9neSBhcmUKc29tZXdoYXQg cmVsYXRlZCwgaW4gZ2VuZXJhbCAodGhpcyBpcyBhdCBsZWFzdCB0cnVlIG9uIEFSTSBzeXN0ZW1z KQp0aGVyZSdzIG5vIHN0cmljdCBtYXBwaW5nIGJldHdlZW4gdGhlIHR3bywgd2hpY2ggaXMgd2h5 IHdlIGhhdmUgc2VwYXJhdGUKYmluZGluZ3MgaW4gdGhlIGZpcnN0IHBsYWNlLgoKRGlzdGluY3Qg Q1BVIHRvcG9sb2dpZXMgY291bGQgbG9vayBpZGVudGljYWwgaW4gY2FjaGUgdG9wb2xvZ3ksIGFu ZAp2aWNlLXZlcnNhLgoKPiBUaGUgc2FtZSBnb2VzIGZvciB0aGUgcG93ZXIgZG9tYWluIHRvcG9s b2d5LCBudW1hIHRvcG9sb2d5LCBvciBmb3IKPiB1bmRlcnN0YW5kaW5nIGhvdyB0aGUgY3B1cyBh cmUgZ3JvdXBlZCBpbiB0ZXJtcyBvZiBjYXBhY2l0eSwgd2UgY2FuCj4gYWx3YXlzIGp1c3QgdXNl IHRoZSBhYm92ZSBiaW5kaW5ncyBvbiBjcHUgbm9kZXMgYW5kIGJlIGRvbmUgd2l0aCBpdC4KPiAK PiBUaGUgd2F5IEkgc2VlIGl0IGNwdS1tYXAgZG9lc24ndCBhZGQgYW55dGhpbmcgbmV3IHRvIHRo ZSBzcGVjIGF0IHRoaXMKPiBwb2ludCwgaXQncyBqdXN0IHRoZXJlIGZvciBjb252ZW5pZW5jZSBz byB0aGF0IHBlb3BsZSBkb24ndCBoYXZlIHRvIGFkZCBhbGwKPiB0aGVzZSBpbmZvcyBvbiB0aGUg Y3B1IG5vZGVzLiBJbnN0ZWFkIG9mIGFkZGluZyBjYWNoZSBub2RlcyBhbmQgdXNlIHRoZQo+IG5l eHQtbGV2ZWwtY2FjaGUgcHJvcGVydHkgbGlrZSB0aGUgZGV2aWNlIHRyZWUgc3BlYyBzYXlzLCB3 ZSBoYXZlIGNwdS1tYXAKPiB0aGF0IHByZXNlbnRzIGhvdyB0aGUgaGFydHMgYXJlICJwYWNrZWQi IGluc2lkZSB0aGUgY2hpcCwgYXNzdW1pbmcgdGhhdAo+IHRoZWlyIHBhY2tpbmcgYWxzbyBhbGln bnMgb24gaG93IHRoZXkgc2hhcmUgdGhlaXIgY2FjaGVzICh0aGV5IHNheQo+IG5vdGhpbmcgYWJv dXQgaG93IHRoZXkgc2hhcmUgdGhlaXIgcG93ZXIgZG9tYWluIG9yIG90aGVyIGF0dHJpYnV0ZXMp LgoKVGhlIGNwdS1tYXAgYW5kIGNhY2hlIGJpbmRpbmdzIGRlc2NyaWJlIHNlcGFyYXRlIHRvcG9s b2dpY2FsIGRldGFpbHMsCmFuZCBuZWl0aGVyIGlzIGludGVuZGVkIHRvIHJlcGxhY2UgdGhlIG90 aGVyLiBUaGVyZSBhcmUgcGxlbnR5IG9mIERUCmZpbGVzIHdpdGggYm90aC4KCj4gSW4gYSBzZW5z ZSBpdCBnb2VzIGFnYWluc3QgeW91ciBydWxlIG9mICJyZS1pbnZlbnRpbmcgdGhlbSBmb3IgdGFz dGUKPiByZWFzb25zIGFsb25lIGlzIG1vcmUgY29zdGx5IHRvIHRoZSBlY29zeXN0ZW0gdGhhbiBz aW1wbHkgdXNpbmcgdGhlCj4gZXhpc3RpbmcgYmluZGluZ3MiLCBJIGZhaWwgdG8gc2VlIGFueXRo aW5nIGVsc2UgdGhhbiAidGFzdGUgcmVhc29ucyIKPiB3aGVuIGl0IGNvbWVzIHRvIGNwdS1tYXAs IHNpbmNlIHRoZXJlIGFyZSBleGlzdGluZyBiaW5kaW5ncyBmb3IKPiBpbmZlcnJpbmcgdGhlIENQ VSB0b3BvbG9neSBhbHJlYWR5LCB0aGV5IGFyZSBqdXN0IG5vdCB0aGF0IGNvbnZlbmllbnQuCgpJ ZiB5b3UgYmVsaWV2ZSB0aGF0J3MgdGhlIGNhc2UsIHRoZW4geW91IGNhbiBwZXJmZWN0bHkgdXNl IHRoZSBleGlzdGluZwpjYWNoZSBhbmQgTlVNQSBiaW5kaW5ncywgYW5kIG5vdCBkZXNjcmliZSB0 aGUgY3B1IHRvcG9sb2d5IGF0IGFsbCwgbm8KbmVlZCB0byBjaGFuZ2UgY3B1LW1hcCBvciBjb21l IHVwIHdpdGggYSBuZXcgYmluZGluZy4KCj4gSSdtIHByb3Bvc2luZyB0byBhZGQgdGhlIG9wdGlv biAobm90IGVuZm9yY2UpIG9mIGFkZGluZyB0aG9zZQo+IGF0dHJpYnV0ZXMgdGhhdCBhcmUgbWVh bnQgdG8gYmUgdXNlZCBvbiBjcHUgbm9kZXMsIG9uIHRoZSB2YXJpb3VzCj4gZ3JvdXBzL2NsYXNz ZXMgb2YgdGhlIGNwdS1tYXAsIHRoaXMgd2F5IGNwdS1tYXAgd2lsbCBwcm92aWRlIHNvbWV0aGlu Zwo+IG1vcmUgbWVhbmluZ2Z1bCBhbmQgYXQgbGVhc3QgaW1wcm92ZSB0aGUgcmVwcmVzZW50YXRp b24gc2lkZSBvZgo+IHRoaW5ncy4gT24gdGhlIGltcGxlbWVudGF0aW9uIHNpZGUgaXQgbWlnaHQg c2F2ZSB1cyB0aGUgYnVyZGVuIG9mCj4gaW5mZXJpbmcgdGhlIHRvcG9sb2d5IGZyb20gcGFyc2lu ZyBhbGwgY3B1IG5vZGVzIGVhY2ggdGltZS4gSXQncyBhbHNvCj4gYmFja3dhcmRzIGNvbXBhdGli bGUgd2l0aCB3aGF0IHlvdSBhbHJlYWR5IGhhdmUsIHRoZSBvbmx5IHRoaW5nIHRoYXQncwo+IG5v dCBiYWNrd2FyZHMgY29tcGF0aWJsZSBpcyB0aGUgcmVtb3ZhbCBvZiB0aGUgPHRocmVhZD4gbm9k ZSwgd2hpY2ggSQo+IGRvbid0IHRoaW5rIGlzIHN1Y2ggYSBiaWcgZGVhbCB0byBmaXguCgpTb3Jy eSwgYnV0IGFzIEkgaGF2ZSBzdGF0ZWQgcmVwZWF0ZWRseSwgdGhpcyBjb21wbGljYXRlcyB0aGUg Y29tbW9uIGNvZGUKZm9yIHdoYXQgeW91IGFkbWl0IGlzIGEgbWF0dGVyIG9mIHRhc3RlLiBJIHdv dWxkIHJhdGhlciBtYWludGFpbiB0aGUKc2ltcGxpY2l0eSBvZiB0aGlzIGJpbmRpbmcgYW5kIGV4 aXN0aW5nIHBhcnNpbmcgY29kZSwgYW5kIG5vdApwb3RlbnRpYWxseSBicmVhayBvdGhlciBwYXJz ZXJzLCBpZiB0aGUgb25seSBjb3N0IGlzIGEgZmV3IG5vZGVzIHdoaWNoCnlvdSBwZXJzb25hbGx5 IGNvbnNpZGVyIHRvIGJlIHJlZHVuZGFudC4KCj4gPiA+IEZpbmFsbHkgZnJvbSB0aGUgZXhhbXBs ZXMgYWJvdmUgSSdkIGxpa2UgdG8gc3RyZXNzIG91dCB0aGF0IHRoZQo+ID4gPiBkaXN0aW5jdGlv biBiZXR3ZWVuIGEgY2x1c3RlciBhbmQgYSBjb3JlIGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlCj4g PiA+IGFuZCBpdCBhbHNvIG1ha2VzIHRoZSByZXByZXNlbnRhdGlvbiBtb3JlIGNvbXBsaWNhdGVk LiBUbyBiZWdpbgo+ID4gPiB3aXRoLCBob3cgd291bGQgeW91IGNhbGwgdGhlIHNldHVwIG9uIEhp Rml2ZSBVbmxlYXNoZWQgPyBBIGNsdXN0ZXIKPiA+ID4gb2YgNCBjb3JlcyB0aGF0IHNoYXJlIHRo ZSBzYW1lIEwzIGNhY2hlID8KPiA+IAo+ID4gTm90IGtub3dpbmcgbXVjaCBhYm91dCB0aGUgaGFy ZHdhcmUsIEkgY2FuJ3QgcmVhbGx5IHNheS4KPiA+IAo+ID4gSSdtIG5vdCBzdXJlIEkgZm9sbG93 IHdoeSB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBhIGNsdXN0ZXIgYW5kIGEgY29yZQo+ID4gaXMg bm9uLXNlbnNpY2FsLiBBIGNsdXN0ZXIgaXMgYWx3YXlzIGEgY29sbGVjdGlvbiBvZiBjb3Jlcy4K PiA+IAo+ID4gQSBoYXJ0IGNvdWxkIGJlIGEgY29yZSBpbiBpdHMgb3duIHJpZ2h0LCBvciBpdCBj b3VsZCBiZSBhIHRocmVhZCB1bmRlciBhCj4gPiBjb3JlLCB3aGljaCBzaGFyZXMgZnVuY3Rpb25h bCB1bml0cyB3aXRoIG90aGVyIGhhcnRzIHdpdGhpbiB0aGF0IGNvcmUuCj4gPiAKPiA+IEFyZ3Vh Ymx5LCB3ZSBjb3VsZCBoYXZlIG1hbmRhdGVkIHRoYXQgdGhlIHRvcG9sb2d5IGFsd2F5cyBuZWVk ZWQgdG8KPiA+IGRlc2NyaWJlIGRvd24gdG8gYSB0aHJlYWQsIGV2ZW4gaWYgYSBjb3JlIG9ubHkg aGFkIGEgc2luZ2xlIHRocmVhZC4gVGhhdAo+ID4gc2hpcCBoYXMgc2FpbGVkLCBob3dldmVyLgo+ IAo+IFNvIHdlIGFncmVlLCB0aGUgImNvcmUiIGRvZXNuJ3Qgc2F5IGFueXRoaW5nIHVzZWZ1bCBy ZWdhcmRpbmcgdGhlCj4gdG9wb2xvZ3ksIHdoeSBrZWVwIHVzaW5nIHRoaXMgZGlzdGluY3Rpb24g b24gYSBiaW5kaW5nIGZvciBSSVNDLVYgYW5kCj4gcG9zc2libHkgb3RoZXIgYXJjaHMgKHNpbmNl IHdlIGFyZSBhbHNvIHRhbGtpbmcgb24gYW4gYXJjaC1pbmRlcGVuZGVudAo+IGFwcHJvYWNoKSA/ CgpXZSBrZWVwIGl0IGJlY2F1c2UgdGhlIGJpbmRpbmcgaGFzIGFscmVhZHkgYmVlbiBmaW5hbGlz ZWQgYW5kIGlzIHVzZSBpbgpwcmFjdGljZS4gVGhlIGV4aXN0aW5nIGJpbmRpbmcgYW5kIHBhcnNp bmcgY29kZSBpcyAqc3VmZmljaWVudCogZm9yIHlvdXIKbmVlZHMuIFBlcnNvbmFsIHRhc3RlIGFu ZCBtaW5vciBzYXZpbmdzIGluIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gYSBEVAphcmUgbm90IGNv bXBlbGxpbmcgcmVhc29ucyB0byBjaGFuZ2UgdGhpcyB3aGVuIHRoZSBjb3N0IGlzIGNvbXBsZXhp dHkKdGhhdCB3ZSBoYXZlIHRvIG1haW50YWluICpmb3JldmVyKi4KClRoYW5rcywKTWFyay4KCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LXJpc2N2 IG1haWxpbmcgbGlzdApsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0 cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcmlzY3YK