2010-03-16 12:33:13

by Daniel Abraham

[permalink] [raw]
Subject: [PATCH] Fix display of last device classes in hciconfig

This is my first ever patch, so it's very simple...
Based on current content in:
http://www.bluetooth.org/assigned-numbers/baseband.htm

Signed-off-by: Daniel Abraham <[email protected]>
---
tools/hciconfig.c | 30 ++++++++++++++++++++++++++----
1 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/tools/hciconfig.c b/tools/hciconfig.c
index 3f687e0..c97ce44 100644
--- a/tools/hciconfig.c
+++ b/tools/hciconfig.c
@@ -645,8 +645,26 @@ static char *get_minor_device_name(int major, int minor)
return "Game";
}
break;
- case 63: /* uncategorised */
- return "";
+ case 9: /* health */
+ switch(minor) {
+ case 0:
+ return "Undefined";
+ case 1:
+ return "Blood Pressure Monitor";
+ case 2:
+ return "Thermometer";
+ case 3:
+ return "Weighing Scale";
+ case 4:
+ return "Glucose Meter";
+ case 5:
+ return "Pulse Oximeter";
+ case 6:
+ return "Heart/Pulse Rate Monitor";
+ case 7:
+ return "Health Data Display";
+ }
+ break;
}
return "Unknown (reserved) minor device class";
}
@@ -668,7 +686,9 @@ static void cmd_class(int ctl, int hdev, char *opt)
"Audio/Video",
"Peripheral",
"Imaging",
- "Uncategorized" };
+ "Wearable",
+ "Toy",
+ "Health" };
int s = hci_open_dev(hdev);

if (s < 0) {
@@ -706,7 +726,9 @@ static void cmd_class(int ctl, int hdev, char *opt)
} else
printf("Unspecified");
printf("\n\tDevice Class: ");
- if ((cls[1] & 0x1f) >= sizeof(major_devices) / sizeof(*major_devices))
+ if (0x1f == cls[1])
+ printf("Uncategorized\n");
+ else if ((cls[1] & 0x1f) >= sizeof(major_devices) / sizeof(*major_devices))
printf("Invalid Device Class!\n");
else
printf("%s, %s\n", major_devices[cls[1] & 0x1f],
--
1.6.6.1


2010-03-27 09:20:56

by Gustavo Padovan

[permalink] [raw]
Subject: Re: [PATCH] Fix display of last device classes in hciconfig

Hi Daniel,

On Sat, Mar 27, 2010 at 5:28 AM, Daniel Abraham
<[email protected]> wrote:
>> > ---
>> > ?tools/hciconfig.c | ? 30 ++++++++++++++++++++++++++----
>> > ?1 files changed, 26 insertions(+), 4 deletions(-)
>> >
>> > diff --git a/tools/hciconfig.c b/tools/hciconfig.c
>> > index 3f687e0..c97ce44 100644
>> > --- a/tools/hciconfig.c
>> > +++ b/tools/hciconfig.c
>> > @@ -645,8 +645,26 @@ static char *get_minor_device_name(int major, int minor)
>> > ? ? ? ? ? ? ? ? ? ? ? ?return "Game";
>> > ? ? ? ? ? ? ? ?}
>> > ? ? ? ? ? ? ? ?break;
>> > - ? ? ? case 63: ? ? ? ?/* uncategorised */
>> > - ? ? ? ? ? ? ? return "";
>>
>> I think that the test for the "Uncategorised" (which seems to be
>> misspelled in many places) device class would be better staying here,
>> because the same code is used inside hcitool.c. Fixing there would be
>> nice too.
>>
>> Another thing, looks like this "case 63:" is wrong, ?major device
>> class is a 5 bit number, and the uncategorized device class is defined
>> as 31. Looks like a legacy from ancient times ;-)
>
> That's exactly why I changed it: the original check below whether to
> enter this function ("if ((cls[1] & 0x1f) >= ...") meant <no. of
> categories + 1> where +1 meant "Unrecognized", but this is mistaken as
> you wrote.
>
> I don't mind fixing it in "hcitool.c" as well, but see followup question
> at the bottom.
>
>> > + ? ? ? case 9: /* health */
>> > + ? ? ? ? ? ? ? switch(minor) {
>> > + ? ? ? ? ? ? ? case 0:
>> > + ? ? ? ? ? ? ? ? ? ? ? return "Undefined";
>> > + ? ? ? ? ? ? ? case 1:
>> > + ? ? ? ? ? ? ? ? ? ? ? return "Blood Pressure Monitor";
>> > + ? ? ? ? ? ? ? case 2:
>> > + ? ? ? ? ? ? ? ? ? ? ? return "Thermometer";
>> > + ? ? ? ? ? ? ? case 3:
>> > + ? ? ? ? ? ? ? ? ? ? ? return "Weighing Scale";
>> > + ? ? ? ? ? ? ? case 4:
>> > + ? ? ? ? ? ? ? ? ? ? ? return "Glucose Meter";
>> > + ? ? ? ? ? ? ? case 5:
>> > + ? ? ? ? ? ? ? ? ? ? ? return "Pulse Oximeter";
>> > + ? ? ? ? ? ? ? case 6:
>> > + ? ? ? ? ? ? ? ? ? ? ? return "Heart/Pulse Rate Monitor";
>> > + ? ? ? ? ? ? ? case 7:
>> > + ? ? ? ? ? ? ? ? ? ? ? return "Health Data Display";
>> > + ? ? ? ? ? ? ? }
>> > + ? ? ? ? ? ? ? break;
>> > ? ? ? ?}
>> > ? ? ? ?return "Unknown (reserved) minor device class";
>> > ?}
>> > @@ -668,7 +686,9 @@ static void cmd_class(int ctl, int hdev, char *opt)
>> > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"Audio/Video",
>> > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"Peripheral",
>> > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"Imaging",
>> > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "Uncategorized" };
>> > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "Wearable",
>> > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "Toy",
>> > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "Health" };
>> > ? ? ? ?int s = hci_open_dev(hdev);
>> >
>> > ? ? ? ?if (s < 0) {
>> > @@ -706,7 +726,9 @@ static void cmd_class(int ctl, int hdev, char *opt)
>> > ? ? ? ? ? ? ? ?} else
>> > ? ? ? ? ? ? ? ? ? ? ? ?printf("Unspecified");
>> > ? ? ? ? ? ? ? ?printf("\n\tDevice Class: ");
>> > - ? ? ? ? ? ? ? if ((cls[1] & 0x1f) >= sizeof(major_devices) / sizeof(*major_devices))
>> > + ? ? ? ? ? ? ? if (0x1f == cls[1])
>>
>> This test is inverted, in BlueZ code we use the form: (variable
>> operator constant)
>>
>> > + ? ? ? ? ? ? ? ? ? ? ? printf("Uncategorized\n");
>> > + ? ? ? ? ? ? ? else if ((cls[1] & 0x1f) >= sizeof(major_devices) / sizeof(*major_devices))
>>
>> See above.
>
> Will fix both.
>
>> > ? ? ? ? ? ? ? ? ? ? ? ?printf("Invalid Device Class!\n");
>> > ? ? ? ? ? ? ? ?else
>> > ? ? ? ? ? ? ? ? ? ? ? ?printf("%s, %s\n", major_devices[cls[1] & 0x1f],
>> > --
>> > 1.6.6.1
>> > --
>> >
>>
>>
>> Cheers,
>
> Thanks for the comments! I'll send a fixed patch.
>
> But here's a followup question: what's the convention for submitting a
> change to a patch - another patch on top of it, or a full replacement
> patch? As a reply to this thread, or as new message?

Send a full replacement inline patch as a reply to this thread.

>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
> the body of a message to [email protected]
> More majordomo info at ?http://vger.kernel.org/majordomo-info.html
>



--
Gustavo F. Padovan
http://padovan.org

2010-03-27 08:28:31

by Daniel Abraham

[permalink] [raw]
Subject: Re: [PATCH] Fix display of last device classes in hciconfig

> > ---
> > tools/hciconfig.c | 30 ++++++++++++++++++++++++++----
> > 1 files changed, 26 insertions(+), 4 deletions(-)
> >
> > diff --git a/tools/hciconfig.c b/tools/hciconfig.c
> > index 3f687e0..c97ce44 100644
> > --- a/tools/hciconfig.c
> > +++ b/tools/hciconfig.c
> > @@ -645,8 +645,26 @@ static char *get_minor_device_name(int major, int minor)
> > return "Game";
> > }
> > break;
> > - case 63: /* uncategorised */
> > - return "";
>
> I think that the test for the "Uncategorised" (which seems to be
> misspelled in many places) device class would be better staying here,
> because the same code is used inside hcitool.c. Fixing there would be
> nice too.
>
> Another thing, looks like this "case 63:" is wrong, major device
> class is a 5 bit number, and the uncategorized device class is defined
> as 31. Looks like a legacy from ancient times ;-)

That's exactly why I changed it: the original check below whether to
enter this function ("if ((cls[1] & 0x1f) >= ...") meant <no. of
categories + 1> where +1 meant "Unrecognized", but this is mistaken as
you wrote.

I don't mind fixing it in "hcitool.c" as well, but see followup question
at the bottom.

> > + case 9: /* health */
> > + switch(minor) {
> > + case 0:
> > + return "Undefined";
> > + case 1:
> > + return "Blood Pressure Monitor";
> > + case 2:
> > + return "Thermometer";
> > + case 3:
> > + return "Weighing Scale";
> > + case 4:
> > + return "Glucose Meter";
> > + case 5:
> > + return "Pulse Oximeter";
> > + case 6:
> > + return "Heart/Pulse Rate Monitor";
> > + case 7:
> > + return "Health Data Display";
> > + }
> > + break;
> > }
> > return "Unknown (reserved) minor device class";
> > }
> > @@ -668,7 +686,9 @@ static void cmd_class(int ctl, int hdev, char *opt)
> > "Audio/Video",
> > "Peripheral",
> > "Imaging",
> > - "Uncategorized" };
> > + "Wearable",
> > + "Toy",
> > + "Health" };
> > int s = hci_open_dev(hdev);
> >
> > if (s < 0) {
> > @@ -706,7 +726,9 @@ static void cmd_class(int ctl, int hdev, char *opt)
> > } else
> > printf("Unspecified");
> > printf("\n\tDevice Class: ");
> > - if ((cls[1] & 0x1f) >= sizeof(major_devices) / sizeof(*major_devices))
> > + if (0x1f == cls[1])
>
> This test is inverted, in BlueZ code we use the form: (variable
> operator constant)
>
> > + printf("Uncategorized\n");
> > + else if ((cls[1] & 0x1f) >= sizeof(major_devices) / sizeof(*major_devices))
>
> See above.

Will fix both.

