From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from galahad.ideasonboard.com ([185.26.127.97]:56265 "EHLO galahad.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934040AbcJQMnA (ORCPT ); Mon, 17 Oct 2016 08:43:00 -0400 From: Laurent Pinchart To: Rob Herring Cc: Laurent Pinchart , dri-devel , "devicetree@vger.kernel.org" , "open list:MEDIA DRIVERS FOR RENESAS - FCP" , Tomi Valkeinen , "linux-media@vger.kernel.org" Subject: Re: [PATCH 1/2] devicetree/bindings: display: Add bindings for LVDS panels Date: Mon, 17 Oct 2016 15:42:56 +0300 Message-ID: <1488637.i0jADhlNmg@avalon> In-Reply-To: References: <1475598210-26857-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> <1645400.RKG9rcP36z@avalon> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-renesas-soc-owner@vger.kernel.org List-ID: Hi Rob, On Friday 14 Oct 2016 07:40:14 Rob Herring wrote: > On Sun, Oct 9, 2016 at 11:33 AM, Laurent Pinchart wrote: > > On Saturday 08 Oct 2016 20:29:39 Rob Herring wrote: > >> On Tue, Oct 04, 2016 at 07:23:29PM +0300, Laurent Pinchart wrote: > >>> LVDS is a physical layer specification defined in ANSI/TIA/EIA-644-A. > >>> Multiple incompatible data link layers have been used over time to > >>> transmit image data to LVDS panels. This binding supports display > >>> panels compatible with the JEIDA-59-1999, Open-LDI and VESA SWPG > >>> specifications. > >>> > >>> Signed-off-by: Laurent Pinchart > >>> > >>> --- > >>> > >>> .../bindings/display/panel/panel-lvds.txt | 119 ++++++++++++++ > >>> 1 file changed, 119 insertions(+) > >>> create mode 100644 > >>> Documentation/devicetree/bindings/display/panel/panel-lvds.txt> > >>> > >>> diff --git > >>> a/Documentation/devicetree/bindings/display/panel/panel-lvds.txt > >>> b/Documentation/devicetree/bindings/display/panel/panel-lvds.txt > >>> new file mode 100644 > >>> index 000000000000..250861f2673e > >>> --- /dev/null > >>> +++ b/Documentation/devicetree/bindings/display/panel/panel-lvds.txt > >>> @@ -0,0 +1,119 @@ > >>> +Generic LVDS Panel > >>> +================== > >>> + > >>> +LVDS is a physical layer specification defined in ANSI/TIA/EIA-644-A. > >>> Multiple > >>> +incompatible data link layers have been used over time to transmit > >>> image data > >>> +to LVDS panels. This bindings supports display panels compatible with > >>> the > >>> +following specifications. > >>> + > >>> +[JEIDA] "Digital Interface Standards for Monitor", JEIDA-59-1999, > >>> February > >>> +1999 (Version 1.0), Japan Electronic Industry Development Association > >>> (JEIDA) > >>> +[LDI] "Open LVDS Display Interface", May 1999 (Version 0.95), National > >>> +Semiconductor > >>> +[VESA] "VESA Notebook Panel Standard", October 2007 (Version 1.0), > >>> Video > >>> +Electronics Standards Association (VESA) > >>> + > >>> +Device compatible with those specifications have been marketed under > >>> the > >>> +FPD-Link and FlatLink brands. > >>> + > >>> + > >>> +Required properties: > >>> +- compatible: shall contain "panel-lvds" > >> > >> Maybe as a fallback, but on its own, no way. > > > > Which brings an interesting question: when designing generic DT bindings, > > what's the rule regarding Looks like I forgot part of the question. I meant to ask what is the rule regarding usage of more precise compatible strings ? For instance (but perhaps not the best example), the input/rotary-encoder.txt bindings define a "rotary-encoder" compatible string, with no other bindings defining more precise compatible strings for the exact rotary encoder model. When it comes to panels I believe it makes sense to define model-specific compatible strings even if they're unused by drivers. I'm however wondering what the rule is there, and where those device-specific compatible strings should be defined. I'd like to avoid using one file per panel model as done today for the simple-panel bindings. > Call it "simple" so I can easily NAK it. :) > > Define a generic structure, not a single binding trying to serve all. > > >> > +- width-mm: panel display width in millimeters > >> > +- height-mm: panel display height in millimeters > >> > >> This is already documented for all panels IIRC. > > > > Note that this DT binding has nothing to do with the simple-panel binding. > > It is instead similar to the panel-dpi and panel-dsi-cm bindings (which > > currently don't but should specify the panel size in DT). The LVDS panel > > driver will *not* include any panel-specific information such as size or > > timings, these are specified in DT. > > The panel bindings aren't really different. The biggest difference was > location in the tree, but we now generally allow panels to be either a > child of the LCD controller or connected with OF graph. We probably > need to work on restructuring the panel bindings a bit. We should have > an inheritance with a base panel binding of things like size, label, > graph, backlight, etc, then perhaps an interface specific bindings for > LVDS, DSI, and parallel, then a panel specific binding. With this the > panel specific binding is typically just a compatible string and which > inherited properties apply to it. That sounds good to me, but we have multiple models for panel bindings. As you mentioned panels can be referenced through an LCD controller node property containing a phandle to the panel node, or through OF graph. That's a situation we have today, and we need to keep supporting both (at least for existing panels, perhaps not for the new ones). Another difference is how to express panel data such as size and timings. The simple-panel DT bindings don't contain such data and expects the drivers to contain a table of panel data for all models supported, while the DPI, DSI and now the proposed LVDS panel bindings contain properties for panel data. How would you like to reconcile all that ? > >>> +- data-mapping: the color signals mapping order, "jeida-18", > >>> "jeida-24" > >>> + or "vesa-24" > >> > >> Maybe this should be part of the compatible. > > > > I've thought about it, but given that some panels support selecting > > between multiple modes (through a mode pin that is usually hardwired), I > > believe a separate DT property makes sense. > > Okay. > > > Furthermore, LVDS data organization is controlled by the combination of > > both data-mapping and data-mirror. It makes little sense from my point of > > view to handle one as part of the compatible string and the other one as > > a separate property. > > > >> > +Optional properties: > >> > +- label: a symbolic name for the panel > >> > >> Could be for any panel or display connector. > > > > Yes, but I'm not sure to understand how that's relevant :-) > > Meaning it should be a common property. Sure. So you expect me to reorganize all the panels and connectors DT bindings in order to get this one merged ? :-) > >>> +- avdd-supply: reference to the regulator that powers the panel > >>> analog supply > >>> +- dvdd-supply: reference to the regulator that powers the panel > >>> digital supply > >> > >> Which one has to be powered on first, what voltage, and with what time > >> in between? This is why "generic" or "simple" bindings don't work. > > > > The above-mentioned specifications also define connectors, pinouts and > > power supplies, but many LVDS panels compatible with the LVDS physical > > and data layers use a different connector with small differences in power > > supplies. > > > > I believe the voltage is irrelevant here, it doesn't need to be controlled > > by the operating system. Power supplies order and timing is relevant, > > I'll investigate the level of differences between panels. I'm also fine > > with dropping those properties for now. > > Whether you have control of the supplies is dependent on the board. > Dropping them is just puts us in the simple binding trap. The simple > bindings start out that way and then people keep adding to them. Damn, you can't be fooled easily ;-) On a more serious note, I'd like to design the bindings in a way that wouldn't require adding device-specific code in the driver for each panel model, given that in most cases power supply handling will be generic. What's your opinion about a generic power supply model that would be used in the default case, with the option to override it with device-specific code when needed ? > >>> +- data-mirror: if set, reverse the bit order on all data lanes (6 to 0 > >>> instead > >>> + of 0 to 6) > > On this one, make the name describe the order. "mirror" requires that > I know what is normal ordering. Perhaps "data-msb-first". Sounds good to me, I'll use that. -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH 1/2] devicetree/bindings: display: Add bindings for LVDS panels Date: Mon, 17 Oct 2016 15:42:56 +0300 Message-ID: <1488637.i0jADhlNmg@avalon> References: <1475598210-26857-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> <1645400.RKG9rcP36z@avalon> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Rob Herring Cc: "devicetree@vger.kernel.org" , Laurent Pinchart , dri-devel , "open list:MEDIA DRIVERS FOR RENESAS - FCP" , Tomi Valkeinen , "linux-media@vger.kernel.org" List-Id: devicetree@vger.kernel.org SGkgUm9iLAoKT24gRnJpZGF5IDE0IE9jdCAyMDE2IDA3OjQwOjE0IFJvYiBIZXJyaW5nIHdyb3Rl Ogo+IE9uIFN1biwgT2N0IDksIDIwMTYgYXQgMTE6MzMgQU0sIExhdXJlbnQgUGluY2hhcnQgd3Jv dGU6Cj4gPiBPbiBTYXR1cmRheSAwOCBPY3QgMjAxNiAyMDoyOTozOSBSb2IgSGVycmluZyB3cm90 ZToKPiA+PiBPbiBUdWUsIE9jdCAwNCwgMjAxNiBhdCAwNzoyMzoyOVBNICswMzAwLCBMYXVyZW50 IFBpbmNoYXJ0IHdyb3RlOgo+ID4+PiBMVkRTIGlzIGEgcGh5c2ljYWwgbGF5ZXIgc3BlY2lmaWNh dGlvbiBkZWZpbmVkIGluIEFOU0kvVElBL0VJQS02NDQtQS4KPiA+Pj4gTXVsdGlwbGUgaW5jb21w YXRpYmxlIGRhdGEgbGluayBsYXllcnMgaGF2ZSBiZWVuIHVzZWQgb3ZlciB0aW1lIHRvCj4gPj4+ IHRyYW5zbWl0IGltYWdlIGRhdGEgdG8gTFZEUyBwYW5lbHMuIFRoaXMgYmluZGluZyBzdXBwb3J0 cyBkaXNwbGF5Cj4gPj4+IHBhbmVscyBjb21wYXRpYmxlIHdpdGggdGhlIEpFSURBLTU5LTE5OTks IE9wZW4tTERJIGFuZCBWRVNBIFNXUEcKPiA+Pj4gc3BlY2lmaWNhdGlvbnMuCj4gPj4+IAo+ID4+ PiBTaWduZWQtb2ZmLWJ5OiBMYXVyZW50IFBpbmNoYXJ0Cj4gPj4+IDxsYXVyZW50LnBpbmNoYXJ0 K3JlbmVzYXNAaWRlYXNvbmJvYXJkLmNvbT4KPiA+Pj4gLS0tCj4gPj4+IAo+ID4+PiAgLi4uL2Jp bmRpbmdzL2Rpc3BsYXkvcGFuZWwvcGFuZWwtbHZkcy50eHQgICAgICAgICAgfCAxMTkgKysrKysr KysrKysrKysKPiA+Pj4gIDEgZmlsZSBjaGFuZ2VkLCAxMTkgaW5zZXJ0aW9ucygrKQo+ID4+PiAg Y3JlYXRlIG1vZGUgMTAwNjQ0Cj4gPj4+ICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGlu Z3MvZGlzcGxheS9wYW5lbC9wYW5lbC1sdmRzLnR4dD4KPiA+Pj4gCj4gPj4+IGRpZmYgLS1naXQK PiA+Pj4gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZGlzcGxheS9wYW5lbC9w YW5lbC1sdmRzLnR4dAo+ID4+PiBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9k aXNwbGF5L3BhbmVsL3BhbmVsLWx2ZHMudHh0Cj4gPj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4g Pj4+IGluZGV4IDAwMDAwMDAwMDAwMC4uMjUwODYxZjI2NzNlCj4gPj4+IC0tLSAvZGV2L251bGwK PiA+Pj4gKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Rpc3BsYXkvcGFu ZWwvcGFuZWwtbHZkcy50eHQKPiA+Pj4gQEAgLTAsMCArMSwxMTkgQEAKPiA+Pj4gK0dlbmVyaWMg TFZEUyBQYW5lbAo+ID4+PiArPT09PT09PT09PT09PT09PT09Cj4gPj4+ICsKPiA+Pj4gK0xWRFMg aXMgYSBwaHlzaWNhbCBsYXllciBzcGVjaWZpY2F0aW9uIGRlZmluZWQgaW4gQU5TSS9USUEvRUlB LTY0NC1BLgo+ID4+PiBNdWx0aXBsZQo+ID4+PiAraW5jb21wYXRpYmxlIGRhdGEgbGluayBsYXll cnMgaGF2ZSBiZWVuIHVzZWQgb3ZlciB0aW1lIHRvIHRyYW5zbWl0Cj4gPj4+IGltYWdlIGRhdGEK PiA+Pj4gK3RvIExWRFMgcGFuZWxzLiBUaGlzIGJpbmRpbmdzIHN1cHBvcnRzIGRpc3BsYXkgcGFu ZWxzIGNvbXBhdGlibGUgd2l0aAo+ID4+PiB0aGUKPiA+Pj4gK2ZvbGxvd2luZyBzcGVjaWZpY2F0 aW9ucy4KPiA+Pj4gKwo+ID4+PiArW0pFSURBXSAiRGlnaXRhbCBJbnRlcmZhY2UgU3RhbmRhcmRz IGZvciBNb25pdG9yIiwgSkVJREEtNTktMTk5OSwKPiA+Pj4gRmVicnVhcnkKPiA+Pj4gKzE5OTkg KFZlcnNpb24gMS4wKSwgSmFwYW4gRWxlY3Ryb25pYyBJbmR1c3RyeSBEZXZlbG9wbWVudCBBc3Nv Y2lhdGlvbgo+ID4+PiAoSkVJREEpCj4gPj4+ICtbTERJXSAiT3BlbiBMVkRTIERpc3BsYXkgSW50 ZXJmYWNlIiwgTWF5IDE5OTkgKFZlcnNpb24gMC45NSksIE5hdGlvbmFsCj4gPj4+ICtTZW1pY29u ZHVjdG9yCj4gPj4+ICtbVkVTQV0gIlZFU0EgTm90ZWJvb2sgUGFuZWwgU3RhbmRhcmQiLCBPY3Rv YmVyIDIwMDcgKFZlcnNpb24gMS4wKSwKPiA+Pj4gVmlkZW8KPiA+Pj4gK0VsZWN0cm9uaWNzIFN0 YW5kYXJkcyBBc3NvY2lhdGlvbiAoVkVTQSkKPiA+Pj4gKwo+ID4+PiArRGV2aWNlIGNvbXBhdGli bGUgd2l0aCB0aG9zZSBzcGVjaWZpY2F0aW9ucyBoYXZlIGJlZW4gbWFya2V0ZWQgdW5kZXIKPiA+ Pj4gdGhlCj4gPj4+ICtGUEQtTGluayBhbmQgRmxhdExpbmsgYnJhbmRzLgo+ID4+PiArCj4gPj4+ ICsKPiA+Pj4gK1JlcXVpcmVkIHByb3BlcnRpZXM6Cj4gPj4+ICstIGNvbXBhdGlibGU6IHNoYWxs IGNvbnRhaW4gInBhbmVsLWx2ZHMiCj4gPj4gCj4gPj4gTWF5YmUgYXMgYSBmYWxsYmFjaywgYnV0 IG9uIGl0cyBvd24sIG5vIHdheS4KPiA+IAo+ID4gV2hpY2ggYnJpbmdzIGFuIGludGVyZXN0aW5n IHF1ZXN0aW9uOiB3aGVuIGRlc2lnbmluZyBnZW5lcmljIERUIGJpbmRpbmdzLAo+ID4gd2hhdCdz IHRoZSBydWxlIHJlZ2FyZGluZwoKTG9va3MgbGlrZSBJIGZvcmdvdCBwYXJ0IG9mIHRoZSBxdWVz dGlvbi4gSSBtZWFudCB0byBhc2sgd2hhdCBpcyB0aGUgcnVsZSAKcmVnYXJkaW5nIHVzYWdlIG9m IG1vcmUgcHJlY2lzZSBjb21wYXRpYmxlIHN0cmluZ3MgPwoKRm9yIGluc3RhbmNlIChidXQgcGVy aGFwcyBub3QgdGhlIGJlc3QgZXhhbXBsZSksIHRoZSBpbnB1dC9yb3RhcnktZW5jb2Rlci50eHQg CmJpbmRpbmdzIGRlZmluZSBhICJyb3RhcnktZW5jb2RlciIgY29tcGF0aWJsZSBzdHJpbmcsIHdp dGggbm8gb3RoZXIgYmluZGluZ3MgCmRlZmluaW5nIG1vcmUgcHJlY2lzZSBjb21wYXRpYmxlIHN0 cmluZ3MgZm9yIHRoZSBleGFjdCByb3RhcnkgZW5jb2RlciBtb2RlbC4gCldoZW4gaXQgY29tZXMg dG8gcGFuZWxzIEkgYmVsaWV2ZSBpdCBtYWtlcyBzZW5zZSB0byBkZWZpbmUgbW9kZWwtc3BlY2lm aWMgCmNvbXBhdGlibGUgc3RyaW5ncyBldmVuIGlmIHRoZXkncmUgdW51c2VkIGJ5IGRyaXZlcnMu IEknbSBob3dldmVyIHdvbmRlcmluZyAKd2hhdCB0aGUgcnVsZSBpcyB0aGVyZSwgYW5kIHdoZXJl IHRob3NlIGRldmljZS1zcGVjaWZpYyBjb21wYXRpYmxlIHN0cmluZ3MgCnNob3VsZCBiZSBkZWZp bmVkLiBJJ2QgbGlrZSB0byBhdm9pZCB1c2luZyBvbmUgZmlsZSBwZXIgcGFuZWwgbW9kZWwgYXMg ZG9uZSAKdG9kYXkgZm9yIHRoZSBzaW1wbGUtcGFuZWwgYmluZGluZ3MuCgo+IENhbGwgaXQgInNp bXBsZSIgc28gSSBjYW4gZWFzaWx5IE5BSyBpdC4gOikKPiAKPiBEZWZpbmUgYSBnZW5lcmljIHN0 cnVjdHVyZSwgbm90IGEgc2luZ2xlIGJpbmRpbmcgdHJ5aW5nIHRvIHNlcnZlIGFsbC4KPiAKPiA+ PiA+ICstIHdpZHRoLW1tOiBwYW5lbCBkaXNwbGF5IHdpZHRoIGluIG1pbGxpbWV0ZXJzCj4gPj4g PiArLSBoZWlnaHQtbW06IHBhbmVsIGRpc3BsYXkgaGVpZ2h0IGluIG1pbGxpbWV0ZXJzCj4gPj4g Cj4gPj4gVGhpcyBpcyBhbHJlYWR5IGRvY3VtZW50ZWQgZm9yIGFsbCBwYW5lbHMgSUlSQy4KPiA+ IAo+ID4gTm90ZSB0aGF0IHRoaXMgRFQgYmluZGluZyBoYXMgbm90aGluZyB0byBkbyB3aXRoIHRo ZSBzaW1wbGUtcGFuZWwgYmluZGluZy4KPiA+IEl0IGlzIGluc3RlYWQgc2ltaWxhciB0byB0aGUg cGFuZWwtZHBpIGFuZCBwYW5lbC1kc2ktY20gYmluZGluZ3MgKHdoaWNoCj4gPiBjdXJyZW50bHkg ZG9uJ3QgYnV0IHNob3VsZCBzcGVjaWZ5IHRoZSBwYW5lbCBzaXplIGluIERUKS4gVGhlIExWRFMg cGFuZWwKPiA+IGRyaXZlciB3aWxsICpub3QqIGluY2x1ZGUgYW55IHBhbmVsLXNwZWNpZmljIGlu Zm9ybWF0aW9uIHN1Y2ggYXMgc2l6ZSBvcgo+ID4gdGltaW5ncywgdGhlc2UgYXJlIHNwZWNpZmll ZCBpbiBEVC4KPiAKPiBUaGUgcGFuZWwgYmluZGluZ3MgYXJlbid0IHJlYWxseSBkaWZmZXJlbnQu IFRoZSBiaWdnZXN0IGRpZmZlcmVuY2Ugd2FzCj4gbG9jYXRpb24gaW4gdGhlIHRyZWUsIGJ1dCB3 ZSBub3cgZ2VuZXJhbGx5IGFsbG93IHBhbmVscyB0byBiZSBlaXRoZXIgYQo+IGNoaWxkIG9mIHRo ZSBMQ0QgY29udHJvbGxlciBvciBjb25uZWN0ZWQgd2l0aCBPRiBncmFwaC4gV2UgcHJvYmFibHkK PiBuZWVkIHRvIHdvcmsgb24gcmVzdHJ1Y3R1cmluZyB0aGUgcGFuZWwgYmluZGluZ3MgYSBiaXQu IFdlIHNob3VsZCBoYXZlCj4gYW4gaW5oZXJpdGFuY2Ugd2l0aCBhIGJhc2UgcGFuZWwgYmluZGlu ZyBvZiB0aGluZ3MgbGlrZSBzaXplLCBsYWJlbCwKPiBncmFwaCwgYmFja2xpZ2h0LCBldGMsIHRo ZW4gcGVyaGFwcyBhbiBpbnRlcmZhY2Ugc3BlY2lmaWMgYmluZGluZ3MgZm9yCj4gTFZEUywgRFNJ LCBhbmQgcGFyYWxsZWwsIHRoZW4gYSBwYW5lbCBzcGVjaWZpYyBiaW5kaW5nLiBXaXRoIHRoaXMg dGhlCj4gcGFuZWwgc3BlY2lmaWMgYmluZGluZyBpcyB0eXBpY2FsbHkganVzdCBhIGNvbXBhdGli bGUgc3RyaW5nIGFuZCB3aGljaAo+IGluaGVyaXRlZCBwcm9wZXJ0aWVzIGFwcGx5IHRvIGl0LgoK VGhhdCBzb3VuZHMgZ29vZCB0byBtZSwgYnV0IHdlIGhhdmUgbXVsdGlwbGUgbW9kZWxzIGZvciBw YW5lbCBiaW5kaW5ncy4KCkFzIHlvdSBtZW50aW9uZWQgcGFuZWxzIGNhbiBiZSByZWZlcmVuY2Vk IHRocm91Z2ggYW4gTENEIGNvbnRyb2xsZXIgbm9kZSAKcHJvcGVydHkgY29udGFpbmluZyBhIHBo YW5kbGUgdG8gdGhlIHBhbmVsIG5vZGUsIG9yIHRocm91Z2ggT0YgZ3JhcGguIFRoYXQncyBhIApz aXR1YXRpb24gd2UgaGF2ZSB0b2RheSwgYW5kIHdlIG5lZWQgdG8ga2VlcCBzdXBwb3J0aW5nIGJv dGggKGF0IGxlYXN0IGZvciAKZXhpc3RpbmcgcGFuZWxzLCBwZXJoYXBzIG5vdCBmb3IgdGhlIG5l dyBvbmVzKS4KCkFub3RoZXIgZGlmZmVyZW5jZSBpcyBob3cgdG8gZXhwcmVzcyBwYW5lbCBkYXRh IHN1Y2ggYXMgc2l6ZSBhbmQgdGltaW5ncy4gVGhlIApzaW1wbGUtcGFuZWwgRFQgYmluZGluZ3Mg ZG9uJ3QgY29udGFpbiBzdWNoIGRhdGEgYW5kIGV4cGVjdHMgdGhlIGRyaXZlcnMgdG8gCmNvbnRh aW4gYSB0YWJsZSBvZiBwYW5lbCBkYXRhIGZvciBhbGwgbW9kZWxzIHN1cHBvcnRlZCwgd2hpbGUg dGhlIERQSSwgRFNJIGFuZCAKbm93IHRoZSBwcm9wb3NlZCBMVkRTIHBhbmVsIGJpbmRpbmdzIGNv bnRhaW4gcHJvcGVydGllcyBmb3IgcGFuZWwgZGF0YS4KCkhvdyB3b3VsZCB5b3UgbGlrZSB0byBy ZWNvbmNpbGUgYWxsIHRoYXQgPwoKPiA+Pj4gKy0gZGF0YS1tYXBwaW5nOiB0aGUgY29sb3Igc2ln bmFscyBtYXBwaW5nIG9yZGVyLCAiamVpZGEtMTgiLAo+ID4+PiAiamVpZGEtMjQiCj4gPj4+ICsg IG9yICJ2ZXNhLTI0Igo+ID4+IAo+ID4+IE1heWJlIHRoaXMgc2hvdWxkIGJlIHBhcnQgb2YgdGhl IGNvbXBhdGlibGUuCj4gPiAKPiA+IEkndmUgdGhvdWdodCBhYm91dCBpdCwgYnV0IGdpdmVuIHRo YXQgc29tZSBwYW5lbHMgc3VwcG9ydCBzZWxlY3RpbmcKPiA+IGJldHdlZW4gbXVsdGlwbGUgbW9k ZXMgKHRocm91Z2ggYSBtb2RlIHBpbiB0aGF0IGlzIHVzdWFsbHkgaGFyZHdpcmVkKSwgSQo+ID4g YmVsaWV2ZSBhIHNlcGFyYXRlIERUIHByb3BlcnR5IG1ha2VzIHNlbnNlLgo+IAo+IE9rYXkuCj4g Cj4gPiBGdXJ0aGVybW9yZSwgTFZEUyBkYXRhIG9yZ2FuaXphdGlvbiBpcyBjb250cm9sbGVkIGJ5 IHRoZSBjb21iaW5hdGlvbiBvZgo+ID4gYm90aCBkYXRhLW1hcHBpbmcgYW5kIGRhdGEtbWlycm9y LiBJdCBtYWtlcyBsaXR0bGUgc2Vuc2UgZnJvbSBteSBwb2ludCBvZgo+ID4gdmlldyB0byBoYW5k bGUgb25lIGFzIHBhcnQgb2YgdGhlIGNvbXBhdGlibGUgc3RyaW5nIGFuZCB0aGUgb3RoZXIgb25l IGFzCj4gPiBhIHNlcGFyYXRlIHByb3BlcnR5Lgo+ID4gCj4gPj4gPiArT3B0aW9uYWwgcHJvcGVy dGllczoKPiA+PiA+ICstIGxhYmVsOiBhIHN5bWJvbGljIG5hbWUgZm9yIHRoZSBwYW5lbAo+ID4+ IAo+ID4+IENvdWxkIGJlIGZvciBhbnkgcGFuZWwgb3IgZGlzcGxheSBjb25uZWN0b3IuCj4gPiAK PiA+IFllcywgYnV0IEknbSBub3Qgc3VyZSB0byB1bmRlcnN0YW5kIGhvdyB0aGF0J3MgcmVsZXZh bnQgOi0pCj4gCj4gTWVhbmluZyBpdCBzaG91bGQgYmUgYSBjb21tb24gcHJvcGVydHkuCgpTdXJl LiBTbyB5b3UgZXhwZWN0IG1lIHRvIHJlb3JnYW5pemUgYWxsIHRoZSBwYW5lbHMgYW5kIGNvbm5l Y3RvcnMgRFQgYmluZGluZ3MgCmluIG9yZGVyIHRvIGdldCB0aGlzIG9uZSBtZXJnZWQgPyA6LSkK Cj4gPj4+ICstIGF2ZGQtc3VwcGx5OiByZWZlcmVuY2UgdG8gdGhlIHJlZ3VsYXRvciB0aGF0IHBv d2VycyB0aGUgcGFuZWwKPiA+Pj4gYW5hbG9nIHN1cHBseQo+ID4+PiArLSBkdmRkLXN1cHBseTog cmVmZXJlbmNlIHRvIHRoZSByZWd1bGF0b3IgdGhhdCBwb3dlcnMgdGhlIHBhbmVsCj4gPj4+IGRp Z2l0YWwgc3VwcGx5Cj4gPj4gCj4gPj4gV2hpY2ggb25lIGhhcyB0byBiZSBwb3dlcmVkIG9uIGZp cnN0LCB3aGF0IHZvbHRhZ2UsIGFuZCB3aXRoIHdoYXQgdGltZQo+ID4+IGluIGJldHdlZW4/IFRo aXMgaXMgd2h5ICJnZW5lcmljIiBvciAic2ltcGxlIiBiaW5kaW5ncyBkb24ndCB3b3JrLgo+ID4g Cj4gPiBUaGUgYWJvdmUtbWVudGlvbmVkIHNwZWNpZmljYXRpb25zIGFsc28gZGVmaW5lIGNvbm5l Y3RvcnMsIHBpbm91dHMgYW5kCj4gPiBwb3dlciBzdXBwbGllcywgYnV0IG1hbnkgTFZEUyBwYW5l bHMgY29tcGF0aWJsZSB3aXRoIHRoZSBMVkRTIHBoeXNpY2FsCj4gPiBhbmQgZGF0YSBsYXllcnMg dXNlIGEgZGlmZmVyZW50IGNvbm5lY3RvciB3aXRoIHNtYWxsIGRpZmZlcmVuY2VzIGluIHBvd2Vy Cj4gPiBzdXBwbGllcy4KPiA+IAo+ID4gSSBiZWxpZXZlIHRoZSB2b2x0YWdlIGlzIGlycmVsZXZh bnQgaGVyZSwgaXQgZG9lc24ndCBuZWVkIHRvIGJlIGNvbnRyb2xsZWQKPiA+IGJ5IHRoZSBvcGVy YXRpbmcgc3lzdGVtLiBQb3dlciBzdXBwbGllcyBvcmRlciBhbmQgdGltaW5nIGlzIHJlbGV2YW50 LAo+ID4gSSdsbCBpbnZlc3RpZ2F0ZSB0aGUgbGV2ZWwgb2YgZGlmZmVyZW5jZXMgYmV0d2VlbiBw YW5lbHMuIEknbSBhbHNvIGZpbmUKPiA+IHdpdGggZHJvcHBpbmcgdGhvc2UgcHJvcGVydGllcyBm b3Igbm93Lgo+IAo+IFdoZXRoZXIgeW91IGhhdmUgY29udHJvbCBvZiB0aGUgc3VwcGxpZXMgaXMg ZGVwZW5kZW50IG9uIHRoZSBib2FyZC4KPiBEcm9wcGluZyB0aGVtIGlzIGp1c3QgcHV0cyB1cyBp biB0aGUgc2ltcGxlIGJpbmRpbmcgdHJhcC4gVGhlIHNpbXBsZQo+IGJpbmRpbmdzIHN0YXJ0IG91 dCB0aGF0IHdheSBhbmQgdGhlbiBwZW9wbGUga2VlcCBhZGRpbmcgdG8gdGhlbS4KCkRhbW4sIHlv dSBjYW4ndCBiZSBmb29sZWQgZWFzaWx5IDstKQoKT24gYSBtb3JlIHNlcmlvdXMgbm90ZSwgSSdk IGxpa2UgdG8gZGVzaWduIHRoZSBiaW5kaW5ncyBpbiBhIHdheSB0aGF0IHdvdWxkbid0IApyZXF1 aXJlIGFkZGluZyBkZXZpY2Utc3BlY2lmaWMgY29kZSBpbiB0aGUgZHJpdmVyIGZvciBlYWNoIHBh bmVsIG1vZGVsLCBnaXZlbiAKdGhhdCBpbiBtb3N0IGNhc2VzIHBvd2VyIHN1cHBseSBoYW5kbGlu ZyB3aWxsIGJlIGdlbmVyaWMuIFdoYXQncyB5b3VyIG9waW5pb24gCmFib3V0IGEgZ2VuZXJpYyBw b3dlciBzdXBwbHkgbW9kZWwgdGhhdCB3b3VsZCBiZSB1c2VkIGluIHRoZSBkZWZhdWx0IGNhc2Us IAp3aXRoIHRoZSBvcHRpb24gdG8gb3ZlcnJpZGUgaXQgd2l0aCBkZXZpY2Utc3BlY2lmaWMgY29k ZSB3aGVuIG5lZWRlZCA/Cgo+ID4+PiArLSBkYXRhLW1pcnJvcjogaWYgc2V0LCByZXZlcnNlIHRo ZSBiaXQgb3JkZXIgb24gYWxsIGRhdGEgbGFuZXMgKDYgdG8gMAo+ID4+PiBpbnN0ZWFkCj4gPj4+ ICsgIG9mIDAgdG8gNikKPiAKPiBPbiB0aGlzIG9uZSwgbWFrZSB0aGUgbmFtZSBkZXNjcmliZSB0 aGUgb3JkZXIuICJtaXJyb3IiIHJlcXVpcmVzIHRoYXQKPiBJIGtub3cgd2hhdCBpcyBub3JtYWwg b3JkZXJpbmcuIFBlcmhhcHMgImRhdGEtbXNiLWZpcnN0Ii4KClNvdW5kcyBnb29kIHRvIG1lLCBJ J2xsIHVzZSB0aGF0LgoKLS0gClJlZ2FyZHMsCgpMYXVyZW50IFBpbmNoYXJ0CgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBs aXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVz a3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK