From rgolan at redhat.com Sun Apr 15 02:01:34 2012 Content-Type: multipart/mixed; boundary="===============8013663018314101544==" MIME-Version: 1.0 From: Roy Golan To: devel at ovirt.org Subject: Re: [Engine-devel] Query regarding ValidationUtils#validateInputs Date: Sun, 15 Apr 2012 09:01:32 +0300 Message-ID: <4F8A643C.8060605@redhat.com> In-Reply-To: 15a5329c-4579-4ef6-b1c8-be0b260e859b@zmail07.collab.prod.int.phx2.redhat.com --===============8013663018314101544== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable This is a multi-part message in MIME format. --------------080707050808080009010909 Content-Type: text/plain; charset=3DUTF-8; format=3Dflowed Content-Transfer-Encoding: 7bit On 04/12/2012 10:50 AM, Omer Frenkel wrote: > > > ------------------------------------------------------------------------ > > *From: *"Shireesh Anjal" > *To: *engine-devel(a)ovirt.org > *Sent: *Thursday, April 12, 2012 9:35:25 AM > *Subject: *[Engine-devel] Query regarding > ValidationUtils#validateInputs > > Hi, > > This is regarding the following validation method we have in > ValidationUtils: > > /public static > ArrayList validateInputs(List> > validationGroupList, T parameters);/ > > I there any particular reason for supporting the validations only > on objects of classes derived from VdcActionParametersBase? I > guess this was done because this method is primarily intended to > validate the action parameters passed to a BLL action, using the > validation annotations on the parameter class. However I think > this method can be useful for general use as well. e.g. I cannot > add a "@Valid" annotation on a "list" or a "map" in a parameter > class. So I need to iterate over the list/map, and validate each > element inside the loop. The validation inside the loop can also > utilize the above method if the restriction "extends > VdcActionParametersBase" is removed. This will allow me to do the > following in the canDoAction method: > > protected boolean canDoAction() { > ... > for(GlusterBrickEntity brick : > getParameters().getGlusterVolume().getBricks()) { > List errors =3D > ValidationUtils.validateInputs(getValidationGroups(), brick); > if(errors !=3D null) { > for(String error : errors) { > addCanDoActionMessage(error); > } > } > } > ... > } > > Regards, > Shireesh > > _______________________________________________ > Engine-devel mailing list > Engine-devel(a)ovirt.org > http://lists.ovirt.org/mailman/listinfo/engine-devel > > i don't think there is a reason to restrict only for = > VdcActionParametersBase, roy what do you think? > > also you can use here > getReturnValue().getCanDoActionMessages().addAll(errors); > instead of going over on all errors. pls see SetupNetworksParameters.java for validating a list of network = interfaces. hibernate validator supports trivial object graphs and members that are = arrays, list and java.util.map implementations. If your code looks like that it should work. If you are using special = validation groups please add them to your command with addValidationGroups. this should work: GlusterCommandParameters.java @Valid List bricks Bricks.java @NotNull Guid id --------------080707050808080009010909 Content-Type: text/html; charset=3DUTF-8 Content-Transfer-Encoding: 8bit On 04/12/2012 10:50 AM, Omer Frenkel wrote:



From: "Shireesh Anjal" <sanjal(a)redhat.com>
To: engine-devel(a)ovirt.org
Sent: Thursday, April 12, 2012 9:35:25 AM
Subject: [Engine-devel] Query regarding ValidationUtils#validateInputs

Hi,

This is regarding the following validation method we have in ValidationUtils:

public static <T extends VdcActionParametersBase> ArrayList<String> validateInputs(List<Class<?>> validationGroupList, T parameters);