> > printf("Invalid Device Class!\n");
> > else
> > printf("%s, %s\n", major_devices[cls[1] & 0x1f],
> > --
> > 1.6.6.1
> > --
> >
>
>
> Cheers,

Thanks for the comments! I'll send a fixed patch.

But here's a followup question: what's the convention for submitting a
change to a patch - another patch on top of it, or a full replacement
patch? As a reply to this thread, or as new message?


2010-03-22 21:36:26

by Vinicius Costa Gomes

[permalink] [raw]
Subject: Re: [PATCH] Fix display of last device classes in hciconfig

SGkgRGFuaWVsLAoKT24gVHVlLCBNYXIgMTYsIDIwMTAgYXQgOTozMyBBTSwgRGFuaWVsIEFicmFo
YW0KPGRhbmllbC5zaHJ1Z2dlZEBnbWFpbC5jb20+IHdyb3RlOgo+IFRoaXMgaXMgbXkgZmlyc3Qg
ZXZlciBwYXRjaCwgc28gaXQncyB2ZXJ5IHNpbXBsZS4uLgo+IEJhc2VkIG9uIGN1cnJlbnQgY29u
dGVudCBpbjoKPiBodHRwOi8vd3d3LmJsdWV0b290aC5vcmcvYXNzaWduZWQtbnVtYmVycy9iYXNl
YmFuZC5odG0KPgoKSXQncyBuaWNlIHRoYXQgdGhpcyBpcyB5b3VyIGZpcnN0IChvZiBtYW55LCBJ
IGhvcGUgOy0pIGNvbnRyaWJ1dGlvbiwKYnV0IEkgZmVlbCBpdCdzIGJldHRlciBpZiB3ZSBsZWZ0
IHRoZSBjb21taXQgbWVzc2FnZSB3aXRoIGp1c3QKZXhwbGFpbmluZyB3aGF0IHRoZSBwYXRjaCBk
b2VzLgoKPiBTaWduZWQtb2ZmLWJ5OiBEYW5pZWwgQWJyYWhhbSA8ZGFuaWVsLnNocnVnZ2VkQGdt
YWlsLmNvbT4KCldlIGRvbid0IHVzZSB0aGUgIlNpZ25lZC1vZmYtYnkiIGxpbmUgaW4gQmx1ZVog
dXNlcmxhbmQgY29kZS4KCj4gLS0tCj4gwqB0b29scy9oY2ljb25maWcuYyB8IMKgIDMwICsrKysr
KysrKysrKysrKysrKysrKysrKysrLS0tLQo+IMKgMSBmaWxlcyBjaGFuZ2VkLCAyNiBpbnNlcnRp
b25zKCspLCA0IGRlbGV0aW9ucygtKQo+Cj4gZGlmZiAtLWdpdCBhL3Rvb2xzL2hjaWNvbmZpZy5j
IGIvdG9vbHMvaGNpY29uZmlnLmMKPiBpbmRleCAzZjY4N2UwLi5jOTdjZTQ0IDEwMDY0NAo+IC0t
LSBhL3Rvb2xzL2hjaWNvbmZpZy5jCj4gKysrIGIvdG9vbHMvaGNpY29uZmlnLmMKPiBAQCAtNjQ1
LDggKzY0NSwyNiBAQCBzdGF0aWMgY2hhciAqZ2V0X21pbm9yX2RldmljZV9uYW1lKGludCBtYWpv
ciwgaW50IG1pbm9yKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJu
ICJHYW1lIjsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0KPiDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoGJyZWFrOwo+IC0gwqAgwqAgwqAgY2FzZSA2MzogwqAgwqAgwqAgwqAvKiB1bmNhdGVnb3Jp
c2VkICovCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXR1cm4gIiI7CgpJIHRoaW5rIHRoYXQg
dGhlIHRlc3QgZm9yIHRoZSAiVW5jYXRlZ29yaXNlZCIgKHdoaWNoIHNlZW1zIHRvIGJlCm1pc3Nw
ZWxsZWQgaW4gbWFueSBwbGFjZXMpIGRldmljZSBjbGFzcyB3b3VsZCBiZSBiZXR0ZXIgc3RheWlu
ZyBoZXJlLApiZWNhdXNlIHRoZSBzYW1lIGNvZGUgaXMgdXNlZCBpbnNpZGUgaGNpdG9vbC5jLiBG
aXhpbmcgdGhlcmUgd291bGQgYmUKbmljZSB0b28uCgpBbm90aGVyIHRoaW5nLCBsb29rcyBsaWtl
IHRoaXMgImNhc2UgNjM6IiBpcyB3cm9uZywgIG1ham9yIGRldmljZQpjbGFzcyBpcyBhIDUgYml0
IG51bWJlciwgYW5kIHRoZSB1bmNhdGVnb3JpemVkIGRldmljZSBjbGFzcyBpcyBkZWZpbmVkCmFz
IDMxLiBMb29rcyBsaWtlIGEgbGVnYWN5IGZyb20gYW5jaWVudCB0aW1lcyA7LSkKCj4gKyDCoCDC
oCDCoCBjYXNlIDk6IC8qIGhlYWx0aCAqLwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc3dpdGNo
KG1pbm9yKSB7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjYXNlIDA6Cj4gKyDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXR1cm4gIlVuZGVmaW5lZCI7Cj4gKyDCoCDCoCDCoCDC
oCDCoCDCoCDCoCBjYXNlIDE6Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBy
ZXR1cm4gIkJsb29kIFByZXNzdXJlIE1vbml0b3IiOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
Y2FzZSAyOgo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuICJUaGVy
bW9tZXRlciI7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjYXNlIDM6Cj4gKyDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXR1cm4gIldlaWdoaW5nIFNjYWxlIjsKPiArIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIGNhc2UgNDoKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIHJldHVybiAiR2x1Y29zZSBNZXRlciI7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjYXNl
IDU6Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXR1cm4gIlB1bHNlIE94
aW1ldGVyIjsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNhc2UgNjoKPiArIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiAiSGVhcnQvUHVsc2UgUmF0ZSBNb25pdG9yIjsK
PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNhc2UgNzoKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIHJldHVybiAiSGVhbHRoIERhdGEgRGlzcGxheSI7Cj4gKyDCoCDCoCDCoCDC
oCDCoCDCoCDCoCB9Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBicmVhazsKPiDCoCDCoCDCoCDC
oH0KPiDCoCDCoCDCoCDCoHJldHVybiAiVW5rbm93biAocmVzZXJ2ZWQpIG1pbm9yIGRldmljZSBj
bGFzcyI7Cj4gwqB9Cj4gQEAgLTY2OCw3ICs2ODYsOSBAQCBzdGF0aWMgdm9pZCBjbWRfY2xhc3Mo
aW50IGN0bCwgaW50IGhkZXYsIGNoYXIgKm9wdCkKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCJBdWRpby9WaWRlbyIsCj4gwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAiUGVy
aXBoZXJhbCIsCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAiSW1hZ2luZyIsCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAiVW5jYXRlZ29yaXplZCIgfTsKPiArIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICJXZWFy
YWJsZSIsCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCAiVG95IiwKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgICJIZWFsdGgiIH07Cj4gwqAgwqAgwqAgwqBpbnQgcyA9IGhj
aV9vcGVuX2RldihoZGV2KTsKPgo+IMKgIMKgIMKgIMKgaWYgKHMgPCAwKSB7Cj4gQEAgLTcwNiw3
ICs3MjYsOSBAQCBzdGF0aWMgdm9pZCBjbWRfY2xhc3MoaW50IGN0bCwgaW50IGhkZXYsIGNoYXIg
Km9wdCkKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZQo+IMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgcHJpbnRmKCJVbnNwZWNpZmllZCIpOwo+IMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgcHJpbnRmKCJcblx0RGV2aWNlIENsYXNzOiAiKTsKPiAtIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIGlmICgoY2xzWzFdICYgMHgxZikgPj0gc2l6ZW9mKG1ham9yX2RldmljZXMpIC8gc2l6
ZW9mKCptYWpvcl9kZXZpY2VzKSkKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmICgweDFmID09
IGNsc1sxXSkKClRoaXMgdGVzdCBpcyBpbnZlcnRlZCwgaW4gQmx1ZVogY29kZSB3ZSB1c2UgdGhl
IGZvcm06ICh2YXJpYWJsZQpvcGVyYXRvciBjb25zdGFudCkKCj4gKyDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCBwcmludGYoIlVuY2F0ZWdvcml6ZWRcbiIpOwo+ICsgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgZWxzZSBpZiAoKGNsc1sxXSAmIDB4MWYpID49IHNpemVvZihtYWpvcl9kZXZp
Y2VzKSAvIHNpemVvZigqbWFqb3JfZGV2aWNlcykpCgpTZWUgYWJvdmUuCgo+IMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcHJpbnRmKCJJbnZhbGlkIERldmljZSBDbGFzcyFcbiIp
Owo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZWxzZQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgcHJpbnRmKCIlcywgJXNcbiIsIG1ham9yX2RldmljZXNbY2xzWzFdICYgMHgx
Zl0sCj4gLS0KPiAxLjYuNi4xCj4gLS0KPiBUbyB1bnN1YnNjcmliZSBmcm9tIHRoaXMgbGlzdDog
c2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgbGludXgtYmx1ZXRvb3RoIiBpbgo+IHRoZSBib2R5
IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnCj4gTW9yZSBtYWpvcmRv
bW8gaW5mbyBhdCDCoGh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvbWFqb3Jkb21vLWluZm8uaHRtbAo+
CgoKQ2hlZXJzLAotLSAKVmluaWNpdXMgR29tZXMKSU5kVCAtIEluc3RpdHV0byBOb2tpYSBkZSBU
ZWNub2xvZ2lhCg==