ICAgICAgICAgICAgICBBcGFjaGUgQ29tbW9ucyBCZWFuVXRpbHMgMS45LjQNCiAgICAgICAgICAgICAgICAgIFJFTEVBU0UgTk9URVMNCg0KVGhlIEFwYWNoZSBDb21tb25zIEJlYW5VdGlscyB0ZWFtIGlzIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgQXBhY2hlIENvbW1vbnMgQmVhblV0aWxzIDEuOS40DQoNCkFwYWNoZSBDb21tb25zIEJlYW5VdGlscyBwcm92aWRlcyBhbiBlYXN5LXRvLXVzZSBidXQgZmxleGlibGUgd3JhcHBlciBhcm91bmQgcmVmbGVjdGlvbiBhbmQgaW50cm9zcGVjdGlvbi4NCg0KVGhlIHByaW1hcnkgcmVhc29uIGZvciB0aGlzIHJlbGVhc2UgaXMgYSBidWdmaXggZm9yIENWRS0yMDE0LTAxMTQuIE1vcmUgc3BlY2lmaWNhbGx5LCBvdXIgZ29hbCB3aXRoDQpCRUFOVVRJTFMtNTIwIGlzIHRvIHNldCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2YgdGhlIEJlYW5VdGlsc0JlYW4gdG8gbm90IGFsbG93IGNsYXNzIGxldmVsIGFjY2Vzcy4gVGhlIGdvYWwNCmluIGRvaW5nIHRoaXMgbm93IGlzIHRvIGJyaW5nIDEuOS5YIGludG8gYWxpZ25tZW50IHdpdGggdGhlIHNhbWUgYmVoYXZpb3VyIG9mIHRoZSAyLlggdmVyc2lvbiBsaW5lIGluDQpyZWdhcmRzIHRvIHNlY3VyaXR5Lg0KDQpJZiBvbmUgd291bGQgbGlrZSB0byBvcHQgb3V0IG9mIHRoZSBkZWZhdWx0IGJlaGF2aW91ciwgb25lIGNvdWxkIGZvbGxvdyB0aGUgZXhhbXBsZSBzZXQgb3V0IGluIHRoZQ0KdGVzdCBjbGFzcyBhdmFpbGFibGUgaW4gc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvYmVhbnV0aWxzL2J1Z3MvSmlyYTUyMFRlc3RDYXNlLmphdmEuDQoNCkNoYW5nZXMgaW4gdGhpcyB2ZXJzaW9uIGluY2x1ZGU6DQoNCkZpeGVkIEJ1Z3M6DQpvIEJFQU5VVElMUy01MjA6ICBCZWFuVXRpbHMgbWl0aWdhdGlvbiBvZiBDVkUtMjAxNC0wMTE0LiAoQ1ZFLTIwMTktMTAwODYgZm9yIGNvbW1vbnMtYmVhbnV0aWxzKS4gVGhhbmtzIHRvIE1lbGxvd2FyZS4NCg0KDQpIaXN0b3JpY2FsIGxpc3Qgb2YgY2hhbmdlczogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtYmVhbnV0aWxzL2NoYW5nZXMtcmVwb3J0Lmh0bWwNCg0KRm9yIGNvbXBsZXRlIGluZm9ybWF0aW9uIG9uIEFwYWNoZSBDb21tb25zIEJlYW5VdGlscywgaW5jbHVkaW5nIGluc3RydWN0aW9ucyBvbiBob3cgdG8gc3VibWl0IGJ1ZyByZXBvcnRzLA0KcGF0Y2hlcywgb3Igc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50LCBzZWUgdGhlIEFwYWNoZSBBcGFjaGUgQ29tbW9ucyBCZWFuVXRpbHMgd2Vic2l0ZToNCg0KaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtYmVhbnV0aWxzLw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgICAgICAgICAgIEFwYWNoZSBDb21tb25zIEJlYW5VdGlscyAxLjkuMw0KICAgICAgICAgICAgICAgICAgUkVMRUFTRSBOT1RFUw0KDQpUaGUgQXBhY2hlIENvbW1vbnMgdGVhbSBpcyBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIEFwYWNoZQ0KQ29tbW9ucyBCZWFuVXRpbHMgMS45LjMNCg0KQXBhY2hlIENvbW1vbnMgQmVhblV0aWxzIHByb3ZpZGVzIGFuIGVhc3ktdG8tdXNlIGJ1dCBmbGV4aWJsZSB3cmFwcGVyIGFyb3VuZA0KcmVmbGVjdGlvbiBhbmQgaW50cm9zcGVjdGlvbi4NCg0KVGhpcyBpcyBhIGJ1ZyBmaXggcmVsZWFzZSwgd2hpY2ggYWxzbyBpbXByb3ZlcyB0aGUgdGVzdHMgZm9yIGJ1aWxkaW5nIG9uIEphdmENCjguDQoNCk5vdGUgdGhhdCBKYXZhIDggYW5kIGxhdGVyIG5vIGxvbmdlciBzdXBwb3J0IGluZGV4ZWQgYmVhbiBwcm9wZXJ0aWVzIG9uDQpqYXZhLnV0aWwuTGlzdCwgb25seSBvbiBhcnJheXMgbGlrZSBTdHJpbmdbXS4gKEJFQU5VVElMUy00OTIpLiAgVGhpcyBhZmZlY3RzDQpQcm9wZXJ0eVV0aWxzLmdldFByb3BlcnR5VHlwZSgpIGFuZCBQcm9wZXJ0eVV0aWxzLmdldFByb3BlcnR5RGVzY3JpcHRvcigpOw0KdGhlaXIgamF2YWRvYyBoYXZlIHRoZXJlZm9yZSBiZWVuIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGlzIGNoYW5nZSBpbiB0aGUgSkRLLg0KDQoNCkNoYW5nZXMgaW4gdGhpcyB2ZXJzaW9uIGluY2x1ZGU6DQoNCkZpeGVkIEJ1Z3M6DQoNCiogQkVBTlVUSUxTLTQ3NzogQ2hhbmdlZCBsb2cgbGV2ZWwgaW4gRmx1ZW50UHJvcGVydHlCZWFuSW50cm9zcGVjdG9yDQoqIEJFQU5VVElMUy00OTI6IEZpeGVkIGV4Y2VwdGlvbiB3aGVuIHNldHRpbmcgaW5kZXhlZCBwcm9wZXJ0aWVzIG9uIER5bmFCZWFucy4NCiAgVGhhbmtzIHRvIEJlcm5oYXJkIFNlZWJhc3MuDQoqIEJFQU5VVElMUy00NzA6IFByZWNpc2lvbiBsb3N0IHdoZW4gY29udmVydGluZyBCaWdEZWNpbWFsIFRoYW5rcyB0byBUb21teQ0KICBUeW5q5C4NCiogQkVBTlVUSUxTLTQ2NTogSW5kZXhlZCBMaXN0IFNldHRlcnMgZml4ZWQuIFRoYW5rcyB0byBEYW5pZWwgQXRhbGxhaC4NCg0KQ2hhbmdlczoNCiogQkVBTlVUSUxTLTQzMzogVXBkYXRlIGRlcGVuZGVuY3kgZnJvbSBKVW5pdCAzLjguMSB0byA0LjEyLg0KICBUaGFua3MgdG8gQmVuZWRpa3QgUml0dGVyLCBHYXJ5IEdyZWdvcnkuDQoqIEJFQU5VVElMUy00Njk6IFVwZGF0ZSBjb21tb25zLWxvZ2dpbmcgZnJvbSAxLjEuMSB0byAxLjIuDQogIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuDQoqIEJFQU5VVElMUy00NzQ6IEZsdWVudFByb3BlcnR5QmVhbkludHJvc3BlY3RvciBkb2VzIG5vdCB1c2UgdGhlIHNhbWUgbmFtaW5nDQogIGFsZ29yaXRobSBhcyBEZWZhdWx0QmVhbkludHJvc3BlY3Rvci4gIFRoYW5rcyB0byBNaWNoYWVsIEdyb3ZlLg0KKiBCRUFOVVRJTFMtNDkwOiBVcGRhdGUgSmF2YSByZXF1aXJlbWVudCBmcm9tIEphdmEgNSB0byA2Lg0KICBUaGFua3MgdG8gR2FyeSBHcmVnb3J5Lg0KKiBCRUFOVVRJTFMtNDgyOiBVcGRhdGUgY29tbW9ucy1jb2xsZWN0aW9ucyBmcm9tIDMuMi4xIHRvIDMuMi4yDQogIChDVkUtMjAxNS00ODUyKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4NCiogQkVBTlVUSUxTLTQ5MDogVXBkYXRlIGphdmEgcmVxdWlyZW1lbnQgdG8gSmF2YSA2LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5Lg0KKiBCRUFOVVRJTFMtNDkyOiBJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yIHRlc3RzIG5vdyBwYXNzIG9uIEphdmEgOC4NCiAgVGhhbmtzIHRvIFN0aWFuIFNvaWxhbmQtUmV5ZXMuDQoqIEJFQU5VVElMUy00OTU6IERhdGVDb252ZXJ0ZXJUZXN0QmFzZSBmYWlscyBvbiBNL2QveXkgaW4gSmF2YSA5Lg0KICBUaGFua3MgdG8gU3RpYW4gU29pbGFuZC1SZXllcy4NCiogQkVBTlVUSUxTLTQ5NjogdGVzdEdldERlc2NyaXB0b3JJbnZhbGlkQm9vbGVhbiBmYWlscyBvbiBKYXZhIDkuDQogIFRoYW5rcyB0byBTdGlhbiBTb2lsYW5kLVJleWVzLg0KDQoNCkhpc3RvcmljYWwgbGlzdCBvZiBjaGFuZ2VzOiBodHRwOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWJlYW51dGlscy9jaGFuZ2VzLXJlcG9ydC5odG1sDQoNCkZvciBjb21wbGV0ZSBpbmZvcm1hdGlvbiBvbiBBcGFjaGUgQ29tbW9ucyBCZWFuVXRpbHMsIGluY2x1ZGluZyBpbnN0cnVjdGlvbnMgb24NCmhvdyB0byBzdWJtaXQgYnVnIHJlcG9ydHMsIHBhdGNoZXMsIG9yIHN1Z2dlc3Rpb25zIGZvciBpbXByb3ZlbWVudCwgc2VlIHRoZQ0KQXBhY2hlIEFwYWNoZSBDb21tb25zIEJlYW5VdGlscyB3ZWJzaXRlOg0KDQpodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1iZWFudXRpbHMvDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9ucyBCZWFuVXRpbHMgUGFja2FnZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMS45LjINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlIE5vdGVzDQoNCklOVFJPRFVDVElPTjoNCj09PT09PT09PT09PQ0KDQpUaGlzIGRvY3VtZW50IGNvbnRhaW5zIHRoZSByZWxlYXNlIG5vdGVzIGZvciB0aGlzIHZlcnNpb24gb2YgdGhlIENvbW1vbnMNCkJlYW5VdGlscyBwYWNrYWdlLCBhbmQgaGlnaGxpZ2h0cyBjaGFuZ2VzIHNpbmNlIHRoZSBwcmV2aW91cyB2ZXJzaW9uLg0KDQpGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBDb21tb25zIEJlYW5VdGlscywgc2VlDQpvIGh0dHA6Ly9jb21tb25zLmFwYWNoZS5vcmcvYmVhbnV0aWxzLw0KDQpSZWxlYXNlIDEuOS4yIG1haW5seSBhZGRyZXNzZXMgYSBwb3RlbnRpYWwgc2VjdXJpdHkgaXNzdWUgd2hlbiBhY2Nlc3NpbmcNCnByb3BlcnRpZXMgaW4gYW4gdW5jb250cm9sbGVkIHdheS4gSW4gYSBudXRzaGVsbCwgaWYgYW4gYXBwbGljYXRpb24gdGhhdCB1c2VzDQpDb21tb25zIEJlYW5VdGlscyBwYXNzZXMgcHJvcGVydHkgcGF0aHMgZnJvbSBhbiBleHRlcm5hbCBzb3VyY2UgZGlyZWN0bHkgdG8NCnRoZSBnZXRQcm9wZXJ0eSgpIG1ldGhvZCBvZiBCZWFuVXRpbHNCZWFuLCBhbiBhdHRhY2tlciBjYW4gYWNjZXNzIHRoZSBjbGFzcw0KbG9hZGVyIHZpYSB0aGUgY2xhc3MgcHJvcGVydHkgYXZhaWxhYmxlIG9uIGFsbCBKYXZhIG9iamVjdHMuDQoNCkluIHZlcnNpb24gMS45LjIgbm93IGEgc3BlY2lhbCBCZWFuSW50cm9zcGVjdG9yIGNsYXNzIHdhcyBhZGRlZCB3aGljaCBhbGxvd3MNCnN1cHByZXNzaW5nIHRoaXMgcHJvcGVydHkuIE5vdGUgdGhhdCB0aGlzIEJlYW5JbnRyb3NwZWN0b3IgaXMgTk9UIGVuYWJsZWQgYnkNCmRlZmF1bHQhIENvbW1vbnMgQmVhblV0aWxzIGlzIGEgbG93LWxldmVsIGxpYnJhcnksIGFuZCBvbiB0aGlzIGxheWVyIGl0IGNhbm5vdA0KYmUgZGVjaWRlZCB3aGV0aGVyIGFjY2VzcyB0byBhIGNlcnRhaW4gcHJvcGVydHkgaXMgbGVnYWwgb3Igbm90LiBUaGVyZWZvcmUsDQphbiBhcHBsaWNhdGlvbiBoYXMgdG8gYWN0aXZhdGUgdGhpcyBzdXBwcmVzc2luZyBCZWFuSW50cm9zcGVjdG9yIGV4cGxpY2l0bHkuDQpUaGlzIGNhbiBiZSBkb25lIHdpdGggdGhlIGZvbGxvd2luZyBsaW5lcyBvZiBjb2RlOg0KDQpCZWFuVXRpbHNCZWFuIGJ1YiA9IG5ldyBCZWFuVXRpbHNCZWFuKCk7DQpidWIuZ2V0UHJvcGVydHlVdGlscygpLmFkZEJlYW5JbnRyb3NwZWN0b3IoDQogICAgU3VwcHJlc3NQcm9wZXJ0aWVzQmVhbkludHJvc3BlY3Rvci5TVVBQUkVTU19DTEFTUyk7DQoNCk5vdyBhbGwgYWNjZXNzIHRvIHByb3BlcnRpZXMgaGFzIHRvIGJlIGRvbmUgdmlhIHRoZSBzcGVjaWFsbHkgY29uZmlndXJlZA0KQmVhblV0aWxzQmVhbiBpbnN0YW5jZS4gTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGlzc3VlIGNhbiBiZSBmb3VuZCBhdA0KaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9CRUFOVVRJTFMtNDYzIG9yIGluIHNlY3Rpb24gMi41IG9mIHRoZQ0KdXNlcidzIGd1aWRlLg0KDQpCVUdGSVhFUyBpbiB2ZXJzaW9uIDEuOS4yDQo9PT09PT09PT09PT09PT09PT09PT09PT09DQoqIFtCRUFOVVRJTFMtNDU4XQ0KICBCYXNlTG9jYWxlQ29udmVydGVyLmNoZWNrQ29udmVyc2lvblJlc3VsdCgpIG5vIGxvbmdlciB0aHJvd3MgYQ0KICBDb252ZXJzaW9uRXhjZXB0aW9uIGlmIHRoZSByZXN1bHQgb2YgYSBjb252ZXJzaW9uIGlzIG51bGwuDQoNCk5ldyBmZWF0dXJlcyBpbiB2ZXJzaW9uIDEuOS4yDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKiBbQkVBTlVUSUxTLTQ2M10NCiAgQWRkZWQgbmV3IFN1cHByZXNzUHJvcGVydGllc0JlYW5JbnRyb3NwZWN0b3IgY2xhc3MgdG8gZGVhbCB3aXRoIGEgcG90ZW50aWFsDQogIGNsYXNzIGxvYWRlciB2dWxuZXJhYmlsaXR5Lg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlIE5vdGVzIGZvciB2ZXJzaW9uIDEuOS4xDQoNClJlbGVhc2UgMS45LjEgaXMgYSBidWcgZml4IHJlbGVhc2Ugd2hpY2ggYWRkcmVzc2VzIGEgcHJvYmxlbSB3aXRoIHRoZSBuZXcNCmZlYXR1cmUgb2YgY3VzdG9tIGludHJvc3BlY3Rpb24gaW50cm9kdWNlZCB3aXRoIHJlbGVhc2UgMS45LjAuIEl0IGlzIGZ1bGx5DQpiaW5hcnkgY29tcGF0aWJsZSB3aXRoIHRoZSBwcmV2aW91cyByZWxlYXNlLiBUaGUgbWluaW11bSByZXF1aXJlZCBKYXZhIHZlcnNpb24NCmlzIDEuNS4NCg0KQlVHRklYRVMgaW4gdmVyc2lvbiAxLjkuMQ0KPT09PT09PT09PT09PT09PT09PT09PT09PQ0KKiBbQkVBTlVUSUxTLTQ1Nl0NCiAgRm9yIFByb3BlcnR5RGVzY3JpcHRvcnMgb2J0YWluZWQgdmlhIGN1c3RvbSBpbnRyb3NwZWN0aW9uIG5vdyBhZGRpdGlvbmFsDQogIGluZm9ybWF0aW9uIGlzIHN0b3JlZCB0byBwcmV2ZW50IHRoYXQgd3JpdGUgbWV0aG9kcyBhcmUgbG9zdCBkdXJpbmcNCiAgZ2FyYmFnZSBjb2xsZWN0aW9uLg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlIE5vdGVzIGZvciB2ZXJzaW9uIDEuOS4wDQoNClJlbGVhc2UgMS45LjAgY29udGFpbnMgc29tZSBidWcgZml4ZXMgYW5kIGltcHJvdmVtZW50cyB0aGF0IGhhdmUgYWNjdW11bGF0ZWQNCmFmdGVyIHRoZSAxLjguMyByZWxlYXNlLiBUaGUgbW9zdCBvYnZpb3VzIGNoYW5nZSBpcyB0aGF0IHRoZSBuZXcgdmVyc2lvbiBub3cNCnJlcXVpcmVzIEpESyAxLjUgb3IgaGlnaGVyLCBhbmQgdGhhdCBsYW5ndWFnZSBmZWF0dXJlcyBpbnRyb2R1Y2VkIHdpdGggSmF2YSA1DQoobWFpbmx5IGdlbmVyaWNzKSBhcmUgdXNlZC4gQSBuZXcgZmVhdHVyZSBoYXMgYmVlbiBpbnRyb2R1Y2VkLCB0b286IHRoZSBzdXBwb3J0DQpmb3IgY3VzdG9taXppbmcgYmVhbiBpbnRyb3NwZWN0aW9uLg0KDQpDb21wYXRpYmlsaXR5IHdpdGggMS44LjMNCj09PT09PT09PT09PT09PT09PT09PT09PQ0KQWRkaW5nIGdlbmVyaWNzIHRvIHRoZSBCZWFuVXRpbHMgQVBJIGhhcyBiZWVuIGRvbmUgaW4gYSBiYWNrd2FyZHMgY29tcGF0aWJsZQ0Kd2F5LiBUaGlzIG1lYW5zIHRoYXQgYWZ0ZXIgdHlwZSBlcmFzdXJlIHRoZSByZXN1bHRpbmcgY2xhc3NlcyBsb29rIHRoZSBzYW1lIGFzDQppbiB0aGUgcHJldmlvdXMgdmVyc2lvbi4gQSBkcmF3YmFjayBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgc29tZXRpbWVzIGl0IGlzDQpub3QgcG9zc2libGUgdG8gdXNlIHRoZSBsb2dpY2FsbHkgY29ycmVjdCB0eXBlIHBhcmFtZXRlcnMgYmVjYXVzZSB0aGVuDQpiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3b3VsZCBiZSBicm9rZW4uIE9uZSBleGFtcGxlIGlzIHRoZSBCZWFuTWFwIGNsYXNzOiBUaGUNCmNsYXNzIGlzIG5vdyBhIE1hcDxPYmplY3QsIE9iamVjdD4gd2hpbGUgaXRzIGtleXMgYWN0dWFsbHkgYXJlIHN0cmluZ3MuDQpIb3dldmVyLCBpbXBsZW1lbnRpbmcgTWFwPFN0cmluZywgT2JqZWN0PiB3b3VsZCBjaGFuZ2UgdGhlIHNpZ25hdHVyZXMgb2Ygc29tZQ0KbWV0aG9kcyBpbiBhbiBpbmNvbXBhdGlibGUgd2F5LiBNb3JlIGRldGFpbHMgYWJvdXQgbGltaXRhdGlvbnMgb2YgdGhlDQpnZW5lcmlmaWNhdGlvbiBjYW4gYmUgZm91bmQgYXQNCmh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQkVBTlVUSUxTLTQ1Mg0KDQpPbmUgZXhjZXB0aW9uIGZyb20gdGhlIGNvbXBhdGliaWxpdHkgcnVsZSBpcyB0aGUgUmVzdWx0U2V0SXRlcmF0b3IgY2xhc3Mgd2hpY2gNCm5vdyBpbXBsZW1lbnRzIHRoZSBJdGVyYXRvcjxEeW5hQmVhbj4gaW50ZXJmYWNlLiBUaGlzIGNhdXNlcyBhIGNoYW5nZSBpbiB0aGUNCnJldHVybiB2YWx1ZSBvZiBpdHMgbmV4dCgpIG1ldGhvZC4gUmVzdWx0U2V0SXRlcmF0b3IgaXMgdXNlZCBpbnRlcm5hbGx5IGFzIHRoZQ0KaXRlcmF0b3IgaW1wbGVtZW50YXRpb24gd2l0aGluIFJlc3VsdFNldER5bmFDbGFzcyAoaXQgaXMgcHJvYmFibHkgYSBtaXN0YWtlIHRoYXQNCml0IGlzIHB1YmxpYykuIFNvIGNoYW5jZXMgYXJlIG1pbmltYWwgdGhhdCB0aGlzIGNoYW5nZSBhZmZlY3RzIGV4aXN0aW5nIGNvZGUuDQoNCkFub3RoZXIgY2hhbmdlIHdoaWNoIG1heSBhZmZlY3QgY29tcGF0aWJpbGl0eSBpcyBbQkVBTlVUSUxTLTM3OV0gKGRldGFpbHMgY2FuDQpiZSBmb3VuZCBhdCBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0JFQU5VVElMUy0zNzkpLiBPbGRlcg0KdmVyc2lvbnMgb2YgQmVhblV0aWxzIGNvbnRhaW5lZCBzb21lIGNsYXNzZXMgdGhhdCB3ZXJlIGNvcGllZCBmcm9tIENvbW1vbnMNCkNvbGxlY3Rpb25zLiBUaGVzZSBjbGFzc2VzIGhhdmUgbm93IGJlZW4gcmVtb3ZlZCwgYW5kIGEgZGVwZW5kZW5jeSB0byBDb21tb25zDQpDb2xsZWN0aW9ucyBoYXMgYmVlbiBhZGRlZDsgdGhlIGNvbGxlY3Rpb25zIGphciBub3cgaGFzIHRvIGJlIGNvbnRhaW5lZCBpbiB0aGUNCmNsYXNzcGF0aCwgdG9vLg0KDQpFeGNlcHQgZm9yIHRoZSBjaGFuZ2Ugb24gUmVzdWx0U2V0SXRlcmF0b3IgYW5kIHRoZSBhZGRpdGlvbmFsIGRlcGVuZGVuY3kgdG8NCkNvbW1vbnMgQ29sbGVjdGlvbnMsIENvbW1vbnMgQmVhblV0aWxzIDEuOS4wIGlzIGZ1bGx5IGJpbmFyeSBjb21wYXRpYmxlIHdpdGgNCnRoZSBwcmV2aW91cyB2ZXJzaW9uIDEuOC4zLg0KDQpDaGFuZ2VzIG9uIENvbnZlcnRlcnMNCj09PT09PT09PT09PT09PT09PT09PQ0KVGhlIGNvbnZlcnQoKSBtZXRob2QgaW4gdGhlIENvbnZlcnRlciBpbnRlcmZhY2Ugbm93IHVzZXMgYSB0eXBlIHBhcmFtZXRlciBpbg0KdGhlIGZvbGxvd2luZyB3YXk6DQoNCiAgICA8VD4gVCBjb252ZXJ0KENsYXNzPFQ+IHR5cGUsIE9iamVjdCB2YWx1ZSk7DQoNClRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gYWNjZXNzIHRoZSBjb252ZXJ0ZXIncyByZXN1bHQgaW4gYSB0eXBlLXNhZmUgd2F5Lg0KQXBwbHlpbmcgZ2VuZXJpY3MgaW4gdGhpcyB3YXkgcmV2ZWFsZWQgc29tZSBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIENvbnZlcnRlcg0KaW1wbGVtZW50YXRpb25zLiBUaGVyZSB3ZXJlIHNpdHVhdGlvbnMgaW4gd2hpY2ggY29udmVydGVycyBjb3VsZCByZXR1cm4gYQ0KcmVzdWx0IG9iamVjdCBvZiBhIGRpZmZlcmVudCB0eXBlIGFzIHdhcyByZXF1ZXN0ZWQuIFRoaXMgd2FzIG5vdCBhIHByb2JsZW0NCmJlZm9yZSBiZWNhdXNlIHRoZSByZXN1bHQgdHlwZSB3YXMganVzdCBPYmplY3QuIE5vdyB0aGUgY29tcGlsZXIgY29tcGxhaW5zIGlmDQphIGNvbnZlcnRlcidzIHJlc3VsdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBkZXNpcmVkIHRhcmdldCB0eXBlLg0KDQpCZWNhdXNlIG9mIHRoYXQgQ29udmVydGVyIGltcGxlbWVudGF0aW9ucyBoYXZlIGJlZW4gbWFkZSBtb3JlIHN0cmljdC4gQQ0KY29udmVydGVyIG5vdyBjaGVja3MgdGhlIHBhc3NlZCBpbiB0YXJnZXQgdHlwZSwgYW5kIGlmIGl0IGNhbm5vdCBoYW5kbGUgaXQsDQp0aHJvd3MgYSBDb252ZXJzaW9uRXhjZXB0aW9uLiBUaGlzIHByZXZlbnRzIHVuZXhwZWN0ZWQgcmVzdWx0cyBhbmQgbWFrZXMNCmNvbnZlcnRlcnMgbW9yZSByZWxpYWJsZSAoaXQgY291bGQgYmUgY29uc2lkZXJlZCBhIGJ1ZyB0aGF0IGEgY29udmVydGVyIHJldHVybnMNCmEgcmVzdWx0IG9iamVjdCBvZiBhIGRpZmZlcmVudCBkYXRhIHR5cGUgYXMgdGhlIHBhc3NlZCBpbiB0YXJnZXQgdHlwZSkuIEluIGENCnR5cGljYWwgc2NlbmFyaW8sIHdoZW4gY29udmVydGVycyBhcmUgYWNjZXNzZWQgdmlhIENvbnZlcnRVdGlscywgdGhpcyBjaGFuZ2UNCnNob3VsZCBub3QgY2F1c2UgYW55IHByb2JsZW1zIGJlY2F1c2UgdGhlIGNvbnZlcnRlcnMgYXJlIG9ubHkgY2FsbGVkIGZvciB0aGUNCmRhdGEgdHlwZXMgdGhleSBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBmb3IuIEJ1dCBpZiBjb252ZXJ0ZXJzIGFyZSB1c2VkIGRpcmVjdGx5LA0KdGhleSBtaWdodCBub3cgdGhyb3cgQ29udmVyc2lvbkV4Y2VwdGlvbnMgd2hlbiB0aGV5IGRpZCBub3QgaW4gYSBwcmV2aW91cw0KdmVyc2lvbi4NCg0KQlVHRklYRVMgaW4gdmVyc2lvbiAxLjkuMA0KPT09PT09PT09PT09PT09PT09PT09PT09PQ0KKiBbQkVBTlVUSUxTLTQ1NF0NCiAgQmVhblV0aWxzQmVhbi5jb3B5UHJvcGVydGllcygpIG5vIGxvbmdlciB0aHJvd3MgYSBDb252ZXJzaW9uRXhjZXB0aW9uIGZvcg0KICBudWxsIHByb3BlcnRpZXMgb2YgY2VydGFpbiBkYXRhIHR5cGVzLiBUaGlzIGZpeGVzIGEgcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluDQogIHZlcnNpb24gMS44LjAuIFRoZSBpc3N1ZSBpcyByZWxhdGVkIHRvIFtCRUFOVVRJTFMtMzg3XS4NCiogW0JFQU5VVElMUy00MTFdDQogIEJlYW5VdGlsc0JlYW4uc2V0UHJvcGVydHkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBnZXR0ZXIgb2YgbmVzdGVkDQogIHByb3BlcnR5IHJldHVybnMgbnVsbC4NCiogW0JFQU5VVElMUy00MDhdDQogIE1ldGhvZFV0aWxzLmludm9rZU1ldGhvZCgpIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGFyZ3M9PW51bGwuDQoqIFtCRUFOVVRJTFMtNDI2XQ0KICBDb25zdHJ1Y3RvclV0aWxzLmludm9rZUNvbnN0cnVjdG9yKENsYXNzIGtsYXNzLCBPYmplY3QgYXJnKSB0aHJvd3MNCiAgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBhcmc9PW51bGwuDQoqIFtCRUFOVVRJTFMtMzgwXQ0KICBCZWFuTWFwIG1ldGhvZHMgc2hvdWxkIGluaXRpYWxpemUgdGhlIHJvb3QgY2F1c2Ugb2YgZXhjZXB0aW9ucyB0aGF0IGFyZQ0KICB0aHJvd24gd2hlbiBydW5uaW5nIG9uIEpESyAxLjQrLg0KKiBbQkVBTlVUSUxTLTM3OV0NCiAgUmVtb3ZlIGNvcGllZCBDb2xsZWN0aW9uIGNsYXNzZXMuDQoqIFtCRUFOVVRJTFMtMzc4XQ0KICBCZWFuTWFwIGRvZXMgbm90IHdvcmsgaW4gb3NnaSAoZml4ZWQgYnkgQkVBTlVUSUxTLTM3OCkuDQoqIFtCRUFOVVRJTFMtMzgxXQ0KICBNZXRob2RVdGlscyBnZXRNYXRjaGluZ0FjY2Vzc2libGVNZXRob2QoKSBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlDQogIGluaGVyaXRhbmNlIGFuZCBtZXRob2Qgb3ZlcmxvYWRpbmcuDQoNCk5ldyBmZWF0dXJlcyBpbiB2ZXJzaW9uIDEuOS4wDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKiBbQkVBTlVUSUxTLTQyNV0NCiAgU3VwcG9ydCBjdXN0b21pemF0aW9uIG9mIGludHJvc3BlY3Rpb24gbWVjaGFuaXNtLg0KKiBbQkVBTlVUSUxTLTQyOF0NCiAgUHJvdmlkZSBhIEJlYW5JbnRyb3NwZWN0b3IgaW1wbGVtZW50YXRpb24gd2hpY2ggc3VwcG9ydHMgcHJvcGVydGllcyBpbiBhDQogIGZsdWVudCBBUEkuDQoqIFtCRUFOVVRJTFMtNDU1XQ0KICBXcmFwRHluYUJlYW5zIGNhbiBub3cgYmUgY29uZmlndXJlZCB0byB1c2UgYSBzcGVjaWZpYyBpbnN0YW5jZSBvZg0KICBQcm9wZXJ0eVV0aWxzQmVhbiBmb3IgaW50cm9zcGVjdGlvbiBvciBwcm9wZXJ0eSBhY2Nlc3MuDQoNCk90aGVyIGNoYW5nZXMgaW4gdmVyc2lvbiAxLjkuMA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoqIFtCRUFOVVRJTFMtNDUyXQ0KICBBZGQgZ2VuZXJpY3MuDQoqIFtCRUFOVVRJTFMtNDQ5XQ0KICBMb2NhbGVDb252ZXJ0ZXJzIGRvIG5vdCB0YWtlIHRoZSB0YXJnZXQgdHlwZSBpbnRvIGFjY291bnQuDQoqIFtCRUFOVVRJTFMtNDQ4XQ0KICBMb2NhbGVDb252ZXJ0ZXJzIGRvIG5vdCBjaGVjayB0aGVpciBkZWZhdWx0IHZhbHVlLg0KKiBbQkVBTlVUSUxTLTQ0N10NCiAgTGF6eUR5bmFMaXN0LnRvQXJyYXkoKSBpcyBub3QgY29uZm9ybSB0byB0aGUgY29udHJhY3QgZGVmaW5lZCBieSB0aGUNCiAgQ29sbGVjdGlvbiBpbnRlcmZhY2UuDQoqIFtCRUFOVVRJTFMtNDQ2XQ0KICBTb21lIG9mIHRoZSBjb252ZXJ0ZXJzIGlnbm9yZSB0aGUgcGFzc2VkIGluIHRhcmdldCB0eXBlLg0KKiBbQkVBTlVUSUxTLTQ0NV0NCiAgQ29udmVydGVycyBjYW4gcmV0dXJuIGFuIGludmFsaWQgcmVzdWx0IG9iamVjdCBpZiBhIGRlZmF1bHQgdmFsdWUgaXMgc2V0Lg0KKiBbQkVBTlVUSUxTLTQ0MV0NCiAgUmVwbGFjZSBVbm1vZGlmaWFibGVTZXQuZGVjb3JhdGUgd2l0aCBDb2xsZWN0aW9ucy51bk1vZGlmaWFibGVTZXQuDQoqIFtCRUFOVVRJTFMtNDM2XQ0KICBSZXBsYWNlIHBhY2thZ2UuaHRtbCB3aXRoIHBhY2thZ2UtaW5mby5qYXZhLg0KKiBbQkVBTlVUSUxTLTQzOF0NCiAgQWRkIEBEZXByZWNhdGVkIGFuZCBAT3ZlcnJpZGUgQW5ub3RhdGlvbnMuDQoqIFtCRUFOVVRJTFMtNDM3XQ0KICBSZXBsYWNlIERhdGUgYW5kIFJldmlzaW9uIFNWTiBrZXl3b3JkcyB3aXRoIElkLg0KKiBbQkVBTlVUSUxTLTQzMV0NCiAgUmVtb3ZlIEBhdXRob3IgdGFncyBhbmQgbW92ZSBtaXNzaW5nIGF1dGhvcnMgdG8gcG9tLnhtbC4NCiogW0JFQU5VVElMUy00MzJdDQogIFN3aXRjaCB0byBKYXZhIDEuNS4NCiogW0JFQU5VVElMUy00MjldDQogIERlbGV0ZSB0cmFpbGluZyB3aGl0ZSBzcGFjZXMgYW5kIHdoaXRlIHNwYWNlcyBvbiBlbXB0eSBsaW5lcyBmcm9tIGFsbCBmaWxlcy4NCiogW0JFQU5VVElMUy00MjddDQogIENvbmZpZ3VyZSBDaGVja3N0eWxlIHRvIGNoZWNrIGZvciB0cmFpbGluZyB3aGl0ZSBzcGFjZXMgYW5kIHdoaXRlIHNwYWNlcyBvbg0KICBlbXB0eSBsaW5lcy4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZSBOb3RlcyBmb3IgdmVyc2lvbiAxLjguMw0KDQpDb21wYXRpYmlsaXR5IHdpdGggMS44LjINCj09PT09PT09PT09PT09PT09PT09PT09PQ0KQmVhblV0aWxzIDEuOC4zIGlzIGJpbmFyeSBjb21wYXRpYmxlIHJlbGVhc2Ugd2l0aCBCZWFudXRpbHMgMS44LjIsIGNvbnRhaW5pbmcgb25seSBidWcgZml4ZXMuDQoNCkJlYW5VdGlscyAxLjguMyByZXF1aXJlcyBhIG1pbmltdW0gb2YgSkRLIDEuMy4NCg0KTWVtb3J5IExlYWsNCj09PT09PT09PT09DQpBIG1lbW9yeSBsZWFrIHdhcyBmb3VuZCBpbiBCZWFuVXRpbHMgMS43LjAgKHNlZSBCRUFOVVRJTFMtMjkxKSB3aGljaCB3YXMgZml4ZWQNCmluIEJlYW5VdGlscyAxLjguMCBmb3IgSkRLIDEuNSsuDQoNClRlc3Rpbmcgb2YgQmVhblV0aWxzIDEuOC4xIHJldmVhbGVkIHRoYXQgdGhlIGxlYWsgc3RpbGwgYXBwZWFycyB0byBleGlzdA0KaW4gSUJNJ3MgSkRLIDEuNiBpbXBsZW1lbnRhdGlvbi4NCg0KDQpzZWUgaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0JFQU5VVElMUy0yOTENCiAgICBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQkVBTlVUSUxTLTM2Ng0KDQoNCkJVR1MgRklYRUQ6DQo9PT09PT09PT09PQ0KDQpUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiB0aGUgYnVncyBmaXhlZCBpbiB0aGlzIHJlbGVhc2UsIHdpdGggdGhlaXIgSmlyYSBpc3N1ZSBudW1iZXI6DQoNCiAgKiBbQkVBTlVUSUxTLTM3M10gLSBNZXRob2RVdGlscyBpcyBub3QgdGhyZWFkIHNhZmUgYmVjYXVzZSBXZWFrRmFzdEhhc2hNYXAgd2hpY2ggdXNlcyBXZWFrSGFzaE1hcCBpcyBub3QgdGhyZWFkLXNhZmUNCiAgKiBbQkVBTlVUSUxTLTM3MV0gLSBBZGQgY29uc3RydWN0b3JzIHdoaWNoIGhhdmUgdXNlQ29sdW1uTGFiZWwgcGFyYW1ldGVyIHRvIFJlc3VsdFNldER5bmFDbGFzcyBhbmQgUm93U2V0RHluYUNsYXNzDQoNCg0K