2018-08-08 13:55:18

by Scott Mayhew

[permalink] [raw]
Subject: [PATCH] nfsd: ensure that writing '+4' to /proc/fs/nfsd/versions enables minor version 0

According to commit d3635ff07e8 ("nfsd: fix configuration of supported
minor versions"), it should be possible to use either '4.0' or '4' to
enable or disable minor version 0.

Currently, writing '+4' to /proc/fs/nfsd/versions has no effect unless
no minor versions are enabled. That leaves rpc.nfsd without an easy
way to re-enable v4.0, since that's what it does when invoked with
'-V 4.0'.

Fixes: d3635ff07e8 ("nfsd: fix configuration of supported minor versions")
Signed-off-by: Scott Mayhew <[email protected]>
---
fs/nfsd/nfsctl.c | 8 ++++++++
1 file changed, 8 insertions(+)

diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index d107b4426f7e..b3f9f9233953 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -614,6 +614,14 @@ static ssize_t __write_versions(struct file *file, char *buf, size_t size)
minor = 0;
while (nfsd_minorversion(minor, cmd) >= 0)
minor++;
+ } else if (cmd == NFSD_SET) {
+ /*
+ * We have +4 but there are already some minors
+ * enabled. We must ensure 4.0 gets enabled,
+ * since it could be a request from rpc.nfsd.
+ */
+ if (nfsd_minorversion(0, cmd) < 0)
+ return -EINVAL;
}
break;
default:
--
2.14.4



2018-08-08 15:01:18

by Trond Myklebust

[permalink] [raw]
Subject: Re: [PATCH] nfsd: ensure that writing '+4' to /proc/fs/nfsd/versions enables minor version 0

