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=-8.9 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS 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 E26BCC43603 for ; Thu, 19 Dec 2019 18:32:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A9287222C2 for ; Thu, 19 Dec 2019 18:32:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="IvZmQM+1" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726911AbfLSScW (ORCPT ); Thu, 19 Dec 2019 13:32:22 -0500 Received: from mail-qt1-f193.google.com ([209.85.160.193]:39831 "EHLO mail-qt1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726797AbfLSScV (ORCPT ); Thu, 19 Dec 2019 13:32:21 -0500 Received: by mail-qt1-f193.google.com with SMTP id e5so5874973qtm.6 for ; Thu, 19 Dec 2019 10:32:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=G6Vp8WB7zFaMYDsDqjMxasHiaE3hIOW0+ggjUmP96JA=; b=IvZmQM+1xx5wRKtwGsH7GokWQ0Q246Nv5kRgefExpPEf0EQpq/5uBmh0vTpjiLnH9a bX4Oo7FLSv0AY+AZkMDdHolJe53QzpAZBCMtwOdVi6QFAmnKK3qBYH9QtQOUpjGJL3vp BDSg1g5jge56DobIY7tn1w6Rb28kIAzN9WFuQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=G6Vp8WB7zFaMYDsDqjMxasHiaE3hIOW0+ggjUmP96JA=; b=KRJd3xgyqdghSEUnQELqfuUnVpIfxvtBTU+Jx+/XARP/G5RwR9vfTgY4l+nhYwJ9zw TxkKpGyJlRoEfn+CwlVlqUGo2WJd+BEnPOCAlv0AypgqjWBbXBUFzX5p47LMOKtPBOPF U+dTY2kal2CtQON0i+yzbX4kvwjUtprqL82DjTPu8XFuB/OzI4lCmc1uARt3FvsPWmjI H69uBMHLQ5hRC7Rgq8khjEhp+FBWeDMY+2DPJBi2poJEz5Q795iCm1Qp64yOy/kcjia+ ctGaAcVjs9ARvftNhUMbNCg3IVLVvLkfVHH4eb69keVmUJFqXoT9/VqyHsNyhaYlsZSl X8/w== X-Gm-Message-State: APjAAAXnXvIwIWrriOJT1Glo4BBsvX0t2QJkydPl4I2rLOvZBh9fpq6K eYY2+TmLtkp6aHJY1Yoqf6HXLKcOuHE= X-Google-Smtp-Source: APXvYqxNGA39Yyk/6iM6HrZz8YaMMk8ctwVSWuXXMMejaMlO9W2vfWeXdiBJ4KyTWnnZ761asXNv8A== X-Received: by 2002:aed:2047:: with SMTP id 65mr8303656qta.78.1576780340038; Thu, 19 Dec 2019 10:32:20 -0800 (PST) Received: from mail-qt1-f172.google.com (mail-qt1-f172.google.com. [209.85.160.172]) by smtp.gmail.com with ESMTPSA id g4sm2179325qtg.35.2019.12.19.10.32.18 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 19 Dec 2019 10:32:18 -0800 (PST) Received: by mail-qt1-f172.google.com with SMTP id j5so5846288qtq.9 for ; Thu, 19 Dec 2019 10:32:18 -0800 (PST) X-Received: by 2002:ac8:2b29:: with SMTP id 38mr8236384qtu.238.1576780338156; Thu, 19 Dec 2019 10:32:18 -0800 (PST) MIME-Version: 1.0 References: <1576684108-30177-1-git-send-email-kvalo@codeaurora.org> <1576684108-30177-2-git-send-email-kvalo@codeaurora.org> <1576748692.7758.17.camel@realtek.com> <20191219154828.GA12287@w1.fi> In-Reply-To: <20191219154828.GA12287@w1.fi> From: Brian Norris Date: Thu, 19 Dec 2019 10:32:06 -0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH 1/2] nl80211: vendor-cmd: qca: add dynamic SAR power limits To: Jouni Malinen Cc: Pkshih , "linux-wireless@vger.kernel.org" , "ath10k@lists.infradead.org" , "kvalo@codeaurora.org" Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org On Thu, Dec 19, 2019 at 7:48 AM Jouni Malinen wrote: > On Thu, Dec 19, 2019 at 09:44:52AM +0000, Pkshih wrote: > > On Wed, 2019-12-18 at 17:48 +0200, Kalle Valo wrote: > > > diff --git a/include/uapi/nl80211-vnd-qca.h b/include/uapi/nl80211-vn= d-qca.h > > > + * NOTE: The authoritative place for definition of QCA_NL80211_VENDO= R_ID, > > > + * vendor subcmd definitions prefixed with QCA_NL80211_VENDOR_SUBCMD= , and > > > + * qca_wlan_vendor_attr is open source file src/common/qca-vendor.h = in > > > + * git://w1.fi/srv/git/hostap.git; the values here are just a copy o= f that By the way, I wonder -- why have this statement? That's not how I recall any other piece of kernel development ever working; upstream Linux defines the upstream Linux API, not some arbitrary user space project. This statement could be useful for saying, "don't stomp on those command numbers please," but the response should probably be to go out and define a totally new vendor ID or something. (See below.) > > > + * @QCA_WLAN_VENDOR_ATTR_SAR_LIMITS_SPEC_BAND: Optional (u32) value = to > > > + * indicate for which band this specification applies. Valid > > > + * values are enumerated in enum %nl80211_band (although not all > > > + * bands may be supported by a given device). If the attribute is > > > > Can we define separated enum to address four 5G sub-bands, likes > > > > enum nl80211_sar_band { > > NL80211_SAR_BAND_2G, > > NL80211_SAR_BAND_5G_BAND1, > > NL80211_SAR_BAND_5G_BAND2, > > NL80211_SAR_BAND_5G_BAND3, > > NL80211_SAR_BAND_5G_BAND4, > > }; > > Please note that the vendor subcmd and attributes used here are already > deployed and in use as a kernel interface. As such, the existing > attributes cannot really be modified; if anything else would be needed, > that would need to be defined as a new attribute and/or command. Clarification: you're talking about out-of-tree drivers, which really have no relevance in upstream discussion, except possibly as examples. I don't think it's ever been a valid approach to dictate upstream kernel design based simply on "what $vendor already implemented for Android." Maybe it's a better idea to just use different command numbers (or vendor ID?) here, to avoid stomping on each others' implementation choices. Otherwise, it sounds like our only choice here is to copy your Android driver verbatim, or get lost. > > I think this vendor command can be a generic nl80211 command, because > > we need SAR > > power limit as well. > > This was discussed during the 2019 wireless workshop. The conclusion > from that discussion was that while there is clear need for SAR power > limits for various devices and multiple vendors/drivers, it did not look > clear that a single common interface could be defined cleanly taken into > account the differences in the ways vendors have designed the mechanism > in driver and firmware implementations. As such, vendor specific > commands were identified as the approach. [citation needed] I was in that workshop, and while I recall the assertion, I don't recall any evidence [1]. In fact, I've watched (off-list) Wen Gong propose several variations of this exact same API along the way (hint, I'm the one requesting he upstream this), and it's clear there's *some* flexibility in the API. If, for example, the driver attempted to provide a list of frequency bands it supports controlling TX power for, that would go a long way toward sharing this API between drivers. Another hint: this is exactly why Pkshih is speaking up here -- I'm fielding requests from him and his employer on implementing the same feature, and his API is starting to look an awful lot like yours. So I suggested he review this proposal to see where and why they differ. Anyway, I don't really object with starting out with a Qualcomm-specific and a Realtek-specific vendor command to implement nearly the same feature, but I'd prefer if people did engage in some healthy discussion about why they can't share an API, with the hopes that maybe they can converge someday. In fact, that's exactly what the Wiki says about this: https://wireless.wiki.kernel.org/en/developers/documentation/nl80211#vendor= -specific_api "The goal with these rules is to enable use of vendor commands in a fashion that is transparent enough to allow later reuse by other components with similar needs, and then potentially defining =E2=80=9Creal= =E2=80=9D nl80211 API for the use case in question." Regards, Brian [1] The closest thing to evidence I've seen is that certain $vendors decide they don't want to give user space any control at all over the SAR power tables, for $reasons. But such $vendors should not really have any say in implementing user space APIs for those $vendors that do provide such control. From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail-qt1-x841.google.com ([2607:f8b0:4864:20::841]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ii0b1-0005wG-1s for ath10k@lists.infradead.org; Thu, 19 Dec 2019 18:32:24 +0000 Received: by mail-qt1-x841.google.com with SMTP id k40so5860932qtk.8 for ; Thu, 19 Dec 2019 10:32:21 -0800 (PST) Received: from mail-qt1-f180.google.com (mail-qt1-f180.google.com. [209.85.160.180]) by smtp.gmail.com with ESMTPSA id 206sm1941830qkf.132.2019.12.19.10.32.18 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 19 Dec 2019 10:32:18 -0800 (PST) Received: by mail-qt1-f180.google.com with SMTP id e12so5889162qto.2 for ; Thu, 19 Dec 2019 10:32:18 -0800 (PST) MIME-Version: 1.0 References: <1576684108-30177-1-git-send-email-kvalo@codeaurora.org> <1576684108-30177-2-git-send-email-kvalo@codeaurora.org> <1576748692.7758.17.camel@realtek.com> <20191219154828.GA12287@w1.fi> In-Reply-To: <20191219154828.GA12287@w1.fi> From: Brian Norris Date: Thu, 19 Dec 2019 10:32:06 -0800 Message-ID: Subject: Re: [PATCH 1/2] nl80211: vendor-cmd: qca: add dynamic SAR power limits List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "ath10k" Errors-To: ath10k-bounces+kvalo=adurom.com@lists.infradead.org To: Jouni Malinen Cc: Pkshih , "linux-wireless@vger.kernel.org" , "kvalo@codeaurora.org" , "ath10k@lists.infradead.org" T24gVGh1LCBEZWMgMTksIDIwMTkgYXQgNzo0OCBBTSBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPiB3 cm90ZToKPiBPbiBUaHUsIERlYyAxOSwgMjAxOSBhdCAwOTo0NDo1MkFNICswMDAwLCBQa3NoaWgg d3JvdGU6Cj4gPiBPbiBXZWQsIDIwMTktMTItMTggYXQgMTc6NDggKzAyMDAsIEthbGxlIFZhbG8g d3JvdGU6Cj4gPiA+IGRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbmw4MDIxMS12bmQtcWNhLmgg Yi9pbmNsdWRlL3VhcGkvbmw4MDIxMS12bmQtcWNhLmgKPiA+ID4gKyAqIE5PVEU6IFRoZSBhdXRo b3JpdGF0aXZlIHBsYWNlIGZvciBkZWZpbml0aW9uIG9mIFFDQV9OTDgwMjExX1ZFTkRPUl9JRCwK PiA+ID4gKyAqIHZlbmRvciBzdWJjbWQgZGVmaW5pdGlvbnMgcHJlZml4ZWQgd2l0aCBRQ0FfTkw4 MDIxMV9WRU5ET1JfU1VCQ01ELCBhbmQKPiA+ID4gKyAqIHFjYV93bGFuX3ZlbmRvcl9hdHRyIGlz IG9wZW4gc291cmNlIGZpbGUgc3JjL2NvbW1vbi9xY2EtdmVuZG9yLmggaW4KPiA+ID4gKyAqIGdp dDovL3cxLmZpL3Nydi9naXQvaG9zdGFwLmdpdDsgdGhlIHZhbHVlcyBoZXJlIGFyZSBqdXN0IGEg Y29weSBvZiB0aGF0CgpCeSB0aGUgd2F5LCBJIHdvbmRlciAtLSB3aHkgaGF2ZSB0aGlzIHN0YXRl bWVudD8gVGhhdCdzIG5vdCBob3cgSQpyZWNhbGwgYW55IG90aGVyIHBpZWNlIG9mIGtlcm5lbCBk ZXZlbG9wbWVudCBldmVyIHdvcmtpbmc7IHVwc3RyZWFtCkxpbnV4IGRlZmluZXMgdGhlIHVwc3Ry ZWFtIExpbnV4IEFQSSwgbm90IHNvbWUgYXJiaXRyYXJ5IHVzZXIgc3BhY2UKcHJvamVjdC4gVGhp cyBzdGF0ZW1lbnQgY291bGQgYmUgdXNlZnVsIGZvciBzYXlpbmcsICJkb24ndCBzdG9tcCBvbgp0 aG9zZSBjb21tYW5kIG51bWJlcnMgcGxlYXNlLCIgYnV0IHRoZSByZXNwb25zZSBzaG91bGQgcHJv YmFibHkgYmUgdG8KZ28gb3V0IGFuZCBkZWZpbmUgYSB0b3RhbGx5IG5ldyB2ZW5kb3IgSUQgb3Ig c29tZXRoaW5nLiAoU2VlIGJlbG93LikKCj4gPiA+ICsgKiBAUUNBX1dMQU5fVkVORE9SX0FUVFJf U0FSX0xJTUlUU19TUEVDX0JBTkQ6IE9wdGlvbmFsICh1MzIpIHZhbHVlIHRvCj4gPiA+ICsgKiBp bmRpY2F0ZSBmb3Igd2hpY2ggYmFuZCB0aGlzIHNwZWNpZmljYXRpb24gYXBwbGllcy4gVmFsaWQK PiA+ID4gKyAqIHZhbHVlcyBhcmUgZW51bWVyYXRlZCBpbiBlbnVtICVubDgwMjExX2JhbmQgKGFs dGhvdWdoIG5vdCBhbGwKPiA+ID4gKyAqIGJhbmRzIG1heSBiZSBzdXBwb3J0ZWQgYnkgYSBnaXZl biBkZXZpY2UpLiBJZiB0aGUgYXR0cmlidXRlIGlzCj4gPgo+ID4gQ2FuIHdlIGRlZmluZSBzZXBh cmF0ZWQgZW51bSB0byBhZGRyZXNzIGZvdXIgNUcgc3ViLWJhbmRzLCBsaWtlcwo+ID4KPiA+IGVu dW0gbmw4MDIxMV9zYXJfYmFuZCB7Cj4gPiAgICAgICBOTDgwMjExX1NBUl9CQU5EXzJHLAo+ID4g ICAgICAgTkw4MDIxMV9TQVJfQkFORF81R19CQU5EMSwKPiA+ICAgICAgIE5MODAyMTFfU0FSX0JB TkRfNUdfQkFORDIsCj4gPiAgICAgICBOTDgwMjExX1NBUl9CQU5EXzVHX0JBTkQzLAo+ID4gICAg ICAgTkw4MDIxMV9TQVJfQkFORF81R19CQU5ENCwKPiA+IH07Cj4KPiBQbGVhc2Ugbm90ZSB0aGF0 IHRoZSB2ZW5kb3Igc3ViY21kIGFuZCBhdHRyaWJ1dGVzIHVzZWQgaGVyZSBhcmUgYWxyZWFkeQo+ IGRlcGxveWVkIGFuZCBpbiB1c2UgYXMgYSBrZXJuZWwgaW50ZXJmYWNlLiBBcyBzdWNoLCB0aGUg ZXhpc3RpbmcKPiBhdHRyaWJ1dGVzIGNhbm5vdCByZWFsbHkgYmUgbW9kaWZpZWQ7IGlmIGFueXRo aW5nIGVsc2Ugd291bGQgYmUgbmVlZGVkLAo+IHRoYXQgd291bGQgbmVlZCB0byBiZSBkZWZpbmVk IGFzIGEgbmV3IGF0dHJpYnV0ZSBhbmQvb3IgY29tbWFuZC4KCkNsYXJpZmljYXRpb246IHlvdSdy ZSB0YWxraW5nIGFib3V0IG91dC1vZi10cmVlIGRyaXZlcnMsIHdoaWNoIHJlYWxseQpoYXZlIG5v IHJlbGV2YW5jZSBpbiB1cHN0cmVhbSBkaXNjdXNzaW9uLCBleGNlcHQgcG9zc2libHkgYXMgZXhh bXBsZXMuCkkgZG9uJ3QgdGhpbmsgaXQncyBldmVyIGJlZW4gYSB2YWxpZCBhcHByb2FjaCB0byBk aWN0YXRlIHVwc3RyZWFtCmtlcm5lbCBkZXNpZ24gYmFzZWQgc2ltcGx5IG9uICJ3aGF0ICR2ZW5k b3IgYWxyZWFkeSBpbXBsZW1lbnRlZCBmb3IKQW5kcm9pZC4iCgpNYXliZSBpdCdzIGEgYmV0dGVy IGlkZWEgdG8ganVzdCB1c2UgZGlmZmVyZW50IGNvbW1hbmQgbnVtYmVycyAob3IKdmVuZG9yIElE PykgaGVyZSwgdG8gYXZvaWQgc3RvbXBpbmcgb24gZWFjaCBvdGhlcnMnIGltcGxlbWVudGF0aW9u CmNob2ljZXMuIE90aGVyd2lzZSwgaXQgc291bmRzIGxpa2Ugb3VyIG9ubHkgY2hvaWNlIGhlcmUg aXMgdG8gY29weQp5b3VyIEFuZHJvaWQgZHJpdmVyIHZlcmJhdGltLCBvciBnZXQgbG9zdC4KCj4g PiBJIHRoaW5rIHRoaXMgdmVuZG9yIGNvbW1hbmQgY2FuIGJlIGEgZ2VuZXJpYyBubDgwMjExIGNv bW1hbmQsIGJlY2F1c2UKPiA+IHdlIG5lZWQgU0FSCj4gPiBwb3dlciBsaW1pdCBhcyB3ZWxsLgo+ Cj4gVGhpcyB3YXMgZGlzY3Vzc2VkIGR1cmluZyB0aGUgMjAxOSB3aXJlbGVzcyB3b3Jrc2hvcC4g VGhlIGNvbmNsdXNpb24KPiBmcm9tIHRoYXQgZGlzY3Vzc2lvbiB3YXMgdGhhdCB3aGlsZSB0aGVy ZSBpcyBjbGVhciBuZWVkIGZvciBTQVIgcG93ZXIKPiBsaW1pdHMgZm9yIHZhcmlvdXMgZGV2aWNl cyBhbmQgbXVsdGlwbGUgdmVuZG9ycy9kcml2ZXJzLCBpdCBkaWQgbm90IGxvb2sKPiBjbGVhciB0 aGF0IGEgc2luZ2xlIGNvbW1vbiBpbnRlcmZhY2UgY291bGQgYmUgZGVmaW5lZCBjbGVhbmx5IHRh a2VuIGludG8KPiBhY2NvdW50IHRoZSBkaWZmZXJlbmNlcyBpbiB0aGUgd2F5cyB2ZW5kb3JzIGhh dmUgZGVzaWduZWQgdGhlIG1lY2hhbmlzbQo+IGluIGRyaXZlciBhbmQgZmlybXdhcmUgaW1wbGVt ZW50YXRpb25zLiBBcyBzdWNoLCB2ZW5kb3Igc3BlY2lmaWMKPiBjb21tYW5kcyB3ZXJlIGlkZW50 aWZpZWQgYXMgdGhlIGFwcHJvYWNoLgoKW2NpdGF0aW9uIG5lZWRlZF0KSSB3YXMgaW4gdGhhdCB3 b3Jrc2hvcCwgYW5kIHdoaWxlIEkgcmVjYWxsIHRoZSBhc3NlcnRpb24sIEkgZG9uJ3QKcmVjYWxs IGFueSBldmlkZW5jZSBbMV0uIEluIGZhY3QsIEkndmUgd2F0Y2hlZCAob2ZmLWxpc3QpIFdlbiBH b25nCnByb3Bvc2Ugc2V2ZXJhbCB2YXJpYXRpb25zIG9mIHRoaXMgZXhhY3Qgc2FtZSBBUEkgYWxv bmcgdGhlIHdheSAoaGludCwKSSdtIHRoZSBvbmUgcmVxdWVzdGluZyBoZSB1cHN0cmVhbSB0aGlz KSwgYW5kIGl0J3MgY2xlYXIgdGhlcmUncwoqc29tZSogZmxleGliaWxpdHkgaW4gdGhlIEFQSS4g SWYsIGZvciBleGFtcGxlLCB0aGUgZHJpdmVyIGF0dGVtcHRlZAp0byBwcm92aWRlIGEgbGlzdCBv ZiBmcmVxdWVuY3kgYmFuZHMgaXQgc3VwcG9ydHMgY29udHJvbGxpbmcgVFggcG93ZXIKZm9yLCB0 aGF0IHdvdWxkIGdvIGEgbG9uZyB3YXkgdG93YXJkIHNoYXJpbmcgdGhpcyBBUEkgYmV0d2VlbiBk cml2ZXJzLgoKQW5vdGhlciBoaW50OiB0aGlzIGlzIGV4YWN0bHkgd2h5IFBrc2hpaCBpcyBzcGVh a2luZyB1cCBoZXJlIC0tIEknbQpmaWVsZGluZyByZXF1ZXN0cyBmcm9tIGhpbSBhbmQgaGlzIGVt cGxveWVyIG9uIGltcGxlbWVudGluZyB0aGUgc2FtZQpmZWF0dXJlLCBhbmQgaGlzIEFQSSBpcyBz dGFydGluZyB0byBsb29rIGFuIGF3ZnVsIGxvdCBsaWtlIHlvdXJzLiBTbyBJCnN1Z2dlc3RlZCBo ZSByZXZpZXcgdGhpcyBwcm9wb3NhbCB0byBzZWUgd2hlcmUgYW5kIHdoeSB0aGV5IGRpZmZlci4K CkFueXdheSwgSSBkb24ndCByZWFsbHkgb2JqZWN0IHdpdGggc3RhcnRpbmcgb3V0IHdpdGggYQpR dWFsY29tbS1zcGVjaWZpYyBhbmQgYSBSZWFsdGVrLXNwZWNpZmljIHZlbmRvciBjb21tYW5kIHRv IGltcGxlbWVudApuZWFybHkgdGhlIHNhbWUgZmVhdHVyZSwgYnV0IEknZCBwcmVmZXIgaWYgcGVv cGxlIGRpZCBlbmdhZ2UgaW4gc29tZQpoZWFsdGh5IGRpc2N1c3Npb24gYWJvdXQgd2h5IHRoZXkg Y2FuJ3Qgc2hhcmUgYW4gQVBJLCB3aXRoIHRoZSBob3Blcwp0aGF0IG1heWJlIHRoZXkgY2FuIGNv bnZlcmdlIHNvbWVkYXkuIEluIGZhY3QsIHRoYXQncyBleGFjdGx5IHdoYXQgdGhlCldpa2kgc2F5 cyBhYm91dCB0aGlzOgoKaHR0cHM6Ly93aXJlbGVzcy53aWtpLmtlcm5lbC5vcmcvZW4vZGV2ZWxv cGVycy9kb2N1bWVudGF0aW9uL25sODAyMTEjdmVuZG9yLXNwZWNpZmljX2FwaQoKIlRoZSBnb2Fs IHdpdGggdGhlc2UgcnVsZXMgaXMgdG8gZW5hYmxlIHVzZSBvZiB2ZW5kb3IgY29tbWFuZHMgaW4g YQpmYXNoaW9uIHRoYXQgaXMgdHJhbnNwYXJlbnQgZW5vdWdoIHRvIGFsbG93IGxhdGVyIHJldXNl IGJ5IG90aGVyCmNvbXBvbmVudHMgd2l0aCBzaW1pbGFyIG5lZWRzLCBhbmQgdGhlbiBwb3RlbnRp YWxseSBkZWZpbmluZyDigJxyZWFs4oCdCm5sODAyMTEgQVBJIGZvciB0aGUgdXNlIGNhc2UgaW4g cXVlc3Rpb24uIgoKUmVnYXJkcywKQnJpYW4KClsxXSBUaGUgY2xvc2VzdCB0aGluZyB0byBldmlk ZW5jZSBJJ3ZlIHNlZW4gaXMgdGhhdCBjZXJ0YWluICR2ZW5kb3JzCmRlY2lkZSB0aGV5IGRvbid0 IHdhbnQgdG8gZ2l2ZSB1c2VyIHNwYWNlIGFueSBjb250cm9sIGF0IGFsbCBvdmVyIHRoZQpTQVIg cG93ZXIgdGFibGVzLCBmb3IgJHJlYXNvbnMuIEJ1dCBzdWNoICR2ZW5kb3JzIHNob3VsZCBub3Qg cmVhbGx5CmhhdmUgYW55IHNheSBpbiBpbXBsZW1lbnRpbmcgdXNlciBzcGFjZSBBUElzIGZvciB0 aG9zZSAkdmVuZG9ycyB0aGF0CmRvIHByb3ZpZGUgc3VjaCBjb250cm9sLgoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KYXRoMTBrIG1haWxpbmcgbGlzdAph dGgxMGtAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWls bWFuL2xpc3RpbmZvL2F0aDEwawo=