I there any particular reason for supporting the validations only on objects of classes derived from VdcActionParametersBase? I guess this was done because this method is primarily intended to validate the action parameters passed to a BLL action, using the validation annotations on the parameter class. However I think this method can be useful for general use as well. e.g. I cannot add a "@Valid" annotation on a "list" or a "map" in a parameter class. So I need to iterate over the list/map, and validate each element inside the loop. The validation inside the loop can also utilize the above method if the restriction "extends VdcActionParametersBase" is removed. This will allow me to do the following in the canDoAction method:

protected boolean canDoAction() {
...
=C2=A0=C2=A0=C2=A0 for(GlusterBrickEntity brick : getParameters().getGlusterVolume().getBricks()) {
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 List<String> errors = =3D ValidationUtils.validateInputs(getValidationGroups(), brick);
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if(errors !=3D null) {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 for(String error : errors) {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 addCanDoActionMessage(error);
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0 }
...
}

Regards,
Shireesh

_______________________________________________
Engine-devel mailing list
Engine-devel(a)ovirt.org
http://lists.ovirt.org/mailman/listinfo/eng= ine-devel
i don't think there is a reason to restrict only for VdcActionParametersBase, roy what do you think?

also you can use here
getReturnValue().getCanDoActionMessages().addAll(errors);
instead of going over on all errors.

pls see SetupNetworksParameters.java for validating a list of network interfaces.

hibernate validator supports trivial object graphs and members that are arrays, list and java.util.map implementations.
If your code looks like that it should work. If you are using special validation groups please add them to your command with addValidationGroups.

this should work:

GlusterCommandParameters.java
=C2=A0@Valid
=C2=A0List<Bricks> bricks

=C2=A0Bricks.java
=C2=A0@NotNull
=C2=A0Guid id
--------------080707050808080009010909-- --===============8013663018314101544== Content-Type: multipart/alternative MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" VGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KLS0tLS0tLS0tLS0t LS0wODA3MDcwNTA4MDgwODAwMDkwMTA5MDkKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy c2V0PVVURi04OyBmb3JtYXQ9Zmxvd2VkCkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQK Ck9uIDA0LzEyLzIwMTIgMTA6NTAgQU0sIE9tZXIgRnJlbmtlbCB3cm90ZToKPgo+Cj4gLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCj4KPiAgICAgKkZyb206ICoiU2hpcmVlc2ggQW5qYWwiIDxzYW5qYWxAcmVkaGF0 LmNvbT4KPiAgICAgKlRvOiAqZW5naW5lLWRldmVsQG92aXJ0Lm9yZwo+ICAgICAqU2VudDogKlRo dXJzZGF5LCBBcHJpbCAxMiwgMjAxMiA5OjM1OjI1IEFNCj4gICAgICpTdWJqZWN0OiAqW0VuZ2lu ZS1kZXZlbF0gUXVlcnkgcmVnYXJkaW5nCj4gICAgIFZhbGlkYXRpb25VdGlscyN2YWxpZGF0ZUlu cHV0cwo+Cj4gICAgIEhpLAo+Cj4gICAgIFRoaXMgaXMgcmVnYXJkaW5nIHRoZSBmb2xsb3dpbmcg dmFsaWRhdGlvbiBtZXRob2Qgd2UgaGF2ZSBpbgo+ICAgICBWYWxpZGF0aW9uVXRpbHM6Cj4KPiAg ICAgL3B1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBWZGNBY3Rpb25QYXJhbWV0ZXJzQmFzZT4KPiAg ICAgQXJyYXlMaXN0PFN0cmluZz4gdmFsaWRhdGVJbnB1dHMoTGlzdDxDbGFzczw/Pj4KPiAgICAg dmFsaWRhdGlvbkdyb3VwTGlzdCwgVCBwYXJhbWV0ZXJzKTsvCj4KPiAgICAgSSB0aGVyZSBhbnkg cGFydGljdWxhciByZWFzb24gZm9yIHN1cHBvcnRpbmcgdGhlIHZhbGlkYXRpb25zIG9ubHkKPiAg ICAgb24gb2JqZWN0cyBvZiBjbGFzc2VzIGRlcml2ZWQgZnJvbSBWZGNBY3Rpb25QYXJhbWV0ZXJz QmFzZT8gSQo+ICAgICBndWVzcyB0aGlzIHdhcyBkb25lIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMg cHJpbWFyaWx5IGludGVuZGVkIHRvCj4gICAgIHZhbGlkYXRlIHRoZSBhY3Rpb24gcGFyYW1ldGVy cyBwYXNzZWQgdG8gYSBCTEwgYWN0aW9uLCB1c2luZyB0aGUKPiAgICAgdmFsaWRhdGlvbiBhbm5v dGF0aW9ucyBvbiB0aGUgcGFyYW1ldGVyIGNsYXNzLiBIb3dldmVyIEkgdGhpbmsKPiAgICAgdGhp cyBtZXRob2QgY2FuIGJlIHVzZWZ1bCBmb3IgZ2VuZXJhbCB1c2UgYXMgd2VsbC4gZS5nLiBJIGNh bm5vdAo+ICAgICBhZGQgYSAiQFZhbGlkIiBhbm5vdGF0aW9uIG9uIGEgImxpc3QiIG9yIGEgIm1h cCIgaW4gYSBwYXJhbWV0ZXIKPiAgICAgY2xhc3MuIFNvIEkgbmVlZCB0byBpdGVyYXRlIG92ZXIg dGhlIGxpc3QvbWFwLCBhbmQgdmFsaWRhdGUgZWFjaAo+ICAgICBlbGVtZW50IGluc2lkZSB0aGUg bG9vcC4gVGhlIHZhbGlkYXRpb24gaW5zaWRlIHRoZSBsb29wIGNhbiBhbHNvCj4gICAgIHV0aWxp emUgdGhlIGFib3ZlIG1ldGhvZCBpZiB0aGUgcmVzdHJpY3Rpb24gImV4dGVuZHMKPiAgICAgVmRj QWN0aW9uUGFyYW1ldGVyc0Jhc2UiIGlzIHJlbW92ZWQuIFRoaXMgd2lsbCBhbGxvdyBtZSB0byBk byB0aGUKPiAgICAgZm9sbG93aW5nIGluIHRoZSBjYW5Eb0FjdGlvbiBtZXRob2Q6Cj4KPiAgICAg cHJvdGVjdGVkIGJvb2xlYW4gY2FuRG9BY3Rpb24oKSB7Cj4gICAgIC4uLgo+ICAgICAgICAgZm9y KEdsdXN0ZXJCcmlja0VudGl0eSBicmljayA6Cj4gICAgIGdldFBhcmFtZXRlcnMoKS5nZXRHbHVz dGVyVm9sdW1lKCkuZ2V0QnJpY2tzKCkpIHsKPiAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZXJy b3JzID0KPiAgICAgVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlSW5wdXRzKGdldFZhbGlkYXRpb25H cm91cHMoKSwgYnJpY2spOwo+ICAgICAgICAgICAgIGlmKGVycm9ycyAhPSBudWxsKSB7Cj4gICAg ICAgICAgICAgICAgIGZvcihTdHJpbmcgZXJyb3IgOiBlcnJvcnMpIHsKPiAgICAgICAgICAgICAg ICAgICAgIGFkZENhbkRvQWN0aW9uTWVzc2FnZShlcnJvcik7Cj4gICAgICAgICAgICAgICAgIH0K PiAgICAgICAgICAgICB9Cj4gICAgICAgICB9Cj4gICAgIC4uLgo+ICAgICB9Cj4KPiAgICAgUmVn YXJkcywKPiAgICAgU2hpcmVlc2gKPgo+ICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwo+ICAgICBFbmdpbmUtZGV2ZWwgbWFpbGluZyBsaXN0Cj4gICAg IEVuZ2luZS1kZXZlbEBvdmlydC5vcmcKPiAgICAgaHR0cDovL2xpc3RzLm92aXJ0Lm9yZy9tYWls bWFuL2xpc3RpbmZvL2VuZ2luZS1kZXZlbAo+Cj4gaSBkb24ndCB0aGluayB0aGVyZSBpcyBhIHJl YXNvbiB0byByZXN0cmljdCBvbmx5IGZvciAKPiBWZGNBY3Rpb25QYXJhbWV0ZXJzQmFzZSwgcm95 IHdoYXQgZG8geW91IHRoaW5rPwo+Cj4gYWxzbyB5b3UgY2FuIHVzZSBoZXJlCj4gZ2V0UmV0dXJu VmFsdWUoKS5nZXRDYW5Eb0FjdGlvbk1lc3NhZ2VzKCkuYWRkQWxsKGVycm9ycyk7Cj4gaW5zdGVh ZCBvZiBnb2luZyBvdmVyIG9uIGFsbCBlcnJvcnMuCgpwbHMgc2VlIFNldHVwTmV0d29ya3NQYXJh bWV0ZXJzLmphdmEgZm9yIHZhbGlkYXRpbmcgYSBsaXN0IG9mIG5ldHdvcmsgCmludGVyZmFjZXMu CgpoaWJlcm5hdGUgdmFsaWRhdG9yIHN1cHBvcnRzIHRyaXZpYWwgb2JqZWN0IGdyYXBocyBhbmQg bWVtYmVycyB0aGF0IGFyZSAKYXJyYXlzLCBsaXN0IGFuZCBqYXZhLnV0aWwubWFwIGltcGxlbWVu dGF0aW9ucy4KSWYgeW91ciBjb2RlIGxvb2tzIGxpa2UgdGhhdCBpdCBzaG91bGQgd29yay4gSWYg eW91IGFyZSB1c2luZyBzcGVjaWFsIAp2YWxpZGF0aW9uIGdyb3VwcyBwbGVhc2UgYWRkIHRoZW0g dG8geW91ciBjb21tYW5kIHdpdGggYWRkVmFsaWRhdGlvbkdyb3Vwcy4KCnRoaXMgc2hvdWxkIHdv cms6CgpHbHVzdGVyQ29tbWFuZFBhcmFtZXRlcnMuamF2YQogIEBWYWxpZAogIExpc3Q8QnJpY2tz PiBicmlja3MKCiAgQnJpY2tzLmphdmEKICBATm90TnVsbAogIEd1aWQgaWQKCi0tLS0tLS0tLS0t LS0tMDgwNzA3MDUwODA4MDgwMDA5MDEwOTA5CkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFy c2V0PVVURi04CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKCjxodG1sPgogIDxoZWFk PgogICAgPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBodHRwLWVxdWl2 PSJDb250ZW50LVR5cGUiPgogIDwvaGVhZD4KICA8Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9y PSIjRkZGRkZGIj4KICAgIE9uIDA0LzEyLzIwMTIgMTA6NTAgQU0sIE9tZXIgRnJlbmtlbCB3cm90 ZToKICAgIDxibG9ja3F1b3RlCmNpdGU9Im1pZDoxNWE1MzI5Yy00NTc5LTRlZjYtYjFjOC1iZTBi MjYwZTg1OWJAem1haWwwNy5jb2xsYWIucHJvZC5pbnQucGh4Mi5yZWRoYXQuY29tIgogICAgICB0 eXBlPSJjaXRlIj4KICAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj5wIHsgbWFyZ2luOiAwOyB9 PC9zdHlsZT4KICAgICAgPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6IFRpbWVzIE5ldyBSb21hbjsg Zm9udC1zaXplOiAxMnB0OyBjb2xvcjoKICAgICAgICAjMDAwMDAwIj48YnI+CiAgICAgICAgPGJy PgogICAgICAgIDxociBpZD0iendjaHIiPgogICAgICAgIDxibG9ja3F1b3RlIHN0eWxlPSJib3Jk ZXItbGVmdDoycHggc29saWQgcmdiKDE2LCAxNiwKMjU1KTttYXJnaW4tbGVmdDo1cHg7cGFkZGlu Zy1sZWZ0OjVweDtjb2xvcjojMDAwO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0eWxlOm5vcm1h bDt0ZXh0LWRlY29yYXRpb246bm9uZTtmb250LWZhbWlseTpIZWx2ZXRpY2EsQXJpYWwsc2Fucy1z ZXJpZjtmb250LXNpemU6MTJwdDsiPjxiPkZyb206CiAgICAgICAgICA8L2I+IlNoaXJlZXNoIEFu amFsIiA8YSBjbGFzcz0ibW96LXR4dC1saW5rLXJmYzIzOTZFIiBocmVmPSJtYWlsdG86c2FuamFs QHJlZGhhdC5jb20iPiZsdDtzYW5qYWxAcmVkaGF0LmNvbSZndDs8L2E+PGJyPgogICAgICAgICAg PGI+VG86IDwvYj48YSBjbGFzcz0ibW96LXR4dC1saW5rLWFiYnJldmlhdGVkIiBocmVmPSJtYWls dG86ZW5naW5lLWRldmVsQG92aXJ0Lm9yZyI+ZW5naW5lLWRldmVsQG92aXJ0Lm9yZzwvYT48YnI+ CiAgICAgICAgICA8Yj5TZW50OiA8L2I+VGh1cnNkYXksIEFwcmlsIDEyLCAyMDEyIDk6MzU6MjUg QU08YnI+CiAgICAgICAgICA8Yj5TdWJqZWN0OiA8L2I+W0VuZ2luZS1kZXZlbF0gUXVlcnkgcmVn YXJkaW5nCiAgICAgICAgICBWYWxpZGF0aW9uVXRpbHMjdmFsaWRhdGVJbnB1dHM8YnI+CiAgICAg ICAgICA8YnI+CiAgICAgICAgICBIaSw8YnI+CiAgICAgICAgICA8YnI+CiAgICAgICAgICBUaGlz IGlzIHJlZ2FyZGluZyB0aGUgZm9sbG93aW5nIHZhbGlkYXRpb24gbWV0aG9kIHdlIGhhdmUgaW4K ICAgICAgICAgIFZhbGlkYXRpb25VdGlsczo8YnI+CiAgICAgICAgICA8YnI+CiAgICAgICAgICA8 aT5wdWJsaWMgc3RhdGljICZsdDtUIGV4dGVuZHMgVmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2UmZ3Q7 CiAgICAgICAgICAgIEFycmF5TGlzdCZsdDtTdHJpbmcmZ3Q7CiAgICAgICAgICAgIHZhbGlkYXRl SW5wdXRzKExpc3QmbHQ7Q2xhc3MmbHQ7PyZndDsmZ3Q7CiAgICAgICAgICAgIHZhbGlkYXRpb25H cm91cExpc3QsIFQgcGFyYW1ldGVycyk7PC9pPjxicj4KICAgICAgICAgIDxicj4KICAgICAgICAg IEkgdGhlcmUgYW55IHBhcnRpY3VsYXIgcmVhc29uIGZvciBzdXBwb3J0aW5nIHRoZSB2YWxpZGF0 aW9ucwogICAgICAgICAgb25seSBvbiBvYmplY3RzIG9mIGNsYXNzZXMgZGVyaXZlZCBmcm9tCiAg ICAgICAgICBWZGNBY3Rpb25QYXJhbWV0ZXJzQmFzZT8gSSBndWVzcyB0aGlzIHdhcyBkb25lIGJl Y2F1c2UgdGhpcwogICAgICAgICAgbWV0aG9kIGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byB2YWxp ZGF0ZSB0aGUgYWN0aW9uIHBhcmFtZXRlcnMKICAgICAgICAgIHBhc3NlZCB0byBhIEJMTCBhY3Rp b24sIHVzaW5nIHRoZSB2YWxpZGF0aW9uIGFubm90YXRpb25zIG9uCiAgICAgICAgICB0aGUgcGFy YW1ldGVyIGNsYXNzLiBIb3dldmVyIEkgdGhpbmsgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWZ1bAog ICAgICAgICAgZm9yIGdlbmVyYWwgdXNlIGFzIHdlbGwuIGUuZy4gSSBjYW5ub3QgYWRkIGEgIkBW YWxpZCIKICAgICAgICAgIGFubm90YXRpb24gb24gYSAibGlzdCIgb3IgYSAibWFwIiBpbiBhIHBh cmFtZXRlciBjbGFzcy4gU28gSQogICAgICAgICAgbmVlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGxp c3QvbWFwLCBhbmQgdmFsaWRhdGUgZWFjaCBlbGVtZW50CiAgICAgICAgICBpbnNpZGUgdGhlIGxv b3AuIFRoZSB2YWxpZGF0aW9uIGluc2lkZSB0aGUgbG9vcCBjYW4gYWxzbwogICAgICAgICAgdXRp bGl6ZSB0aGUgYWJvdmUgbWV0aG9kIGlmIHRoZSByZXN0cmljdGlvbiAiZXh0ZW5kcwogICAgICAg ICAgVmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2UiIGlzIHJlbW92ZWQuIFRoaXMgd2lsbCBhbGxvdyBt ZSB0byBkbwogICAgICAgICAgdGhlIGZvbGxvd2luZyBpbiB0aGUgY2FuRG9BY3Rpb24gbWV0aG9k Ojxicj4KICAgICAgICAgIDxicj4KICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNhbkRvQWN0 aW9uKCkgezxicj4KICAgICAgICAgIC4uLjxicj4KICAgICAgICAgIMKgwqDCoCBmb3IoR2x1c3Rl ckJyaWNrRW50aXR5IGJyaWNrIDoKICAgICAgICAgIGdldFBhcmFtZXRlcnMoKS5nZXRHbHVzdGVy Vm9sdW1lKCkuZ2V0QnJpY2tzKCkpIHs8YnI+CiAgICAgICAgICDCoMKgwqAgwqDCoMKgIExpc3Qm bHQ7U3RyaW5nJmd0OyBlcnJvcnMgPQogICAgICAgICAgVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRl SW5wdXRzKGdldFZhbGlkYXRpb25Hcm91cHMoKSwgYnJpY2spOzxicj4KICAgICAgICAgIMKgwqDC oCDCoMKgwqAgaWYoZXJyb3JzICE9IG51bGwpIHs8YnI+CiAgICAgICAgICDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGZvcihTdHJpbmcgZXJyb3IgOiBlcnJvcnMpIHs8YnI+CiAgICAgICAgICDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYWRkQ2FuRG9BY3Rpb25NZXNzYWdlKGVycm9yKTs8 YnI+CiAgICAgICAgICDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH08YnI+CiAgICAgICAgICDCoMKg wqDCoMKgwqDCoCB9PGJyPgogICAgICAgICAgwqDCoMKgIH08YnI+CiAgICAgICAgICAuLi48YnI+ CiAgICAgICAgICB9PGJyPgogICAgICAgICAgPGJyPgogICAgICAgICAgUmVnYXJkcyw8YnI+CiAg ICAgICAgICBTaGlyZWVzaDxicj4KICAgICAgICAgIDxicj4KICAgICAgICAgIF9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fPGJyPgogICAgICAgICAgRW5naW5l LWRldmVsIG1haWxpbmcgbGlzdDxicj4KICAgICAgICAgIDxhIGNsYXNzPSJtb3otdHh0LWxpbmst YWJicmV2aWF0ZWQiIGhyZWY9Im1haWx0bzpFbmdpbmUtZGV2ZWxAb3ZpcnQub3JnIj5FbmdpbmUt ZGV2ZWxAb3ZpcnQub3JnPC9hPjxicj4KICAgICAgICAgIDxhIGNsYXNzPSJtb3otdHh0LWxpbmst ZnJlZXRleHQiIGhyZWY9Imh0dHA6Ly9saXN0cy5vdmlydC5vcmcvbWFpbG1hbi9saXN0aW5mby9l bmdpbmUtZGV2ZWwiPmh0dHA6Ly9saXN0cy5vdmlydC5vcmcvbWFpbG1hbi9saXN0aW5mby9lbmdp bmUtZGV2ZWw8L2E+PGJyPgogICAgICAgIDwvYmxvY2txdW90ZT4KICAgICAgICBpIGRvbid0IHRo aW5rIHRoZXJlIGlzIGEgcmVhc29uIHRvIHJlc3RyaWN0IG9ubHkgZm9yCiAgICAgICAgVmRjQWN0 aW9uUGFyYW1ldGVyc0Jhc2UsIHJveSB3aGF0IGRvIHlvdSB0aGluaz88YnI+CiAgICAgICAgPGJy PgogICAgICAgIGFsc28geW91IGNhbiB1c2UgaGVyZTxicj4KICAgICAgICBnZXRSZXR1cm5WYWx1 ZSgpLmdldENhbkRvQWN0aW9uTWVzc2FnZXMoKS5hZGRBbGwoZXJyb3JzKTs8YnI+CiAgICAgICAg aW5zdGVhZCBvZiBnb2luZyBvdmVyIG9uIGFsbCBlcnJvcnMuPGJyPgogICAgICA8L2Rpdj4KICAg IDwvYmxvY2txdW90ZT4KICAgIDxicj4KICAgIHBscyBzZWUgU2V0dXBOZXR3b3Jrc1BhcmFtZXRl cnMuamF2YSBmb3IgdmFsaWRhdGluZyBhIGxpc3Qgb2YKICAgIG5ldHdvcmsgaW50ZXJmYWNlcy48 YnI+CiAgICA8YnI+CiAgICBoaWJlcm5hdGUgdmFsaWRhdG9yIHN1cHBvcnRzIHRyaXZpYWwgb2Jq ZWN0IGdyYXBocyBhbmQgbWVtYmVycyB0aGF0CiAgICBhcmUgYXJyYXlzLCBsaXN0IGFuZCBqYXZh LnV0aWwubWFwIGltcGxlbWVudGF0aW9ucy48YnI+CiAgICBJZiB5b3VyIGNvZGUgbG9va3MgbGlr ZSB0aGF0IGl0IHNob3VsZCB3b3JrLiBJZiB5b3UgYXJlIHVzaW5nCiAgICBzcGVjaWFsIHZhbGlk YXRpb24gZ3JvdXBzIHBsZWFzZSBhZGQgdGhlbSB0byB5b3VyIGNvbW1hbmQgd2l0aAogICAgYWRk VmFsaWRhdGlvbkdyb3Vwcy48YnI+CiAgICA8YnI+CiAgICB0aGlzIHNob3VsZCB3b3JrOjxicj4K ICAgIDxicj4KICAgIEdsdXN0ZXJDb21tYW5kUGFyYW1ldGVycy5qYXZhPGJyPgogICAgwqBAVmFs aWQ8YnI+CiAgICDCoExpc3QmbHQ7QnJpY2tzJmd0OyBicmlja3M8YnI+CiAgICA8YnI+CiAgICDC oEJyaWNrcy5qYXZhPGJyPgogICAgwqBATm90TnVsbDxicj4KICAgIMKgR3VpZCBpZDxicj4KICA8 L2JvZHk+CjwvaHRtbD4KCi0tLS0tLS0tLS0tLS0tMDgwNzA3MDUwODA4MDgwMDA5MDEwOTA5LS0K --===============8013663018314101544==--