T24gV2VkLCAyMDE4LTA4LTA4IGF0IDA3OjM2IC0wNDAwLCBTY290dCBNYXloZXcgd3JvdGU6DQo+
IEFjY29yZGluZyB0byBjb21taXQgZDM2MzVmZjA3ZTggKCJuZnNkOiBmaXggY29uZmlndXJhdGlv
biBvZg0KPiBzdXBwb3J0ZWQNCj4gbWlub3IgdmVyc2lvbnMiKSwgaXQgc2hvdWxkIGJlIHBvc3Np
YmxlIHRvIHVzZSBlaXRoZXIgJzQuMCcgb3IgJzQnIHRvDQo+IGVuYWJsZSBvciBkaXNhYmxlIG1p
bm9yIHZlcnNpb24gMC4NCj4gDQo+IEN1cnJlbnRseSwgd3JpdGluZyAnKzQnIHRvIC9wcm9jL2Zz
L25mc2QvdmVyc2lvbnMgaGFzIG5vIGVmZmVjdA0KPiB1bmxlc3MNCj4gbm8gbWlub3IgdmVyc2lv
bnMgYXJlIGVuYWJsZWQuICBUaGF0IGxlYXZlcyBycGMubmZzZCB3aXRob3V0IGFuIGVhc3kNCj4g
d2F5IHRvIHJlLWVuYWJsZSB2NC4wLCBzaW5jZSB0aGF0J3Mgd2hhdCBpdCBkb2VzIHdoZW4gaW52
b2tlZCB3aXRoDQo+ICctViA0LjAnLg0KPiANCj4gRml4ZXM6IGQzNjM1ZmYwN2U4ICgibmZzZDog
Zml4IGNvbmZpZ3VyYXRpb24gb2Ygc3VwcG9ydGVkIG1pbm9yDQo+IHZlcnNpb25zIikNCj4gU2ln
bmVkLW9mZi1ieTogU2NvdHQgTWF5aGV3IDxzbWF5aGV3QHJlZGhhdC5jb20+DQo+IC0tLQ0KPiAg
ZnMvbmZzZC9uZnNjdGwuYyB8IDggKysrKysrKysNCj4gIDEgZmlsZSBjaGFuZ2VkLCA4IGluc2Vy
dGlvbnMoKykNCj4gDQo+IGRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2N0bC5jIGIvZnMvbmZzZC9u
ZnNjdGwuYw0KPiBpbmRleCBkMTA3YjQ0MjZmN2UuLmIzZjlmOTIzMzk1MyAxMDA2NDQNCj4gLS0t
IGEvZnMvbmZzZC9uZnNjdGwuYw0KPiArKysgYi9mcy9uZnNkL25mc2N0bC5jDQo+IEBAIC02MTQs
NiArNjE0LDE0IEBAIHN0YXRpYyBzc2l6ZV90IF9fd3JpdGVfdmVyc2lvbnMoc3RydWN0IGZpbGUN
Cj4gKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpDQo+ICAJCQkJCW1pbm9yID0gMDsNCj4g
IAkJCQkJd2hpbGUgKG5mc2RfbWlub3J2ZXJzaW9uKG1pbm9yLA0KPiBjbWQpID49IDApDQo+ICAJ
CQkJCQltaW5vcisrOw0KPiArCQkJCX0gZWxzZSBpZiAoY21kID09IE5GU0RfU0VUKSB7DQo+ICsJ
CQkJCS8qDQo+ICsJCQkJCSAqIFdlIGhhdmUgKzQgYnV0IHRoZXJlIGFyZQ0KPiBhbHJlYWR5IHNv
bWUgbWlub3JzDQo+ICsJCQkJCSAqIGVuYWJsZWQuICBXZSBtdXN0IGVuc3VyZSA0LjANCj4gZ2V0
cyBlbmFibGVkLA0KPiArCQkJCQkgKiBzaW5jZSBpdCBjb3VsZCBiZSBhIHJlcXVlc3QNCj4gZnJv
bSBycGMubmZzZC4NCj4gKwkJCQkJICovDQo+ICsJCQkJCWlmIChuZnNkX21pbm9ydmVyc2lvbigw
LCBjbWQpIDwNCj4gMCkNCj4gKwkJCQkJCXJldHVybiAtRUlOVkFMOw0KPiAgCQkJCX0NCj4gIAkJ
CQlicmVhazsNCj4gIAkJCWRlZmF1bHQ6DQoNClRoaXMgYnJlYWtzIHRoZSBpbnRlbnRpb24gYmVo
aW5kIHRoYXQgcGF0Y2gsIHdoaWNoIHdhcyB0byBlbnN1cmUgdGhhdA0KKzQgbXVzdCBfbm90XyBh
dXRvbWF0aWNhbGx5IGVuYWJsZSA0LjAuLi4NCg0KSW5zdGVhZCwgeW91IHVzZSArLy00LjAgdG8g
ZW5hYmxlL2Rpc2FibGUgNC4wLCBqdXN0IGxpa2UgeW91IHVzZSArLy00LjEgDQp0byBlbmFibGUv
ZGlzYWJsZSA0LjEsICsvLTQuMiB0byBlbmFibGUvZGlzYWJsZSA0LjIsIGV0YywgZXRjLi4uDQoN
ClRoZSBzcGVjaWFsIHZhbHVlICsvLTQgZXhpc3RzIGluIG9yZGVyIGFsbG93IHlvdSB0byBkaXNh
YmxlL2VuYWJsZSB2NA0KYWx0b2dldGhlci4gaS5lLiAnLTQnIGFjdHMgYXMgYSBtYXNrIHRvIHR1
cm4gb2ZmIHY0LnggZm9yIGFsbCB2YWx1ZXMgb2YNCnguICcrNCcgd2lsbCBlbmFibGUgdjQueCBm
b3IgdGhvc2UgdmFsdWVzIG9mIHggd2hpY2ggaGF2ZSBiZWVuDQpleHBsaWNpdGx5IHNldC4NCg0K
LS0gDQpUcm9uZCBNeWtsZWJ1c3QNCkNUTywgSGFtbWVyc3BhY2UgSW5jDQo0MzAwIEVsIENhbWlu
byBSZWFsLCBTdWl0ZSAxMDUNCkxvcyBBbHRvcywgQ0EgOTQwMjINCnd3dy5oYW1tZXIuc3BhY2UN
Cg0KDQo=

2018-08-08 15:27:11

by Scott Mayhew

[permalink] [raw]
Subject: Re: [PATCH] nfsd: ensure that writing '+4' to /proc/fs/nfsd/versions enables minor version 0

On Wed, 08 Aug 2018, Trond Myklebust wrote:

