LyoNCiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCiAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqDQogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQogKg0KICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogKi8NCg0KLS0gUXVlcnkgUGhyYXNlIFBvcHVsYXJpdHkgKEhhZG9vcCBjbHVzdGVyKQ0KDQotLSBUaGlzIHNjcmlwdCBwcm9jZXNzZXMgYSBzZWFyY2ggcXVlcnkgbG9nIGZpbGUgZnJvbSB0aGUgRXhjaXRlIHNlYXJjaCBlbmdpbmUgYW5kIGZpbmRzIHNlYXJjaCBwaHJhc2VzIHRoYXQgb2NjdXIgd2l0aCBwYXJ0aWN1bGFyIGhpZ2ggZnJlcXVlbmN5IGR1cmluZyBjZXJ0YWluIHRpbWVzIG9mIHRoZSBkYXkuIA0KDQoNCi0tIFJlZ2lzdGVyIHRoZSB0dXRvcmlhbCBKQVIgZmlsZSBzbyB0aGF0IHRoZSBpbmNsdWRlZCBVREZzIGNhbiBiZSBjYWxsZWQgaW4gdGhlIHNjcmlwdC4NClJFR0lTVEVSIC4vdHV0b3JpYWwuamFyOw0KDQotLSBVc2UgdGhlICBQaWdTdG9yYWdlIGZ1bmN0aW9uIHRvIGxvYWQgdGhlIGV4Y2l0ZSBsb2cgZmlsZSBpbnRvIHRoZSCTcmF3lCBiYWcgYXMgYW4gYXJyYXkgb2YgcmVjb3Jkcy4NCi0tIElucHV0OiAodXNlcix0aW1lLHF1ZXJ5KSANCnJhdyA9IExPQUQgJ2V4Y2l0ZS5sb2cuYnoyJyBVU0lORyBQaWdTdG9yYWdlKCdcdCcpIEFTICh1c2VyLCB0aW1lLCBxdWVyeSk7DQoNCg0KLS0gQ2FsbCB0aGUgTm9uVVJMRGV0ZWN0b3IgVURGIHRvIHJlbW92ZSByZWNvcmRzIGlmIHRoZSBxdWVyeSBmaWVsZCBpcyBlbXB0eSBvciBhIFVSTC4gDQpjbGVhbjEgPSBGSUxURVIgcmF3IEJZIG9yZy5hcGFjaGUucGlnLnR1dG9yaWFsLk5vblVSTERldGVjdG9yKHF1ZXJ5KTsNCg0KLS0gQ2FsbCB0aGUgVG9Mb3dlciBVREYgdG8gY2hhbmdlIHRoZSBxdWVyeSBmaWVsZCB0byBsb3dlcmNhc2UuIA0KY2xlYW4yID0gRk9SRUFDSCBjbGVhbjEgR0VORVJBVEUgdXNlciwgdGltZSwgb3JnLmFwYWNoZS5waWcudHV0b3JpYWwuVG9Mb3dlcihxdWVyeSkgYXMgcXVlcnk7DQoNCi0tIEJlY2F1c2UgdGhlIGxvZyBmaWxlIG9ubHkgY29udGFpbnMgcXVlcmllcyBmb3IgYSBzaW5nbGUgZGF5LCB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBob3VyLg0KLS0gVGhlIGV4Y2l0ZSBxdWVyeSBsb2cgdGltZXN0YW1wIGZvcm1hdCBpcyBZWU1NRERISE1NU1MuDQotLSBDYWxsIHRoZSBFeHRyYWN0SG91ciBVREYgdG8gZXh0cmFjdCB0aGUgaG91ciAoSEgpIGZyb20gdGhlIHRpbWUgZmllbGQuDQpob3VyZWQgPSBGT1JFQUNIIGNsZWFuMiBHRU5FUkFURSB1c2VyLCBvcmcuYXBhY2hlLnBpZy50dXRvcmlhbC5FeHRyYWN0SG91cih0aW1lKSBhcyBob3VyLCBxdWVyeTsNCg0KLS0gQ2FsbCB0aGUgTkdyYW1HZW5lcmF0b3IgVURGIHRvIGNvbXBvc2UgdGhlIG4tZ3JhbXMgb2YgdGhlIHF1ZXJ5Lg0KbmdyYW1lZDEgPSBGT1JFQUNIIGhvdXJlZCBHRU5FUkFURSB1c2VyLCBob3VyLCBmbGF0dGVuKG9yZy5hcGFjaGUucGlnLnR1dG9yaWFsLk5HcmFtR2VuZXJhdG9yKHF1ZXJ5KSkgYXMgbmdyYW07DQoNCi0tIFVzZSB0aGUgIERJU1RJTkNUIGNvbW1hbmQgdG8gZ2V0IHRoZSB1bmlxdWUgbi1ncmFtcyBmb3IgYWxsIHJlY29yZHMuDQpuZ3JhbWVkMiA9IERJU1RJTkNUIG5ncmFtZWQxOw0KDQotLSBVc2UgdGhlICBHUk9VUCBjb21tYW5kIHRvIGdyb3VwIHJlY29yZHMgYnkgbi1ncmFtIGFuZCBob3VyLiANCmhvdXJfZnJlcXVlbmN5MSA9IEdST1VQIG5ncmFtZWQyIEJZIChuZ3JhbSwgaG91cik7DQoNCi0tIFVzZSB0aGUgIENPVU5UIGZ1bmN0aW9uIHRvIGdldCB0aGUgY291bnQgKG9jY3VycmVuY2VzKSBvZiBlYWNoIG4tZ3JhbS4gDQpob3VyX2ZyZXF1ZW5jeTIgPSBGT1JFQUNIIGhvdXJfZnJlcXVlbmN5MSBHRU5FUkFURSBmbGF0dGVuKCQwKSwgQ09VTlQoJDEpIGFzIGNvdW50Ow0KDQotLSBVc2UgdGhlICBHUk9VUCBjb21tYW5kIHRvIGdyb3VwIHJlY29yZHMgYnkgbi1ncmFtIG9ubHkuIA0KLS0gRWFjaCBncm91cCBub3cgY29ycmVzcG9uZHMgdG8gYSBkaXN0aW5jdCBuLWdyYW0gYW5kIGhhcyB0aGUgY291bnQgZm9yIGVhY2ggaG91ci4NCnVuaXFfZnJlcXVlbmN5MSA9IEdST1VQIGhvdXJfZnJlcXVlbmN5MiBCWSBncm91cDo6bmdyYW07DQoNCi0tIEZvciBlYWNoIGdyb3VwLCBpZGVudGlmeSB0aGUgaG91ciBpbiB3aGljaCB0aGlzIG4tZ3JhbSBpcyB1c2VkIHdpdGggYSBwYXJ0aWN1bGFybHkgaGlnaCBmcmVxdWVuY3kuDQotLSBDYWxsIHRoZSBTY29yZUdlbmVyYXRvciBVREYgdG8gY2FsY3VsYXRlIGEgInBvcHVsYXJpdHkiIHNjb3JlIGZvciB0aGUgbi1ncmFtLg0KdW5pcV9mcmVxdWVuY3kyID0gRk9SRUFDSCB1bmlxX2ZyZXF1ZW5jeTEgR0VORVJBVEUgZmxhdHRlbigkMCksIGZsYXR0ZW4ob3JnLmFwYWNoZS5waWcudHV0b3JpYWwuU2NvcmVHZW5lcmF0b3IoJDEpKTsNCg0KLS0gVXNlIHRoZSAgRk9SRUFDSC1HRU5FUkFURSBjb21tYW5kIHRvIGFzc2lnbiBuYW1lcyB0byB0aGUgZmllbGRzLiANCnVuaXFfZnJlcXVlbmN5MyA9IEZPUkVBQ0ggdW5pcV9mcmVxdWVuY3kyIEdFTkVSQVRFICQxIGFzIGhvdXIsICQwIGFzIG5ncmFtLCAkMiBhcyBzY29yZSwgJDMgYXMgY291bnQsICQ0IGFzIG1lYW47DQoNCi0tIFVzZSB0aGUgIEZJTFRFUiBjb21tYW5kIHRvIG1vdmUgYWxsIHJlY29yZHMgd2l0aCBhIHNjb3JlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAyLjAuDQpmaWx0ZXJlZF91bmlxX2ZyZXF1ZW5jeSA9IEZJTFRFUiB1bmlxX2ZyZXF1ZW5jeTMgQlkgc2NvcmUgPiAyLjA7DQoNCi0tIFVzZSB0aGUgIE9SREVSIGNvbW1hbmQgdG8gc29ydCB0aGUgcmVtYWluaW5nIHJlY29yZHMgYnkgaG91ciBhbmQgc2NvcmUuIA0Kb3JkZXJlZF91bmlxX2ZyZXF1ZW5jeSA9IE9SREVSIGZpbHRlcmVkX3VuaXFfZnJlcXVlbmN5IEJZIGhvdXIsIHNjb3JlOw0KDQotLSBVc2UgdGhlICBQaWdTdG9yYWdlIGZ1bmN0aW9uIHRvIHN0b3JlIHRoZSByZXN1bHRzLiANCi0tIE91dHB1dDogKGhvdXIsIG4tZ3JhbSwgc2NvcmUsIGNvdW50LCBhdmVyYWdlX2NvdW50c19hbW9uZ19hbGxfaG91cnMpDQpTVE9SRSBvcmRlcmVkX3VuaXFfZnJlcXVlbmN5IElOVE8gJ3NjcmlwdDEtaGFkb29wLXJlc3VsdHMnIFVTSU5HIFBpZ1N0b3JhZ2UoKTsNCg==