Skip to contentSkip to conversation

support for antenna configuration profiles

PATCH In review Daniel Golle 2 participants 4 messages Nov 28, 2011 – Dec 6, 2011 802.11 (including cfg80211/NL80211)

lore
Share & tools
lore
#0 lore raw

PATCH 1/3 support for antenna configuration profiles

This adds support for antenna switch configuration profiles to nl80211.

---
 include/linux/nl80211.h |   47 +++++++++++++++++++++++++++++++
 include/net/cfg80211.h  |   26 +++++++++++++++++
 net/wireless/nl80211.c  |   71 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 144 insertions(+), 0 deletions(-)
include/linux/nl80211.h +47 -0
index 97bfebf..0653896 100644
@@ -1185,6 +1185,12 @@ enum nl80211_commands {
  *    abides to when initiating radiation on DFS channels. A country maps
  *    to one DFS region.
  *
+ * @NL80211_ATTR_WIPHY_EXTANT: External antenna switch profiles. This nested
+ *	structure contains a list of available profiles as well as the current
+ *	profile selection status.
+ *
+ * @NL80211_ATTR_WIPHY_EXTANT_SELECT: Select extant profile.
+ *
  * @NL80211_ATTR_MAX: highest attribute number currently defined
  * @__NL80211_ATTR_AFTER_LAST: internal use
  */
@@ -1428,6 +1434,9 @@ enum nl80211_attrs {
 	NL80211_ATTR_DISABLE_HT,
 	NL80211_ATTR_HT_CAPABILITY_MASK,
 
+	NL80211_ATTR_WIPHY_EXTANT,
+	NL80211_ATTR_WIPHY_EXTANT_SELECT,
+
 	/* add attributes here, update the policy in nl80211.c */
 
 	__NL80211_ATTR_AFTER_LAST,
@@ -1720,6 +1729,44 @@ enum nl80211_mpath_info {
 	NL80211_MPATH_INFO_MAX = __NL80211_MPATH_INFO_AFTER_LAST - 1
 };
 
+
+
+/**
+ * enum nl80211_extant_attr - external antenna switch
+ * @__NL80211_EXTANT_ATTR_INVALID: attribute number 0 is reserved
+ * @NL80211_EXTANT_ATTR_STATE: currently selected profile
+ * @NL80211_EXTANT_ATTR_PROFILES: highest profile attribute currently defined
+ * @NL80211_EXTANT_ATTR_MAX: highest profile attribute currently defined
+ * @__NL80211_EXTANT_ATTR_AFTER_LAST: internal use
+ */
+enum nl80211_extant_attr {
+	__NL80211_EXTANT_ATTR_INVALID,
+	NL80211_EXTANT_ATTR_STATE,
+	NL80211_EXTANT_ATTR_PROFILES,
+	/* keep last */
+	__NL80211_EXTANT_ATTR_AFTER_LAST,
+	NL80211_EXTANT_ATTR_MAX = __NL80211_EXTANT_ATTR_AFTER_LAST - 1
+};
+
+/**
+ * enum nl80211_easp_attr - external antenna switch configuration profile
+ * @__NL80211_EASP_ATTR_INVALID: attribute number 0 is reserved
+ * @NL80211_EASP_ATTR_ID: unique identifier
+ * @NL80211_EASP_ATTR_NAME: human-readable name of the configuration profile
+ * @NL80211_EASP_ATTR_DESC: human-readable description of the configuration profile
+ * @NL80211_EASP_ATTR_MAX: highest profile attribute currently defined
+ * @__NL80211_EASP_ATTR_AFTER_LAST: internal use
+ */
+enum nl80211_easp_attr {
+	__NL80211_EASP_ATTR_INVALID,
+	NL80211_EASP_ATTR_ID,
+	NL80211_EASP_ATTR_NAME,
+	NL80211_EASP_ATTR_DESC,
+	/* keep last */
+	__NL80211_EASP_ATTR_AFTER_LAST,
+	NL80211_EASP_ATTR_MAX = __NL80211_EASP_ATTR_AFTER_LAST - 1
+};
+
 /**
  * enum nl80211_band_attr - band attributes
  * @__NL80211_BAND_ATTR_INVALID: attribute number 0 is reserved
include/net/cfg80211.h +26 -0
index d5e1891..4896e7a 100644
@@ -1456,6 +1456,9 @@ struct cfg80211_gtk_rekey_data {
  *
  * @get_antenna: Get current antenna configuration from device (tx_ant, rx_ant).
  *
+ * @set_extant: Select the external antenna switch configuration profile.
+ * @get_extant: Get currently selected antenna switch profile.
+ *
  * @set_ringparam: Set tx and rx ring sizes.
  *
  * @get_ringparam: Get tx and rx ring current and maximum sizes.
@@ -1637,6 +1640,9 @@ struct cfg80211_ops {
 	int	(*set_antenna)(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant);
 	int	(*get_antenna)(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant);
 
+	int	(*set_extant)(struct wiphy *wiphy, u32 extant);
+	int	(*get_extant)(struct wiphy *wiphy, u32 *extant);
+
 	int	(*set_ringparam)(struct wiphy *wiphy, u32 tx, u32 rx);
 	void	(*get_ringparam)(struct wiphy *wiphy,
 				 u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max);
@@ -1748,6 +1754,7 @@ enum wiphy_flags {
 	WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD	= BIT(19),
 	WIPHY_FLAG_OFFCHAN_TX			= BIT(20),
 	WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL	= BIT(21),
+	WIPHY_FLAG_HAS_EXTANT_SWITCH		= BIT(22),
 };
 
 /**
@@ -1875,6 +1882,21 @@ struct wiphy_wowlan_support {
 };
 
 /**
+ * struct wiphy_extant_profile - User-parsable external antenna switch info
+ *
+ * This structure is used to provide the available switch configurations.
+ * @id: unique identifier of the profile
+ * @name: profile name (a short string)
+ * @description: user-parsable description of the profile
+ */
+struct wiphy_extant_profile {
+	int id;
+	char *name;
+	char *desc;
+};
+
+
+/**
  * struct wiphy - wireless hardware description
  * @reg_notifier: the driver's regulatory notification callback,
  *	note that if your driver uses wiphy_apply_custom_regulatory()
@@ -1955,6 +1977,8 @@ struct wiphy_wowlan_support {
  *	configured as RX antennas. Antenna configuration commands will be
  *	rejected unless this or @available_antennas_tx is set.
  *
+ * @extant: struct holding the available antenna switch configuration profiles.
+ *
  * @max_remain_on_channel_duration: Maximum time a remain-on-channel operation
  *	may request, if implemented.
  *
@@ -2025,6 +2049,8 @@ struct wiphy {
 	 */
 	u32 probe_resp_offload;
 
+	struct wiphy_extant_profile *extant;
+
 	/* If multiple wiphys are registered and you're handed e.g.
 	 * a regular netdev with assigned ieee80211_ptr, you won't
 	 * know whether it points to a wiphy your driver has registered
net/wireless/nl80211.c +71 -0

101 lines not on this page · raw message

Signature · 1 line
1.7.4.1
#1 lore raw

T24gTW9uLCAyMDExLTExLTI4IGF0IDE3OjEyICswMTAwLCBEYW5pZWwgR29sbGUgd3JvdGU6Cj4g VGhpcyBhZGRzIHN1cHBvcnQgZm9yIGFudGVubmEgc3dpdGNoIGNvbmZpZ3VyYXRpb24gcHJvZmls ZXMgdG8gbmw4MDIxMS4KCk1laCwgSSBjb3VsZG4ndCBmaW5kIHRoaXMgcGF0Y2ggYmVjYXVzZSB0 aGUgc3ViamVjdHMgYXJlIGFsbCB3cm9uZy4KVGhyZWUgcGF0Y2hlcyB3aXRoIGV4YWN0bHkgdGhl IHNhbWUgc3ViamVjdD8hIENvbWUgb24uIEFsc28gcGxlYXNlIHVzZQp0aHJlYWRlZCBtb2RlIHRv IHN1Ym1pdCAtLSBvdGhlcndpc2UgdGhlIDAvTiBkaXNjdXNzaW9uICYgdGhlIHBhdGNoZXMKZ2V0 IHRvcm4gYXBhcnQgKHdoaWNoIGlzIHRoZSByZWFzb24gSSdtIHJlcGx5aW5nIGhlcmUpLgoKQW55 d2F5LCBlbm91Z2ggY29tcGxhaW5pbmcuCgoKPiAgLyoqCj4gKyAqIHN0cnVjdCB3aXBoeV9leHRh bnRfcHJvZmlsZSAtIFVzZXItcGFyc2FibGUgZXh0ZXJuYWwgYW50ZW5uYSBzd2l0Y2ggaW5mbwo+ ICsgKgo+ICsgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGF2YWlsYWJs ZSBzd2l0Y2ggY29uZmlndXJhdGlvbnMuCj4gKyAqIEBpZDogdW5pcXVlIGlkZW50aWZpZXIgb2Yg dGhlIHByb2ZpbGUKPiArICogQG5hbWU6IHByb2ZpbGUgbmFtZSAoYSBzaG9ydCBzdHJpbmcpCj4g KyAqIEBkZXNjcmlwdGlvbjogdXNlci1wYXJzYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvZmls ZQo+ICsgKi8KPiArc3RydWN0IHdpcGh5X2V4dGFudF9wcm9maWxlIHsKPiArCWludCBpZDsKPiAr CWNoYXIgKm5hbWU7Cj4gKwljaGFyICpkZXNjOwoKY29uc3QKCj4gKwlzdHJ1Y3Qgd2lwaHlfZXh0 YW50X3Byb2ZpbGUgKmV4dGFudDsKCmNvbnN0CgpBbHNvLCBzaG91bGRuJ3QgdGhpcyBhbGxvdyBt dWx0aXBsZSBwcm9maWxlcz8KCkl0J3MgYSBiaXQgc3RyYW5nZSB0byBoYXZlIGEgcHJvZmlsZSBJ RCBidXQgdGhlbiBvbmx5IGEgc2luZ2xlCnByb2ZpbGUgLi4uCgo+ICsvKiBwb2xpY3kgZm9yIGV4 dGVybmFsIGFudGVubmEgc3dpdGNoIGNvbmZpZ3VyYXRpb24gcHJvZmlsZXMgKi8KPiArc3RhdGlj IGNvbnN0IHN0cnVjdCBubGFfcG9saWN5Cj4gK25sODAyMTFfZWFzcF9wb2xpY3lbTkw4MDIxMV9F QVNQX0FUVFJfTUFYICsgMV0gPSB7Cj4gKwlbTkw4MDIxMV9FQVNQX0FUVFJfSURdID0geyAudHlw ZSA9IE5MQV9VMzIgfSwKPiArCVtOTDgwMjExX0VBU1BfQVRUUl9OQU1FXSA9IHsgLnR5cGUgPSBO TEFfU1RSSU5HLAo+ICsJCQkJCS5sZW4gPSBJRUVFODAyMTFfTUFYX0RBVEFfTEVOIH0sCj4gKwlb Tkw4MDIxMV9FQVNQX0FUVFJfREVTQ10gPSB7IC50eXBlID0gTkxBX1NUUklORywKPiArCQkJCQku bGVuID0gSUVFRTgwMjExX01BWF9EQVRBX0xFTiB9LAo+ICt9OwoKVGhvc2UgbGVuZ3RoIHJlc3Ry aWN0aW9ucyBhcmUgY29tcGxldGVseSBib2d1cywgYnV0IHRoZXkncmUgYWxzbwp1bm5lY2Vzc2Fy eSBzaW5jZSB0aGlzIGRhdGEgaXMgb3V0cHV0IGRhdGEgb25seSBzbyB5b3UgYXJlbid0IHVzaW5n IHRoZQpwb2xpY3kgYW55d2hlcmUgYW55d2F5LgoKPiBAQCAtNzgxLDYgKzc5Niw0OCBAQCBzdGF0 aWMgaW50IG5sODAyMTFfc2VuZF93aXBoeShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcGlkLCB1 MzIgc2VxLCBpbnQgZmxhZ3MsCj4gIAkJfQo+ICAJfQo+ICAKPiArCS8qCj4gKwkgKiBhbnRlbm5h IHN3aXRjaCBjb25maWd1cmF0aW9uIHByb2ZpbGUgc3VwcG9ydAo+ICsJICovCj4gKwlpZiAoZGV2 LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfSEFTX0VYVEFOVF9TV0lUQ0gpIHsKPiArCQlzdHJ1 Y3Qgd2lwaHlfZXh0YW50X3Byb2ZpbGUgKndlcHJvZjsKPiArCQlubF9leHRhbnQgPSBubGFfbmVz dF9zdGFydChtc2csIE5MODAyMTFfQVRUUl9XSVBIWV9FWFRBTlQpOwo+ICsJCWlmICghbmxfZXh0 YW50KQo+ICsJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKPiArCj4gKwkJLyogY3VycmVudGx5IHNl bGVjdGVkIGNvbmZpZ3VyYXRpb24gcHJvZmlsZSAqLwo+ICsJCWlmIChkZXYtPm9wcy0+Z2V0X2V4 dGFudCkgewo+ICsJCQl1MzIgZXh0YW50Owo+ICsJCQlpbnQgcmVzOwo+ICsJCQlyZXMgPSBkZXYt Pm9wcy0+Z2V0X2V4dGFudCgmZGV2LT53aXBoeSwgJmV4dGFudCk7Cj4gKwkJCWlmICghcmVzKQo+ ICsJCQkJTkxBX1BVVF9VMzIobXNnLAo+ICsJCQkJCU5MODAyMTFfRVhUQU5UX0FUVFJfU1RBVEUs Cj4gKwkJCQkJZXh0YW50KTsKPiArCQl9Cj4gKwo+ICsJCS8qIGF2YWlsYWJsZSBwcm9maWxlcyAq Lwo+ICsJCWk9MDsKPiArCQlubF9lYXNwcyA9IG5sYV9uZXN0X3N0YXJ0KG1zZywgTkw4MDIxMV9F WFRBTlRfQVRUUl9QUk9GSUxFUyk7Cj4gKwkJZm9yICh3ZXByb2YgPSBkZXYtPndpcGh5LmV4dGFu dDsgd2Vwcm9mLT5pZCA+PSAwOyB3ZXByb2YrKykgewoKT2ggc28gdGhhdCdzIHN1cHBvc2VkIHRv IGJlIGFuIGFycmF5IC0tIHRoZXJlJ3Mgbm8gd2F5IHRvIHRlbGwgdGhpcyBmcm9tCnRoZSBoZWFk ZXIgZmlsZXMuIEl0J3MgYWNjZXB0YWJsZSwgYnV0IHBsZWFzZSBnaXZlIGl0IGFuIGV4cGxpY2l0 Cmxlbmd0aC4KCgpBbnl3YXksIGFwYXJ0IGZyb20gdGhlc2UgdGVjaG5pY2FsIGlzc3VlcyB0aGF0 IHlvdSBtdXN0IGZpeCwgSSBhbHNvIHdhbnQKc29tZWJvZHkgd2hvIGtub3dzIHdoYXQgdGhpcyBp cyB1c2VkIGZvciBhbmQgaG93IGl0IGlzIHVzZWQgdG8gcmV2aWV3Cml0LCB3aGljaCBtaWdodCBt ZWFuIHdhaXRpbmcgZm9yIEFkcmlhbiB3aG8gc2F5cyBpdCdsbCBiZSBhIGNvdXBsZSBvZgp3ZWVr cyBhdCBsZWFzdC4KCmpvaGFubmVzCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpJbnRl bCBHbWJICkRvcm5hY2hlciBTdHJhc3NlIDEKODU2MjIgRmVsZGtpcmNoZW4vTXVlbmNoZW4sIERl dXRzY2hsYW5kIApTaXR6IGRlciBHZXNlbGxzY2hhZnQ6IEZlbGRraXJjaGVuIGJlaSBNdWVuY2hl bgpHZXNjaGFlZnRzZnVlaHJlcjogRG91Z2xhcyBMdXNrLCBQZXRlciBHbGVpc3NuZXIsIEhhbm5l cyBTY2h3YWRlcmVyClJlZ2lzdGVyZ2VyaWNodDogTXVlbmNoZW4gSFJCIDQ3NDU2IApVc3QuLUlk TnIuL1ZBVCBSZWdpc3RyYXRpb24gTm8uOiBERTEyOTM4NTg5NQpDaXRpYmFuayBGcmFua2Z1cnQg YS5NLiAoQkxaIDUwMiAxMDkgMDApIDYwMDExOTA1Mgo=

#2 lore raw

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi!

Quoted 7 lines · Johannes Berg
Quoted 1 line · Daniel Golle

This adds support for antenna switch configuration profiles to nl80211.

Meh, I couldn't find this patch because the subjects are all wrong. Three patches with exactly the same subject?! Come on. Also please use threaded mode to submit -- otherwise the 0/N discussion & the patches get torn apart (which is the reason I'm replying here).

I see, I try to use git-email in future to automatize the submission process and hope that would improve the form.
The draft/v0 patch was posted on ath9k-devel, I re-posted this one to linux-wireless after Mohammed suggested to post it here to have a broader audience for discussion. Unfortunately I didn't repost the board-setup and userspace patches as well, I'll try to prepare that in the next days.

Quoted 1 line

Anyway, enough complaining.

Please excuse me being a noob when it comes to collaboration methods, trying to emulate what I observe. I highly appreciate people showing me where and how I can improve.

Quoted 3 lines

Those length restrictions are completely bogus, but they're also unnecessary since this data is output data only so you aren't using the policy anywhere anyway.

Should I completely skip adding it to the policy then or just ommit the length restriction?

Quoted 3 lines

Oh so that's supposed to be an array -- there's no way to tell this from the header files. It's acceptable, but please give it an explicit length.

Ok, I haven't seen any devices with more than 2 possible antenna configuation profiles (horizontal/vertical, built-in/external) so far, so giving the array a fixed length of 4 should be fine for now.

Quoted 4 lines

Anyway, apart from these technical issues that you must fix, I also want somebody who knows what this is used for and how it is used to review it, which might mean waiting for Adrian who says it'll be a couple of weeks at least.

No worries about that, I'll also be traveling in the next few weeks and we can further discuss when Adrian has returned as well.

Daniel

- --
ALLNET GmbH ; Maistr. 2 ; D-82110 Germering ; Germany
Tel. +49-89-89422222 - Fax +49-89-89422233
http://www.allnet.de
email: Daniel Golle <[email protected]> Schulungs-/Veranstaltungsprogramm: http://www.802lab.de<http://www.802lab.de/>
Geschäftsführer: Wolfgang Marcus Bauer
Handelsregister München B 95922 ; UST-ID-Nr. DE 128214294 ; St.-Nr.117/115/00164
WEEE-Reg.-NR. DE 13101093
Bankverbindung:
Sparkasse Fürstenfeldbruck KTO: 2774594 ; BLZ: 70053070
Swift-Code: BYLADEM1FFB ; IBAN: DE61700530700002774594
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iQIcBAEBAgAGBQJO3PfpAAoJEDy9cKN/1Et0gSwP/33wyuFu6Hz0o8BnSO7QCP5p QPH/KO9tzIsLh7VgDqGYFpkhInh4JCc+zumSM7OL8JY0NkJv+PVoCs9o3WqtDqdY k10CV4l1kT0ckfcvsE0E/LTsQAzq53tlc/A8g0NJCRVWUT2ikXE93ixcOh77n/lC VvcblSU1wvgvmKn9848Ydm31T32wdrI910kLnGH97NVc3K6cpQUtNLRA5adLTBlz nlxj7eFP2rwkiXpBMHO6HWqvW2LpgFgzHCnpCxVyq0To5l4l2KZuscRs94nRm717 uScjxN7fPHj8WNv/QXlJ5+xQQLL5xfXzJd0UMNSx3yIY3ObgBbjA9j6eme3QLvKG Yz6jDzRbCCO0n4YfFxYnrcAsZawjHx4WqjmqV9vpYrEXDEmkaj3LSMt9dYfjWiZX PBfUs+Al+2NjO7lqq7nWMevmOlX+GBkQPJeH9Ov3NT8xAlqDmEEE8EzD5NXdAdDw BSATVJkTh5OVsU5S13Wlf98N6mcV904lmRDi9jEPUITL1ygiVFiqBMakIF62Ozgc flF83MR9f+NxLC0oeqVEYgMddwUK2O3wj5YrT9EsWt6mwJ2kzFfSugo4cf+IGCml 6MZDX5OoeIB1jWe7MS7jONKXmz2dWU4g1tB8DHc6XSRZKXkrKm7hzrOSF9sIK6hJ i76D1gt+BH5/zFAHY4Fd
=ytEh
-----END PGP SIGNATURE-----

#3 lore raw

Cj4gPiBUaG9zZSBsZW5ndGggcmVzdHJpY3Rpb25zIGFyZSBjb21wbGV0ZWx5IGJvZ3VzLCBidXQg dGhleSdyZSBhbHNvCj4gPiB1bm5lY2Vzc2FyeSBzaW5jZSB0aGlzIGRhdGEgaXMgb3V0cHV0IGRh dGEgb25seSBzbyB5b3UgYXJlbid0IHVzaW5nIHRoZQo+ID4gcG9saWN5IGFueXdoZXJlIGFueXdh eS4KCj4gU2hvdWxkIEkgY29tcGxldGVseSBza2lwIGFkZGluZyBpdCB0byB0aGUgcG9saWN5IHRo ZW4gb3IganVzdCBvbW1pdCB0aGUgbGVuZ3RoCj4gcmVzdHJpY3Rpb24/CgpKdXN0IGRvbid0IGFk ZCB0aGUgcG9saWN5LCBJIGRvbid0IHNlZSBpdCBhZGRpbmcgYW55IHZhbHVlLiBUaGUgZm9ybWF0 CnNob3VsZCBiZSBkb2N1bWVudGVkIHdlbGwgZW5vdWdoIGluIHRoZSBoZWFkZXIgZmlsZSBzbyB1 c2Vyc3BhY2UgY2FuCnVuZGVyc3RhbmQgaXQgd2l0aG91dCB0aGUgcG9saWN5LgooQWxzbyBub3Rl IHRoYXQgSSB3YXMgcmVmZXJyaW5nIHRvIHVzaW5nIGEgYm9ndXMgbGVuZ3RoIGNvbnN0YW50IC0t IHlvdQp3ZXJlIHNheWluZyBlYWNoIHN0cmluZyBoZXJlIGNhbiBiZSBhcyBsb25nIGFzIGEgODAy LjExIGZyYW1lKQoKPiA+IE9oIHNvIHRoYXQncyBzdXBwb3NlZCB0byBiZSBhbiBhcnJheSAtLSB0 aGVyZSdzIG5vIHdheSB0byB0ZWxsIHRoaXMgZnJvbQo+ID4gdGhlIGhlYWRlciBmaWxlcy4gSXQn cyBhY2NlcHRhYmxlLCBidXQgcGxlYXNlIGdpdmUgaXQgYW4gZXhwbGljaXQKPiA+IGxlbmd0aC4K PiBPaywgSSBoYXZlbid0IHNlZW4gYW55IGRldmljZXMgd2l0aCBtb3JlIHRoYW4gMiBwb3NzaWJs ZSBhbnRlbm5hIGNvbmZpZ3VhdGlvbgo+IHByb2ZpbGVzIChob3Jpem9udGFsL3ZlcnRpY2FsLCBi dWlsdC1pbi9leHRlcm5hbCkgc28gZmFyLCBzbyBnaXZpbmcgdGhlIGFycmF5IGEKPiBmaXhlZCBs ZW5ndGggb2YgNCBzaG91bGQgYmUgZmluZSBmb3Igbm93LgoKSSBkb24ndCB0aGluayBkb2luZyBh IGZpeGVkIGxlbmd0aCBpcyB1c2VmdWwgLS0ganVzdCBhZGQgYSB2YXJpYWJsZQpkZXNjcmliaW5n IHRoZSBsZW5ndGguCgpqb2hhbm5lcwoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KSW50 ZWwgR21iSApEb3JuYWNoZXIgU3RyYXNzZSAxCjg1NjIyIEZlbGRraXJjaGVuL011ZW5jaGVuLCBE ZXV0c2NobGFuZCAKU2l0eiBkZXIgR2VzZWxsc2NoYWZ0OiBGZWxka2lyY2hlbiBiZWkgTXVlbmNo ZW4KR2VzY2hhZWZ0c2Z1ZWhyZXI6IERvdWdsYXMgTHVzaywgUGV0ZXIgR2xlaXNzbmVyLCBIYW5u ZXMgU2Nod2FkZXJlcgpSZWdpc3RlcmdlcmljaHQ6IE11ZW5jaGVuIEhSQiA0NzQ1NiAKVXN0Li1J ZE5yLi9WQVQgUmVnaXN0cmF0aW9uIE5vLjogREUxMjkzODU4OTUKQ2l0aWJhbmsgRnJhbmtmdXJ0 IGEuTS4gKEJMWiA1MDIgMTA5IDAwKSA2MDAxMTkwNTIK