> On Wed, 2018-08-08 at 07:36 -0400, Scott Mayhew wrote:
> > According to commit d3635ff07e8 ("nfsd: fix configuration of
> > supported
> > minor versions"), it should be possible to use either '4.0' or '4' to
> > enable or disable minor version 0.
> >
> > Currently, writing '+4' to /proc/fs/nfsd/versions has no effect
> > unless
> > no minor versions are enabled. That leaves rpc.nfsd without an easy
> > way to re-enable v4.0, since that's what it does when invoked with
> > '-V 4.0'.
> >
> > Fixes: d3635ff07e8 ("nfsd: fix configuration of supported minor
> > versions")
> > Signed-off-by: Scott Mayhew <[email protected]>
> > ---
> > fs/nfsd/nfsctl.c | 8 ++++++++
> > 1 file changed, 8 insertions(+)
> >
> > diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
> > index d107b4426f7e..b3f9f9233953 100644
> > --- a/fs/nfsd/nfsctl.c
> > +++ b/fs/nfsd/nfsctl.c
> > @@ -614,6 +614,14 @@ static ssize_t __write_versions(struct file
> > *file, char *buf, size_t size)
> > minor = 0;
> > while (nfsd_minorversion(minor,
> > cmd) >= 0)
> > minor++;
> > + } else if (cmd == NFSD_SET) {
> > + /*
> > + * We have +4 but there are
> > already some minors
> > + * enabled. We must ensure 4.0
> > gets enabled,
> > + * since it could be a request
> > from rpc.nfsd.
> > + */
> > + if (nfsd_minorversion(0, cmd) <
> > 0)
> > + return -EINVAL;
> > }
> > break;
> > default:
>
> This breaks the intention behind that patch, which was to ensure that
> +4 must _not_ automatically enable 4.0...
>
> Instead, you use +/-4.0 to enable/disable 4.0, just like you use +/-4.1
> to enable/disable 4.1, +/-4.2 to enable/disable 4.2, etc, etc...
>
> The special value +/-4 exists in order allow you to disable/enable v4
> altogether. i.e. '-4' acts as a mask to turn off v4.x for all values of
> x. '+4' will enable v4.x for those values of x which have been
> explicitly set.

Okay I guess I'm confused by this wording from the commit message in
d3635ff07e8:

Allow the user to use either '4.0' or '4' to enable or disable minor
version 0. Other minor versions are still enabled or disabled using the
'4.x' format.

Should rpc.nfsd be changed then? The way it is now, nfssvc_print_vers() will
write '+4' if you run 'rpc.nfsd -V4.0'...

>
> --
> Trond Myklebust
> CTO, Hammerspace Inc
> 4300 El Camino Real, Suite 105
> Los Altos, CA 94022
> http://www.hammer.space
>
>

2018-08-09 18:12:30

by Scott Mayhew

[permalink] [raw]
Subject: Re: [PATCH] nfsd: ensure that writing '+4' to /proc/fs/nfsd/versions enables minor version 0

On Wed, 08 Aug 2018, Scott Mayhew wrote:

> On Wed, 08 Aug 2018, Trond Myklebust wrote:
>
> > On Wed, 2018-08-08 at 07:36 -0400, Scott Mayhew wrote:
> > > According to commit d3635ff07e8 ("nfsd: fix configuration of
> > > supported
> > > minor versions"), it should be possible to use either '4.0' or '4' to
> > > enable or disable minor version 0.
> > >
> > > Currently, writing '+4' to /proc/fs/nfsd/versions has no effect
> > > unless
> > > no minor versions are enabled. That leaves rpc.nfsd without an easy
> > > way to re-enable v4.0, since that's what it does when invoked with
> > > '-V 4.0'.
> > >
> > > Fixes: d3635ff07e8 ("nfsd: fix configuration of supported minor
> > > versions")
> > > Signed-off-by: Scott Mayhew <[email protected]>
> > > ---
> > > fs/nfsd/nfsctl.c | 8 ++++++++
> > > 1 file changed, 8 insertions(+)
> > >
> > > diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
> > > index d107b4426f7e..b3f9f9233953 100644
> > > --- a/fs/nfsd/nfsctl.c
> > > +++ b/fs/nfsd/nfsctl.c
> > > @@ -614,6 +614,14 @@ static ssize_t __write_versions(struct file
> > > *file, char *buf, size_t size)
> > > minor = 0;
> > > while (nfsd_minorversion(minor,
> > > cmd) >= 0)
> > > minor++;
> > > + } else if (cmd == NFSD_SET) {
> > > + /*
> > > + * We have +4 but there are
> > > already some minors
> > > + * enabled. We must ensure 4.0
> > > gets enabled,
> > > + * since it could be a request
> > > from rpc.nfsd.
> > > + */
> > > + if (nfsd_minorversion(0, cmd) <
> > > 0)
> > > + return -EINVAL;
> > > }
> > > break;
> > > default:
> >
> > This breaks the intention behind that patch, which was to ensure that
> > +4 must _not_ automatically enable 4.0...
> >
> > Instead, you use +/-4.0 to enable/disable 4.0, just like you use +/-4.1
> > to enable/disable 4.1, +/-4.2 to enable/disable 4.2, etc, etc...
> >
> > The special value +/-4 exists in order allow you to disable/enable v4
> > altogether. i.e. '-4' acts as a mask to turn off v4.x for all values of
> > x. '+4' will enable v4.x for those values of x which have been
> > explicitly set.
>
> Okay I guess I'm confused by this wording from the commit message in
> d3635ff07e8:
>
> Allow the user to use either '4.0' or '4' to enable or disable minor
> version 0. Other minor versions are still enabled or disabled using the
> '4.x' format.

Okay I see that that commit message actually came from Bruce and is
different than the original commit message... but in your original cover
letter (https://marc.info/?l=linux-nfs&m=148780658904187&w=2) you stated
that '+4' should enable 4.0:

"""
2) Allow the user to use either '4.0' or '4' in order to enable or disable
minor version 0. Other minor versions remain enabled/disabled using the
'4.x' format.
"""

I thought the point of your patches were to allow the user to enable 4.x
(for x > 0) without enabling 4.0. My patch doesn't change that. All it
does is allow '+4' to enable 4.0, which is what both Bruce's commit
message and your cover letter says it should do.

current HEAD:

[root@fedora27_1236568e ~]# echo '-4' >/proc/fs/nfsd/versions
[root@fedora27_1236568e ~]# cat /proc/fs/nfsd/versions
-2 +3 -4 -4.0 -4.1 -4.2
[root@fedora27_1236568e ~]# echo '+4.1' >/proc/fs/nfsd/versions
[root@fedora27_1236568e ~]# !cat
cat /proc/fs/nfsd/versions
-2 +3 +4 -4.0 +4.1 -4.2
[root@fedora27_1236568e ~]# echo '+4' >/proc/fs/nfsd/versions
[root@fedora27_1236568e ~]# !cat
cat /proc/fs/nfsd/versions
-2 +3 +4 -4.0 +4.1 -4.2

with my patch:

[root@fedora27_8686dfcb ~]# echo '-4' >/proc/fs/nfsd/versions
[root@fedora27_8686dfcb ~]# cat /proc/fs/nfsd/versions
-2 +3 -4 -4.0 -4.1 -4.2
[root@fedora27_8686dfcb ~]# echo '+4.1' >/proc/fs/nfsd/versions
[root@fedora27_8686dfcb ~]# !cat
cat /proc/fs/nfsd/versions
-2 +3 +4 -4.0 +4.1 -4.2 <----- 4.0 is still disabled
[root@fedora27_8686dfcb ~]# echo '+4' >/proc/fs/nfsd/versions
[root@fedora27_8686dfcb ~]# !cat
cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 -4.2 <----- 4.0 is enabled

-Scott

>
> Should rpc.nfsd be changed then? The way it is now, nfssvc_print_vers() will
> write '+4' if you run 'rpc.nfsd -V4.0'...
>
> >
> > --
> > Trond Myklebust
> > CTO, Hammerspace Inc
> > 4300 El Camino Real, Suite 105
> > Los Altos, CA 94022
> > http://www.hammer.space
> >
> >

2018-08-09 20:37:27

by Trond Myklebust

[permalink] [raw]
Subject: Re: [PATCH] nfsd: ensure that writing '+4' to /proc/fs/nfsd/versions enables minor version 0

T24gVGh1LCAyMDE4LTA4LTA5IGF0IDExOjQ2IC0wNDAwLCBTY290dCBNYXloZXcgd3JvdGU6DQo+
IE9uIFdlZCwgMDggQXVnIDIwMTgsIFNjb3R0IE1heWhldyB3cm90ZToNCj4gDQo+ID4gT24gV2Vk
LCAwOCBBdWcgMjAxOCwgVHJvbmQgTXlrbGVidXN0IHdyb3RlOg0KPiA+IA0KPiA+ID4gT24gV2Vk
LCAyMDE4LTA4LTA4IGF0IDA3OjM2IC0wNDAwLCBTY290dCBNYXloZXcgd3JvdGU6DQo+ID4gPiA+
IEFjY29yZGluZyB0byBjb21taXQgZDM2MzVmZjA3ZTggKCJuZnNkOiBmaXggY29uZmlndXJhdGlv
biBvZg0KPiA+ID4gPiBzdXBwb3J0ZWQNCj4gPiA+ID4gbWlub3IgdmVyc2lvbnMiKSwgaXQgc2hv
dWxkIGJlIHBvc3NpYmxlIHRvIHVzZSBlaXRoZXIgJzQuMCcgb3INCj4gPiA+ID4gJzQnIHRvDQo+
ID4gPiA+IGVuYWJsZSBvciBkaXNhYmxlIG1pbm9yIHZlcnNpb24gMC4NCj4gPiA+ID4gDQo+ID4g
PiA+IEN1cnJlbnRseSwgd3JpdGluZyAnKzQnIHRvIC9wcm9jL2ZzL25mc2QvdmVyc2lvbnMgaGFz
IG5vIGVmZmVjdA0KPiA+ID4gPiB1bmxlc3MNCj4gPiA+ID4gbm8gbWlub3IgdmVyc2lvbnMgYXJl
IGVuYWJsZWQuICBUaGF0IGxlYXZlcyBycGMubmZzZCB3aXRob3V0IGFuDQo+ID4gPiA+IGVhc3kN
Cj4gPiA+ID4gd2F5IHRvIHJlLWVuYWJsZSB2NC4wLCBzaW5jZSB0aGF0J3Mgd2hhdCBpdCBkb2Vz
IHdoZW4gaW52b2tlZA0KPiA+ID4gPiB3aXRoDQo+ID4gPiA+ICctViA0LjAnLg0KPiA+ID4gPiAN
Cj4gPiA+ID4gRml4ZXM6IGQzNjM1ZmYwN2U4ICgibmZzZDogZml4IGNvbmZpZ3VyYXRpb24gb2Yg
c3VwcG9ydGVkIG1pbm9yDQo+ID4gPiA+IHZlcnNpb25zIikNCj4gPiA+ID4gU2lnbmVkLW9mZi1i
eTogU2NvdHQgTWF5aGV3IDxzbWF5aGV3QHJlZGhhdC5jb20+DQo+ID4gPiA+IC0tLQ0KPiA+ID4g
PiAgZnMvbmZzZC9uZnNjdGwuYyB8IDggKysrKysrKysNCj4gPiA+ID4gIDEgZmlsZSBjaGFuZ2Vk
LCA4IGluc2VydGlvbnMoKykNCj4gPiA+ID4gDQo+ID4gPiA+IGRpZmYgLS1naXQgYS9mcy9uZnNk
L25mc2N0bC5jIGIvZnMvbmZzZC9uZnNjdGwuYw0KPiA+ID4gPiBpbmRleCBkMTA3YjQ0MjZmN2Uu
LmIzZjlmOTIzMzk1MyAxMDA2NDQNCj4gPiA+ID4gLS0tIGEvZnMvbmZzZC9uZnNjdGwuYw0KPiA+
ID4gPiArKysgYi9mcy9uZnNkL25mc2N0bC5jDQo+ID4gPiA+IEBAIC02MTQsNiArNjE0LDE0IEBA
IHN0YXRpYyBzc2l6ZV90IF9fd3JpdGVfdmVyc2lvbnMoc3RydWN0DQo+ID4gPiA+IGZpbGUNCj4g
PiA+ID4gKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpDQo+ID4gPiA+ICAJCQkJCW1pbm9y
ID0gMDsNCj4gPiA+ID4gIAkJCQkJd2hpbGUNCj4gPiA+ID4gKG5mc2RfbWlub3J2ZXJzaW9uKG1p
bm9yLA0KPiA+ID4gPiBjbWQpID49IDApDQo+ID4gPiA+ICAJCQkJCQltaW5vcisrOw0KPiA+ID4g
PiArCQkJCX0gZWxzZSBpZiAoY21kID09IE5GU0RfU0VUKSB7DQo+ID4gPiA+ICsJCQkJCS8qDQo+
ID4gPiA+ICsJCQkJCSAqIFdlIGhhdmUgKzQgYnV0IHRoZXJlDQo+ID4gPiA+IGFyZQ0KPiA+ID4g
PiBhbHJlYWR5IHNvbWUgbWlub3JzDQo+ID4gPiA+ICsJCQkJCSAqIGVuYWJsZWQuICBXZSBtdXN0
DQo+ID4gPiA+IGVuc3VyZSA0LjANCj4gPiA+ID4gZ2V0cyBlbmFibGVkLA0KPiA+ID4gPiArCQkJ
CQkgKiBzaW5jZSBpdCBjb3VsZCBiZSBhDQo+ID4gPiA+IHJlcXVlc3QNCj4gPiA+ID4gZnJvbSBy
cGMubmZzZC4NCj4gPiA+ID4gKwkJCQkJICovDQo+ID4gPiA+ICsJCQkJCWlmDQo+ID4gPiA+IChu
ZnNkX21pbm9ydmVyc2lvbigwLCBjbWQpIDwNCj4gPiA+ID4gMCkNCj4gPiA+ID4gKwkJCQkJCXJl
dHVybiAtRUlOVkFMOw0KPiA+ID4gPiAgCQkJCX0NCj4gPiA+ID4gIAkJCQlicmVhazsNCj4gPiA+
ID4gIAkJCWRlZmF1bHQ6DQo+ID4gPiANCj4gPiA+IFRoaXMgYnJlYWtzIHRoZSBpbnRlbnRpb24g
YmVoaW5kIHRoYXQgcGF0Y2gsIHdoaWNoIHdhcyB0byBlbnN1cmUNCj4gPiA+IHRoYXQNCj4gPiA+
ICs0IG11c3QgX25vdF8gYXV0b21hdGljYWxseSBlbmFibGUgNC4wLi4uDQo+ID4gPiANCj4gPiA+
IEluc3RlYWQsIHlvdSB1c2UgKy8tNC4wIHRvIGVuYWJsZS9kaXNhYmxlIDQuMCwganVzdCBsaWtl
IHlvdSB1c2UNCj4gPiA+ICsvLTQuMSANCj4gPiA+IHRvIGVuYWJsZS9kaXNhYmxlIDQuMSwgKy8t
NC4yIHRvIGVuYWJsZS9kaXNhYmxlIDQuMiwgZXRjLCBldGMuLi4NCj4gPiA+IA0KPiA+ID4gVGhl
IHNwZWNpYWwgdmFsdWUgKy8tNCBleGlzdHMgaW4gb3JkZXIgYWxsb3cgeW91IHRvDQo+ID4gPiBk
aXNhYmxlL2VuYWJsZSB2NA0KPiA+ID4gYWx0b2dldGhlci4gaS5lLiAnLTQnIGFjdHMgYXMgYSBt
YXNrIHRvIHR1cm4gb2ZmIHY0LnggZm9yIGFsbA0KPiA+ID4gdmFsdWVzIG9mDQo+ID4gPiB4LiAn
KzQnIHdpbGwgZW5hYmxlIHY0LnggZm9yIHRob3NlIHZhbHVlcyBvZiB4IHdoaWNoIGhhdmUgYmVl
bg0KPiA+ID4gZXhwbGljaXRseSBzZXQuDQo+ID4gDQo+ID4gT2theSBJIGd1ZXNzIEknbSBjb25m
dXNlZCBieSB0aGlzIHdvcmRpbmcgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2UNCj4gPiBpbg0KPiA+
IGQzNjM1ZmYwN2U4Og0KPiA+IA0KPiA+ICAgICBBbGxvdyB0aGUgdXNlciB0byB1c2UgZWl0aGVy
ICc0LjAnIG9yICc0JyB0byBlbmFibGUgb3IgZGlzYWJsZQ0KPiA+IG1pbm9yDQo+ID4gICAgIHZl
cnNpb24gMC4gIE90aGVyIG1pbm9yIHZlcnNpb25zIGFyZSBzdGlsbCBlbmFibGVkIG9yIGRpc2Fi
bGVkDQo+ID4gdXNpbmcgdGhlDQo+ID4gICAgICc0LngnIGZvcm1hdC4NCj4gDQo+IE9rYXkgSSBz
ZWUgdGhhdCB0aGF0IGNvbW1pdCBtZXNzYWdlIGFjdHVhbGx5IGNhbWUgZnJvbSBCcnVjZSBhbmQg
aXMNCj4gZGlmZmVyZW50IHRoYW4gdGhlIG9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlLi4uIGJ1dCBp
biB5b3VyIG9yaWdpbmFsDQo+IGNvdmVyDQo+IGxldHRlciAoaHR0cHM6Ly9tYXJjLmluZm8vP2w9
bGludXgtbmZzJm09MTQ4NzgwNjU4OTA0MTg3Jnc9MikgeW91DQo+IHN0YXRlZA0KPiB0aGF0ICcr
NCcgc2hvdWxkIGVuYWJsZSA0LjA6DQo+IA0KPiAiIiINCj4gMikgQWxsb3cgdGhlIHVzZXIgdG8g
dXNlIGVpdGhlciAnNC4wJyBvciAnNCcgaW4gb3JkZXIgdG8gZW5hYmxlIG9yDQo+IGRpc2FibGUN
Cj4gICAgbWlub3IgdmVyc2lvbiAwLiBPdGhlciBtaW5vciB2ZXJzaW9ucyByZW1haW4gZW5hYmxl
ZC9kaXNhYmxlZA0KPiB1c2luZyB0aGUNCj4gICAgJzQueCcgZm9ybWF0Lg0KPiAiIiINCj4gDQo+
IEkgdGhvdWdodCB0aGUgcG9pbnQgb2YgeW91ciBwYXRjaGVzIHdlcmUgdG8gYWxsb3cgdGhlIHVz
ZXIgdG8gZW5hYmxlDQo+IDQueA0KPiAoZm9yIHggPiAwKSB3aXRob3V0IGVuYWJsaW5nIDQuMC4g
IE15IHBhdGNoIGRvZXNuJ3QgY2hhbmdlIHRoYXQuICBBbGwNCj4gaXQNCj4gZG9lcyBpcyBhbGxv
dyAnKzQnIHRvIGVuYWJsZSA0LjAsIHdoaWNoIGlzIHdoYXQgYm90aCBCcnVjZSdzIGNvbW1pdA0K
PiBtZXNzYWdlIGFuZCB5b3VyIGNvdmVyIGxldHRlciBzYXlzIGl0IHNob3VsZCBkby4NCj4gDQo+
IGN1cnJlbnQgSEVBRDoNCj4gDQo+IFtyb290QGZlZG9yYTI3XzEyMzY1NjhlIH5dIyBlY2hvICct
NCcgPi9wcm9jL2ZzL25mc2QvdmVyc2lvbnMNCj4gW3Jvb3RAZmVkb3JhMjdfMTIzNjU2OGUgfl0j
IGNhdCAvcHJvYy9mcy9uZnNkL3ZlcnNpb25zDQo+IC0yICszIC00IC00LjAgLTQuMSAtNC4yDQo+
IFtyb290QGZlZG9yYTI3XzEyMzY1NjhlIH5dIyBlY2hvICcrNC4xJyA+L3Byb2MvZnMvbmZzZC92
ZXJzaW9ucw0KPiBbcm9vdEBmZWRvcmEyN18xMjM2NTY4ZSB+XSMgIWNhdA0KPiBjYXQgL3Byb2Mv
ZnMvbmZzZC92ZXJzaW9ucw0KPiAtMiArMyArNCAtNC4wICs0LjEgLTQuMg0KPiBbcm9vdEBmZWRv
cmEyN18xMjM2NTY4ZSB+XSMgZWNobyAnKzQnID4vcHJvYy9mcy9uZnNkL3ZlcnNpb25zDQo+IFty
b290QGZlZG9yYTI3XzEyMzY1NjhlIH5dIyAhY2F0DQo+IGNhdCAvcHJvYy9mcy9uZnNkL3ZlcnNp
b25zDQo+IC0yICszICs0IC00LjAgKzQuMSAtNC4yDQo+IA0KPiB3aXRoIG15IHBhdGNoOg0KPiAN
Cj4gW3Jvb3RAZmVkb3JhMjdfODY4NmRmY2Igfl0jIGVjaG8gJy00JyA+L3Byb2MvZnMvbmZzZC92
ZXJzaW9ucyANCj4gW3Jvb3RAZmVkb3JhMjdfODY4NmRmY2Igfl0jIGNhdCAvcHJvYy9mcy9uZnNk
L3ZlcnNpb25zIA0KPiAtMiArMyAtNCAtNC4wIC00LjEgLTQuMg0KPiBbcm9vdEBmZWRvcmEyN184
Njg2ZGZjYiB+XSMgZWNobyAnKzQuMScgPi9wcm9jL2ZzL25mc2QvdmVyc2lvbnMNCj4gW3Jvb3RA
ZmVkb3JhMjdfODY4NmRmY2Igfl0jICFjYXQNCj4gY2F0IC9wcm9jL2ZzL25mc2QvdmVyc2lvbnMg
DQo+IC0yICszICs0IC00LjAgKzQuMSAtNC4yIDwtLS0tLSA0LjAgaXMgc3RpbGwgZGlzYWJsZWQN
Cj4gW3Jvb3RAZmVkb3JhMjdfODY4NmRmY2Igfl0jIGVjaG8gJys0JyA+L3Byb2MvZnMvbmZzZC92
ZXJzaW9ucyANCj4gW3Jvb3RAZmVkb3JhMjdfODY4NmRmY2Igfl0jICFjYXQNCj4gY2F0IC9wcm9j
L2ZzL25mc2QvdmVyc2lvbnMgDQo+IC0yICszICs0ICs0LjEgLTQuMiA8LS0tLS0gNC4wIGlzIGVu
YWJsZWQNCg0KVGhpcyBpcyBub3Qgd2hhdCBpcyBpbnRlbmRlZC4gQXMgSSBzYWlkLCB0aGUgaW50
ZW50aW9uIHdhcyB0aGF0IHlvdQ0Kc2hvdWxkIHVzZSAnKzQuMCcgdG8gZW5hYmxlIDQuMCBhbmQg
Jy00LjAnIHRvIGRpc2FibGUgaXQuDQoNClRoZSBleGNlcHRpb24gaXMgZm9yIGxlZ2FjeSBrZXJu
ZWxzLCB3aGljaCBhcmUgbm90IHR5cGljYWxseSBhYmxlIHRvDQpyZWNvZ25pc2UgdGhlICcrNC4w
JyBvciAnLTQuMCcsIHNvIGZvciB0aG9zZSBrZXJuZWxzIChhbmQgdGhvc2Uga2VybmVscw0Kb25s
eSksIHRoZSAnKzQnLyctNCcgbmVlZCB0byBjb250aW51ZSB0byB3b3JrIGFzIGJlZm9yZS4NCg0K
PiANCj4gLVNjb3R0DQo+IA0KPiA+IA0KPiA+IFNob3VsZCBycGMubmZzZCBiZSBjaGFuZ2VkIHRo
ZW4/ICBUaGUgd2F5IGl0IGlzIG5vdywNCj4gPiBuZnNzdmNfcHJpbnRfdmVycygpIHdpbGwNCj4g
PiB3cml0ZSAnKzQnIGlmIHlvdSBydW4gJ3JwYy5uZnNkIC1WNC4wJy4uLg0KPiA+IA0KPiA+ID4g
DQo+ID4gPiAtLSANCj4gPiA+IFRyb25kIE15a2xlYnVzdA0KPiA+ID4gQ1RPLCBIYW1tZXJzcGFj
ZSBJbmMNCj4gPiA+IDQzMDAgRWwgQ2FtaW5vIFJlYWwsIFN1aXRlIDEwNQ0KPiA+ID4gTG9zIEFs
dG9zLCBDQSA5NDAyMg0KPiA+ID4gd3d3LmhhbW1lci5zcGFjZQ0KPiA+ID4gDQo+ID4gPiANCi0t
IA0KVHJvbmQgTXlrbGVidXN0DQpDVE8sIEhhbW1lcnNwYWNlIEluYw0KNDMwMCBFbCBDYW1pbm8g
UmVhbCwgU3VpdGUgMTA1DQpMb3MgQWx0b3MsIENBIDk0MDIyDQp3d3cuaGFtbWVyLnNwYWNlDQoN
Cg0K