CkFwYWNoZSBDb21tb25zIElPIDIuMTYuMSBSZWxlYXNlIE5vdGVzCgpJbnRyb2R1Y3Rpb24KLS0tLS0tLS0tLS0tCgpDb21tb25zIElPIGlzIGEgcGFja2FnZSBvZiBKYXZhIHV0aWxpdHkgY2xhc3NlcyBsaWtlIGphdmEuaW8uICAKQ2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc28gc3RhbmRhcmQgYW5kIG9mIHN1Y2ggaGlnaCAKcmV1c2UgYXMgdG8ganVzdGlmeSBleGlzdGVuY2UgaW4gamF2YS5pby4KClRoZSBBcGFjaGUgQ29tbW9ucyBJTyBsaWJyYXJ5IGNvbnRhaW5zIHV0aWxpdHkgY2xhc3Nlcywgc3RyZWFtIGltcGxlbWVudGF0aW9ucywgZmlsZSBmaWx0ZXJzLApmaWxlIGNvbXBhcmF0b3JzLCBlbmRpYW4gdHJhbnNmb3JtYXRpb24gY2xhc3NlcywgYW5kIG11Y2ggbW9yZS4KCkphdmEgOCBpcyByZXF1aXJlZC4KCgpGaXhlZCBCdWdzCi0tLS0tLS0tLS0KCm8gICAgICAgICAgUmVpbXBsZW1lbnQgRmlsZVN5c3RlbVV0aWxzIHVzaW5nIE5JTy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gSU8tODUxOiAgRmlsZVN5c3RlbVV0aWxzIG5vIGxvbmdlciB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLiBUaGFua3MgdG8gU2ViYiwgR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBdm9pZCBwb3NzaWJsZSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBGaWxlVXRpbHMubGlzdEFjY3VtdWxhdGUoRmlsZSwgSU9GaWxlRmlsdGVyLCBJT0ZpbGVGaWx0ZXIsIEZpbGVWaXNpdE9wdGlvbi4uLikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIElPLTg1MzogIEJvdW5kZWRJbnB1dFN0cmVhbS5yZXNldCgpIG5vdCB1cGRhdGluZyBjb3VudC4gVGhhbmtzIHRvIE1pa2UgRHJvYiwgR2FyeSBHcmVnb3J5LiAKCkNoYW5nZXMKLS0tLS0tLQoKbyAgICAgICAgICBCdW1wIGNvbW1vbnMuYnl0ZWJ1ZGR5LnZlcnNpb24gZnJvbSAxLjE0LjEyIHRvIDEuMTQuMTMgIzYwNS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQnVtcCBvcmcuYXBhY2hlLmNvbW1vbnM6Y29tbW9ucy1wYXJlbnQgZnJvbSA2NyB0byA2OSAjNjA4LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LCBEZXBlbmRhYm90LiAKCgpDb21tb25zIElPIDIuNyBhbmQgdXAgcmVxdWlyZXMgSmF2YSA4IG9yIGFib3ZlLgpDb21tb25zIElPIDIuNiByZXF1aXJlcyBKYXZhIDcgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4zIHRocm91Z2ggMi41IHJlcXVpcmVzIEphdmEgNiBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjIgcmVxdWlyZXMgSmF2YSA1IG9yIGFib3ZlLgpDb21tb25zIElPIDEuNCByZXF1aXJlcyBKYXZhIDEuMyBvciBhYm92ZS4KCkhpc3RvcmljYWwgbGlzdCBvZiBjaGFuZ2VzOiBodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby9jaGFuZ2VzLXJlcG9ydC5odG1sCgpGb3IgY29tcGxldGUgaW5mb3JtYXRpb24gb24gQXBhY2hlIENvbW1vbnMgSU8sIGluY2x1ZGluZyBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHN1Ym1pdCBidWcgcmVwb3J0cywKcGF0Y2hlcywgb3Igc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50LCBzZWUgdGhlIEFwYWNoZSBDb21tb25zIElPIHdlYnNpdGU6CgpodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby8KCkRvd25sb2FkIHBhZ2U6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2Rvd25sb2FkX2lvLmNnaQoKSGF2ZSBmdW4hCi1BcGFjaGUgQ29tbW9ucyBUZWFtCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgpBcGFjaGUgQ29tbW9ucyBJTyAyLjE2LjAgUmVsZWFzZSBOb3RlcwoKSW50cm9kdWN0aW9uCi0tLS0tLS0tLS0tLQoKQ29tbW9ucyBJTyBpcyBhIHBhY2thZ2Ugb2YgSmF2YSB1dGlsaXR5IGNsYXNzZXMgbGlrZSBqYXZhLmlvLiAgCkNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGFyZSBjb25zaWRlcmVkIHRvIGJlIHNvIHN0YW5kYXJkIGFuZCBvZiBzdWNoIGhpZ2ggCnJldXNlIGFzIHRvIGp1c3RpZnkgZXhpc3RlbmNlIGluIGphdmEuaW8uCgpUaGUgQXBhY2hlIENvbW1vbnMgSU8gbGlicmFyeSBjb250YWlucyB1dGlsaXR5IGNsYXNzZXMsIHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMsIGZpbGUgZmlsdGVycywKZmlsZSBjb21wYXJhdG9ycywgZW5kaWFuIHRyYW5zZm9ybWF0aW9uIGNsYXNzZXMsIGFuZCBtdWNoIG1vcmUuCgpKYXZhIDggaXMgcmVxdWlyZWQuCgpOZXcgZmVhdHVyZXMKLS0tLS0tLS0tLS0tCgpvICAgICAgICAgIEFkZCBhbmQgdXNlIFBhdGhVdGlscy5nZXRGaWxlTmFtZShQYXRoLCBGdW5jdGlvbjxQYXRoLCBSPikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEFkZCBhbmQgdXNlIFBhdGhVdGlscy5nZXRGaWxlTmFtZVN0cmluZygpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBNYWtlIHB1YmxpYyBFcmFzZS5yZXRocm93KFRocm93YWJsZSkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIElPLTgyNjogIEFkZCBCcm9rZW5JbnB1dFN0cmVhbS5Ccm9rZW5JbnB1dFN0cmVhbShUaHJvd2FibGUpLiBUaGFua3MgdG8gbWFya3NsYXRlciwgR2FyeSBHcmVnb3J5LiAKbyBJTy04MjY6ICBBZGQgQnJva2VuUmVhZGVyLkJyb2tlblJlYWRlcihUaHJvd2FibGUpLiBUaGFua3MgdG8gbWFya3NsYXRlciwgR2FyeSBHcmVnb3J5LiAKbyBJTy04MjY6ICBBZGQgQnJva2VuT3V0cHV0U3RyZWFtLkJyb2tlbk91dHB1dFN0cmVhbShUaHJvd2FibGUpLiBUaGFua3MgdG8gbWFya3NsYXRlciwgR2FyeSBHcmVnb3J5LiAKbyBJTy04MjY6ICBBZGQgQnJva2VuV3JpdGVyLkJyb2tlbldyaXRlcihUaHJvd2FibGUpLiBUaGFua3MgdG8gbWFya3NsYXRlciwgR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBZGQgQm91bmRlZElucHV0U3RyZWFtLmdldFJlbWFpbmluZygpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBZGQgRmlsZVRpbWVzLnRvTnRmc1RpbWUobG9uZykuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEFkZCBGaWxlVGltZXMuZnJvbVVuaXhUaW1lKGxvbmcpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBZGQgRmlsZVRpbWVzLmlzVW5peFRpbWUoRmlsZVRpbWUpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBZGQgRmlsZVRpbWVzLmlzVW5peFRpbWUobG9uZykuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEFkZCBGaWxlVGltZXMudG9Vbml4VGltZShGaWxlVGltZSkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEFkZCBCcm9rZW5JbnB1dFN0cmVhbS5CdWlsZGVyLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBZGQgUGF0aFV0aWxzLmdldEV4dGVuc2lvbihQYXRoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQWRkIFBhdGhVdGlscy5nZXRCYXNlTmFtZShQYXRoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQWRkIFRocm90dGxlZElucHV0U3RyZWFtLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBZGQgSU9SdW5uYWJsZS5ub29wKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEFkZCBDaGVja3N1bUlucHV0U3RyZWFtIGFuZCB0ZXN0ICM1NDguIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEFkZCBBYnN0cmFjdFN0cmVhbUJ1aWxkZXIuZ2V0UmVhZGVyKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEFkZCBNYXZlbiBwcm9wZXJ0eSBwcm9qZWN0LmJ1aWxkLm91dHB1dFRpbWVzdGFtcCBmb3IgYnVpbGQgcmVwcm9kdWNpYmlsaXR5LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBZGQgUHJveHlJbnB1dFN0cmVhbS51bndyYXAoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQWRkIGEgcnVubmluZyBjb3VudCBhbmQgYnVpbGRlciB0byBCb3VuZGVkSW5wdXRTdHJlYW0uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoKRml4ZWQgQnVncwotLS0tLS0tLS0tCgpvICAgICAgICAgIEZpeCBhbmQgcmUtZW5hYmxlIHRlc3RTa2lwX1JlcXVpcmVkQ2hhcnNldHMgIzUxOC4gVGhhbmtzIHRvIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZC4gCm8gSU8tODI0OiAgU3ltYm9saWNMaW5lRmlsZUZpbHRlciBkb2N1bWVudGF0aW9uIGZpeGVzLiBUaGFua3MgdG8gTWlndWVsIE11bm96LCBHYXJ5IEdyZWdvcnkuIApvIElPLTc5NTogIENoYXJTZXF1ZW5jZUlucHV0U3RyZWFtLnJlc2V0KCkgb25seSB3b3JrcyBvbmNlICM1MjAuIFRoYW5rcyB0byBNaWd1ZWwgTXVub3osIEdhcnkgR3JlZ29yeS4gCm8gSU8tNzk1OiAgRmluaXNoIFRPRE8gb24gQ2hhclNlcXVlbmNlSW5wdXRTdHJlYW0gIzU0MC4gVGhhbmtzIHRvIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZC4gCm8gSU8tODI1OiAgQWRkIGJ5dGUgYXJyYXkgc2l6ZSB2YWxpZGF0aW9uIGZvciBtZXRob2RzIGluIEVuZGlhblV0aWxzICM1MjEuIFRoYW5rcyB0byBBcnRodXIgQ2hhbiwgR2FyeSBHcmVnb3J5LiAKbyBJTy04MjU6ICBBZGQgbWlzc2luZyB0ZXN0IGNhc2UgQ2lyY3VsYXJCeXRlQnVmZmVyVGVzdC4gVGhhbmtzIHRvIGRrZGFsLCBHYXJ5IEdyZWdvcnkuIApvIElPLTc4MTogIE1ha2UgQ2hhclNlcXVlbmNlSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgbW9yZSBjb3JyZWN0IGluIHRoZSBmYWNlIG9mIG11bHRpYnl0ZSBlbmNvZGluZ3MgIzUyNS4gVGhhbmtzIHRvIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZC4gCm8gSU8tNzgxOiAgUmVtb3ZlIHVucmVhY2hhYmxlIGNvZGUgaW4gQWJzdHJhY3RJT0ZpbGVGaWx0ZXJUZXN0ICM1MjYuIFRoYW5rcyB0byBFbGxpb3R0ZSBSdXN0eSBIYXJvbGQuIApvIElPLTgwODogIFJhdGlvbmFsaXplIGFuZCB1bmlmeSBjaGVja2luZyBmb3IgZXhpc3RlbmNlIG9mIGZpbGVzIGFuZCBkaXJlY3RvcmllcyAjNTI5LiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLiAKbyAgICAgICAgICBBdm9pZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBJT0Nhc2UuY2hlY2tFcXVhbHMoU3RyaW5nLCBTdHJpbmcpIG9uIG51bGwgaW5wdXQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEF2b2lkIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIENhbkV4ZWN1dGVGaWxlRmlsdGVyLmFjY2VwdChGaWxlKSBvbiBudWxsIGlucHV0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBdm9pZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBDYW5FeGVjdXRlRmlsZUZpbHRlci5hY2NlcHQoUGF0aCwgQmFzaWNGaWxlQXR0cmlidXRlcykgb24gbnVsbCBpbnB1dC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQXZvaWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gQ2FuUmVhZEZpbGVGaWx0ZXIuYWNjZXB0KEZpbGUpIG9uIG51bGwgaW5wdXQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEF2b2lkIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIENhblJlYWRGaWxlRmlsdGVyLmFjY2VwdChQYXRoLCBCYXNpY0ZpbGVBdHRyaWJ1dGVzKSBvbiBudWxsIGlucHV0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBdm9pZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBDYW5Xcml0ZUZpbGVGaWx0ZXIuYWNjZXB0KEZpbGUpIG9uIG51bGwgaW5wdXQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEF2b2lkIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIENhbldyaXRlRmlsZUZpbHRlci5hY2NlcHQoUGF0aCwgQmFzaWNGaWxlQXR0cmlidXRlcykgb24gbnVsbCBpbnB1dC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQXZvaWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gRGlyZWN0b3J5RmlsZUZpbHRlci5hY2NlcHQoRmlsZSkgb24gbnVsbCBpbnB1dC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQXZvaWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gRGlyZWN0b3J5RmlsZUZpbHRlci5hY2NlcHQoUGF0aCwgQmFzaWNGaWxlQXR0cmlidXRlcykgb24gbnVsbCBpbnB1dC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQXZvaWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gRW1wdHlGaWxlRmlsdGVyLmFjY2VwdChGaWxlKSBvbiBudWxsIGlucHV0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBdm9pZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBFbXB0eUZpbGVGaWx0ZXIuYWNjZXB0KFBhdGgsIEJhc2ljRmlsZUF0dHJpYnV0ZXMpIG9uIG51bGwgaW5wdXQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEF2b2lkIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIEZpbGVGaWxlRmlsdGVyLmFjY2VwdChGaWxlKSBvbiBudWxsIGlucHV0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBdm9pZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBGaWxlRmlsZUZpbHRlci5hY2NlcHQoUGF0aCwgQmFzaWNGaWxlQXR0cmlidXRlcykgb24gbnVsbCBpbnB1dC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQXZvaWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gSGlkZGVuRmlsZUZpbHRlci5hY2NlcHQoRmlsZSkgb24gbnVsbCBpbnB1dC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQXZvaWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gSGlkZGVuRmlsZUZpbHRlci5hY2NlcHQoUGF0aCwgQmFzaWNGaWxlQXR0cmlidXRlcykgb24gbnVsbCBpbnB1dC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQXZvaWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gSU9DYXNlLmNoZWNrSW5kZXhPZihTdHJpbmcsIGludCwgU3RyaW5nKSBvbiBudWxsIGlucHV0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBdm9pZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBJT0Nhc2UuY2hlY2tSZWdpb25NYXRjaGVzKFN0cmluZywgaW50LCBTdHJpbmcpIG9uIG51bGwgaW5wdXQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEJvdW5kZWRJbnB1dFN0cmVhbS5nZXRDb3VudCgpIHNob3VsZCBub3QgY291bnQgRU9GLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBNb2Rlcm5pemUgdGVtcG9yYXJ5IGZpbGUgY3JlYXRpb24gYW5kIGRlbGV0aW9uIGluIERlZmVycmVkRmlsZU91dHB1dFN0cmVhbVRlc3QgIzUzNS4gVGhhbmtzIHRvIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZCwgR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBZGQgUGF0aE1hdGNoZXIgdG8gSU9GaWxlRmlsdGVyIGNsYXNzIEphdmFkb2MgIzUzNi4gVGhhbmtzIHRvIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZC4gCm8gSU8tNzgxOiAgRml4IENoYXJTZXF1ZW5jZUlucHV0U3RyZWFtIGNvZGluZyBleGNlcHRpb24gaGFuZGxpbmcgIzUzNy4gVGhhbmtzIHRvIE1hcmNvbm8xMjM0LiAKbyBJTy03ODE6ICBEZXByZWNhdGUgaW50IENvdW50aW5nSW5wdXRTdHJlYW0jZ2V0Q291bnQoKSBpbiBmYXZvciBvZiBsb25nIENvdW50aW5nSW5wdXRTdHJlYW0jZ2V0Qnl0ZUNvdW50KCkuIFRoYW5rcyB0byBNYXJjb25vMTIzNC4gCm8gSU8tODI4OiAgRGVwcmVjYXRlIENvdW50aW5nSW5wdXRTdHJlYW0ucmVzZXRDb3VudCgpIGluIGZhdm9yIG9mIHJlc2V0Qnl0ZUNvdW50KCkuIFRoYW5rcyB0byBFbGxpb3R0ZSBSdXN0eSBIYXJvbGQsIEdhcnkgR3JlZ29yeS4gCm8gSU8tODI4OiAgRGVwcmVjYXRlIENvdW50aW5nSW5wdXRTdHJlYW0uZ2V0TWF4TGVuZ3RoKCkgaW4gZmF2b3Igb2YgZ2V0TWF4Q291bnQoKSkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIElPLTgxODogIE51bGxJbnB1dFN0cmVhbSBicmVha3MgSW5wdXRTdHJlYW0ncyByZWFkIG1ldGhvZCBjb250cmFjdC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgSmF2YWRvYyBzaG91bGRuJ3QgcmVmZXJlbmNlIDEueCBiZWhhdmlvciAjNTM5LiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLiAKbyBJTy04Mjk6ICBEb24ndCBkZWNvZGUgYW5kIHJlZW5jb2RlIGNoYXJhY3RlcnMgaW4gYSBwb3RlbnRpYWxseSBkaWZmZXJlbnQgY2hhcnNldCBpbiBBYnN0cmFjdE9yaWdpbi5DaGFyU2VxdWVuY2VPcmlnaW4uZ2V0UmVhZGVyKENoYXJzZXQpLiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLCBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIExldCBzdWJjbGFzc2VzIG9mIENvdW50aW5nSW5wdXRTdHJlYW0uYWZ0ZXJSZWFkKGludCkgdGhyb3cgSU9FeGNlcHRpb24uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIElPLTgwNzogIENoYXJhY3Rlcml6YXRpb24gdGVzdCBmb3IgYnJva2VuIHN5bWxpbmtzIHdoZW4gY29weWluZyBkaXJlY3RvcmllcyAjNTQ3LiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLCBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIENsb3NlZElucHV0U3RyZWFtLnJlYWQoYnl0ZVtdLCBpbnQsIGludCkgZG9lcyBub3QgYWx3YXlzIHJldHVybiAtMS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgQ2xvc2VkT3V0cHV0U3RyZWFtLndyaXRlKGJ5dGVbXSwgaW50LCBpbnQpIGRvZXMgbm90IGFsd2F5cyB0aHJvdyBJT0V4Y2VwdGlvbi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgWG1sU3RyZWFtUmVhZGVyIGNhbid0IHBhcnNlIGFuIFhNTCBkb2N1bWVudCB3aXRoIGEgbXVsdGktbGluZSBwcm9sb2cgIzU1MC4gVGhhbmtzIHRvIFN5bHdlc3RlciBMYWNoaWV3aWN6LCBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIFhtbFN0cmVhbVJlYWRlciBjYW4ndCBwYXJzZSBYTUwgYW4gZG9jdW1lbnQgd2l0aCBhbiBleHRlcm5hbCBwYXJzZWQgZW50aXR5IHByb2xvZy4gVGhhbmtzIHRvIEFuZHJlYXMgSHVib2xkLCBHYXJ5IEdyZWdvcnkuIApvIElPLTgzNjogIFVwZGF0ZSBGaWxlTmFtZVV0aWxzIEphdmFkb2MgIzU1NC4gVGhhbmtzIHRvIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZC4gCm8gSU8tODA3OiAgQ29weSBzeW1saW5rcywgbm90IHRoZSBmaWxlcyB0aGUgc3ltbGlua3MgcG9pbnQgdG8gIzU1OC4gVGhhbmtzIHRvIEpvcmRpIFNvbGEsIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZC4gCm8gICAgICAgICAgUGlja3VwIGFwYWNoZS1yYXQtcGx1Z2luIHZlcnNpb24gZnJvbSBwYXJlbnQgUE9NLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBZGQgdGVzdCBmb3IgY29weWluZyBhIHN5bWxpbmsgRmlsZVV0aWxzVGVzdCN0ZXN0Q29weUZpbGVfc3ltTGluaygpICM1NjQuIFRoYW5rcyB0byBFbGxpb3R0ZSBSdXN0eSBIYXJvbGQuIApvICAgICAgICAgIE1ha2UgY29weUZpbGUgY29weSBzeW1ib2xpYyBsaW5rcyBieSB2YWx1ZSByYXRoZXIgdGhhbiByZWZlcmVuY2UgIzU2NS4gVGhhbmtzIHRvIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZC4gCm8gICAgICAgICAgRGVwcmVjYXRlIENvcHlVdGlscyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy04NDM6ICBEZXByZWNhdGUgRW5kaWFuVXRpbHMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeSwgRWxsaW90dGUgUnVzdHkgSGFyb2xkLiAKbyAgICAgICAgICBEZXByZWNhdGUgRmlsZVN5c3RlbVV0aWxzIDAtYXJndW1lbnQgY29uc3RydWN0b3IuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIERlcHJlY2F0ZSBGaWxlbmFtZVV0aWxzIDAtYXJndW1lbnQgY29uc3RydWN0b3IuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIERlcHJlY2F0ZSBSYW5kb21BY2Nlc3NGaWxlcyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBDbGFyaWZ5IGFuZCBjb3JyZWN0IEVuZGlhblV0aWxzIGFuZCBTd2FwcGVkRGF0YUlucHV0U3RyZWFtIEFQSSBkb2MgIzU2Ni4gVGhhbmtzIHRvIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZCwgR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBZGQgY2hhcmFjdGVyaXphdGlvbiB0ZXN0IGZvciBjb3B5aW5nIGEgc3ltbGlua2VkIGRpcmVjdG9yeSAjNTcwLiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLiAKbyAgICAgICAgICBSYW5kb21BY2Nlc3NGaWxlSW5wdXRTdHJlYW0uYnVpbGRlcigpLmdldCgpIG5vdyB0aHJvd3MgSVNFIGluc3RlYWQgb2YgTlBFLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy04NDU6ICBUZXN0IGxpbmtzIHRvIHRhcmdldHMgb3V0c2lkZSB0aGUgc291cmNlIGRpcmVjdG9yeSAjNTcxLiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLiAKbyAgICAgICAgICBGb2N1cyBKYXZhZG9jIG9uIGN1cnJlbnQgdmVyc2lvbiByYXRoZXIgdGhhbiBwYXN0IHZlcnNpb25zICM1NzMsICM1NzQuIFRoYW5rcyB0byBFbGxpb3R0ZSBSdXN0eSBIYXJvbGQuIApvIElPLTQ2OTogICJTZWxmLXN1cHByZXNzaW9uIG5vdCBwZXJtaXR0ZWQiIHdoaWxlIHVzaW5nIEJyb2tlbk91dHB1dCBhbmQgQnJva2VuSW5wdXQgc3RyZWFtcyB3aXRoIHRyeS13aXRoLXJlc291cmNlcy4gVGhhbmtzIHRvIEdyaWdvcnkgRmFkZWV2LCBLcmlzdGlhbiBSb3NlbnZvbGQsIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZC4gCm8gSU8tNDA1OiAgSGFuZGxlIHplcm8gYW5kIG5lZ2F0aXZlIHRocmVzaG9sZHMgIzU4Ny4gVGhhbmtzIHRvIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZC4gCm8gICAgICAgICAgRGVwcmVjYXRlIENvdW50aW5nSW5wdXRTdHJlYW0gaW4gZmF2b3Igb2YgQm91bmRlZElucHV0U3RyZWFtLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBQYXRoVXRpbHMuc2V0UG9zaXhQZXJtaXNzaW9ucyguLi4pIG9ubHkgc2V0cyBwZXJtaXNzaW9ucyBpZiBuZWVkZWQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIFBhdGhVdGlscy5zZXRSZWFkT25seSguLi4pIG9ubHkgc2V0cyBwZXJtaXNzaW9ucyBpZiBuZWVkZWQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIFBhdGhVdGlscy5kZWxldGVGaWxlKC4uLiwgRGVsZXRlT3B0aW9uLi4uKSBvbmx5IHNldHMgcGVybWlzc2lvbnMgaWYgbmVlZGVkLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBDbGVhbmluZ1BhdGhWaXNpdG9yIG9ubHkgc2V0cyBwZXJtaXNzaW9ucyBpZiBuZWVkZWQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIERlbGV0aW5nUGF0aFZpc2l0b3Igb25seSBzZXRzIHBlcm1pc3Npb25zIGlmIG5lZWRlZC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCgpDaGFuZ2VzCi0tLS0tLS0KCm8gICAgICAgICAgQnVtcCBjb21tb25zLmJ5dGVidWRkeS52ZXJzaW9uIGZyb20gMS4xNC4xMCB0byAxLjE0LjEyICM1MzQsICM1OTIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEJ1bXAgb3JnLmFwYWNoZS5jb21tb25zOmNvbW1vbnMtcGFyZW50IGZyb20gNjUgdG8gNjcuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgIEJ1bXAgY29tbW9ucy1jb2RlYzpjb21tb25zLWNvZGVjIGZyb20gMS4xNi4wIHRvIDEuMTYuMSAjNTgzLiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCm8gICAgICAgICAgQnVtcCBvcmcuY29kZWhhdXMubW9qbzpleGVjLW1hdmVuLXBsdWdpbiBmcm9tIDMuMS4xIHRvIDMuMi4wICM1OTMuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKCgpDb21tb25zIElPIDIuNyBhbmQgdXAgcmVxdWlyZXMgSmF2YSA4IG9yIGFib3ZlLgpDb21tb25zIElPIDIuNiByZXF1aXJlcyBKYXZhIDcgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4zIHRocm91Z2ggMi41IHJlcXVpcmVzIEphdmEgNiBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjIgcmVxdWlyZXMgSmF2YSA1IG9yIGFib3ZlLgpDb21tb25zIElPIDEuNCByZXF1aXJlcyBKYXZhIDEuMyBvciBhYm92ZS4KCkhpc3RvcmljYWwgbGlzdCBvZiBjaGFuZ2VzOiBodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby9jaGFuZ2VzLXJlcG9ydC5odG1sCgpGb3IgY29tcGxldGUgaW5mb3JtYXRpb24gb24gQXBhY2hlIENvbW1vbnMgSU8sIGluY2x1ZGluZyBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHN1Ym1pdCBidWcgcmVwb3J0cywKcGF0Y2hlcywgb3Igc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50LCBzZWUgdGhlIEFwYWNoZSBDb21tb25zIElPIHdlYnNpdGU6CgpodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby8KCkRvd25sb2FkIHBhZ2U6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2Rvd25sb2FkX2lvLmNnaQoKSGF2ZSBmdW4hCi1BcGFjaGUgQ29tbW9ucyBUZWFtCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgpBcGFjaGUgQ29tbW9ucyBJTyAKVmVyc2lvbiAyLjE1LjEKUmVsZWFzZSBOb3RlcwoKSW50cm9kdWN0aW9uCi0tLS0tLS0tLS0tLQoKQ29tbW9ucyBJTyBpcyBhIHBhY2thZ2Ugb2YgSmF2YSB1dGlsaXR5IGNsYXNzZXMgbGlrZSBqYXZhLmlvLiAgCkNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGFyZSBjb25zaWRlcmVkIHRvIGJlIHNvIHN0YW5kYXJkIGFuZCBvZiBzdWNoIGhpZ2ggCnJldXNlIGFzIHRvIGp1c3RpZnkgZXhpc3RlbmNlIGluIGphdmEuaW8uCgpUaGUgQXBhY2hlIENvbW1vbnMgSU8gbGlicmFyeSBjb250YWlucyB1dGlsaXR5IGNsYXNzZXMsIHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMsIGZpbGUgZmlsdGVycywKZmlsZSBjb21wYXJhdG9ycywgZW5kaWFuIHRyYW5zZm9ybWF0aW9uIGNsYXNzZXMsIGFuZCBtdWNoIG1vcmUuCgpKYXZhIDggaXMgcmVxdWlyZWQuCgpGaXhlZCBCdWdzCi0tLS0tLS0tLS0KCiogICAgICAgICAgIEZpeCB3cm9uZyBpc3N1ZSBpZCBpbiBjaGFuZ2UgbG9nICM1MDMuIFRoYW5rcyB0byBHcmVnb3IgRHNjaHVuZy4gCiogICAgICAgICAgIEFkZCB0ZXN0IGZvciBGaWxlQ2hhbm5lbHMuY29udGVudEVxdWFscygpICM1MDkuIFRoYW5rcyB0byBTdGVwaGFuIE1hcmt3YWxkZXIsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEZpeCBGaWxlQ2hhbm5lbHMuY29udGVudEVxdWFscygpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRml4IHNvbWUgSmF2YWRvYyBpc3N1ZXMgaW4gTGluZUl0ZXJhdG9yIGFuZCBJT1V0aWxzLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgU2ltcGxpZnkgRmlsZUFsdGVyYXRpb25PYnNlcnZlciBpbnRlcm5hbCBwcm9jZXNzaW5nLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQXZvaWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gUmVnZXhGaWxlRmlsdGVyLlJlZ2V4RmlsZUZpbHRlcihQYXR0ZXJuKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEF2b2lkIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIFJlZ2V4RmlsZUZpbHRlci5hY2NlcHQoUGF0aCwgQmFzaWNGaWxlQXR0cmlidXRlcykuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBGaXggU3BvdEJ1Z3MgZXJyb3I6IENsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5pby5maWxlZmlsdGVyLlJlZ2V4RmlsZUZpbHRlciBkZWZpbmVzIG5vbi10cmFuc2llbnQgbm9uLXNlcmlhbGl6YWJsZSBpbnN0YW5jZSBmaWVsZCBwYXRoVG9TdHJpbmcgW29yZy5hcGFjaGUuY29tbW9ucy5pby5maWxlZmlsdGVyLlJlZ2V4RmlsZUZpbHRlcl0gSW4gUmVnZXhGaWxlRmlsdGVyLmphdmEgU0VfQkFEX0ZJRUxELiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRml4IFNwb3RCdWdzIGVycm9yOiBDbGFzcyBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uZmlsZWZpbHRlci5EZWxlZ2F0ZUZpbGVGaWx0ZXIgZGVmaW5lcyBub24tdHJhbnNpZW50IG5vbi1zZXJpYWxpemFibGUgaW5zdGFuY2UgZmllbGQgZmlsZUZpbHRlciBbb3JnLmFwYWNoZS5jb21tb25zLmlvLmZpbGVmaWx0ZXIuRGVsZWdhdGVGaWxlRmlsdGVyXSBJbiBEZWxlZ2F0ZUZpbGVGaWx0ZXIuamF2YSBTRV9CQURfRklFTEQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBGaXggU3BvdEJ1Z3MgZXJyb3I6IENsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5pby5maWxlZmlsdGVyLkRlbGVnYXRlRmlsZUZpbHRlciBkZWZpbmVzIG5vbi10cmFuc2llbnQgbm9uLXNlcmlhbGl6YWJsZSBpbnN0YW5jZSBmaWVsZCBmaWxlTmFtZUZpbHRlciBbb3JnLmFwYWNoZS5jb21tb25zLmlvLmZpbGVmaWx0ZXIuRGVsZWdhdGVGaWxlRmlsdGVyXSBJbiBEZWxlZ2F0ZUZpbGVGaWx0ZXIuamF2YSBTRV9CQURfRklFTEQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBGaXggU3BvdEJ1Z3MgZXJyb3I6IG9yZy5hcGFjaGUuY29tbW9ucy5pby5mdW5jdGlvbi5JT1N0cmVhbSQxLm5leHQoKSBjYW5ub3QgdGhyb3cgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBbb3JnLmFwYWNoZS5jb21tb25zLmlvLmZ1bmN0aW9uLklPU3RyZWFtJDFdIEF0IElPU3RyZWFtLmphdmE6W2xpbmUgOThdIElUX05PX1NVQ0hfRUxFTUVOVC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEZpeCBTcG90QnVncyBlcnJvcjogb3JnLmFwYWNoZS5jb21tb25zLmlvLm1vbml0b3IuRmlsZUFsdGVyYXRpb25Nb25pdG9yLmdldE9ic2VydmVycygpIG1heSBleHBvc2UgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gYnkgcmV0dXJuaW5nIEZpbGVBbHRlcmF0aW9uTW9uaXRvci5vYnNlcnZlcnMgW29yZy5hcGFjaGUuY29tbW9ucy5pby5tb25pdG9yLkZpbGVBbHRlcmF0aW9uTW9uaXRvcl0gQXQgRmlsZUFsdGVyYXRpb25Nb25pdG9yLmphdmE6W2xpbmUgMTI0XSBFSV9FWFBPU0VfUkVQLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRml4IFNwb3RCdWdzIGVycm9yOiBDbGFzcyBvcmcuYXBhY2hlLmNvbW1vbnMuaW8ubW9uaXRvci5GaWxlQWx0ZXJhdGlvbk9ic2VydmVyIGRlZmluZXMgbm9uLXRyYW5zaWVudCBub24tc2VyaWFsaXphYmxlIGluc3RhbmNlIGZpZWxkIGZpbGVGaWx0ZXIgW29yZy5hcGFjaGUuY29tbW9ucy5pby5tb25pdG9yLkZpbGVBbHRlcmF0aW9uT2JzZXJ2ZXJdIEluIEZpbGVBbHRlcmF0aW9uT2JzZXJ2ZXIuamF2YSBTRV9CQURfRklFTEQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBGaXggU3BvdEJ1Z3MgZXJyb3I6IENsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5pby5tb25pdG9yLkZpbGVBbHRlcmF0aW9uT2JzZXJ2ZXIgZGVmaW5lcyBub24tdHJhbnNpZW50IG5vbi1zZXJpYWxpemFibGUgaW5zdGFuY2UgZmllbGQgbGlzdGVuZXJzIFtvcmcuYXBhY2hlLmNvbW1vbnMuaW8ubW9uaXRvci5GaWxlQWx0ZXJhdGlvbk9ic2VydmVyXSBJbiBGaWxlQWx0ZXJhdGlvbk9ic2VydmVyLmphdmEgU0VfQkFEX0ZJRUxELiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRml4IFNwb3RCdWdzIGVycm9yOiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZUNsZWFuaW5nVHJhY2tlci5nZXREZWxldGVGYWlsdXJlcygpIG1heSBleHBvc2UgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gYnkgcmV0dXJuaW5nIEZpbGVDbGVhbmluZ1RyYWNrZXIuZGVsZXRlRmFpbHVyZXMgW29yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlQ2xlYW5pbmdUcmFja2VyXSBBdCBGaWxlQ2xlYW5pbmdUcmFja2VyLmphdmE6W2xpbmUgMjE4XSBFSV9FWFBPU0VfUkVQLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRml4IFNwb3RCdWdzIGVycm9yOiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9FeGNlcHRpb25MaXN0LmdldENhdXNlTGlzdCgpIG1heSBleHBvc2UgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gYnkgcmV0dXJuaW5nIElPRXhjZXB0aW9uTGlzdC5jYXVzZUxpc3QgW29yZy5hcGFjaGUuY29tbW9ucy5pby5JT0V4Y2VwdGlvbkxpc3RdIEF0IElPRXhjZXB0aW9uTGlzdC5qYXZhOltsaW5lIDExOF0gRUlfRVhQT1NFX1JFUC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEZpeCBTcG90QnVncyBlcnJvcjogb3JnLmFwYWNoZS5jb21tb25zLmlvLklPRXhjZXB0aW9uTGlzdC5nZXRDYXVzZUxpc3QoQ2xhc3MpIG1heSBleHBvc2UgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gYnkgcmV0dXJuaW5nIElPRXhjZXB0aW9uTGlzdC5jYXVzZUxpc3QgW29yZy5hcGFjaGUuY29tbW9ucy5pby5JT0V4Y2VwdGlvbkxpc3RdIEF0IElPRXhjZXB0aW9uTGlzdC5qYXZhOltsaW5lIDEyOV0gRUlfRVhQT1NFX1JFUC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEZpeCBTcG90QnVncyBlcnJvcjogb3JnLmFwYWNoZS5jb21tb25zLmlvLmZpbGUuQWNjdW11bGF0b3JQYXRoVmlzaXRvci5nZXREaXJMaXN0KCkgbWF5IGV4cG9zZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBieSByZXR1cm5pbmcgQWNjdW11bGF0b3JQYXRoVmlzaXRvci5kaXJMaXN0IFtvcmcuYXBhY2hlLmNvbW1vbnMuaW8uZmlsZS5BY2N1bXVsYXRvclBhdGhWaXNpdG9yXSBBdCBBY2N1bXVsYXRvclBhdGhWaXNpdG9yLmphdmE6W2xpbmUgMTc5XSBFSV9FWFBPU0VfUkVQLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRml4IFNwb3RCdWdzIGVycm9yOiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uZmlsZS5BY2N1bXVsYXRvclBhdGhWaXNpdG9yLmdldEZpbGVMaXN0KCkgbWF5IGV4cG9zZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBieSByZXR1cm5pbmcgQWNjdW11bGF0b3JQYXRoVmlzaXRvci5maWxlTGlzdCBbb3JnLmFwYWNoZS5jb21tb25zLmlvLmZpbGUuQWNjdW11bGF0b3JQYXRoVmlzaXRvcl0gQXQgQWNjdW11bGF0b3JQYXRoVmlzaXRvci5qYXZhOltsaW5lIDE4OF0gRUlfRVhQT1NFX1JFUC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEZpeCBTcG90QnVncyBlcnJvcjogb3JnLmFwYWNoZS5jb21tb25zLmlvLmlucHV0Lk9ic2VydmFibGVJbnB1dFN0cmVhbS5nZXRPYnNlcnZlcnMoKSBtYXkgZXhwb3NlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGJ5IHJldHVybmluZyBPYnNlcnZhYmxlSW5wdXRTdHJlYW0ub2JzZXJ2ZXJzIFtvcmcuYXBhY2hlLmNvbW1vbnMuaW8uaW5wdXQuT2JzZXJ2YWJsZUlucHV0U3RyZWFtXSBBdCBPYnNlcnZhYmxlSW5wdXRTdHJlYW0uamF2YTpbbGluZSAxODddIEVJX0VYUE9TRV9SRVAuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBGaXggU3BvdEJ1Z3MgZXJyb3I6IEV4Y2VwdGlvbiB0aHJvd24gaW4gY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmlvLmlucHV0LlVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW0gYXQgbmV3IG9yZy5hcGFjaGUuY29tbW9ucy5pby5pbnB1dC5VbnN5bmNocm9uaXplZEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVbXSwgaW50KSB3aWxsIGxlYXZlIHRoZSBjb25zdHJ1Y3Rvci4gVGhlIG9iamVjdCB1bmRlciBjb25zdHJ1Y3Rpb24gcmVtYWlucyBwYXJ0aWFsbHkgaW5pdGlhbGl6ZWQgYW5kIG1heSBiZSB2dWxuZXJhYmxlIHRvIEZpbmFsaXplciBhdHRhY2tzLiBbb3JnLmFwYWNoZS5jb21tb25zLmlvLmlucHV0LlVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW0sIG9yZy5hcGFjaGUuY29tbW9ucy5pby5pbnB1dC5VbnN5bmNocm9uaXplZEJ5dGVBcnJheUlucHV0U3RyZWFtXSBBdCBVbnN5bmNocm9uaXplZEJ5dGVBcnJheUlucHV0U3RyZWFtLmphdmE6W2xpbmUgMjAyXUF0IFVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW0uamF2YTpbbGluZSAyMDJdIENUX0NPTlNUUlVDVE9SX1RIUk9XLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRml4IFNwb3RCdWdzIGVycm9yOiBFeGNlcHRpb24gdGhyb3duIGluIGNsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5pby5pbnB1dC5VbnN5bmNocm9uaXplZEJ5dGVBcnJheUlucHV0U3RyZWFtIGF0IG5ldyBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uaW5wdXQuVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlW10sIGludCwgaW50KSB3aWxsIGxlYXZlIHRoZSBjb25zdHJ1Y3Rvci4gVGhlIG9iamVjdCB1bmRlciBjb25zdHJ1Y3Rpb24gcmVtYWlucyBwYXJ0aWFsbHkgaW5pdGlhbGl6ZWQgYW5kIG1heSBiZSB2dWxuZXJhYmxlIHRvIEZpbmFsaXplciBhdHRhY2tzLiBbb3JnLmFwYWNoZS5jb21tb25zLmlvLmlucHV0LlVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW0sIG9yZy5hcGFjaGUuY29tbW9ucy5pby5pbnB1dC5VbnN5bmNocm9uaXplZEJ5dGVBcnJheUlucHV0U3RyZWFtXSBBdCBVbnN5bmNocm9uaXplZEJ5dGVBcnJheUlucHV0U3RyZWFtLmphdmE6W2xpbmUgMjIzXUF0IFVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW0uamF2YTpbbGluZSAyMjNdIENUX0NPTlNUUlVDVE9SX1RIUk9XLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKCkNoYW5nZXMKLS0tLS0tLQoKKiAgICAgICAgICAgQnVtcCBvcmcuY29kZWhhdXMubW9qbzpleGVjLW1hdmVuLXBsdWdpbiBmcm9tIDMuMS4wIHRvIDMuMS4xICM1MTIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBCdW1wIGNvbW1vbnMtbGFuZzMgZnJvbSAzLjEzLjAgdG8gMy4xNC4wLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQnVtcCBjb21tb25zLmJ5dGVidWRkeS52ZXJzaW9uIGZyb20gMS4xNC45IHRvIDEuMTQuMTAgIzUxNi4gVGhhbmtzIHRvIERlcGVuZGFib3QuIAoqICAgICAgICAgICBCdW1wIGNvbW1vbnMtcGFyZW50IGZyb20gNjQgdG8gNjUuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKCkNvbXBhdGliaWxpdHkgd2l0aCAyLjY6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBZZXMuClNlbWFudGljIGNvbXBhdGlibGU6IFllcy4KCkNvbW1vbnMgSU8gMi43IGFuZCB1cCByZXF1aXJlcyBKYXZhIDggb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi42IHJlcXVpcmVzIEphdmEgNyBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjMgdGhyb3VnaCAyLjUgcmVxdWlyZXMgSmF2YSA2IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMiByZXF1aXJlcyBKYXZhIDUgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlLgoKSGlzdG9yaWNhbCBsaXN0IG9mIGNoYW5nZXM6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2NoYW5nZXMtcmVwb3J0Lmh0bWwKCkZvciBjb21wbGV0ZSBpbmZvcm1hdGlvbiBvbiBBcGFjaGUgQ29tbW9ucyBJTywgaW5jbHVkaW5nIGluc3RydWN0aW9ucyBvbiBob3cgdG8gc3VibWl0IGJ1ZyByZXBvcnRzLApwYXRjaGVzLCBvciBzdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnQsIHNlZSB0aGUgQXBhY2hlIENvbW1vbnMgSU8gd2Vic2l0ZToKCmh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvLwoKRG93bmxvYWQgcGFnZTogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vZG93bmxvYWRfaW8uY2dpCgpIYXZlIGZ1biEKLUFwYWNoZSBDb21tb25zIFRlYW0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQXBhY2hlIENvbW1vbnMgSU8gClZlcnNpb24gMi4xNS4wClJlbGVhc2UgTm90ZXMKCkludHJvZHVjdGlvbgotLS0tLS0tLS0tLS0KCkNvbW1vbnMgSU8gaXMgYSBwYWNrYWdlIG9mIEphdmEgdXRpbGl0eSBjbGFzc2VzIGxpa2UgamF2YS5pby4gIApDbGFzc2VzIGluIHRoaXMgcGFja2FnZSBhcmUgY29uc2lkZXJlZCB0byBiZSBzbyBzdGFuZGFyZCBhbmQgb2Ygc3VjaCBoaWdoIApyZXVzZSBhcyB0byBqdXN0aWZ5IGV4aXN0ZW5jZSBpbiBqYXZhLmlvLgoKVGhlIEFwYWNoZSBDb21tb25zIElPIGxpYnJhcnkgY29udGFpbnMgdXRpbGl0eSBjbGFzc2VzLCBzdHJlYW0gaW1wbGVtZW50YXRpb25zLCBmaWxlIGZpbHRlcnMsCmZpbGUgY29tcGFyYXRvcnMsIGVuZGlhbiB0cmFuc2Zvcm1hdGlvbiBjbGFzc2VzLCBhbmQgbXVjaCBtb3JlLgoKSmF2YSA4IGlzIHJlcXVpcmVkLgoKTmV3IGZlYXR1cmVzCi0tLS0tLS0tLS0tLQoKKiAgICAgICAgICAgQWRkIG9yZy5hcGFjaGUuY29tbW9ucy5pby5jaGFubmVscy5GaWxlQ2hhbm5lbHMuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgUmFuZG9tQWNjZXNzRmlsZXMjY29udGVudEVxdWFscyhSYW5kb21BY2Nlc3NGaWxlLCBSYW5kb21BY2Nlc3NGaWxlKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBSYW5kb21BY2Nlc3NGaWxlcyNyZXNldChSYW5kb21BY2Nlc3NGaWxlKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBQYXRoVXRpbHNDb250ZW50RXF1YWxzQmVuY2htYXJrLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIG9yZy5hcGFjaGUuY29tbW9ucy5pby5TdHJlYW1JdGVyYXRvci4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBNZXNzYWdlRGlnZXN0SW5wdXRTdHJlYW0gYW5kIGRlcHJlY2F0ZSBNZXNzYWdlRGlnZXN0Q2FsY3VsYXRpbmdJbnB1dFN0cmVhbS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCgpGaXhlZCBCdWdzCi0tLS0tLS0tLS0KCiogSU8tODE1OiAgWG1sU3RyZWFtUmVhZGVyIGVuY29kaW5nIG1hdGNoIFJFIGlzIHRvbyBzdHJpY3QuIFRoYW5rcyB0byBMYXVyZW5jZSBHb25zYWx2ZXMuIAoqIElPLTgxMDogIEphdmFkb2MgaW4gRmlsZVV0aWxzIGRvZXMgbm90IHJlZmxlY3QgY29kZSBmb3IgdGhyb3duIGV4Y2VwdGlvbnMuIFRoYW5rcyB0byBHcmVnb3IgRHNjaHVuZywgR2FyeSBHcmVnb3J5LiAKKiBJTy04MTI6ICBKYXZhZG9jIHNob3VsZCBtZW50aW9uIGNsb3NpbmcgU3RyZWFtcyBiYXNlZCBvbiBmaWxlIHJlc291cmNlcy4gVGhhbmtzIHRvIEFkYW0gUmF1Y2gsIEdhcnkgR3JlZ29yeS4gCiogSU8tODExOiAgSW4gdGVzdHMsIEZpbGVzLndhbGsoKSBkaXJlY3QgYW5kIGluZGlyZWN0IGNhbGxlcnMgZmFpbCB0byBjbG9zZSB0aGUgcmV0dXJuZWQgU3RyZWFtLiBUaGFua3MgdG8gQWRhbSBSYXVjaCwgR2FyeSBHcmVnb3J5LiAKKiBJTy04MTE6ICBGaWxlVXRpbHMubGlzdEZpbGVzKEZpbGUsIFN0cmluZ1tdLCBib29sZWFuKSBmYWlscyB0byBjbG9zZSBpdHMgaW50ZXJuYWwgU3RyZWFtLiBUaGFua3MgdG8gQWRhbSBSYXVjaCwgR2FyeSBHcmVnb3J5LiAKKiBJTy04MTE6ICBGaWxlVXRpbHMuaXRlcmF0ZUZpbGVzKEZpbGUsIFN0cmluZ1tdLCBib29sZWFuKSBmYWlscyB0byBjbG9zZSBpdHMgaW50ZXJuYWwgU3RyZWFtLiBUaGFua3MgdG8gQWRhbSBSYXVjaCwgR2FyeSBHcmVnb3J5LiAKKiBJTy04MTE6ICBTdHJlYW1JdGVyYXRvciBmYWlscyB0byBjbG9zZSBpdHMgaW50ZXJuYWwgU3RyZWFtLiBUaGFua3MgdG8gQWRhbSBSYXVjaCwgR2FyeSBHcmVnb3J5LiAKKiBJTy04MTQ6ICBEb24ndCB0aHJvdyBVbmNoZWNrZWRJT0V4Y2VwdGlvbiAjNDkxLiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTQxNDogIERvbid0IHdyaXRlIGEgQk9NIG9uIGV2ZXJ5IChvciBhbnkpIGxpbmUgIzQ5Mi4gVGhhbmtzIHRvIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZCwgR2FyeSBHcmVnb3J5LiAKKiBJTy04MTQ6ICBSYW5kb21BY2Nlc3NGaWxlTW9kZS5jcmVhdGUoUGF0aCkgcHJvdmlkZXMgYSBiZXR0ZXIgTnVsbFBvaW50ZXJFeGNlcHRpb24gbWVzc2FnZS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEltcHJvdmUgcGVyZm9ybWFuY2Ugb2YgUGF0aFV0aWxzLmZpbGVDb250ZW50RXF1YWxzKFBhdGgsIFBhdGgsIExpbmtPcHRpb25bXSwgT3Blbk9wdGlvbltdKSBieSBhYm91dCA2MCUsIHNlZSBQYXRoVXRpbHNDb250ZW50RXF1YWxzQmVuY2htYXJrLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgSW1wcm92ZSBwZXJmb3JtYW5jZSBvZiBQYXRoVXRpbHMuZmlsZUNvbnRlbnRFcXVhbHMoUGF0aCwgUGF0aCkgYnkgYWJvdXQgNjAlLCBzZWUgUGF0aFV0aWxzQ29udGVudEVxdWFsc0JlbmNobWFyay4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEltcHJvdmUgcGVyZm9ybWFuY2Ugb2YgRmlsZVV0aWxzLmNvbnRlbnRFcXVhbHMoRmlsZSwgRmlsZSkgYnkgYWJvdXQgNjAlLCBzZWUgUGF0aFV0aWxzQ29udGVudEVxdWFsc0JlbmNobWFyay4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIFJlbW92ZSB1bnVzZWQgdGVzdCBjb2RlICM0OTQuIFRoYW5rcyB0byBFbGxpb3R0ZSBSdXN0eSBIYXJvbGQuIAoqICAgICAgICAgICBbSmF2YWRvY10gSU9VdGlscyNjb250ZW50RXF1YWxzIGRvZXMgbm90IHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uICM0OTYuIFRoYW5rcyB0byBzZWJiQVNGLiAKKiAgICAgICAgICAgRml4IENvZGVRTCB3YXJuaW5ncyBpbiBVbnN5bmNocm9uaXplZEJ1ZmZlcmVkSW5wdXRTdHJlYW06IEltcGxpY2l0IG5hcnJvd2luZyBjb252ZXJzaW9uIGluIGNvbXBvdW5kIGFzc2lnbm1lbnQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBNZXNzYWdlRGlnZXN0Q2FsY3VsYXRpbmdJbnB1dFN0cmVhbS5NZXNzYWdlRGlnZXN0TWFpbnRhaW5pbmdPYnNlcnZlci5NZXNzYWdlRGlnZXN0TWFpbnRhaW5pbmdPYnNlcnZlcihNZXNzYWdlRGlnZXN0KSBub3cgdGhyb3dzIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24KICAgICAgICBpZiB0aGUgTWVzc2FnZURpZ2VzdCBpcyBudWxsLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgTWVzc2FnZURpZ2VzdENhbGN1bGF0aW5nSW5wdXRTdHJlYW0uTWVzc2FnZURpZ2VzdENhbGN1bGF0aW5nSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0sIE1lc3NhZ2VEaWdlc3QpIG5vdyB0aHJvd3MgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbgogICAgICAgIGlmIHRoZSBNZXNzYWdlRGlnZXN0IGlzIG51bGwuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTgxNjogIFVuc3luY2hyb25pemVkQnVmZmVyZWRJbnB1dFN0cmVhbS5yZWFkKGJ5dGVbXSwgaW50LCBpbnQpIGRvZXMgbm90IHVzZSBidWZmZXIuIFRoYW5rcyB0byBBbmRyZWFzIExvdGgsIEdhcnkgR3JlZ29yeS4gCgpDaGFuZ2VzCi0tLS0tLS0KCiogICAgICAgICAgIEJ1bXAgb3JnLmFwYWNoZS5jb21tb25zOmNvbW1vbnMtcGFyZW50IGZyb20gNjIgdG8gNjQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuNjoKQmluYXJ5IGNvbXBhdGlibGU6IFllcy4KU291cmNlIGNvbXBhdGlibGU6IFllcy4KU2VtYW50aWMgY29tcGF0aWJsZTogWWVzLgoKQ29tbW9ucyBJTyAyLjcgYW5kIHVwIHJlcXVpcmVzIEphdmEgOCBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjYgcmVxdWlyZXMgSmF2YSA3IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMyB0aHJvdWdoIDIuNSByZXF1aXJlcyBKYXZhIDYgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4yIHJlcXVpcmVzIEphdmEgNSBvciBhYm92ZS4KQ29tbW9ucyBJTyAxLjQgcmVxdWlyZXMgSmF2YSAxLjMgb3IgYWJvdmUuCgpIaXN0b3JpY2FsIGxpc3Qgb2YgY2hhbmdlczogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vY2hhbmdlcy1yZXBvcnQuaHRtbAoKRm9yIGNvbXBsZXRlIGluZm9ybWF0aW9uIG9uIEFwYWNoZSBDb21tb25zIElPLCBpbmNsdWRpbmcgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBzdWJtaXQgYnVnIHJlcG9ydHMsCnBhdGNoZXMsIG9yIHN1Z2dlc3Rpb25zIGZvciBpbXByb3ZlbWVudCwgc2VlIHRoZSBBcGFjaGUgQ29tbW9ucyBJTyB3ZWJzaXRlOgoKaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vCgpEb3dubG9hZCBwYWdlOiBodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby9kb3dubG9hZF9pby5jZ2kKCkhhdmUgZnVuIQotQXBhY2hlIENvbW1vbnMgVGVhbQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBcGFjaGUgQ29tbW9ucyBJTyAKVmVyc2lvbiAyLjE0LjAKUmVsZWFzZSBOb3RlcwoKSW50cm9kdWN0aW9uCi0tLS0tLS0tLS0tLQoKQ29tbW9ucyBJTyBpcyBhIHBhY2thZ2Ugb2YgSmF2YSB1dGlsaXR5IGNsYXNzZXMgbGlrZSBqYXZhLmlvLiAgCkNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGFyZSBjb25zaWRlcmVkIHRvIGJlIHNvIHN0YW5kYXJkIGFuZCBvZiBzdWNoIGhpZ2ggCnJldXNlIGFzIHRvIGp1c3RpZnkgZXhpc3RlbmNlIGluIGphdmEuaW8uCgpUaGUgQXBhY2hlIENvbW1vbnMgSU8gbGlicmFyeSBjb250YWlucyB1dGlsaXR5IGNsYXNzZXMsIHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMsIGZpbGUgZmlsdGVycywKZmlsZSBjb21wYXJhdG9ycywgZW5kaWFuIHRyYW5zZm9ybWF0aW9uIGNsYXNzZXMsIGFuZCBtdWNoIG1vcmUuCgpKYXZhIDggcmVxdWlyZWQuCgpOZXcgZmVhdHVyZXMKLS0tLS0tLS0tLS0tCgoqICAgICAgICAgICBBZGQgRGVmZXJyZWRGaWxlT3V0cHV0U3RyZWFtLmdldFBhdGgoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBGaWxlQ2xlYW5pbmdUcmFja2VyLnRyYWNrKFBhdGgsIE9iamVjdFssIEZpbGVEZWxldGVTdHJhdGVneV0pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIElPVXRpbHMuc2tpcFtGdWxseV0oSW5wdXRTdHJlYW0sIGxvbmcsIFN1cHBsaWVyPGJ5dGVbXT4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIEZpbGVzVW5jaGVjay5maW5kKFBhdGgsIGludCwgQmlQcmVkaWNhdGUlbHQ7UGF0aCwgQmFzaWNGaWxlQXR0cmlidXRlcz4sIEZpbGVWaXNpdE9wdGlvbi4uLikgVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBJT0ludFN1cHBsaWVyLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIElPTG9uZ1N1cHBsaWVyLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFVuY2hlY2suZ2V0QXNJbnQoSU9JbnRTdXBwbGllciBbLCBTdXBwbGllcjxTdHJpbmc+XSkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgVW5jaGVjay5nZXRBc0xvbmcoSU9Mb25nU3VwcGxpZXIgWywgU3VwcGxpZXI8U3RyaW5nPl0pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFVuY2hlY2sucnVuKElPUnVubmFibGUsIFN1cHBsaWVyPFN0cmluZz4pIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgVW5jaGVjay5nZXQoSU9TdXBwbGllciwgU3VwcGxpZXI8U3RyaW5nPikgVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIElPRmlsZUZpbHRlciBub3cgYWxzbyBleHRlbmRzIGphdmEubmlvLmZpbGUuUGF0aE1hdGNoZXIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgUGF0aE1hdGNoZXJGaWxlRmlsdGVyIHRvIGFkYXB0IGphdmEubmlvLmZpbGUuUGF0aE1hdGNoZXIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgVGhyZXNob2xkaW5nT3V0cHV0U3RyZWFtLmdldE91dHB1dFN0cmVhbSgpIGFuZCBkZXByZWNhdGUgZ2V0U3RyZWFtKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgRGVmZXJyZWRGaWxlT3V0cHV0U3RyZWFtLkJ1aWxkZXIuc2V0T3V0cHV0RmlsZShQYXRoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBEZWZlcnJlZEZpbGVPdXRwdXRTdHJlYW0uQnVpbGRlci5zZXREaXJlY3RvcnkoUGF0aCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgQWJzdHJhY3RTdHJlYW1CdWlsZGVyLnNldEJ1ZmZlclNpemVDaGVja2VyKEludFRvSW50RnVuY3Rpb24pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIEFic3RyYWN0U3RyZWFtQnVpbGRlci5zZXRCdWZmZXJTaXplTWF4KGludCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoKRml4ZWQgQnVncwotLS0tLS0tLS0tCgoqIElPLTc5OTogIFJlYWRlcklucHV0U3RyZWFtLnJlYWQoKSB0aHJvd3MgYW4gZXhjZXB0aW9uIGluc3RlYWQgb2YgcmV0dXJuaW5nIC0xIHdoZW4gY2FsbGVkIGFnYWluIGFmdGVyIHJldHVybmluZyAtMS4gVGhhbmtzIHRvIEplcm9lbiB2YW4gZGVyIFZlZ3QsIEdhcnkgR3JlZ29yeS4gCiogSU8tODA0OiAgRmlsZVV0aWxzLmZvcmNlTWtkaXJQYXJlbnQoKSBKYXZhZG9jIGlzIGluY29ycmVjdC4gVGhhbmtzIHRvIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZCwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgW1N0ZXBTZWN1cml0eV0gY2k6IEhhcmRlbiBHaXRIdWIgQWN0aW9ucyAjNDYxLiBUaGFua3MgdG8gc3RlcC1zZWN1cml0eS1ib3QsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIE1hZ2ljTnVtYmVyRmlsZUZpbHRlci5hY2NlcHQoUGF0aCwgQmFzaWNGaWxlQXR0cmlidXRlcykgZG9lc24ndCBpdHMgYnl0ZU9mZnNldCBiZWZvcmUgcmVhZGluZy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEphdmFkb2MgaW1wcm92ZW1lbnRzLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgU3BlbGxpbmcgIzQ2OC4gVGhhbmtzIHRvIEpvc2ggU29yZWYsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIFVzZSBhc3NlcnRUaHJvd3MgIzQ3NS4gVGhhbmtzIHRvIEpha3ViIEt1cGN6eWsuIAoKQ2hhbmdlcwotLS0tLS0tCgoqICAgICAgICAgICBCdW1wIGppbWZzIGZyb20gMS4yIHRvIDEuMy4wICM0NjUgKHRlc3RzKS4gVGhhbmtzIHRvIERlcGVuZGFib3QuIAoqICAgICAgICAgICBCdW1wIGNvbW1vbnMtcGFyZW50IGZyb20gNTggdG8gNjIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBCdW1wIGNvbW1vbnMtbGFuZzMgZnJvbSAzLjEyIHRvIDMuMTMuMC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCgpDb21wYXRpYmlsaXR5IHdpdGggMi42OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogWWVzLgpTZW1hbnRpYyBjb21wYXRpYmxlOiBZZXMuCgpDb21tb25zIElPIDIuNyBhbmQgdXAgcmVxdWlyZXMgSmF2YSA4IG9yIGFib3ZlLgpDb21tb25zIElPIDIuNiByZXF1aXJlcyBKYXZhIDcgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4zIHRocm91Z2ggMi41IHJlcXVpcmVzIEphdmEgNiBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjIgcmVxdWlyZXMgSmF2YSA1IG9yIGFib3ZlLgpDb21tb25zIElPIDEuNCByZXF1aXJlcyBKYXZhIDEuMyBvciBhYm92ZS4KCkhpc3RvcmljYWwgbGlzdCBvZiBjaGFuZ2VzOiBodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby9jaGFuZ2VzLXJlcG9ydC5odG1sCgpGb3IgY29tcGxldGUgaW5mb3JtYXRpb24gb24gQXBhY2hlIENvbW1vbnMgSU8sIGluY2x1ZGluZyBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHN1Ym1pdCBidWcgcmVwb3J0cywKcGF0Y2hlcywgb3Igc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50LCBzZWUgdGhlIEFwYWNoZSBDb21tb25zIElPIHdlYnNpdGU6CgpodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby8KCkRvd25sb2FkIHBhZ2U6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2Rvd25sb2FkX2lvLmNnaQoKSGF2ZSBmdW4hCi1BcGFjaGUgQ29tbW9ucyBUZWFtCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkFwYWNoZSBDb21tb25zIElPIApWZXJzaW9uIDIuMTMuMApSZWxlYXNlIE5vdGVzCgpJbnRyb2R1Y3Rpb24KLS0tLS0tLS0tLS0tCgpDb21tb25zIElPIGlzIGEgcGFja2FnZSBvZiBKYXZhIHV0aWxpdHkgY2xhc3NlcyBsaWtlIGphdmEuaW8uICAKQ2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc28gc3RhbmRhcmQgYW5kIG9mIHN1Y2ggaGlnaCAKcmV1c2UgYXMgdG8ganVzdGlmeSBleGlzdGVuY2UgaW4gamF2YS5pby4KClRoZSBBcGFjaGUgQ29tbW9ucyBJTyBsaWJyYXJ5IGNvbnRhaW5zIHV0aWxpdHkgY2xhc3Nlcywgc3RyZWFtIGltcGxlbWVudGF0aW9ucywgZmlsZSBmaWx0ZXJzLApmaWxlIGNvbXBhcmF0b3JzLCBlbmRpYW4gdHJhbnNmb3JtYXRpb24gY2xhc3NlcywgYW5kIG11Y2ggbW9yZS4KCkphdmEgOCByZXF1aXJlZC4KCk5ldyBmZWF0dXJlcwotLS0tLS0tLS0tLS0KCiogICAgICAgICAgIEFkZCBDaGFyU2VxdWVuY2VJbnB1dFN0cmVhbS5CdWlsZGVyLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIENodW5rZWRPdXRwdXRTdHJlYW0uQnVpbGRlci4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBBYnN0cmFjdFN0cmVhbUJ1aWxkZXIuc2V0T3Blbk9wdGlvbnMoT3Blbk9wdGlvbi4uLikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgc29tZSBtaXNzaW5nIGNvbnZlcnNpb25zIHRvIEFic3RyYWN0T3JpZ2luIHN1YmNsYXNzZXMuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgQWJzdHJhY3RPcmlnaW4uZ2V0Qnl0ZUFycmF5KGxvbmcsIGludCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgYW5kIHVzZSBSYW5kb21BY2Nlc3NGaWxlcy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBBYnN0cmFjdE9yaWdpbi5zaXplKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgUGF0aFV0aWxzLkVNUFRZX0ZJTEVfQVRUUklCVVRFX0FSUkFZLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIENoYXJTZXF1ZW5jZUlucHV0U3RyZWFtLkJ1aWxkZXIuc2V0Q2hhcnNldEVuY29kZXIoQ2hhcnNldEVuY29kZXIpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIENoYXJzZXRFbmNvZGVycy50b0NoYXJzZXRFbmNvZGVyKENoYXJzZXRFbmNvZGVyLCBTdXBwbGllcjxDaGFyc2V0RW5jb2Rlcj4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKCkZpeGVkIEJ1Z3MKLS0tLS0tLS0tLQoKKiBJTy03OTE6ICBSZWdyZXNzaW9uIGluIEZpbGVVdGlscy50b3VjaCgpIC0gbm8gbG9uZ2VyIGNyZWF0ZXMgcGFyZW50IGRpcmVjdG9yaWVzLiBUaGFua3MgdG8gQ2hhZCBXaWxzb24sIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEJ5dGVBcnJheU9yaWdpbiBzaG91bGQgYmUgYWJsZSBjb252ZXJ0IGEgYnl0ZVtdIHRvIGEgQnl0ZUFycmF5SW5wdXRTdHJlYW0uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBYnN0cmFjdE9yaWdpblN1cHBsaWVyLmNoZWNrT3JpZ2luKCkgbm93IHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaW5zdGVhZCBvZiBOdWxsUG9pbnRlckV4Y2VwdGlvbi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNzk2OiAgRmlsZUFscmVhZHlFeGlzdHNFeGNlcHRpb24gaW4gUGF0aFV0aWxzLmNyZWF0ZVBhcmVudERpcmVjdG9yaWVzKFBhdGgsIExpbmtPcHRpb24sIEZpbGVBdHRyaWJ1dGUuLi4pLiBUaGFua3MgdG8gR2lhY29tbyBCb2NjYXJkbywgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgT25seSByZWFkIHRoZSByZWxldmFudCBwb3J0aW9uIG9mIGEgZmlsZSBpbiBBYnN0cmFjdE9yaWdpbi5GaWxlT3JpZ2luLmdldEJ5dGVBcnJheShsb25nLCBpbnQpIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBPbmx5IHJlYWQgdGhlIHJlbGV2YW50IHBvcnRpb24gb2YgYSBmaWxlIGluIEFic3RyYWN0T3JpZ2luLlBhdGhPcmlnaW4uZ2V0Qnl0ZUFycmF5KGxvbmcsIGludCkgVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNzk4OiAgRGVmZXJyZWRGaWxlT3V0cHV0U3RyZWFtIHRocm93cyBleGNlcHRpb24gd2hlbiBzeXN0ZW0gdGVtcCBkaXIgaXMgYSBzeW1saW5rLiBUaGFua3MgdG8gU2hhaSBTaGFwaXJhLCBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBSZWFkZXJJbnB1dFN0cmVhbS5CdWlsZGVyLnNldENoYXJzZXRFbmNvZGVyKG51bGwpIHNob3VsZCByZXNldCB0byBhIGRlZmF1bHQgb2JqZWN0LCBub3QgdGhyb3cgYW4gTlBFLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgUmVhZGVySW5wdXRTdHJlYW0uQnVpbGRlci5zZXRDaGFyc2V0KG51bGwpIHNob3VsZCByZXNldCB0byBhIGRlZmF1bHQgb2JqZWN0LCBub3QgdGhyb3cgYW4gTlBFLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKCkNoYW5nZXMKLS0tLS0tLQoKKiAgICAgICAgICAgQnVtcCBjb21tb25zLXBhcmVudCBmcm9tIDU3IHRvIDU4LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LCBEZXBlbmRhYm90LiAKCkNvbXBhdGliaWxpdHkgd2l0aCAyLjY6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBZZXMuClNlbWFudGljIGNvbXBhdGlibGU6IFllcy4KCkNvbW1vbnMgSU8gMi43IGFuZCB1cCByZXF1aXJlcyBKYXZhIDggb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi42IHJlcXVpcmVzIEphdmEgNyBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjMgdGhyb3VnaCAyLjUgcmVxdWlyZXMgSmF2YSA2IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMiByZXF1aXJlcyBKYXZhIDUgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlLgoKSGlzdG9yaWNhbCBsaXN0IG9mIGNoYW5nZXM6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2NoYW5nZXMtcmVwb3J0Lmh0bWwKCkZvciBjb21wbGV0ZSBpbmZvcm1hdGlvbiBvbiBBcGFjaGUgQ29tbW9ucyBJTywgaW5jbHVkaW5nIGluc3RydWN0aW9ucyBvbiBob3cgdG8gc3VibWl0IGJ1ZyByZXBvcnRzLApwYXRjaGVzLCBvciBzdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnQsIHNlZSB0aGUgQXBhY2hlIENvbW1vbnMgSU8gd2Vic2l0ZToKCmh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvLwoKRG93bmxvYWQgcGFnZTogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vZG93bmxvYWRfaW8uY2dpCgpIYXZlIGZ1biEKLUFwYWNoZSBDb21tb25zIFRlYW0KCkFwYWNoZSBDb21tb25zIElPIApWZXJzaW9uIDIuMTIuMApSZWxlYXNlIE5vdGVzCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkludHJvZHVjdGlvbgotLS0tLS0tLS0tLS0KCkNvbW1vbnMgSU8gaXMgYSBwYWNrYWdlIG9mIEphdmEgdXRpbGl0eSBjbGFzc2VzIGxpa2UgamF2YS5pby4gIApDbGFzc2VzIGluIHRoaXMgcGFja2FnZSBhcmUgY29uc2lkZXJlZCB0byBiZSBzbyBzdGFuZGFyZCBhbmQgb2Ygc3VjaCBoaWdoIApyZXVzZSBhcyB0byBqdXN0aWZ5IGV4aXN0ZW5jZSBpbiBqYXZhLmlvLgoKVGhlIEFwYWNoZSBDb21tb25zIElPIGxpYnJhcnkgY29udGFpbnMgdXRpbGl0eSBjbGFzc2VzLCBzdHJlYW0gaW1wbGVtZW50YXRpb25zLCBmaWxlIGZpbHRlcnMsCmZpbGUgY29tcGFyYXRvcnMsIGVuZGlhbiB0cmFuc2Zvcm1hdGlvbiBjbGFzc2VzLCBhbmQgbXVjaCBtb3JlLgoKSmF2YSA4IHJlcXVpcmVkLgoKTmV3IGZlYXR1cmVzCi0tLS0tLS0tLS0tLQoKKiBJTy03NDY6ICBEcm9wIHVubmVjZXNzYXJ5IGNhc3RzIGFuZCBjb252ZXJzaW9ucyAjMjY3LiBUaGFua3MgdG8gRGF2aWRlIEFuZ2Vsb2NvbGEuIAoqICAgICAgICAgICBBZGQgR2l0SHViIGNvdmVyYWdlLnltbC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBCcm9rZW5SZWFkZXIuSU5TVEFOQ0UuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgVW5jaGVja2VkQnVmZmVyZWRSZWFkZXIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgVW5jaGVja2VkRmlsdGVyUmVhZGVyLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFVuY2hlY2tlZEZpbHRlcldyaXRlci4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBTdHJpbmdJbnB1dFN0cmVhbS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBVbmNoZWNrZWRGaWx0ZXJJbnB1dFN0cmVhbS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBVbmNoZWNrZWRGaWx0ZXJPdXRwdXRTdHJlYW0uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgQnJva2VuSW5wdXRTdHJlYW0uSU5TVEFOQ0UuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgQ2xvc2VkSW5wdXRTdHJlYW0uSU5TVEFOQ0UgYW5kIGRlcHJlY2F0ZSBDTE9TRURfSU5QVVRfU1RSRUFNLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIENsb3NlZFJlYWRlci5JTlNUQU5DRSBhbmQgZGVwcmVjYXRlIENMT1NFRF9SRUFERVIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgQnJva2VuV3JpdGVyLklOU1RBTkNFLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIENsb3NlZE91dHB1dFN0cmVhbS5JTlNUQU5DRSBhbmQgZGVwcmVjYXRlIENMT1NFRF9PVVRQVVRfU1RSRUFNLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIENsb3NlZFdyaXRlci5JTlNUQU5DRSBhbmQgZGVwcmVjYXRlIENMT1NFRF9XUklURVIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRSBhbmQgZGVwcmVjYXRlIE5VTExfT1VUUFVUX1NUUkVBTS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBOdWxsUHJpbnRTdHJlYW0uSU5TVEFOQ0UgYW5kIGRlcHJlY2F0ZSBOVUxMX1BSSU5UX1NUUkVBTS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBOdWxsV3JpdGVyLklOU1RBTkNFIGFuZCBkZXByZWNhdGUgTlVMTF9XUklURVIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgTnVsbElucHV0U3RyZWFtLklOU1RBTkNFLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIE51bGxSZWFkZXIuSU5TVEFOQ0UuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgUGF0aFV0aWxzLnJlYWRTdHJpbmcoUGF0aCwgQ2hhcnNldCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgRmlsZVV0aWxzLm5ld091dHB1dFN0cmVhbShGaWxlLCBib29sZWFuKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBQYXRoVXRpbHMubmV3T3V0cHV0U3RyZWFtKFBhdGgsIGJvb2xlYW4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFVuY2hlY2tlZEFwcGVuZGFibGUuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgYW5kIHJldXNlIFVuY2hlY2tlZElPRXhjZXB0aW9ucy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBQYXRoVXRpbHMuZ2V0VGVtcERpcmVjdG9yeSgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIEZpbGVTeXN0ZW0uZ2V0TmFtZVNlcGFyYXRvcigpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIEZpbGVTeXN0ZW0ubm9ybWFsaXplU2VwYXJhdG9ycygpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFBhdGhVdGlscy5pc05ld2VyKFBhdGgsIEZpbGVUaW1lLCBMaW5rT3B0aW9uLi4uKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBQYXRoVXRpbHMuaXNOZXdlcihQYXRoLCBJbnN0YW50LCBMaW5rT3B0aW9uLi4uKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBBZ2VGaWxlRmlsdGVyLkFnZUZpbGVGaWx0ZXIoSW5zdGFudCkuCiAgICAgICAgQWRkIEFnZUZpbGVGaWx0ZXIuQWdlRmlsZUZpbHRlcihJbnN0YW50LCBib29sZWFuKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBGaWxlVXRpbHMubGFzdE1vZGlmaWVkRmlsZVRpbWUoRmlsZSkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgRmlsZVRpbWVzLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFBhdGhVdGlscy53YWl0Rm9yKFBhdGgsIER1cmF0aW9uLCBMaW5rT3B0aW9uLi4uKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uaW5wdXQuVGFpbGVyLmdldERlbGF5RHVyYXRpb24oKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBGaWxlVXRpbHMuY3VycmVudCgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIGFuZCB1c2UgUGF0aFV0aWxzLnNldExhc3RNb2RpZmllZFRpbWUoUGF0aCkgZm9yIG1vcmUgcHJlY2lzaW9uLgogICAgICAgIEFkZCBhbmQgdXNlIFBhdGhVdGlscy5zZXRMYXN0TW9kaWZpZWRUaW1lKFBhdGgsIFBhdGgpIGZvciBtb3JlIHByZWNpc2lvbi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBhbmQgdXNlIFBhdGhVdGlscy5pc05ld2VyKFBhdGgsIENocm9ub1pvbmVkRGF0ZVRpbWUsIExpbmtPcHRpb24uLi4pIGZvciBtb3JlIHByZWNpc2lvbi4KICAgICAgICBBZGQgYW5kIHVzZSBQYXRoVXRpbHMuaXNOZXdlcihQYXRoLCBQYXRoKSBmb3IgbW9yZSBwcmVjaXNpb24uCiAgICAgICAgQWRkIGFuZCB1c2UgRmlsZVV0aWxzLmlzTmV3ZXIoRmlsZSwgRmlsZVRpbWUpIGZvciBtb3JlIHByZWNpc2lvbi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBhbmQgdXNlIFBhdGhVdGlscy5pc09sZGVyKFBhdGgsIEZpbGVUaW1lLCBMaW5rT3B0aW9uLi4uKS4KICAgICAgICBBZGQgYW5kIHVzZSBQYXRoVXRpbHMuaXNPbGRlcihQYXRoLCBJbnN0YW50LCBMaW5rT3B0aW9uLi4uKS4KICAgICAgICBBZGQgYW5kIHVzZSBQYXRoVXRpbHMuaXNPbGRlcihQYXRoLCBsb25nLCBMaW5rT3B0aW9uLi4uKS4KICAgICAgICBBZGQgYW5kIHVzZSBQYXRoVXRpbHMuaXNPbGRlcihQYXRoLCBQYXRoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBhbmQgdXNlIFBhdGhVdGlscy5zaXplT2YoUGF0aCkuCiAgICAgICAgQWRkIGFuZCB1c2UgUGF0aFV0aWxzLnNpemVPZkFzQmlnSW50ZWdlcihQYXRoKS4KICAgICAgICBBZGQgYW5kIHVzZSBQYXRoVXRpbHMuc2l6ZU9mRGlyZWN0b3J5KFBhdGgpLgogICAgICAgIEFkZCBhbmQgdXNlIFBhdGhVdGlscy5zaXplT2ZEaXJlY3RvcnlBc0JpZ0ludGVnZXIoUGF0aCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgYW5kIHVzZSBJT0Nhc2UudmFsdWUoSU9DYXNlLCBJT0Nhc2UpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFRhaWxlci5UYWlsYWJsZSBpbnRlcmZhY2UgdG8gYWxsb3cgdGFpbGluZyBvZiByZW1vdGUgZmlsZXMgZm9yIGV4YW1wbGUgdXNpbmcgakNJRlMuIFRoYW5rcyB0byBKb24gRnJlZWRtYW4sIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBhbmQgdXNlIFJhbmRvbUFjY2Vzc0ZpbGVNb2RlLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFBhdGhVdGlscy53cml0ZVN0cmluZyhQYXRoLCBDaGFyU2VxdWVuY2UsIENoYXJzZXQsIE9wZW5PcHRpb24uLi4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFBhdGhVdGlGaWxlcy5nZXRGaWxlQXR0cmlidXRlVmlldygpIHNob3J0aGFuZHM6CiAgICAgICAgICAtIFBhdGhVdGlscy5nZXRBY2xGaWxlQXR0cmlidXRlVmlldyhQYXRoLCBMaW5rT3B0aW9uLi4uKQogICAgICAgICAgLSBQYXRoVXRpbHMuZ2V0RG9zRmlsZUF0dHJpYnV0ZVZpZXcoUGF0aCwgTGlua09wdGlvbi4uLikKICAgICAgICAgIC0gUGF0aFV0aWxzLmdldFBvc2l4RmlsZUF0dHJpYnV0ZVZpZXcoUGF0aCwgTGlua09wdGlvbi4uLikgVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNzQ3OiAgTWFrZSBjb21tb25zLWlvIGEgSlBNUyBtb2R1bGUgYnkgYWRkaW5nIG1vZHVsZS1pbmZvLmNsYXNzLiAKKiBJTy03NTM6ICBBZGQgSU9VdGlscyBtZXRob2QgdG8gY29weSBvdXRwdXQgc3RyZWFtIHRvIGlucHV0IHN0cmVhbSAjMjgxLiBUaGFua3MgdG8gU2ViYXN0aWFuRGlldHJpY2gsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBQYXRoVXRpbHMuaXNQb3NpeChQYXRoLCBMaW5rT3B0aW9uLi4uKS4gIzI5MCBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIFBhdGhVdGlscy5yZWFkQXR0cmlidXRlcyhQYXRoLCBDbGFzcywgTGlua09wdGlvbi4uLikuICMyOTAgVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBJT0V4Y2VwdGlvbkxpc3QuY2hlY2tFbXB0eShMaXN0LCBPYmplY3QpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIElPQmlDb25zdW1lciwgSU9UcmlDb25zdW1lciwgSU9Db21wYXJhdG9yLCBJT1VuYXJ5T3BlcmF0b3IsIElPQmluYXJ5T3BlcmF0b3IuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgYW5kIHJldXNlIElPQ29uc3VtZXIgZm9yQWxsKCopLCBmb3JFYWNoKCopLCBhbmQgZm9yRWFjaEluZGV4ZWQoKikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgQ2hhcnNldEVuY29kZXJzLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIENoYXJzZXREZWNvZGVycy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBQYXRoVXRpbHMuY3JlYXRlUGFyZW50RGlyZWN0b3JpZXMoUGF0aCwgTGlua09wdGlvbiwgRmlsZUF0dHJpYnV0ZS4uLikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBVcGRhdGUgRmlsZUVudHJ5IHRvIHVzZSBGaWxlVGltZSBpbnN0ZWFkIG9mIGxvbmcgZm9yIGZpbGUgdGltZSBzdGFtcHMuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTY4MDogIEFkZCBtb3JlIHRlc3RzIGZvciBJT1V0aWxzLmNvbnRlbnRFcXVhbHNJZ25vcmVFT0wgIzEzNy4gVGhhbmtzIHRvIFhlbm9BbWVzcywgc2ViYkFTRiwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgUmVkdWNlIGJvaWxlcnBsYXRlIHRocm91Z2ggbmV3IFVuY2hlY2tlZElPIGNsYXNzIGFuZCBmcmllbmRzIGluIG9yZy5hcGFjaGUuY29tbW9ucy5pby5mdW5jdGlvbi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBQYXRoVXRpbHMudG91Y2goUGF0aCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgRmlsZVN5c3RlbS5nZXRJbGxlZ2FsRmlsZU5hbWVDb2RlUG9pbnRzKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgRmlsZVV0aWxzLmlzRmlsZU5ld2VyKEZpbGUsIENocm9ub0xvY2FsRGF0ZSwgT2Zmc2V0VGltZSkuCiAgICAgICAgQWRkIEZpbGVVdGlscy5pc0ZpbGVOZXdlcihGaWxlLCBPZmZzZXREYXRlVGltZSkuCiAgICAgICAgQWRkIEZpbGVVdGlscy5pc0ZpbGVPbGRlcihGaWxlLCBDaHJvbm9Mb2NhbERhdGUsIE9mZnNldFRpbWUpLgogICAgICAgIEFkZCBGaWxlVXRpbHMuaXNGaWxlT2xkZXIoRmlsZSwgT2Zmc2V0RGF0ZVRpbWUpLiBUaGFua3MgdG8gSXNpcmEgU2VuZXZpcmF0bmUsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBJT0JpQ29uc3VtZXIubm9vcCgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIElPVXRpbHMuY2xvc2VRdWlldGx5KEl0ZXJhYmxlPENsb3NlYWJsZT4pLgogICAgICAgIEFkZCBJT1V0aWxzLmNsb3NlUXVpZXRseShTdHJlYW08Q2xvc2VhYmxlPikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgQ2hhcnNldHMudG9DaGFyc2V0KENoYXJzZXQsIENoYXJzZXQpLgogICAgICAgIEFkZCBDaGFyc2V0cy50b0NoYXJzZXQoU3RyaW5nLCBDaGFyc2V0KS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBYbWxTdHJlYW1Xcml0ZXIoT3V0cHV0U3RyZWFtLCBDaGFyc2V0KS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBQYXRoVXRpbHMuZ2V0TGFzdE1vZGlmaWVkRmlsZVRpbWUoKikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgSU9CaUZ1bmN0aW9uLCBJT1RyaUZ1bmN0aW9uLCBJT1F1YWRGdW5jdGlvbiwgSU9QcmVkaWNhdGUsIElPSXRlcmF0b3IsIElPU3BsaXRlcmF0b3IsIElPQmFzZVN0cmVhbSwgSU9TdHJlYW0sIEZpbGVzVW5jaGVjay4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBJT1V0aWxzLmNvbnN1bWUoUmVhZGVyKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBJT1N1cHBsaWVyLmFzU3VwcGxpZXIoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBJT0Z1bmN0aW9uLmFzRnVuY3Rpb24oKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBJT0NvbnN1bWVyLmFzQ29uc3VtZXIoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBUaW1lc3RhbXBlZE9ic2VydmVyLmlzQ2xvc2VkKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBJT0V4Y2VwdGlvbkxpc3QgaW1wbGVtZW50cyBJdGVyYWJsZS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNzg0OiAgQWRkIHN1cHBvcnQgZm9yIEFwcGVuZGFibGUgdG8gSGV4RHVtcCAjNDE4LiBUaGFua3MgdG8gRnJlZHJpayBLamVsbGJlcmcsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEFkZCBhbmQgdXNlIFRocmVhZFV0aWxzLiBUaGFua3MgdG8gRGFHZVJlLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTc4NjogIEFkZCBVbnN5bmNocm9uaXplZEZpbHRlcklucHV0U3RyZWFtLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy03ODY6ICBBZGQgVW5zeW5jaHJvbml6ZWRCdWZmZXJlZElucHV0U3RyZWFtLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LCBCZW5vaXQgVGVsbGllci4gCiogICAgICAgICAgIEFkZCBGaWxlU3lzdGVtLmdldEJsb2NrU2l6ZSgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIGJ1aWxkZXJzIGFuZCBhdm9pZCBjcmVhdGluZyBtb3JlIGNvbnN0cnVjdG9ycyBmb3IgYWxsIHBlcm11dGF0aW9ucyBvZiBjdXJyZW50IG9wdGlvbnMuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBSZWZhY3RvciB1c2luZyBuZXcgU3VwcGxpZXIgQVBJIElPVXRpbHMudG9TdHJpbmcoSU9TdXBwbGllcjxJbnB1dFN0cmVhbT4sIENoYXJzZXRbLCBJT1N1cHBsaWVyPFN0cmluZz5dKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeSwgbWF4eGVkZXYuIAoqICAgICAgICAgICBSZWZhY3RvciB1c2luZyBuZXcgU3VwcGxpZXIgQVBJIG9yZy5hcGFjaGUuY29tbW9ucy5pby5maWxlLlBhdGhVdGlscy5jb3B5KElPU3VwcGxpZXI8SW5wdXRTdHJlYW0+LCBQYXRoLCBDb3B5T3B0aW9uLi4uKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeSwgbWF4eGVkZXYuIAoKRml4ZWQgQnVncwotLS0tLS0tLS0tCgoqIElPLTY5NzogIElPVXRpbHMudG9CeXRlQXJyYXkgc2l6ZSB2YWxpZGF0aW9uIGRvZXMgbm90IG1hdGNoIGRvY3VtZW50YXRpb24uIFRoYW5rcyB0byBvdHRlcjYwNi4gCiogICAgICAgICAgIEZpeCBKYXZhZG9jIGxpbmtzIHRvIHRoZSBKUkUgSmF2YWRvYyA4LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy03NDQ6ICBGaWxlV3JpdGVyV2l0aEVuY29kaW5nIGZvciBhbiBleGlzdGluZyBmaWxlIG5vIGxvbmdlciB0cnVuY2F0ZXMgdGhlIGZpbGUuICMyNTEuIFRoYW5rcyB0byBSQlJpLCBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBIG51bGwgQ2hhcnNldCBvciBDaGFyc2V0IG5hbWUgaW4gRmlsZVdyaXRlcldpdGhFbmNvZGluZyBjb25zdHJ1Y3RvcnMgdXNlcyB0aGUgZGVmYXVsdCBDaGFyc2V0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRml4IHVzYWdlIG9mIGFzc2VydE5vdE51bGwgIzI2OS4gVGhhbmtzIHRvIERhdmlkZSBBbmdlbG9jb2xhLiAKKiBJTy03Mjc6ICBGaWxlbmFtZVV0aWxzIGRpcmVjdG9yeUNvbnRhaW5zKCkgc2hvdWxkIGhhbmRsZSBmaWxlcyB3aXRoIHRoZSBzYW1lIHByZWZpeCAjMjE3LiBUaGFua3MgdG8gdHJ1bmdQYSwgR2FyeSBHcmVnb3J5LiAKKiBJTy03NDg6ICBGaWxlVXRpbHMubW92ZVRvRGlyZWN0b3J5KCkgZXhjZXB0aW9uIGRvY3VtZW50YXRpb24gYW5kIGV4Y2VwdGlvbiBtZXNzYWdlIGVycm9yLiBUaGFua3MgdG8gRGlyayBIZWlucmljaHMsIEdhcnkgR3JlZ29yeSwgRWxhbmdvIFJhdmkuIAoqICAgICAgICAgICBUaHJlYWRNb25pdG9yLnNsZWVwKER1cmF0aW9uKSBpZ25vcmVzIG5hbm9zZWNvbmRzLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRml4IEphdmFkb2MgaW4gVGhyZWFkTW9uaXRvciNydW4oKSBtZXRob2QuICMyNzMuIFRoYW5rcyB0byBBcnR1cm8gQmVybmFsLiAKKiBJTy03NDk6ICBGaWxlVXRpbHMubGlzdEZpbGVzKCkgZG9lcyBub3QgbGlzdCBtYXRjaGluZyBmaWxlcyBpZiBGaWxlIHBhcmFtZXRlciBpcyBhIHN5bWJvbGljIGxpbmsuIFRoYW5rcyB0byBoYWlodWl5YW5nLCBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBGaXggdHlwbyBpbiBKYXZhZG9jcyBmb3IgRmlsZVV0aWxzI2NvbnZlcnRGaWxlQ29sbGVjdGlvblRvRmlsZUFycmF5KCkgIzI3Ni4gVGhhbmtzIHRvIG5pcmFuamFuZ2h1bGUsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEF2b2lkIENvZGUgRHVwbGljYXRpb246IFJldXNlIFNsZWVwIGZyb20gVGhyZWFkTW9uaXRvciAjNjYuIFRoYW5rcyB0byBEYUdlUmUsIEdhcnkgR3JlZ29yeS4gCiogSU8tNzUwOiAgRmlsZVV0aWxzLml0ZXJhdGVGaWxlcyBhbHNvIGxpc3RzIGRpcmVjdG9yaWVzLiBUaGFua3MgdG8gU2l0YSBHZd9uZXIsIFNlYmFzdGlhbiBQZXRlcnMsIEdhcnkgR3JlZ29yeS4gCiogSU8tNzIxOiAgV3JvbmcgZXhjZXB0aW9uIG1lc3NhZ2UgaW4gRmlsZVV0aWxzLnNldExhc3RNb2RpZmllZChGaWxlLCBGaWxlKS4gVGhhbmtzIHRvIERpcmsgSGVpbnJpY2hzLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTcxNzogIEluZmluaXRlIGxvb3AgaW4gUmVhZGVySW5wdXRTdHJlYW0gaW5zdGVhZCBvZiB0aHJvd2luZyBleGNlcHRpb24gZm9yIENvZGluZ0Vycm9yQWN0aW9uLlJFUE9SVC4gVGhhbmtzIHRvIE1hcmNvbm8xMjM0LCBHYXJ5IEdyZWdvcnkuIAoqIElPLTcxNjogIFJlYWRlcklucHV0U3RyZWFtIGVudGVyIGluZmluaXRlIGxvb3AgZm9yIHRvbyBzbWFsbCBidWZmZXIgc2l6ZXMuIFRoYW5rcyB0byBNYXJjb25vMTIzNCwgR2FyeSBHcmVnb3J5LiAKKiBJTy02Mzg6ICBJbmZpbml0ZSBsb29wIGluIENoYXJTZXF1ZW5jZUlucHV0U3RyZWFtLnJlYWQgZm9yIDQtYnl0ZSBjaGFyYWN0ZXJzIHdpdGggVVRGLTggYW5kIDMtYnl0ZSBidWZmZXIuIFRoYW5rcyB0byBUaGF5bmUgTWNDb21icywgR2FyeSBHcmVnb3J5LiAKKiBJTy02Mzg6ICBQYXRoVXRpbHMuc2V0UmVhZE9ubHkoUGF0aCwgYm9vbGVhbiwgTGlua09wdGlvbi4uLikgc2hvdWxkIGFkZCBSRUFEXyogZmlsZSBhdHRyaWJ1dGVzIHdoZW4gdXNpbmcgUE9TSVguIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTYzODogIFBhdGhVdGlscy5zZXRSZWFkT25seShQYXRoLCBib29sZWFuLCBMaW5rT3B0aW9uLi4uKSByZWFkT25seSBhcmd1bWVudCBpcyBhbHdheXMgYXNzdW1lZCB0cnVlIG9uIFBPU0lYLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy03Mjk6ICBQcmV2ZW50IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbnMgaW4gQnJva2VuSW5wdXRTdHJlYW0vUmVhZGVyL091dHB1dFN0cmVhbS9Xcml0ZXIgIzI3OC4gVGhhbmtzIHRvIFJvYiBTcG9vciwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlVUkxUb0ZpbGUoVVJMLCBGaWxlLCBpbnQsIGludCkgbGVha3MgaXRzIFVSTENvbm5lY3Rpb24uCiAgICAgICAgQ2FsbGVkIGJ5IEZpbGVVdGlscy5jb3B5VVJMVG9GaWxlKFVSTCwgRmlsZSkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTcxNDogIEZpeGVkIFJlYWRlcklucHV0U3RyZWFtIG5vdCBjYWxsaW5nIENoYXJzZXRFbmNvZGVyLmZsdXNoIGlzc3VlICMyODMuIFRoYW5rcyB0byBrZXZpbndhbmcxOTc1LCBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBNaW5vciBjaGFuZ2VzICMyODcuIFRoYW5rcyB0byBBcnR1cm8gQmVybmFsLiAKKiBJTy03NTY6ICBVcGRhdGUgRmlsZVdyaXRlcldpdGhFbmNvZGluZyB0byBleHRlbmQgUHJveHlXcml0ZXIgIzI5Ni4gVGhhbmtzIHRvIHdvZGVuY2FmZSwgR2FyeSBHcmVnb3J5LCBCcnVubyBQLiBLaW5vc2hpdGEuIAoqICAgICAgICAgICBJbml0aWFsaXplIHRoZSBtZXNzYWdlIG9mIGFuIElPRXhjZXB0aW9uTGlzdCB0byBhIGRlZmF1bHQgaWYgbnVsbC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNzUxOiAgV2hlbiBkZWxldGluZyBzeW1saW5rcywgRmlsZS9QYXRoVXRpbHMuZGVsZXRlRGlyZWN0b3J5KCkgY2hhbmdlcyBmaWxlIHBlcm1pc3Npb25zIG9mIHRoZSB0YXJnZXQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnksIFJpY2hhcmQgQ3lnYW5pYWsuIAoqICAgICAgICAgICBSZWFkZXJJbnB1dFN0cmVhbSBtYXBzIG51bGwgQ2hhcnNldCwgQ2hhcnNldCBuYW1lLCBhbmQgQ2hhcnNldEVuY29kZXIgdG8gdGhlIHBsYXRmb3JtIGRlZmF1bHQgaW5zdGVhZCBvZiB0aHJvd2luZyBhIE51bGxQb2ludGVyRXhjZXB0aW9uLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQ2hhclNlcXVlbmNlSW5wdXRTdHJlYW0gbWFwcyBudWxsIENoYXJzZXQgYW5kIENoYXJzZXQgbmFtZSB0byB0aGUgcGxhdGZvcm0gZGVmYXVsdCBpbnN0ZWFkIG9mIHRocm93aW5nIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBXcml0ZXJPdXRwdXRTdHJlYW0gbWFwcyBudWxsIENoYXJzZXQsIENoYXJzZXQgbmFtZSwgYW5kIENoYXJzZXRFbmNvZGVyIG5hbWUgdG8gdGhlIHBsYXRmb3JtIGRlZmF1bHQgaW5zdGVhZCBvZiB0aHJvd2luZyBhIE51bGxQb2ludGVyRXhjZXB0aW9uLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlVUkxUb0ZpbGUgc2hvdWxkIGNyZWF0ZSB0YXJnZXQgcGFyZW50IGRpcmVjdG9yaWVzIGFuZCBvdmVyd3JpdGUgdGFyZ2V0IGZpbGUgIzMxOS4gVGhhbmtzIHRvIENoYWQgV2lsc29uLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTQ4NDogIEZpeCBpbmNvcnJlY3QgRmlsZW5hbWVVdGlscyBKYXZhZG9jIGZvciBudWxsIGJ5dGVzICMzMTAuIFRoYW5rcyB0byBNYXJjb25vMTIzNCwgR2FyeSBHcmVnb3J5LiAKKiBJTy00ODQ6ICBDaGFuZ2UgdG8gdXBwZXJjYXNlIHZhcmlhYmxlIGNvbnN0YW50LiAjMzIzLiBUaGFua3MgdG8gQXJ0dXJvIEJlcm5hbC4gCiogSU8tNDg0OiAgSU9DYXNlLmlzQ2FzZVNlbnNpdGl2ZShJT0Nhc2UpIHJlc3VsdCBpcyBiYWNrd2FyZCAjMzI1LiBUaGFua3MgdG8gRGF2aWQgSHVhbmcsIEdhcnkgR3JlZ29yeS4gCiogSU8tNzU4OiAgRGVwcmVjYXRlIFBhdGhVdGlscy5OT0ZPTExPV19MSU5LX09QVElPTl9BUlJBWSBpbiBmYXZvciBvZiBub0ZvbGxvd0xpbmtPcHRpb25BcnJheSgpLiBUaGFua3MgdG8gTWFyY29ubzEyMzQsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEltcHJvdmUgUmVhZGVySW5wdXRTdHJlYW0gZG9jdW1lbnRhdGlvbiAjMjkxLiBUaGFua3MgdG8gTWFyY29ubzEyMzQsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEZpeCBtaXNsZWFkaW5nIGNvbW1lbnRzIGluIEZpbGVGaWx0ZXJUZXN0ICMzMzQuIFRoYW5rcyB0byByaWNoYXJkYTIzLiAKKiAgICAgICAgICAgQWRkIG1pc3NpbmcgSmF2YWRvYyBmb3IgZXhjZXB0aW9ucyB0aHJvd24gZm9yIGludmFsaWQgYXJndW1lbnRzICMzMzkuIFRoYW5rcyB0byBEaWVnbyBNYXJjaWxpby4gCiogICAgICAgICAgIEZpbGVGaWx0ZXJUZXN0IG1pbm9yIGZpeGVzICMzNDAuIFRoYW5rcyB0byByaWNoYXJkYTIzLiAKKiBJTy03NjQ6ICBJT1V0aWxzLndyaXRlKCkgdGhyb3dzIE91dE9mTWVtb3J5RXJyb3IvTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24gd2hpbGUgd3JpdGluZyBiaWcgc3RyaW5ncyAjMzQzLiBUaGFua3MgdG8gRGFHZVJlLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTc2ODogIEFkZCByZXNlcnZlZCBXaW5kb3dzIGZpbGUgbmFtZXMgQ09OSU4kIGFuZCBDT05PVVQkIHRvIEZpbGVTeXN0ZW0gIzM1NS4gVGhhbmtzIHRvIE1hcmNvbm8xMjM0LCBNaWNoYWVsIE9zaXBvdi4gCiogSU8tNzczOiAgUmVnZXhGaWxlRmlsdGVyIGlzIG5vIGxvbmdlciBTZXJpYWxpemFibGUuIFRoYW5rcyB0byBEb21pbmlrIFJlaW5hcnosIEdhcnkgR3JlZ29yeS4gCiogSU8tNzYzOiAgW0phdmFkb2NdIEZpbGVGaWx0ZXJVdGlscyBkb2MgZG9lcyBub3QgbWF0Y2ggaW1wbDogbWlzc2luZyBzb21lIGZpbGUgZmlsdGVycy4gVGhhbmtzIHRvIFJpY2hhcmQgQWRhbXMsIEdhcnkgR3JlZ29yeS4gCiogSU8tNzYyOiAgRmlsZVN5c3RlbS5XSU5ET1dTLmlzUmVzZXJ2ZWRGaWxlTmFtZSBkb2Vzbid0IGNoZWNrIGZvciBmaWxlIGV4dGVuc2lvbi4gVGhhbmtzIHRvIExlb25pZGFzIENoaXJvbiwgR2FyeSBHcmVnb3J5LiAKKiBJTy03NzI6ICBDb25mdXNpbmcgSmF2YWRvYyBvbiBJT1V0aWxzI3Jlc291cmNlVG9VUkwoKSBhbmQgb3RoZXIgcmVzb3VyY2UqIG1ldGhvZHMuIFRoYW5rcyB0byBEYW4gWmllbWJhLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTQ0MzogIEZpbGVVdGlscy5jb3B5RmlsZSBtZXRob2RzIHRocm93IGFuIHVubmVjZXNzYXJ5ICJGYWlsZWQgdG8gY29weSBmdWxsIGNvbnRlbnRzIGZyb20iIGV4Y2VwdGlvbi4gVGhhbmtzIHRvIERhbiBaaWVtYmEsIEdhcnkgR3JlZ29yeS4gCiogSU8tNTY0OiAgUGljayB1cCBKYXZhZG9jIGZyb20gc3VwZXIgZm9yIG92ZXJyaWRlIHdyaXRlKCkgbWV0aG9kcyBpbiBBYnN0cmFjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhbmQgQnl0ZUFycmF5T3V0cHV0U3RyZWFtLiBUaGFua3MgdG8gSGFvIFpob25nLCBCZXJuZCBFY2tlbmZlbHMsIFBhc2NhbCBTY2h1bWFjaGVyLCBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBGaXggbWlub3IgdHlwb3MgIzM2Ny4gVGhhbmtzIHRvIE1hcmMgV3JvYmVsLiAKKiBJTy03NzY6ICBGaXggcGFyYW1ldGVycyB0byByZXF1aXJlTm9uTnVsbCBjYWxsIGluIERlZmVycmVkT3V0cHV0U3RlYW0gIzM2OC4gVGhhbmtzIHRvIENocmlzIFBvdmlyay4gCiogICAgICAgICAgIEZpeCBQYXRoVXRpbHMuY29weUZpbGVUb0RpcmVjdG9yeShVUkwsUGF0aCxDb3B5T3B0aW9uW10pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy0zODY6ICBGaWxlVXRpbHMuZG9Db3B5RmlsZSB1c2VzIGRpZmZlcmVudCBtZXRob2RzIHRvIGNoZWNrIHRoZSBmaWxlIHNpemVzLiBUaGFua3MgdG8gU2ViYiwgQmVybmQgRWNrZW5mZWxzLCB6aGlwZW5neHUsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEZpeCB0eXBvcyAjMzc1LiBUaGFua3MgdG8gTWljaGFlbCBFcm5zdC4gCiogSU8tNjExOiAgRmlsZW5hbWVVdGlscy5ub3JtYWxpemUgamF2YWRvYyBhbmQgdGVzdHMgIzM4My4gVGhhbmtzIHRvIEZlZG9yIFVydmFub3YuIAoqIElPLTYxMTogIEJldHRlciBkb2NzIGluIElPVXRpbHMgYW5kIElPVXRpbHMuYnl0ZUFycmF5KGludCBzaXplKSAjMzc0LiBUaGFua3MgdG8gQXJkZW5MLUxpdSwgQnJ1bm8gUC4gS2lub3NoaXRhLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTc4MjogIFNlcXVlbmNlUmVhZGVyIHNob3VsZCBjbG9zZSByZWFkZXJzIHdoZW4gaXRzIGNsb3NlIG1ldGhvZCBpcyBjYWxsZWQgIzM5MS4gVGhhbmtzIHRvIE1hdHRlbyBEaSBHaW92aW5henpvLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTc5MDogIEZpeCBzeW1ib2xpYyBsaW5rIGZpbGUgZmlsdGVyICM0NTAuIFRoYW5rcyB0byBNaWd1ZWwgTXXxb3osIEdhcnkgR3JlZ29yeS4gCiogSU8tNzkwOiAgQXBwbHkgbmFub3NlY29uZHMgcHJlY2lzaW9uIGZvciBRdWV1ZUlucHV0U3RyZWFtIHRpbWVvdXQgZHVyYXRpb24uICM0NTMuIFRoYW5rcyB0byBtYXh4ZWRldiwgR2FyeSBHcmVnb3J5LCBCcnVubyBQLiBLaW5vc2hpdGEuIAoqICAgICAgICAgICBGaXggb3ZlcmZsb3cgZm9yIEZpbGVVdGlsc1Rlc3QgY29uc3RhbnRzICM0NTYuIFRoYW5rcyB0byBNYXJjb25vMTIzNC4gCiogICAgICAgICAgIFNlcmlhbGl6YXRpb24gaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIDMuMC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEZpbGVTeXN0ZW1VdGlscy5wZXJmb3JtQ29tbWFuZChTdHJpbmdbXSwgaW50LCBEdXJhdGlvbik6IFVzZSBMb2NhbGUuZ2V0RGVmYXVsdCgpIGluc3RlYWQgb2YgRU5HTElTSC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNzI2OiAgQWRkIE1lbW9yeU1hcHBlZEZpbGVJbnB1dFN0cmVhbSAjMjE1LiBUaGFua3MgdG8gc2hvbGxhbmRlciwgR2FyeSBHcmVnb3J5LiAKCkNoYW5nZXMKLS0tLS0tLQoKKiAgICAgICAgICAgQnVtcCBhY3Rpb25zL2NhY2hlIGZyb20gMi4xLjYgdG8gMy4wLjEwICMzMDcsICMzMzcsICMzOTMuIFRoYW5rcyB0byBEZXBlbmRhYm90LCBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBCdW1wIGFjdGlvbnMvY2hlY2tvdXQgZnJvbSAyLjMuNCB0byAzLjEuMCAjMjg2LCAjMjk4LCAjMzMwLCAjMzkyLiBUaGFua3MgdG8gRGVwZW5kYWJvdCwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQnVtcCBhY3Rpb25zL3NldHVwLWphdmEgZnJvbSAyIHRvIDMuNi4wICMzNDYsICMzOTcuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKKiAgICAgICAgICAgQnVtcCBnaXRodWIvY29kZXFsLWFjdGlvbiBmcm9tIDEgdG8gMiAjMzUzLiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCiogICAgICAgICAgIEJ1bXAgTWF2ZW4gSmF2YWRvYyBwbHVnaW4gZnJvbSAzLjIuMCB0byAzLjQuMS4gVGhhbmtzIHRvIERlcGVuZGFib3QsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEJ1bXAgc3BvdGJ1Z3MtbWF2ZW4tcGx1Z2luIGZyb20gNC4yLjMgdG8gNC43LjMuMCAjMjUwLCAjMjU5LCAjMjcyLCAjMjc0LCAjMjg1LCAjMjg4LCAjMjg5LCAjMzA1LCAjMzE1LCAjMzI2LCAjMzM4LCAjMzYwLCAjMzY2LCAjMzcwLCAjMzgwLCAjMzk1LCAjNDAzLiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCiogICAgICAgICAgIEJ1bXAgc3BvdGJ1Z3MgZnJvbSA0LjUuMiB0byA0LjcuMyAjMzEzLCAjMzE3LCAjMzU3LCAjMzgyLCAjMzk4LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LCBEZXBlbmRhYm90LiAKKiAgICAgICAgICAgQnVtcCBKVW5pdCBmcm9tIDUuNy4yIHRvIDUuOC4yLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQnVtcCBtYXZlbi1lbmZvcmNlci1wbHVnaW4gZnJvbSAzLjAuMC1NMyB0byAzLjMuMCAjMjU1LCAjMzYzLCAjNDMxLCAjNDQ2LiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCiogICAgICAgICAgIEJ1bXAgY2hlY2tzdHlsZSBmcm9tIDguNDQgdG8gOS4zICMyNTYsICMyNTcsICMyNjYsICMyNzksICMyOTIuICMzMDguIFRoYW5rcyB0byBEZXBlbmRhYm90LCBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBCdW1wIGp1bml0LWJvbSBmcm9tIDUuOC4wLU0xIHRvIDUuOS4xICMyNjAsICMyNzEsICMyNzUsICMzMDksICMzODYuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKKiAgICAgICAgICAgQnVtcCBtb2NraXRvLWlubGluZSBmcm9tIDMuMTEuMiB0byA0LjExLjAgIzI2MiwgIzI2NCwgIzI4MiwgIzMwNiwgIzMxNCwgIzMzMSwgIzM0OCwgIzM1OSwgIzM4MSwgIzM5OSwgIzQwNSwgIzQxNCwgIzQyMC4gVGhhbmtzIHRvIERlcGVuZGFib3QsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEJ1bXAgam1oLnZlcnNpb24gZnJvbSAxLjMyIHRvIDEuMzYgIzI1OCwgIzMxNiwgIzM0MiwgIzQwNC4gVGhhbmtzIHRvIERlcGVuZGFib3QuIAoqICAgICAgICAgICBCdW1wIG1vZGl0ZWN0LW1hdmVuLXBsdWdpbiBmcm9tIDEuMC4wLlJDMSB0byAxLjAuMC5GaW5hbCAjMjgwLCAjNDM5LCAjNDQ1LiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCiogICAgICAgICAgIEJ1bXAganVuaXQtcGlvbmVlciBmcm9tIDEuNC4yIHRvIDEuOS4xICMzMDQuICMzMzUsICMzNjIsICM0MDIsICM0MDYsICM0MDkuIFRoYW5rcyB0byBEZXBlbmRhYm90LCBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBCdW1wIGphcGljbXAtbWF2ZW4tcGx1Z2luIGZyb20gMC4xNS4zIHRvIDAuMTYuMC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEJ1bXAgY29tbW9ucy1wYXJlbnQgZnJvbSA1MiB0byA1NyAjMzg4LCAjNDE1LCAjNDIxLCAjMTg0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LCBEZXBlbmRhYm90LiAKKiAgICAgICAgICAgQnVtcCBqYWNvY28tbWF2ZW4tcGx1Z2luIGZyb20gMC44LjcgdG8gMC44LjguIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBCdW1wIG1hdmVuLWFudHJ1bi1wbHVnaW4gZnJvbSAzLjAuMCB0byAzLjEuMCAjMzU0LiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCiogICAgICAgICAgIEJ1bXAgY29tbW9ucy5zdXJlZmlyZS52ZXJzaW9uIDMuMC4wLU01IHRvIDMuMC4wLU03LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQnVtcCBQTUQgZnJvbSA2LjQ0LjAgdG8gNi41Mi4wLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQnVtcCBtYXZlbi1wbWQtcGx1Z2luIGZyb20gMy4xNi4wIHRvIDMuMTkuMC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEJ1bXAgYXBhY2hlLXJhdCBmcm9tIDAuMTMgdG8gMC4xNC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEJ1bXAgZXhlYy1tYXZlbi1wbHVnaW4gZnJvbSAzLjAuMCB0byAzLjEuMCAjMzY5LiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCiogICAgICAgICAgIEJ1bXAgbWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW4gZnJvbSAzLjEuMiB0byAzLjIuMCAjMzc2LiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCiogICAgICAgICAgIEJ1bXAgYXBhY2hlLXJhdC1wbHVnaW4gZnJvbSAwLjE0IHRvIDAuMTUgIzM4Ny4gVGhhbmtzIHRvIERlcGVuZGFib3QuIAoqICAgICAgICAgICBCdW1wIGRlZmF1bHQgYnVmZmVyIHNpemUgZm9yIENoYXJTZXF1ZW5jZUlucHV0U3RyZWFtIHRvIElPVXRpbHMjREVGQVVMVF9CVUZGRVJfU0laRS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgIEJ1bXAgZGVmYXVsdCBidWZmZXIgc2l6ZSBmb3IgQ2h1bmtlZE91dHB1dFN0cmVhbSB0byBJT1V0aWxzI0RFRkFVTFRfQlVGRkVSX1NJWkUuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBCdW1wIGRlZmF1bHQgYnVmZmVyIHNpemUgZm9yIENodW5rZWRXcml0ZXIgdG8gSU9VdGlscyNERUZBVUxUX0JVRkZFUl9TSVpFLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQnVtcCBkZWZhdWx0IGJ1ZmZlciBzaXplIGZvciBSZWFkZXJJbnB1dFN0cmVhbSB0byBJT1V0aWxzI0RFRkFVTFRfQlVGRkVSX1NJWkUuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBCdW1wIGRlZmF1bHQgYnVmZmVyIHNpemUgZm9yIFdyaXRlck91dHB1dFN0cmVhbSB0byBJT1V0aWxzI0RFRkFVTFRfQlVGRkVSX1NJWkUuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuNjoKQmluYXJ5IGNvbXBhdGlibGU6IFllcy4KU291cmNlIGNvbXBhdGlibGU6IFllcy4KU2VtYW50aWMgY29tcGF0aWJsZTogWWVzLgoKQ29tbW9ucyBJTyAyLjcgYW5kIHVwIHJlcXVpcmVzIEphdmEgOCBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjYgcmVxdWlyZXMgSmF2YSA3IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMyB0aHJvdWdoIDIuNSByZXF1aXJlcyBKYXZhIDYgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4yIHJlcXVpcmVzIEphdmEgNSBvciBhYm92ZS4KQ29tbW9ucyBJTyAxLjQgcmVxdWlyZXMgSmF2YSAxLjMgb3IgYWJvdmUuCgpIaXN0b3JpY2FsIGxpc3Qgb2YgY2hhbmdlczogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vY2hhbmdlcy1yZXBvcnQuaHRtbAoKRm9yIGNvbXBsZXRlIGluZm9ybWF0aW9uIG9uIEFwYWNoZSBDb21tb25zIElPLCBpbmNsdWRpbmcgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBzdWJtaXQgYnVnIHJlcG9ydHMsCnBhdGNoZXMsIG9yIHN1Z2dlc3Rpb25zIGZvciBpbXByb3ZlbWVudCwgc2VlIHRoZSBBcGFjaGUgQ29tbW9ucyBJTyB3ZWJzaXRlOgoKaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vCgpEb3dubG9hZCBwYWdlOiBodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby9kb3dubG9hZF9pby5jZ2kKCkhhdmUgZnVuIQotQXBhY2hlIENvbW1vbnMgVGVhbQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBcGFjaGUgQ29tbW9ucyBJTyAKVmVyc2lvbiAyLjExLjAKUmVsZWFzZSBOb3RlcwoKSW50cm9kdWN0aW9uCi0tLS0tLS0tLS0tLQoKQ29tbW9ucyBJTyBpcyBhIHBhY2thZ2Ugb2YgSmF2YSB1dGlsaXR5IGNsYXNzZXMgbGlrZSBqYXZhLmlvLiAgCkNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGFyZSBjb25zaWRlcmVkIHRvIGJlIHNvIHN0YW5kYXJkIGFuZCBvZiBzdWNoIGhpZ2ggCnJldXNlIGFzIHRvIGp1c3RpZnkgZXhpc3RlbmNlIGluIGphdmEuaW8uCgpUaGUgQXBhY2hlIENvbW1vbnMgSU8gbGlicmFyeSBjb250YWlucyB1dGlsaXR5IGNsYXNzZXMsIHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMsIGZpbGUgZmlsdGVycywKZmlsZSBjb21wYXJhdG9ycywgZW5kaWFuIHRyYW5zZm9ybWF0aW9uIGNsYXNzZXMsIGFuZCBtdWNoIG1vcmUuCgpKYXZhIDggcmVxdWlyZWQuCgpGaXhlZCBCdWdzCi0tLS0tLS0tLS0KCiogSU8tNzQxOiAgRmlsZVV0aWxzLmxpc3RGaWxlcyBkb2VzIG5vdCBsaXN0IG1hdGNoaW5nIGZpbGVzIGlmIEZpbGUgcGFyYW1ldGVyIGlzIGEgc3ltYm9saWMgbGluay4gVGhhbmtzIHRvIFphY2ggU2hlcm1hbi4gCiogSU8tNzI0OiAgRmlsZVV0aWxzI2RlbGV0ZURpcmVjdG9yeShGaWxlKSBleGNlcHRpb24gSmF2YWRvYyBpbmFjY3VyYXRlIHVwZGF0ZSAjMjQ1LiBUaGFua3MgdG8gbGlyYW4yMDAwLiAKKiAgICAgICAgICBNaW5vciBjaGFuZ2VzICMyNDMuIFRoYW5rcyB0byBBcnR1cm8gQmVybmFsLiAKKiAgICAgICAgICBSZXBsYWNlIGNvbnN0cnVjdGlvbiBvZiBGaWxlSW5wdXRTdHJlYW0gYW5kIEZpbGVPdXRwdXRTdHJlYW0gb2JqZWN0cyB3aXRoIEZpbGVzIE5JTyBBUElzLiAjMjIxLiBUaGFua3MgdG8gQXJ0dXJvIEJlcm5hbC4gCiogICAgICAgICAgRml4IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW4gSU9FeGNlcHRpb25MaXN0IGNvbnN0cnVjdG9ycy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgUmVtb3ZlIElPRXhjZXB0aW9uIGZyb20gdGhlIG1ldGhvZCBzaWduYXR1cmVzIHRoYXQgbm8gbG9uZ2VyIHRocm93IElPRXhjZXB0aW9uLgogICAgICAgICAgIFRoaXMgbWFpbnRhaW5zIGJpbmFyeSBjb21wYXRpYmlsaXR5IGJ1dCBub3Qgc291cmNlIGNvbXBhdGliaWxpdHkuCiAgICAgICAgICAgLSBGaWxlbmFtZVV0aWxzCiAgICAgICAgICAgICAgIGRpcmVjdG9yeUNvbnRhaW5zKFN0cmluZywgU3RyaW5nKQogICAgICAgICAgIC0gQm91bmRlZFJlYWRlcgogICAgICAgICAgICAgICBCb3VuZGVkUmVhZGVyKGphdmEuaW8uUmVhZGVyLCBpbnQpCiAgICAgICAgICAgLSBJT1V0aWxzCiAgICAgICAgICAgICAgIGxpbmVJdGVyYXRvcihqYXZhLmlvLklucHV0U3RyZWFtLCBDaGFyc2V0KQogICAgICAgICAgICAgICBsaW5lSXRlcmF0b3IoamF2YS5pby5JbnB1dFN0cmVhbSwgU3RyaW5nKQogICAgICAgICAgICAgICB0b0J5dGVBcnJheShTdHJpbmcpCiAgICAgICAgICAgICAgIHRvSW5wdXRTdHJlYW0oQ2hhclNlcXVlbmNlLCBTdHJpbmcpCiAgICAgICAgICAgICAgIHRvSW5wdXRTdHJlYW0oU3RyaW5nLCBTdHJpbmcpCiAgICAgICAgICAgICAgIHRvU3RyaW5nKGJ5dGVbXSkKICAgICAgICAgICAgICAgdG9TdHJpbmcoYnl0ZVtdLCBTdHJpbmcpIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoKQ2hhbmdlcwotLS0tLS0tCgoqICAgICAgICAgIEFkZCBTeW1ib2xpY0xpbmtGaWxlRmlsdGVyLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICBBZGQgdGVzdCB0byBtYWtlIHN1cmUgdGhlIHNldHRlciBvZiBBbmRGaWxlRmlsdGVyIHdvcmtzIGNvcnJlY3RseSAjMjQ0LiBUaGFua3MgdG8gdHJuY2F0ZS4KKiAgICAgICAgICBBZGQgWG1sU3RyZWFtUmVhZGVyKFBhdGgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICBCdW1wIG1vY2tpdG8taW5saW5lIGZyb20gMy4xMS4wIHRvIDMuMTEuMiAjMjQ3LiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCiogICAgICAgICAgQnVtcCBqbWgudmVyc2lvbiBmcm9tIDEuMjcgdG8gMS4zMiAjMjM3LiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCiogICAgICAgICAgQnVtcCBzcG90YnVncyBmcm9tIDQuMi4zIHRvIDQuMy4wICMyNDkuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKCkNvbXBhdGliaWxpdHkgd2l0aCAyLjY6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBZZXMuClNlbWFudGljIGNvbXBhdGlibGU6IFllcy4KCkNvbW1vbnMgSU8gMi43IGFuZCB1cCByZXF1aXJlcyBKYXZhIDggb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi42IHJlcXVpcmVzIEphdmEgNyBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjMgdGhyb3VnaCAyLjUgcmVxdWlyZXMgSmF2YSA2IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMiByZXF1aXJlcyBKYXZhIDUgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlLgoKSGlzdG9yaWNhbCBsaXN0IG9mIGNoYW5nZXM6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2NoYW5nZXMtcmVwb3J0Lmh0bWwKCkZvciBjb21wbGV0ZSBpbmZvcm1hdGlvbiBvbiBBcGFjaGUgQ29tbW9ucyBJTywgaW5jbHVkaW5nIGluc3RydWN0aW9ucyBvbiBob3cgdG8gc3VibWl0IGJ1ZyByZXBvcnRzLApwYXRjaGVzLCBvciBzdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnQsIHNlZSB0aGUgQXBhY2hlIENvbW1vbnMgSU8gd2Vic2l0ZToKCmh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvLwoKRG93bmxvYWQgcGFnZTogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vZG93bmxvYWRfaW8uY2dpCgpIYXZlIGZ1biEKLUFwYWNoZSBDb21tb25zIFRlYW0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQXBhY2hlIENvbW1vbnMgSU8gClZlcnNpb24gMi4xMC4wClJlbGVhc2UgTm90ZXMKCkludHJvZHVjdGlvbgotLS0tLS0tLS0tLS0KCkNvbW1vbnMgSU8gaXMgYSBwYWNrYWdlIG9mIEphdmEgdXRpbGl0eSBjbGFzc2VzIGxpa2UgamF2YS5pby4gIApDbGFzc2VzIGluIHRoaXMgcGFja2FnZSBhcmUgY29uc2lkZXJlZCB0byBiZSBzbyBzdGFuZGFyZCBhbmQgb2Ygc3VjaCBoaWdoIApyZXVzZSBhcyB0byBqdXN0aWZ5IGV4aXN0ZW5jZSBpbiBqYXZhLmlvLgoKVGhlIEFwYWNoZSBDb21tb25zIElPIGxpYnJhcnkgY29udGFpbnMgdXRpbGl0eSBjbGFzc2VzLCBzdHJlYW0gaW1wbGVtZW50YXRpb25zLCBmaWxlIGZpbHRlcnMsCmZpbGUgY29tcGFyYXRvcnMsIGVuZGlhbiB0cmFuc2Zvcm1hdGlvbiBjbGFzc2VzLCBhbmQgbXVjaCBtb3JlLgoKSmF2YSA4IHJlcXVpcmVkLgoKTmV3IGZlYXR1cmVzCi0tLS0tLS0tLS0tLQoKKiAgICAgICAgICAgQWRkIGFuZCB1c2UgUmVnZXhGaWxlRmlsdGVyLnRvU3RyaW5nKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICBBZGQgYW5kIHVzZSBSZWdleEZpbGVGaWx0ZXIuUmVnZXhGaWxlRmlsdGVyKFBhdHRlcm4sIEZ1bmN0aW9uPFBhdGg+LCBTdHJpbmc+KSBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgQWRkIGFuZCB1c2UgSU9DYXNlLmlzQ2FzZVNlbnNpdGl2ZShJT0Nhc2UpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKCkZpeGVkIEJ1Z3MKLS0tLS0tLS0tLQoKKiBJTy03MzM6ICBSZWdleEZpbGVGaWx0ZXIgdXNlcyB0aGUgcGF0aCBhbmQgZmlsZSBuYW1lIGluc3RlYWQgb2YganVzdCB0aGUgZmlsZSBuYW1lLiBUaGFua3MgdG8gSmltIFNlbGxlcnMsIEdhcnkgR3JlZ29yeS4gCiogSU8tNzM0OiAgVGhlIE9TR2kgbWFuaWZlc3Qgbm93IGNvbnRhaW5zIHN1bi4qIGltcG9ydCBwYWNrYWdlcyAjMjM5LiBUaGFua3MgdG8gRXJpYyBOb3JtYW4uIAoqIElPLTU4NTogIFNhbml0aXplIGRvdWJsZSBzbGFzaCBhZnRlciBwcmVmaXggIzc5LiBUaGFua3MgdG8gQWRhbSBNY0NsZW5hZ2hhbi4gCgpDaGFuZ2VzCi0tLS0tLS0KCiogICAgICAgICAgIEJ1bXAgYWN0aW9ucy9jYWNoZSBmcm9tIDIuMS41IHRvIDIuMS42ICMyMzguIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKKiAgICAgICAgICAgQnVtcCBqdW5pdC1waW9uZWVyIGZyb20gMS40LjEgdG8gMS40LjIgIzI0MC4gVGhhbmtzIHRvIERlcGVuZGFib3QuIAoqICAgICAgICAgICBCdW1wIGNoZWNrc3R5bGUgZnJvbSA4LjQyIHRvIDguNDMgIzI0MS4gVGhhbmtzIHRvIERlcGVuZGFib3QuIAoqICAgICAgICAgICBCdW1wIG1vY2tpdG8taW5saW5lIGZyb20gMy4xMC4wIHRvIDMuMTEuMCAjMjQyLiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCgpDb21wYXRpYmlsaXR5IHdpdGggMi42OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogWWVzLgpTZW1hbnRpYyBjb21wYXRpYmxlOiBZZXMuCgpDb21tb25zIElPIDIuNyBhbmQgdXAgcmVxdWlyZXMgSmF2YSA4IG9yIGFib3ZlLgpDb21tb25zIElPIDIuNiByZXF1aXJlcyBKYXZhIDcgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4zIHRocm91Z2ggMi41IHJlcXVpcmVzIEphdmEgNiBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjIgcmVxdWlyZXMgSmF2YSA1IG9yIGFib3ZlLgpDb21tb25zIElPIDEuNCByZXF1aXJlcyBKYXZhIDEuMyBvciBhYm92ZS4KCkhpc3RvcmljYWwgbGlzdCBvZiBjaGFuZ2VzOiBodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby9jaGFuZ2VzLXJlcG9ydC5odG1sCgpGb3IgY29tcGxldGUgaW5mb3JtYXRpb24gb24gQXBhY2hlIENvbW1vbnMgSU8sIGluY2x1ZGluZyBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHN1Ym1pdCBidWcgcmVwb3J0cywKcGF0Y2hlcywgb3Igc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50LCBzZWUgdGhlIEFwYWNoZSBDb21tb25zIElPIHdlYnNpdGU6CgpodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby8KCkRvd25sb2FkIHBhZ2U6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2Rvd25sb2FkX2lvLmNnaQoKSGF2ZSBmdW4hCi1BcGFjaGUgQ29tbW9ucyBUZWFtCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkFwYWNoZSBDb21tb25zIElPIApWZXJzaW9uIDIuOC4wClJlbGVhc2UgTm90ZXMKCkludHJvZHVjdGlvbgotLS0tLS0tLS0tLS0KCkNvbW1vbnMgSU8gaXMgYSBwYWNrYWdlIG9mIEphdmEgdXRpbGl0eSBjbGFzc2VzIGxpa2UgamF2YS5pby4gIApDbGFzc2VzIGluIHRoaXMgcGFja2FnZSBhcmUgY29uc2lkZXJlZCB0byBiZSBzbyBzdGFuZGFyZCBhbmQgb2Ygc3VjaCBoaWdoIApyZXVzZSBhcyB0byBqdXN0aWZ5IGV4aXN0ZW5jZSBpbiBqYXZhLmlvLgoKVGhlIEFwYWNoZSBDb21tb25zIElPIGxpYnJhcnkgY29udGFpbnMgdXRpbGl0eSBjbGFzc2VzLCBzdHJlYW0gaW1wbGVtZW50YXRpb25zLCBmaWxlIGZpbHRlcnMsCmZpbGUgY29tcGFyYXRvcnMsIGVuZGlhbiB0cmFuc2Zvcm1hdGlvbiBjbGFzc2VzLCBhbmQgbXVjaCBtb3JlLgoKSmF2YSA4IHJlcXVpcmVkLgoKTmV3IGZlYXR1cmVzCi0tLS0tLS0tLS0tLQoKKiBBZGQgb3JnLmFwYWNoZS5jb21tb25zLmlvLmlucHV0LkNpcmN1bGFySW5wdXRTdHJlYW0uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIEFkZCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uZmlsZS5QYXRoVXRpbHMuY2xlYW5EaXJlY3RvcnkoUGF0aCwgRmlsZVZpc2l0T3B0aW9uLi4uKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogQWRkIG9yZy5hcGFjaGUuY29tbW9ucy5pby5maWxlLlBhdGhVdGlscy5kZWxldGVEaXJlY3RvcnkoUGF0aCwgRmlsZVZpc2l0T3B0aW9uLi4uKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogQWRkIE51bGxBcHBlbmRhYmxlLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBBZGQgUGF0aFV0aWxzLmdldEFjbEVudHJ5TGlzdChQYXRoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogTnVsbC1ndWFyZCBJT1V0aWxzLmNsb3NlKENsb3NlYWJsZSwgSU9Db25zdW1lcikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIEFkZCBSZXZlcnNlZExpbmVzRmlsZVJlYWRlci5yZWFkTGluZXMoaW50KS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogQWRkIFJldmVyc2VkTGluZXNGaWxlUmVhZGVyLnRvU3RyaW5nKGludCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTY4NDogIEFkZCBQYXRoVXRpbHMuZGVsZXRlKFBhdGgsIERlbGV0ZU9wdGlvbi4uLikuCiAgICAgICAgQWRkIFBhdGhVdGlscy5kZWxldGVEaXJlY3RvcnkoUGF0aCwgRGVsZXRlT3B0aW9uLi4uKS4KICAgICAgICBBZGQgUGF0aFV0aWxzLmRlbGV0ZUZpbGUoUGF0aCwgRGVsZXRlT3B0aW9uLi4uKS4KICAgICAgICBBZGQgUGF0aFV0aWxzLnNldFJlYWRPbmx5KFBhdGgsIGJvb2xlYW4sIExpbmtPcHRpb24uLi4pLgogICAgICAgIEFkZCBDbGVhbmluZ1BhdGhWaXNpdG9yLkNsZWFuaW5nUGF0aFZpc2l0b3IoUGF0aENvdW50ZXJzLCBEZWxldGVPcHRpb25bXSwgU3RyaW5nLi4uKS4KICAgICAgICBBZGQgRGVsZXRpbmdQYXRoVmlzaXRvci5EZWxldGluZ1BhdGhWaXNpdG9yKFBhdGhDb3VudGVycywgRGVsZXRlT3B0aW9uW10sIFN0cmluZy4uLikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnksIFJvYmluIEphbnNvaG4uIAoqIEFkZCBSYW5kb21BY2Nlc3NGaWxlSW5wdXRTdHJlYW0uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTY4MTogIElPVXRpbHMuY2xvc2UoQ2xvc2VhYmxlKSBzaG91bGQgYWxsb3cgYSBsaXN0IG9mIGNsb3NlYWJsZXMuIAoqIEFkZCBJT1V0aWxzLmNvbnN1bWUoSW5wdXRTdHJlYW0pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy02NzY6ICBBZGQgaXNGaWxlTmV3ZXIoKSBhbmQgaXNGaWxlT2xkZXIoKSBtZXRob2RzIHRoYXQgc3VwcG9ydCB0aGUgSmF2YSA4IERhdGUvVGltZSBBUEkuICMxMjQuIFRoYW5rcyB0byBJc2lyYSBTZW5ldmlyYXRuZSwgR2FyeSBHcmVnb3J5LiAKKiBBZGQgYSBNYXJrU2hpZWxkSW5wdXRTdHJlYW0gIzExOS4gVGhhbmtzIHRvIEFkYW0gUmV0dGVyLCBHYXJ5IEdyZWdvcnkuIAoqIERlcHJlY2F0ZSBJT1V0aWxzLkxJTkVfU0VQQVJBVE9SIGluIGZhdm9yIG9mIEphdmEgNydzIFN5c3RlbS5saW5lU2VwYXJhdG9yKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoKRml4ZWQgQnVncwotLS0tLS0tLS0tCgoqIENoYXJTZXF1ZW5jZVJlYWRlci5za2lwIHNob3VsZCByZXR1cm4gMCBpbnN0ZWFkIG9mIEVPRiBvbiBzdHJlYW0gZW5kICMxMjMuIFRoYW5rcyB0byBSb2IgU3Bvb3IsIEpvY2hlbiBXaWVkbWFubi4gCiogSW1wbGVtZW50IENoYXJTZXF1ZW5jZVJlYWRlci5yZWFkeSgpICMxMjIuIFRoYW5rcyB0byBSb2IgU3Bvb3IuIAoqIElPLTY2OTogIEZpeCBjb2RlIHNtZWxsczsgZml4IHR5cG9zICMxMTUuIFRoYW5rcyB0byBYZW5vQW1lc3MsIEdhcnkgR3JlZ29yeS4gCiogQWRkIGNhY2hpbmcgZm9yIHJlcXVpcmVkIGNoYXJzZXRzICMxMjAuIFRoYW5rcyB0byBKZXJvbWUgV29sZmYsIEdhcnkgR3JlZ29yeS4gCiogSU8tNjczOiAgTWFrZSBzb21lIHNpbXBsaWZpY2F0aW9ucyAjMTIxLiBUaGFua3MgdG8gSmVyb21lIFdvbGZmLiAKKiBJTy02NzQ6ICBJbmZpbml0ZUNpcmN1bGFySW5wdXRTdHJlYW0gaXMgbm90IGluZmluaXRlIGlmIGl0cyBpbnB1dCBidWZmZXIgY29udGFpbnMgLTEuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTY3NTogIEluZmluaXRlQ2lyY3VsYXJJbnB1dFN0cmVhbSB0aHJvd3MgYSBkaXZpZGUtYnktemVybyBleGNlcHRpb24gd2hlbiByZWFkaW5nIGlmIGl0cyBpbnB1dCBidWZmZXIgaXMgc2l6ZSAwLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy02Nzc6ICBGaWxlU3lzdGVtLmdldEN1cnJlbnQoKSBkb2VzIG5vdCByZXR1cm4gdGhlIGNvcnJlY3QgZW51bS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNjc5OiAgaW5wdXQuQWJzdHJhY3RDaGFyYWN0ZXJGaWx0ZXJSZWFkZXIgcGFzc2VzIGNvdW50IG9mIGNoYXJzIHJlYWQgIzEzMi4gVGhhbmtzIHRvIHByb25lZWwuIAoqIElPLTY4MzogIENpcmN1bGFyQnVmZmVySW5wdXRTdHJlYW0ucmVhZCgpIGZhaWxzIHRvIGNvbnZlcnQgYnl0ZSB0byB1bnNpZ25lZCBpbnQgCiogRml4IFNwb3RCdWdzIGlzc3VlcyBpbiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy02NzI6ICBDb3B5aW5nIGEgRmlsZSBzZXRzIGxhc3QgbW9kaWZpZWQgZGF0ZSB0byAwMSBKYW51YXJ5IDE5NzAuIAoqIElPLTY3NjogIFByZXZlbnQgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gUmV2ZXJzZWRMaW5lc0ZpbGVSZWFkZXIgY29uc3RydWN0b3JzICMxMTcuIFRoYW5rcyB0byBNaWNoYWVsIEVybnN0LCBHYXJ5IEdyZWdvcnkuIAoKQ2hhbmdlcwotLS0tLS0tCgoqIFJlcGxhY2UgRmluZEJ1Z3Mgd2l0aCBTcG90QnVncy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogbWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW4gMy4xLjAgLT4gMy4xLjEuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIFVwZGF0ZSB0ZXN0cyBmcm9tIG9yZy5hcGFjaGUuY29tbW9uczpjb21tb25zLWxhbmczIDMuMTAgdG8gMy4xMS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogVXBkYXRlIGNvbW1vbnMtcGFyZW50IGZyb20gNTAgdG8gNTEgIzEyOS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogVXBkYXRlIGFjdGlvbnMvY2hlY2tvdXQgZnJvbSB2MSB0byB2Mi4zLjEgIzEyNi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogVXBkYXRlIGp1bml0LXBpb25lZXIgZnJvbSAwLjYuMCB0byAwLjguMCwgIzEyNywgIzEzNS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogVXBkYXRlIG1vY2tpdG8tY29yZSBmcm9tIDMuMy4zIHRvIDMuNS45ICMxMjgsICMxMzMsICMxNDUsICMxNDksICMxNTEuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIFVwZGF0ZSBzcG90YnVncyBmcm9tIDQuMC42IHRvIDQuMS4xICMxMzQuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKKiBVcGRhdGUganVuaXQtcGlvbmVlciBmcm9tIDAuOC4wIHRvIDAuOS4wICMxMzguIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKKiBVcGRhdGUgYWN0aW9ucy9jaGVja291dCBmcm9tIHYyLjMuMSB0byB2Mi4zLjIgIzE0MC4gVGhhbmtzIHRvIERlcGVuZGFib3QuIAoqIFVwZGF0ZSBhY3Rpb25zL3NldHVwLWphdmEgZnJvbSB2MS40LjAgdG8gdjEuNC4yICMxNDEsICMxNDguIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKCkNvbXBhdGliaWxpdHkgd2l0aCAyLjc6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBZZXMuClNlbWFudGljIGNvbXBhdGlibGU6IFllcy4KCkNvbW1vbnMgSU8gMi43IGFuZCB1cCByZXF1aXJlcyBKYXZhIDggb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi42IHJlcXVpcmVzIEphdmEgNyBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjMgdGhyb3VnaCAyLjUgcmVxdWlyZXMgSmF2YSA2IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMiByZXF1aXJlcyBKYXZhIDUgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlLgoKSGlzdG9yaWNhbCBsaXN0IG9mIGNoYW5nZXM6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2NoYW5nZXMtcmVwb3J0Lmh0bWwKCkZvciBjb21wbGV0ZSBpbmZvcm1hdGlvbiBvbiBBcGFjaGUgQ29tbW9ucyBJTywgaW5jbHVkaW5nIGluc3RydWN0aW9ucyBvbiBob3cgdG8gc3VibWl0IGJ1ZyByZXBvcnRzLApwYXRjaGVzLCBvciBzdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnQsIHNlZSB0aGUgQXBhY2hlIENvbW1vbnMgSU8gd2Vic2l0ZToKCmh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvLwoKRG93bmxvYWQgcGFnZTogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vZG93bmxvYWRfaW8uY2dpCgpIYXZlIGZ1biEKLUFwYWNoZSBDb21tb25zIFRlYW0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQXBhY2hlIENvbW1vbnMgSU8gClZlcnNpb24gMi43ClJlbGVhc2UgTm90ZXMKCkludHJvZHVjdGlvbgotLS0tLS0tLS0tLS0KCkNvbW1vbnMgSU8gaXMgYSBwYWNrYWdlIG9mIEphdmEgdXRpbGl0eSBjbGFzc2VzIGxpa2UgamF2YS5pby4gIApDbGFzc2VzIGluIHRoaXMgcGFja2FnZSBhcmUgY29uc2lkZXJlZCB0byBiZSBzbyBzdGFuZGFyZCBhbmQgb2Ygc3VjaCBoaWdoIApyZXVzZSBhcyB0byBqdXN0aWZ5IGV4aXN0ZW5jZSBpbiBqYXZhLmlvLgoKVGhlIEFwYWNoZSBDb21tb25zIElPIGxpYnJhcnkgY29udGFpbnMgdXRpbGl0eSBjbGFzc2VzLCBzdHJlYW0gaW1wbGVtZW50YXRpb25zLCBmaWxlIGZpbHRlcnMsCmZpbGUgY29tcGFyYXRvcnMsIGVuZGlhbiB0cmFuc2Zvcm1hdGlvbiBjbGFzc2VzLCBhbmQgbXVjaCBtb3JlLgoKSmF2YSA4IHJlcXVpcmVkLgoKTmV3IGZlYXR1cmVzCi0tLS0tLS0tLS0tLQoKKiAgICAgICAgICAgQWRkaW5nIHRoZSBDaXJjdWxhckJ1ZmZlcklucHV0U3RyZWFtLCBhbmQgdGhlIFBlZWthYmxlSW5wdXRTdHJlYW0uIAoqIElPLTU1MzogIEFkZCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZW5hbWVVdGlscy5pc0lsbGVnYWxXaW5kb3dzRmlsZU5hbWUoY2hhcikuIAoqIElPLTU3NzogIEFkZCByZWFkZXJzIHRvIGZpbHRlciBvdXQgZ2l2ZW4gY2hhcmFjdGVyczogQ2hhcmFjdGVyU2V0RmlsdGVyUmVhZGVyIGFuZCBDaGFyYWN0ZXJGaWx0ZXJSZWFkZXIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTU5NDogIEFkZCBJT1V0aWxzIGNvcHkgbWV0aG9kcyB3aXRoIGphdmEubGFuZy5BcHBlbmRhYmxlIGFzIHRoZSB0YXJnZXQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTYwNTogIEFkZCBjbGFzcyBDYW5FeGVjdXRlRmlsZUZpbHRlci4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNTc4OiAgU3VwcG9ydCBqYXZhLm5pby5QYXRoIGFuZCBub24tZGVmYXVsdCBmaWxlIHN5c3RlbXMgZm9yIFJldmVyc2VkTGluZXNGaWxlUmVhZGVyICgjNjIpLiBUaGFua3MgdG8gTWFyayBDaGVzbmV5LiAKKiBJTy02MDg6ICBBZGQgYSBjb252ZW5pZW5jZSBOdWxsUHJpbnRTdHJlYW0uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTYxMjogIEFkZCBjbGFzcyBUZWVSZWFkZXIuIFRoYW5rcyB0byBSb2IgU3Bvb3IsIEdhcnkgR3JlZ29yeS4gCiogSU8tNjEzOiAgQWRkIGNsYXNzZXMgQ2xvc2VkUmVhZGVyIGFuZCBDbG9zZVNoaWVsZFJlYWRlci4gIzg0LiBUaGFua3MgdG8gUm9iIFNwb29yLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTYxNDogIEFkZCBjbGFzc2VzIFRhZ2dlZFdyaXRlciwgQ2xvc2VkV3JpdGVyIGFuZCBCcm9rZW5Xcml0ZXIuICM4Ni4gVGhhbmtzIHRvIFJvYiBTcG9vci4gCiogSU8tNjE1OiAgQWRkIGNsYXNzZXMgVGVlV3JpdGVyLCBGaWx0ZXJDb2xsZWN0aW9uV3JpdGVyLCBQcm94eUNvbGxlY3Rpb25Xcml0ZXIsIElPRXhjZXB0aW9uTGlzdCwgSU9JbmRleGVkRXhjZXB0aW9uLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LCBSb2IgU3Bvb3IuIAoqIElPLTYxNjogIEFkZCBjbGFzcyBBcHBlbmRhYmxlV3JpdGVyLiAjODcuIFRoYW5rcyB0byBSb2IgU3Bvb3IuIAoqIElPLTYxNzogIEFkZCBjbGFzcyBDbG9zZVNoaWVsZFdyaXRlci4gIzgzLiBUaGFua3MgdG8gUm9iIFNwb29yLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTYxODogIEFkZCBjbGFzc2VzIEFkZGVkIFRhZ2dlZFJlYWRlciwgQ2xvc2VkUmVhZGVyIGFuZCBCcm9rZW5SZWFkZXIuICM4NS4gVGhhbmtzIHRvIFJvYiBTcG9vci4gCiogSU8tNjE5OiAgU3VwcG9ydCBzdWIgc2VxdWVuY2VzIGluIENoYXJTZXF1ZW5jZVJlYWRlci4gIzkxLiBUaGFua3MgdG8gUm9iIFNwb29yLiAKKiBJTy02MzE6ICBBZGQgYSBDb3VudGluZ0ZpbGVWaXNpdG9yIChhcyB0aGUgYmFzaXMgZm9yIGEgZm9ydGhjb21pbmcgRGVsZXRpbmdGaWxlVmlzaXRvcikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTYzMjogIEFkZCBQYXRoVXRpbHMgZm9yIG9wZXJhdGlvbnMgb24gTklPIFBhdGguIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTYzMzogIEFkZCBEZWxldGluZ0ZpbGVWaXNpdG9yLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy02MzU6ICBBZGQgb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHMuY2xvc2UoQ2xvc2VhYmxlKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNjM2OiAgQWRkIGFuZCByZXVzZSBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlscy5jbG9zZVF1aXRlbHkoQ2xvc2VhYmxlLCBDb25zdW1lcjxJT0V4Y2VwdGlvbj4pLgogICAgICAgICAgIEFkZCBhbmQgcmV1c2Ugb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHMuY2xvc2UoQ2xvc2VhYmxlLCBJT0NvbnN1bWVyPElPRXhjZXB0aW9uPikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTY0NTogIEFkZCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uZmlsZS5QYXRoVXRpbHMuZmlsZUNvbnRlbnRFcXVhbHMoUGF0aCwgUGF0aCwgT3Blbk9wdGlvbi4uLikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTQ1ODogIEFkZCBhIFNlcXVlbmNlUmVhZGVyIHNpbWlsYXIgdG8gamF2YS5pby5TZXF1ZW5jZUlucHV0U3RyZWFtLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LCBKb3NodWEgR2l0bGluLiAKKiBJTy02NDg6ICBJbXBsZW1lbnQgZGlyZWN0b3J5IGNvbnRlbnQgZXF1YWxpdHkuIDEwMCMuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqIElPLTY0ODogIFJlZmFjdG9yIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBpbnRvIHN5bmNocm9uaXplZCBhbmQgdW5zeW5jaHJvbml6ZWQgdmVyc2lvbnMgIzEwOC4gVGhhbmtzIHRvIEFkYW0gUmV0dGVyLCBBbGV4IEhlcmJlcnQsIEdhcnkgR3JlZ29yeS4gCiogSU8tNjYyOiAgUmVmYWN0b3IgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGludG8gc3luY2hyb25pemVkIGFuZCB1bnN5bmNocm9uaXplZCB2ZXJzaW9ucyAjMTA4LiBUaGFua3MgdG8gQWRhbSBSZXR0ZXIsIEdhcnkgR3JlZ29yeS4gCgpGaXhlZCBCdWdzCi0tLS0tLS0tLS0KCiogSU8tNTg5OiAgU29tZSB0ZXN0cyBmYWlsIGlmIHRoZSBiYXNlIHBhdGggY29udGFpbnMgYSBzcGFjZS4gCiogSU8tNTgyOiAgTWFrZSBtZXRob2RzIGluIE9ic2VydmFibGVJbnB1dFN0cmVhbS5PYnNlcnZlciBwdWJsaWMuIFRoYW5rcyB0byBCcnVubyBQYWxvcy4KKiBJTy01MzU6ICBUaHJlYWQgYnVnIGluIEZpbGVBbHRlcmF0aW9uTW9uaXRvci5zdG9wKGludCkuIFRoYW5rcyB0byBTdmV0bGluIFphcmV2LCBBbnRob255IFJheW1vbmQuIAoqIElPLTU1NzogIFBlcmZvcm0gbG9jYWxlIGluZGVwZW5kZW50IHVwcGVyIGNhc2UgY29udmVyc2lvbnMuIFRoYW5rcyB0byBsdWNjaW9tYW4uIAoqIElPLTU3MDogIE1pc3NpbmcgSmF2YWRvYyBpbiBGaWxlbmFtZVV0aWxzIGNhdXNpbmcgVHJhdmlzLUNJIGJ1aWxkIHRvIGZhaWwuIFRoYW5rcyB0byBQcmFuZXQgVmVybWEuIAoqIElPLTU3MTogIFJlbW92ZSByZWR1bmRhbnQgaXNEaXJlY3RvcnkoKSBjaGVjayBpbiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzLmxpc3RGaWxlc0FuZERpcnMoRmlsZSwgSU9GaWxlRmlsdGVyLCBJT0ZpbGVGaWx0ZXIpLiBUaGFua3MgdG8gcHJhbmV0LiAKKiBJTy01NTk6ICBGaWxlbmFtZVV0aWxzLm5vcm1hbGl6ZSBub3cgdmVyaWZpZXMgaG9zdG5hbWUgc3ludGF4IGluIFVOQyBwYXRoLiAKKiBJTy01NTQ6ICBGaWxlVXRpbHMuY29weVRvRmlsZShJbnB1dFN0cmVhbSBzb3VyY2UsIEZpbGUgZGVzdGluYXRpb24pIHNob3VsZCBub3QgY2xvc2UgaW5wdXQgc3RyZWFtLiBUaGFua3MgdG8gTWljaGVsZSBNYXJpb3R0aS4gCiogSU8tNjA0OiAgRmlsZVV0aWxzLmRvQ29weUZpbGUoRmlsZSwgRmlsZSwgYm9vbGVhbikgY2FuIHRocm93IENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy02MjU6ICBDb3JyZWN0ZWQgbWlzbGVhZGluZyBleGNlcHRpb24gbWVzc2FnZSBmb3IgRmlsZVV0aWxzLmNvcHlEaXJlY3RvcnlUb0RpcmVjdG9yeS4gVGhhbmtzIHRvIE1pa2tvIE1hdW51LiAKKiBJTy02MjY6ICBBIG1pc3Rha2UgaW4gdGhlIEZpbGVuYW1lVXRpbHMuY29uY2F0KCkncyBKYXZhZG9jIGFib3V0IGFuIGFic29sdXRlIHBhdGguIFRoYW5rcyB0byBZdWppIEtvbmlzaGkuIAoqIElPLTY0MDogIE5QRSBpbiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlscy5jb250ZW50RXF1YWxzKElucHV0U3RyZWFtLCBJbnB1dFN0cmVhbSkgd2hlbiBvbmx5IG9uZSBpbnB1dCBpcyBudWxsLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy02NDE6ICBOUEUgaW4gb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHMuY29udGVudEVxdWFscyhSZWFkZXIsIFJlYWRlcikgd2hlbiBvbmx5IG9uZSBpbnB1dCBpcyBudWxsLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy02NDM6ICBOUEUgaW4gb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHMuY29udGVudEVxdWFsc0lnbm9yZUVPTChSZWFkZXIsIFJlYWRlcikgd2hlbiBvbmx5IG9uZSBpbnB1dCBpcyBudWxsLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy02NDQ6ICBOUEUgaW4gb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlscy5jb250ZW50RXF1YWxzSWdub3JlRU9MKEZpbGUsIEZpbGUpIHdoZW4gb25seSBvbmUgaW5wdXQgaXMgbnVsbC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNjY0OiAgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlscy5jb3B5VVJMVG9GaWxlKCopIG9wZW4gYnV0IGRvIG5vdCBjbG9zZSBzdHJlYW1zLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKCkNoYW5nZXMKLS0tLS0tLQoKKiBJTy01NzI6ICBSZWZhY3RvciBkdXBsaWNhdGUgY29kZSBpbiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzLiBUaGFua3MgdG8gUHJhbmV0IFZlcm1hLiAKKiBJTy01ODA6ICBVcGRhdGUgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVuYW1lVXRpbHMuaXNFeHRlbnNpb24oU3RyaW5nLCBTdHJpbmdbXSkgdG8gdXNlIHZhciBhcmdzLiAKKiBJTy03MDE6ICBNYWtlIGFycmF5IGRlY2xhcmF0aW9uIGluIFRocmVzaG9sZGluZ091dHB1dFN0cmVhbSBjb25zaXN0ZW50IHdpdGggb3RoZXIgYXJyYXkgZGVjbGFyYXRpb25zIGluIHRoZSBsaWJyYXJ5ICM3Ny4gVGhhbmtzIHRvIFJheW1vbmQgVGFuLiAKKiBJTy02MDc6ICBVcGRhdGUgZnJvbSBKYXZhIDcgdG8gSmF2YSA4LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy02MTA6ICBSZW1vdmUgdGhyb3dzIElPRXhjZXB0aW9uIGluIG1ldGhvZCBpc1N5bWxpbmsoKSAjODAuIFRoYW5rcyB0byBTZWJhc3RpYW4uIAoqIElPLTYyODogIE1pZ3JhdGlvbiB0byBKVW5pdCBKdXBpdGVyICM5Ny4gVGhhbmtzIHRvIEFsbG9uIE11cmVpbmlrLiAKKiBJTy02MzA6ICBEZXByZWNhdGUgb3JnLmFwYWNoZS5jb21tb25zLmlvLm91dHB1dC5OdWxsT3V0cHV0U3RyZWFtLk51bGxPdXRwdXRTdHJlYW0oKSBpbiBmYXZvciBvZiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8ub3V0cHV0Lk51bGxPdXRwdXRTdHJlYW0uTlVMTF9PVVRQVVRfU1RSRUFNLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiBJTy02Mjk6ICBGaWxlVXRpbHMjZm9yY2VEZWxldGUgc2hvdWxkIHVzZSBGaWxlcyNkZWxldGUgcmF0aGVyIHRoYW4gRmlsZSNkZWxldGUgc28gZXhjZXB0aW9uIG1lc3NhZ2VzIGluY2x1ZGVzIHJlYXNvbiBmb3IgZmFpbHVyZS4gVGhhbmtzIHRvIElhbiBTcHJpbmdlciwgSWFuIFNwcmluZ2VyLCBHYXJ5IEdyZWdvcnkuIAoqIElPLTYzNDogIE1ha2UgZ2V0Q2F1c2Ugc3luY2hyb25pemVkIGFuZCB1c2UgYSBEZXF1ZSBpbnN0ZWFkIG9mIGEgU3RhY2sgIzY0LiBUaGFua3MgdG8gVuFjbGF2IEhhaXNtYW4sIEJydW5vIFAuIEtpbm9zaGl0YSwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgIFVwZGF0ZSB0ZXN0cyBmcm9tIEFwYWNoZSBDb21tb25zIExhbmcgMy45IHRvIDMuMTAuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICAgVXBkYXRlIHRlc3RzIG9yZy5qdW5pdC1waW9uZWVyOmp1bml0LXBpb25lZXIgMC4zLjAgLT4gMC42LjAuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICAgVXBkYXRlIHRlc3RzIG9yZy5qdW5pdC5qdXBpdGVyOmp1bml0LWp1cGl0ZXIgNS41LjIgLT4gNS42LjIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICAgVXBkYXRlIHRlc3RzIG9yZy5tb2NraXRvOm1vY2tpdG8tY29yZSAzLjAuMCAtPiAzLjMuMy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNjY2OiAgTm9ybWFsaXplIGludGVybmFsIGJ1ZmZlcnMgdG8gODE5MiBieXRlcy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNjY1OiAgRW5zdXJlIHRoYXQgcGFzc2luZyBhIG51bGwgSW5wdXRTdHJlYW0gcmVzdWx0cyBpbiBOUEUgd2l0aCB0ZXN0cyAjMTEyLiBUaGFua3MgdG8gT3R0byBGb3dsZXIsIEdhcnkgR3JlZ29yeS4gCiogICAgICAgICAgICBjb21tb25zLmphY29jby52ZXJzaW9uIDAuOC40IC0+IDAuOC41LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgIGNvbS5naXRodWIuc2lvbTc5LmphcGljbXA6amFwaWNtcC1tYXZlbi1wbHVnaW4gMC4xNC4xIC0+IDAuMTQuMy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCiogSU8tNjY3OiAgQWRkIGZ1bmN0aW9uYWwgaW50ZXJmYWNlcyBJT0Z1bmN0aW9uIGFuZCBJT1N1cHBsaWVyICMxMTAuIFRoYW5rcyB0byBBZGFtIFJldHRlciwgR2FyeSBHcmVnb3J5LiAKKiAgICAgICAgICAgIFN1cHBvcnQgc3ViIHNlcXVlbmNlcyBpbiBDaGFyU2VxdWVuY2VSZWFkZXIgIzkxLiBUaGFua3MgdG8gUm9iIFNwb29yLCBHYXJ5IEdyZWdvcnkuIAoqICAgICAgICAgICAgUmVtb3ZlIGRlcHJlY2F0ZWQgc3VkbyBzZXR0aW5nLiAjMTEzLiBUaGFua3MgdG8gZGVuZ2xpbWluZy4gCgpDb21wYXRpYmlsaXR5IHdpdGggMi42OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogWWVzLgpTZW1hbnRpYyBjb21wYXRpYmxlOiBZZXMuCgpDb21tb25zIElPIDIuNyBhbmQgdXAgcmVxdWlyZXMgSmF2YSA4IG9yIGFib3ZlLgpDb21tb25zIElPIDIuNiByZXF1aXJlcyBKYXZhIDcgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4zIHRocm91Z2ggMi41IHJlcXVpcmVzIEphdmEgNiBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjIgcmVxdWlyZXMgSmF2YSA1IG9yIGFib3ZlLgpDb21tb25zIElPIDEuNCByZXF1aXJlcyBKYXZhIDEuMyBvciBhYm92ZS4KCkhpc3RvcmljYWwgbGlzdCBvZiBjaGFuZ2VzOiBodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby9jaGFuZ2VzLXJlcG9ydC5odG1sCgpGb3IgY29tcGxldGUgaW5mb3JtYXRpb24gb24gQXBhY2hlIENvbW1vbnMgSU8sIGluY2x1ZGluZyBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHN1Ym1pdCBidWcgcmVwb3J0cywKcGF0Y2hlcywgb3Igc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50LCBzZWUgdGhlIEFwYWNoZSBDb21tb25zIElPIHdlYnNpdGU6CgpodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby8KCkRvd25sb2FkIHBhZ2U6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2Rvd25sb2FkX2lvLmNnaQoKSGF2ZSBmdW4hCi1BcGFjaGUgQ29tbW9ucyBUZWFtCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkFwYWNoZSBDb21tb25zIElPIFZlcnNpb24gMi42CgpJbnRyb2R1Y3Rpb24KLS0tLS0tLS0tLS0tCgpBcGFjaGUgQ29tbW9ucyBJTyBpcyBhIHBhY2thZ2Ugb2YgSmF2YSB1dGlsaXR5IGNsYXNzZXMgbGlrZSBqYXZhLmlvLgpDbGFzc2VzIGluIHRoaXMgcGFja2FnZSBhcmUgY29uc2lkZXJlZCB0byBiZSBzbyBzdGFuZGFyZCBhbmQgb2Ygc3VjaCBoaWdoCnJldXNlIGFzIHRvIGp1c3RpZnkgZXhpc3RlbmNlIGluIGphdmEuaW8uCgpUaGUgQXBhY2hlIENvbW1vbnMgSU8gbGlicmFyeSBjb250YWlucyB1dGlsaXR5IGNsYXNzZXMsIHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMsCmZpbGUgZmlsdGVycywgZmlsZSBjb21wYXJhdG9ycywgZW5kaWFuIHRyYW5zZm9ybWF0aW9uIGNsYXNzZXMsIGFuZCBtdWNoIG1vcmUuCgpBcGFjaGUgQ29tbW9ucyBJTyAyLjYgcmVxdWlyZXMgYXQgbGVhc3QgSmF2YSA3IHRvIGJ1aWxkIGFuZCBydW4uCgpERVBSRUNBVElPTlMKPT09PT09PT09PT09CgpBbGwgY2xvc2VRdWlldGx5IG92ZXJsb2FkcyBpbiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlscyBoYXZlIGJlZW4KZGVwcmVjYXRlZC4gVXNlIHRoZSB0cnktd2l0aC1yZXNvdXJjZXMgc3RhdGVtZW50IG9yIGhhbmRsZSBzdXBwcmVzc2VkCmV4Y2VwdGlvbnMgbWFudWFsbHkuCgpUaGUgY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVTeXN0ZW1VdGlscyBoYXMgYmVlbiBkZXByZWNhdGVkLgpVc2UgZXF1aXZhbGVudCBtZXRob2RzIGluIGphdmEubmlvLmZpbGUuRmlsZVN0b3JlIGluc3RlYWQsIGUuZy4KRmlsZXMuZ2V0RmlsZVN0b3JlKFBhdGhzLmdldCgiL2hvbWUiKSkuZ2V0VXNhYmxlU3BhY2UoKSBvciBpdGVyYXRlIG92ZXIKRmlsZVN5c3RlbXMuZ2V0RGVmYXVsdCgpLmdldEZpbGVTdG9yZXMoKS4KCkNPTVBBVElCSUxJVFkgV0lUSCBKQVZBIDkKPT09PT09PT09PT09PT09PT09CgpUaGUgTUFOSUZFU1QuTUYgbm93IGNvbnRhaW5zIGFuIGFkZGl0aW9uYWwgZW50cnk6CgogIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmFwYWNoZS5jb21tb25zLmlvCgpUaGlzIHNob3VsZCBtYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSBDb21tb25zIElPIDIuNiBhcyBhIG1vZHVsZSBpbiB0aGUgSmF2YSA5Cm1vZHVsZSBzeXN0ZW0uIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgY29ycmVzcG9uZGluZyBpc3N1ZToKCiAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0lPLTU1MQoKQnVpbGRpbmcgQ29tbW9ucyBJTyAyLjYgc2hvdWxkIHdvcmsgb3V0IG9mIHRoZSBib3ggd2l0aCB0aGUgbGF0ZXN0IEphdmEgOQpyZWxlYXNlLiBQbGVhc2UgcmVwb3J0IGFueSBKYXZhIDkgcmVsYXRlZCBpc3N1ZXMgYXQ6CgogICAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9JTwoKTkVXIEZFQVRVUkVTCj09PT09PT09PT09PQoKKiBJTy01NTE6IEFkZCBBdXRvbWF0aWMtTW9kdWxlLU5hbWUgTUFOSUZFU1QgZW50cnkgZm9yIEphdmEgOSBjb21wYXRpYmlsaXR5LgoqIElPLTM2NzogQWRkIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGNvcHlUb0RpcmVjdG9yeS4gVGhhbmtzIHRvIEphbWVzIFNhd2xlLgoqIElPLTQ5MzogQWRkIGluZmluaXRlIGNpcmN1bGFyIGlucHV0IHN0cmVhbS4gVGhhbmtzIHRvIFBpb3RyIFR1cnNraS4KKiBJTy01MDc6IEFkZCBhIEJ5dGVPcmRlclV0aWxzIGNsYXNzLgoqIElPLTUxODogQWRkIE9ic2VydmFibGVJbnB1dFN0cmVhbS4KKiBJTy01MTk6IEFkZCBNZXNzYWdlRGlnZXN0Q2FsY3VsYXRpbmdJbnB1dFN0cmVhbS4KKiBJTy01MTM6IEFkZCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciByZWFkaW5nIGNsYXNzIHBhdGggcmVzb3VyY2VzLgogICAgICAgICAgVGhhbmtzIHRvIEJlaHJhbmcgU2FlZWR6YWRlaC4KCkZJWEVEIEJVR1MKPT09PT09PT09PQoKKiBJTy01NDY6IENsb3NlZE91dHB1dFN0cmVhbSNmbHVzaCBzaG91bGQgdGhyb3cuIFRoYW5rcyB0byBUb21hcyBDZWxheWEuCiogSU8tNTUwOiBEb2N1bWVudGF0aW9uIGlzc3VlLCBmaXggNDA0IEphdmFkb2MgaXNzdWVzIGluIHRoZSBkZXNjcmlwdGlvbiBwYWdlLgogICAgICAgICAgVGhhbmtzIHRvIEppbWkgQWRyaWFuLgoqIElPLTQ0MjogSmF2YWRvYyBjb250cmFkaWN0b3J5IGZvciBGaWxlRmlsdGVyVXRpbHMuYWdlRmlsZUZpbHRlcihjdXRvZmYpIGFuZAogICAgICAgICAgdGhlIGZpbHRlciBpdCBjb25zdHJ1Y3RzOiBBZ2VGaWxlRmlsdGVyKGN1dG9mZikuCiAgICAgICAgICBUaGFua3MgdG8gU2ltb24gUm9iaW5zb24uCiogSU8tNTM0OiBGaWxlVXRpbFRlc3RDYXNlLnRlc3RGb3JjZURlbGV0ZURpcigpIHNob3VsZCBub3QgZGVsZXRlIHRlc3REaXJlY3RvcnkKICAgICAgICAgIHBhcmVudC4KKiBJTy01Mjg6IEZpeCBUYWlsZXIucnVuIHJhY2UgY29uZGl0aW9uIHJ1bmF3YXkgbG9nZ2luZy4gVGhhbmtzIHRvIERhdmUgTW90ZW4uCiogSU8tNDgzOiBnZXRQcmVmaXhMZW5ndGggcmV0dXJuIC0xIGlmIFVuaXggZmlsZSBjb250YWlucyBjb2xvbi4KICAgICAgICAgIFRoYW5rcyB0byBNYXJrbyBWYXNpYy4KKiBJTy01MjA6IEZpbGVVdGlsc1Rlc3RDYXNlI3Rlc3RDb250ZW50RXF1YWxzSWdub3JlRU9MIGZhaWxzIG9uIFdpbmRvd3MuCiogSU8tNTE2OiAuZ2l0YXR0cmlidXRlcyBub3QgY29ycmVjdGx5IGFwcGxpZWQuIFRoYW5rcyB0byBKYXNvbiBQeWVyb24uCiogSU8tNTE1OiBBbGxvdyBTcGVjaWZ5aW5nIEluaXRpYWwgQnVmZmVyIFNpemUgb2YgRGVmZXJyZWRGaWxlT3V0cHV0U3RyZWFtLgogICAgICAgICAgVGhhbmtzIHRvIEJyZXR0IExvdW5zYnVyeSwgR2FyeSBHcmVnb3J5LgoqIElPLTUxMjogVGhyZXNob2xkaW5nT3V0cHV0U3RyZWFtLnRocmVzaG9sZFJlYWNoZWQoKSByZXN1bHRzIGluCiAgICAgICAgICBGaWxlTm90Rm91bmRFeGNlcHRpb24uIFRoYW5rcyB0byBSYWxmIEhhdXNlci4KKiBJTy01MTE6IEFmdGVyIGEgZmV3IHVuaXQgdGVzdHMsIGEgZmV3IG5ld2x5IGNyZWF0ZWQgZGlyZWN0b3JpZXMgbm90IGNsZWFuZWQKICAgICAgICAgIGNvbXBsZXRlbHkuIFRoYW5rcyB0byBBaG1ldCBDZWxpay4KKiBJTy01MDI6IEV4Y2VwdGlvbnMgYXJlIHN1cHByZXNzZWQgaW5jb3JyZWN0bHkgd2hlbiBjb3B5aW5nIGZpbGVzLgogICAgICAgICAgVGhhbmtzIHRvIENocmlzdGlhbiBTY2h1bHRlLgoqIElPLTUwMzogVXBkYXRlIHBsYXRmb3JtIHJlcXVpcmVtZW50IHRvIEphdmEgNy4KKiBJTy01Mzc6IEJPTUlucHV0U3RyZWFtIHNob3VsZG4ndCBzb3J0IGFycmF5IG9mIEJPTXMgaW4tcGxhY2UuCiAgICAgICAgICBUaGFua3MgdG8gQm9yeXMgWmlicm92LgoKQ0hBTkdFUwo9PT09PT09CgoqIElPLTU1MzogTWFrZSBjb2RlIHN0eWxlIG9mIGhhc0JPTSgpIGNvbnNpc3RlbnQgd2l0aCBnZXRCT01DaGFyc2V0TmFtZSgpLgogICAgICAgICAgVGhhbmtzIHRvIE1pY2hhZWwgRXJuc3QuCiogSU8tNTQyOiBGaWxlVXRpbHMjcmVhZEZpbGVUb0J5dGVBcnJheTogb3B0aW1pemUgcmVhZGluZyBvZiBmaWxlcyB3aXRoIGtub3duCiAgICAgICAgICBzaXplLiBUaGFua3MgdG8gSWxtYXJzIFBvaWthbnMuCiogSU8tNTQ3OiBUaHJvdyBhIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbnN0ZWFkIG9mIE51bGxQb2ludGVyRXhjZXB0aW9uIGluCiAgICAgICAgICBGaWxlU3lzdGVtVXRpbHMuZnJlZVNwYWNlV2luZG93cygpLiBUaGFua3MgdG8gTmlraGlsIFNoaW5kZSwKICAgICAgICAgIE1pY2hhZWwgRXJuc3QsIEdhcnkgR3Jlb3J5LgoqIElPLTUwNjogRGVwcmVjYXRlIG1ldGhvZHMgRmlsZVN5c3RlbVV0aWxzLmZyZWVTcGFjZUtiKCkuCiAgICAgICAgICBUaGFua3MgdG8gQ2hyaXN0aWFuIFNjaHVsdGUuCiogSU8tNTA1OiBNYWtlIExpbmVJdGVyYXRvciBpbXBsZW1lbnQgQ2xvc2VhYmxlIHRvIHN1cHBvcnQgdHJ5LXdpdGgtcmVzb3VyY2VzCiAgICAgICAgICBzdGF0ZW1lbnRzLiBUaGFua3MgdG8gQ2hyaXN0aWFuIFNjaHVsdGUuCiogSU8tNTA0OiBEZXByZWNhdGVkIG9mIGFsbCBJT1V0aWxzLmNsb3NlUXVpZXRseSgpIG1ldGhvZHMgYW5kIHVzZQogICAgICAgICAgdHJ5LXdpdGgtcmVzb3VyY2VzIGludGVybmFsbHkuIFRoYW5rcyB0byBDaHJpc3RpYW4gU2NodWx0ZS4KClJFTU9WRUQKPT09PT09PQoKKiBJTy01MTQ6IFJlbW92ZSBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSmF2YTdTdXBwb3J0LgoKQ09NUEFUSUJJTElUWSBXSVRIIE9MREVSIFZFUlNJT05TCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuNToKQmluYXJ5IGNvbXBhdGlibGU6IFllcy4KU291cmNlIGNvbXBhdGlibGU6IFllcy4KU2VtYW50aWMgY29tcGF0aWJsZTogWWVzLgoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuNiBhbmQgMS40OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogTm8sIHNlZSB0aGUgcmFyZSBjYXNlIGluCiAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9JTy0zMTguClNlbWFudGljIGNvbXBhdGlibGU6IE5vLCBzZWUgdGhlIHJhcmUgY2FzZSBpbgogIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSU8tMzE4LgoKQ29tbW9ucyBJTyAyLjcgYW5kIHVwIHJlcXVpcmVzIEphdmEgOCBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjYgcmVxdWlyZXMgSmF2YSA3IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMyB0aHJvdWdoIDIuNSByZXF1aXJlcyBKYXZhIDYgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4yIHJlcXVpcmVzIEphdmEgNSBvciBhYm92ZS4KQ29tbW9ucyBJTyAxLjQgcmVxdWlyZXMgSmF2YSAxLjMgb3IgYWJvdmUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkFwYWNoZSBDb21tb25zIElPIFZlcnNpb24gMi41CgpOZXcgZmVhdHVyZXMgYW5kIGJ1ZyBmaXhlcy4KCk5ldyBmZWF0dXJlcwotLS0tLS0tLS0tLS0KCiogSU8tNDg3OiAgQWRkIFZhbGlkYXRpbmdPYmplY3RJbnB1dFN0cmVhbSBmb3IgY29udHJvbGxlZCBkZXNlcmlhbGl6YXRpb24gCiogSU8tNDcxOiAgU3VwcG9ydCBmb3IgYWRkaXRpb25hbCBlbmNvZGluZ3MgaW4gUmV2ZXJzZWRMaW5lc0ZpbGVSZWFkZXIgVGhhbmtzIHRvIExlYW5kcm8gUmVpcy4gCiogSU8tNDI1OiAgU2V0dGVyIG1ldGhvZCBmb3IgdGhyZXNob2xkIG9uIFRocmVzaG9sZGluZ091dHB1dFN0cmVhbSBUaGFua3MgdG8gQ3JhaWcgU3dhbmsuIAoqIElPLTQwNjogIEludHJvZHVjZSBuZXcgY2xhc3MgQXBwZW5kYWJsZU91dHB1dFN0cmVhbSBUaGFua3MgdG8gTmlhbGwgUGVtYmVydG9uLiAKKiBJTy00NTk6ICBBZGQgV2luZG93c0xpbmVFbmRpbmdJbnB1dFN0cmVhbSBhbmQgVW5peExpbmVFbmRpbmdJbnB1dFN0cmVhbS4gVGhhbmtzIHRvIEtyaXN0aWFuIFJvc2Vudm9sZC4gCiogSU8tNDU3OiAgQWRkIGEgQm91bmRlZFJlYWRlciwgYSB3cmFwcGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uc3RyYWluIGFjY2VzcwogICAgICAgIHRvIGFuIHVuZGVybHlpbmcgc3RyZWFtIHdoZW4gdXNlZCB3aXRoIG1hcmsvcmVzZXQgLQogICAgICAgIHRvIGF2b2lkIG92ZXJmbG93aW5nIHRoZSBtYXJrIGxpbWl0IG9mIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlci4gVGhhbmtzIHRvIEtyaXN0aWFuIFJvc2Vudm9sZC4gCiogSU8tNDI2OiAgQWRkIEFQSSBJT1V0aWxzLmNsb3NlUXVpZXRseShDbG9zZWFibGUuLi4pIAoqIElPLTQxMDogIFJlYWRmdWxseSgpIFRoYXQgUmV0dXJucyBBIEJ5dGUgQXJyYXkgVGhhbmtzIHRvIEJlbHVnYSBCZWhyLiAKKiBJTy0zOTU6ICBPdmVybG9hZCBJT1V0aWxzIGJ1ZmZlciBtZXRob2RzIHRvIGFjY2VwdCBidWZmZXIgc2l6ZSBUaGFua3MgdG8gQmVsdWdhIEJlaHIuIAoqIElPLTM4MjogIENodW5rZWQgSU8gZm9yIGxhcmdlIGFycmF5cy4KICAgICAgICAgQWRkZWQgd3JpdGVDaHVua2VkKGJ5dGVbXSwgT3V0cHV0U3RyZWFtKSBhbmQgd3JpdGVDaHVua2VkKGNoYXJbXSBXcml0ZXIpCiAgICAgICAgIEFkZGVkIENodW5rZWRPdXRwdXRTdHJlYW0sIENodW5rZWRXcml0ZXIgCiogSU8tMjMzOiAgQWRkIE1ldGhvZHMgZm9yIEJ1ZmZlcmluZyBTdHJlYW1zL1dyaXRlcnMgVG8gSU9VdGlscwogICAgICAgICBBZGRlZCBvdmVybG9hZGVkIGJ1ZmZlcigpIG1ldGhvZHMgLSBzZWUgYWxzbyBJTy0zMzAgCiogSU8tMzMwOiAgSU9VdGlscyN0b0J1ZmZlcmVkT3V0cHV0U3RyZWFtL3RvQnVmZmVyZWRXcml0ZXIgdG8gY29uZGl0aW9uYWxseSB3cmFwIHRoZSBvdXRwdXQKICAgICAgICAgQWRkZWQgb3ZlcmxvYWRlZCBidWZmZXIoKSBtZXRob2RzIC0gc2VlIGFsc28gSU8tMjMzIAoqIElPLTM4MTogIEFkZCBGaWxlVXRpbHMuY29weUlucHV0U3RyZWFtVG9GaWxlIEFQSSB3aXRoIG9wdGlvbiB0byBsZWF2ZSB0aGUgc291cmNlIG9wZW4uCiAgICAgICAgU2VlIGNvcHlJbnB1dFN0cmVhbVRvRmlsZShmaW5hbCBJbnB1dFN0cmVhbSBzb3VyY2UsIGZpbmFsIEZpbGUgZGVzdGluYXRpb24sIGJvb2xlYW4gY2xvc2VTb3VyY2UpIAoqIElPLTM3OTogIENoYXJTZXF1ZW5jZUlucHV0U3RyZWFtIC0gYWRkIHRlc3RzIGZvciBhdmFpbGFibGUoKQogICAgICAgICBGaXggY29kZSBzbyBpdCByZWFsbHkgZG9lcyByZWZsZWN0IGEgbWluaW11bSBhdmFpbGFibGUuIAoqIElPLTM0NjogIEFkZCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0udG9JbnB1dFN0cmVhbSgpIAoqIElPLTM0MTogIEEgY29uc3RhbnQgZm9yIGhvbGRpbmcgdGhlIEJPTSBjaGFyYWN0ZXIgKFUrRkVGRikgCiogSU8tMzYxOiAgQWRkIEFQSSBGaWxlVXRpbHMuZm9yY2VNa2RpcnNQYXJlbnQoKS4gCiogSU8tMzYwOiAgQWRkIEFQSSBDaGFyc2V0cy5yZXF1aXJlZENoYXJzZXRzKCkuIAoqIElPLTM1OTogIEFkZCBJT1V0aWxzLnNraXAgYW5kIHNraXBGdWxseShSZWFkYWJsZUJ5dGVDaGFubmVsLCBsb25nKS4gVGhhbmtzIHRvIHl1a29iYS4gCiogSU8tMzU4OiAgQWRkIElPVXRpbHMucmVhZCBhbmQgcmVhZEZ1bGx5KFJlYWRhYmxlQnl0ZUNoYW5uZWwsIEJ5dGVCdWZmZXIgYnVmZmVyKS4gVGhhbmtzIHRvIHl1a29iYS4gCiogSU8tMzUzOiAgQWRkIEFQSSBJT1V0aWxzLmNvcHkoSW5wdXRTdHJlYW0sIE91dHB1dFN0cmVhbSwgaW50KSBUaGFua3MgdG8gZ2dyZWdvcnkuIAoqIElPLTM0OTogIEFkZCBBUEkgd2l0aCBhcnJheSBvZmZzZXQgYW5kIGxlbmd0aCBhcmd1bWVudCB0byBGaWxlVXRpbHMud3JpdGVCeXRlQXJyYXlUb0ZpbGUuIFRoYW5rcyB0byBzY29wLiAKKiBJTy0zNDg6ICBNaXNzaW5nIGluZm9ybWF0aW9uIGluIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB0aHJvd24gYnkgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlscyN2YWxpZGF0ZUxpc3RGaWxlc1BhcmFtZXRlcnMuIFRoYW5rcyB0byBwbGNzdHBpZXJyZS4gCiogSU8tMzQ1OiAgU3VwcGx5IGEgaG9vayBtZXRob2QgYWxsb3dpbmcgVGFpbGVyIGFjdGl2ZWx5IGRldGVybWluaW5nIHN0b3AgY29uZGl0aW9uLiBUaGFua3MgdG8gbWtyZXNzZS4gCiogSU8tNDM3OiAgTWFrZSBJT1V0aWxzLkVPRiBwdWJsaWMgYW5kIHJldXNlIGl0IGluIHZhcmlvdXMgY2xhc3Nlcy4gCgpGaXhlZCBCdWdzCi0tLS0tLS0tLS0KCiogSU8tNDQ2OiAgYWRkcyBhbiBlbmRPZkZpbGVSZWFjaGVkIG1ldGhvZCB0byB0aGUgVGFpbGVyTGlzdGVuZXIgVGhhbmtzIHRvIEplZmZyZXkgQmFycnVzLiAKKiBJTy00ODQ6ICBGaWxlbmFtZVV0aWxzIHNob3VsZCBoYW5kbGUgZW1iZWRkZWQgbnVsbCBieXRlcyBUaGFua3MgdG8gUGhpbGlwcGUgQXJ0ZWF1LiAKKiBJTy00ODE6ICBDaGFuZ2VkL0NvcnJlY3RlZCBhbGdvcml0aG0gZm9yIHdhaXRGb3IgCiogSU8tNDI4OiAgQk9NSW5wdXRTdHJlYW0uc2tpcCByZXR1cm5zIHdyb25nIGNvdW50IGlmIHN0cmVhbSBjb250YWlucyBubyBCT00gVGhhbmtzIHRvIFN0ZWZhbiBHbWVpbmVyLiAKKiBJTy00ODg6ICBGaWxlVXRpbHMud2FpdEZvciguLi4pIHN3YWxsb3dzIHRocmVhZCBpbnRlcnJ1cHRlZCBzdGF0dXMgVGhhbmtzIHRvIEJq9nJuIEJ1Y2huZXIuIAoqIElPLTQ1MjogIFN1cHBvcnQgZm9yIHN5bWxpbmtzIHdpdGggbWlzc2luZyB0YXJnZXQuIEFkZGVkIHN1cHBvcnQgZm9yIEpESzcgc3ltbGluayBmZWF0dXJlcyB3aGVuIHByZXNlbnQgVGhhbmtzIHRvIERhdmlkIFN0YW5kaXNoLiAKKiBJTy00NTM6ICBSZWdyZXNzaW9uIGluIEZpbGVVdGlscy5yZWFkRmlsZVRvU3RyaW5nIGZyb20gMi4wLjEgVGhhbmtzIHRvIFN0ZXZlbiBDaHJpc3RvdS4gCiogSU8tNDUxOiAgYW50IHRlc3QgZmFpbHMgLSByZXNvdXJjZXMgbWlzc2luZyBmcm9tIHRlc3QgY2xhc3NwYXRoIFRoYW5rcyB0byBEYXZpZCBTdGFuZGlzaC4gCiogSU8tNDM1OiAgRG9jdW1lbnQgdGhhdCBGaWxlVXRpbHMuZGVsZXRlRGlyZWN0b3J5LCBkaXJlY3RvcnlDb250YWlucyBhbmQgY2xlYW5EaXJlY3RvcnkKICAgICAgICAgbWF5IHRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBwYXNzZWQgZGlyZWN0b3J5IGRvZXMgbm90CiAgICAgICAgIGV4aXN0IG9yIGlzIG5vdCBhIGRpcmVjdG9yeS4gVGhhbmtzIHRvIERvbWluaWsgU3RhZGxlci4gCiogSU8tNDI0OiAgSmF2YWRvYyBmaXhlcywgbW9zdGx5IHRvIGFwcGVhc2UgMS44LjAgVGhhbmtzIHRvIFZpbGxlIFNreXR05C4gCiogSU8tMzg5OiAgRmlsZVV0aWxzLnNpemVPZkRpcmVjdG9yeSBjYW4gdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRoYW5rcyB0byBBdXN0aW4gRG91cG5pay4gCiogSU8tMzkwOiAgRmlsZVV0aWxzLnNpemVPZkRpcmVjdG9yeUFzQmlnSW50ZWdlciBjYW4gb3ZlcmZsb3cuCiAgICAgICAgIEVuc3VyZSB0aGF0IHJlY3Vyc2l2ZSBjYWxscyBhbGwgdXNlIEJpZ0ludGVnZXIgCiogSU8tMzg1OiAgRmlsZVV0aWxzLmRvQ29weUZpbGUgY2FuIHBvdGVudGlhbGx5IGxvb3AgZm9yIGV2ZXIKICAgICAgICAgRXhpdCBsb29wIGlmIG5vIGRhdGEgdG8gY29weSAKKiBJTy0zODM6ICBGaWxlVXRpbHMuZG9Db3B5RmlsZSBjYWNoZXMgdGhlIGZpbGUgc2l6ZTsgbmVlZHMgdG8gYmUgZG9jdW1lbnRlZAogICAgICAgICBBZGRlZCBKYXZhZG9jOyBzaG93IGZpbGUgbGVuZ3RocyBpbiBleGNlcHRpb24gbWVzc2FnZSAKKiBJTy0zODA6ICBGaWxlVXRpbHMuY29weUlucHV0U3RyZWFtVG9GaWxlIHNob3VsZCBkb2N1bWVudCBpdCBjbG9zZXMgdGhlIGlucHV0IHNvdXJjZSBUaGFua3MgdG8gY2xhdWRpb19jaC4gCiogSU8tMjc5OiAgVGFpbGVyIGVycm9uZW91c2x5IGNvbnNpZGVycyBmaWxlIGFzIG5ldy4KICAgICAgICBGaXggdG8gdXNlIGZpbGUubGFzdE1vZGlmaWVkKCkgcmF0aGVyIHRoYW4gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgCiogSU8tMzU2OiAgQ2hhclNlcXVlbmNlSW5wdXRTdHJlYW0jcmVzZXQoKSBiZWhhdmVzIGluY29ycmVjdGx5IGluIGNhc2Ugd2hlbiBidWZmZXIgc2l6ZSBpcyBub3QgZGl2aWRhYmxlIGJ5IGRhdGEgc2l6ZS4KICAgICAgICAgRml4IGNvZGUgc28gc2tpcCByZWxhdGVzIHRvIHRoZSBlbmNvZGVkIGJ5dGVzOyByZXNldCBub3cgcmUtZW5jb2RlcyB0aGUgZGF0YSB1cCB0byB0aGUgcG9pbnQgb2YgdGhlIG1hcmsgCiogSU8tMzY4OiAgQ2xhc3NMb2FkZXJPYmplY3RJbnB1dFN0cmVhbSBkb2VzIG5vdCBoYW5kbGUgcHJpbWl0aXZlIHR5cGVkIG1lbWJlcnMgCiogSU8tMzE0OiAgRGVwcmVjYXRlIGFsbCBtZXRob2RzIHRoYXQgdXNlIHRoZSBkZWZhdWx0IGVuY29kaW5nIAoqIElPLTMzODogIFdoZW4gYSBmaWxlIGlzIHJvdGF0ZWQsIGZpbmlzaCByZWFkaW5nIHByZXZpb3VzIGZpbGUgcHJpb3IgdG8gc3RhcnRpbmcgbmV3IG9uZSAKKiBJTy0zNTQ6ICBDb21tb25zIElPIFRhaWxlciBkb2VzIG5vdCByZXNwZWN0IFVURi04IENoYXJzZXQuIAoqIElPLTMyMzogIFdoYXQgc2hvdWxkIGhhcHBlbiBpbiBGaWxlVXRpbHMuc2l6ZU9mW0RpcmVjdG9yeV0gd2hlbiBhbiBvdmVyZmxvdyB0YWtlcyBwbGFjZT8KICAgICAgICBBZGRlZCBKYXZhZG9jLiAKKiBJTy0zNzI6ICBGaWxlVXRpbHMubW92ZURpcmVjdG9yeSBjYW4gcHJvZHVjZSBtaXNsZWFkaW5nIGVycm9yIG1lc3NhZ2Ugb24gZmFpbHVyZQoqIElPLTM2MjogIElPVXRpbHMuY29udGVudEVxdWFscyogbWV0aG9kcyByZXR1cm5zIGZhbHNlIGlmIGlucHV0MSA9PSBpbnB1dDIsIHNob3VsZCByZXR1cm4gdHJ1ZS4gVGhhbmtzIHRvIG1tYWRzb24sIGdncmVnb3J5LiAKKiBJTy0zNTc6ICBbVGFpbGVyXSBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB3aGlsZSB0aGUgdGhyZWFkIGlzIHNsZWVwaW5nIGlzIHNpbGVudGx5IGlnbm9yZWQgVGhhbmtzIHRvIG1vcnRlbmguIAoqIElPLTM1MjogIFNwZWxsaW5nIGZpeGVzLiBUaGFua3MgdG8gc2NvcC4gCiogSU8tNDM2OiAgSW1wcm9wZXIgSmF2YWRvYyBjb21tZW50IGZvciBGaWxlbmFtZVV0aWxzLmluZGV4T2ZFeHRlbnNpb24uIFRoYW5rcyB0byBjaHJpc3RvcGguc2NobmVlZ2Fucy4gCgpDaGFuZ2VzCi0tLS0tLS0KCiogSU8tNDMzOiAgQ29udmVydGVkIGFsbCB0ZXN0Y2FzZXMgdG8gSlVuaXQgNCAKKiBJTy00NjY6ICBBZGRlZCB0ZXN0Y2FzZSB0byBzaG93IHRoaXMgd2FzIGZpeGVkIHdpdGggSU8tNDIzIAoqIElPLTQ3OTogIENvcnJlY3QgZXhjZXB0aW9uIG1lc3NhZ2UgaW4gRmlsZVV0aWxzLmdldEZpbGUoRmlsZSwgU3RyaW5nLi4uKSBUaGFua3MgdG8gWmhvdWNlIENoZW4uIAoqIElPLTQ2NTogIFVwZGF0ZSB0byBKVW5pdCA0LjEyIFRoYW5rcyB0byBiYXNlZDIuIAoqIElPLTQ2MjogIElPRXhjZXB0aW9uV2l0aENhdXNlIG5vIGxvbmdlciBuZWVkZWQgCiogSU8tNDIyOiAgRGVwcmVjYXRlIENoYXJzZXRzIENoYXJzZXQgY29uc3RhbnRzIGluIGZhdm9yIG9mIEphdmEgNydzIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cyAKKiBJTy0yMzk6ICBDb252ZXJ0IElPQ2FzZSB0byBhIEphdmEgMS41KyBFbnVtZXJhdGlvbgogICAgICAgICBbTi5CLiB0aGlzIGlzIGJpbmFyeSBjb21wYXRpYmxlXSAKKiBJTy0zMjg6ICBnZXRQcmVmaXhMZW5ndGggcmV0dXJucyBudWxsIGlmIGZpbGVuYW1lIGhhcyBsZWFkaW5nIHNsYXNoZXMKICAgICAgICBKYXZhZG9jOiBhZGQgZXhhbXBsZXMgdG8gc2hvdyBjb3JyZWN0IGJlaGF2aW9yOyBhZGQgdW5pdCB0ZXN0cyAKKiBJTy0yOTk6ICBGaWxlVXRpbHMubGlzdEZpbGVzQW5kRGlycyBpbmNsdWRlcyBvcmlnaW5hbCBkaXIgaW4gcmVzdWx0cyBldmVuIHdoZW4gaXQgZG9lc24ndCBtYXRjaCBmaWx0ZXIKICAgICAgICBKYXZhZG9jOiBjbGFyaWZ5IHRoYXQgb3JpZ2luYWwgZGlyIGlzIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzIAoqIElPLTM3NTogIEZpbGVuYW1lVXRpbHMuc3BsaXRPblRva2VucyhTdHJpbmcgdGV4dCkgY2hlY2sgZm9yICcqKicgY291bGQgYmUgc2ltcGxpZmllZCAKKiBJTy0zNzQ6ICBXaWxkY2FyZEZpbGVGaWx0ZXIgY3RvcnMgc2hvdWxkIG5vdCB1c2UgbnVsbCB0byBtZWFuIElPQ2FzZS5TRU5TSVRJVkUgd2hlbiBkZWxlZ2F0aW5nIHRvIG90aGVyIGN0b3JzIAoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuNDoKQmluYXJ5IGNvbXBhdGlibGU6IFllcy4KU291cmNlIGNvbXBhdGlibGU6IFllcy4KU2VtYW50aWMgY29tcGF0aWJsZTogWWVzLgoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuMiBhbmQgMS40OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogTm8sIHNlZSB0aGUgcmFyZSBjYXNlIGluIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSU8tMzE4LgpTZW1hbnRpYyBjb21wYXRpYmxlOiBObywgc2VlIHRoZSByYXJlIGNhc2UgaW4gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9JTy0zMTguCgpDb21tb25zIElPIDIuNyBhbmQgdXAgcmVxdWlyZXMgSmF2YSA4IG9yIGFib3ZlLgpDb21tb25zIElPIDIuNiByZXF1aXJlcyBKYXZhIDcgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4zIHRocm91Z2ggMi41IHJlcXVpcmVzIEphdmEgNiBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjIgcmVxdWlyZXMgSmF2YSA1IG9yIGFib3ZlLgpDb21tb25zIElPIDEuNCByZXF1aXJlcyBKYXZhIDEuMyBvciBhYm92ZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQXBhY2hlIENvbW1vbnMgSU8gVmVyc2lvbiAyLjQKCk5ldyBmZWF0dXJlcwotLS0tLS0tLS0tLS0KCiogSU8tMjY5OiAgVGFpbGVyIGxvY2tzIGZpbGUgZnJvbSBkZWxldGlvbi9yZW5hbWUgb24gV2luZG93cy4gVGhhbmtzIHRvCnNlYmIuCiogSU8tMzMzOiAgRXhwb3J0IE9TR2kgcGFja2FnZXMgYXQgdmVyc2lvbiAxLnggaW4gYWRkaXRpb24gdG8gMi54LiBUaGFua3MKdG8gZm1lc2NoYmUuCiogSU8tMzIwOiAgQWRkIFhtbFN0cmVhbVJlYWRlciBzdXBwb3J0IGZvciBVVEYtMzIuIFRoYW5rcyB0byBnZ3JlZ29yeS4KKiBJTy0zMzE6ICBCT01JbnB1dFN0cmVhbSB3cm9uZ2x5IGRldGVjdHMgVVRGLTMyTEVfQk9NIGZpbGVzIGFzClVURi0xNkxFX0JPTSBmaWxlcyBpbiBtZXRob2QgZ2V0Qk9NKCkuIFRoYW5rcyB0byBnZ3JlZ29yeS4KKiBJTy0zMjc6ICBBZGQgYnl0ZUNvdW50VG9EaXNwbGF5U2l6ZShCaWdJbnRlZ2VyKS4gVGhhbmtzIHRvIGdncmVnb3J5LgoqIElPLTMyNjogIEFkZCBuZXcgRmlsZVV0aWxzLnNpemVPZltEaXJlY3RvcnldIEFQSXMgdG8gcmV0dXJuIEJpZ0ludGVnZXIuClRoYW5rcyB0byBnZ3JlZ29yeS4KKiBJTy0zMjU6ICBBZGQgSU9VdGlscy50b0J5dGVBcnJheSBtZXRob2RzIHRvIHdvcmsgd2l0aCBVUkwgYW5kIFVSSS4gVGhhbmtzCnRvIHJhdmlwcmFrLgoqIElPLTMyNDogIEFkZCBtaXNzaW5nIENoYXJzZXQgc2lzdGVyIEFQSXMgdG8gbWV0aG9kIHRoYXQgdGFrZSBhIFN0cmluZwpjaGFyc2V0IG5hbWUuIFRoYW5rcyB0byByYXZpcHJhay4KCkZpeGVkIEJ1Z3MKLS0tLS0tLS0tLQoKKiBJTy0zMzY6ICBZb3R0YWJ5dGUgKFlCKSBpbmNvcnJlY3RseSBkZWZpbmVkIGluIEZpbGVVdGlscy4gVGhhbmtzIHRvCnJsZWF2ZWxsZS4KKiBJTy0yNzk6ICBUYWlsZXIgZXJyb25lb3VzbHkgY29uc2lkZXJzIGZpbGUgYXMgbmV3LiBUaGFua3MgdG8gU2VyZ2lvCkJvc3NhLCBDaHJpcyBCYXJvbi4KKiBJTy0zMzU6ICBUYWlsZXIjcmVhZExpbmVzIC0gaW5jb3JyZWN0IENSIGhhbmRsaW5nLgoqIElPLTMzNDogIEZpbGVVdGlscy50b1VSTHMgdGhyb3dzIE5QRSBmb3IgbnVsbCBwYXJhbWV0ZXI7IGRvY3VtZW50IHRoZQpiZWhhdmlvci4KKiBJTy0zMzI6ICBJbXByb3ZlIHRhaWxlcidzIHJlYWRpbmcgcGVyZm9ybWFuY2UuIFRoYW5rcyB0byBsaWFuZ2x5LgoqIElPLTI3OTogIEltcHJvdmUgVGFpbGVyIHBlcmZvcm1hbmNlIHdpdGggYnVmZmVyZWQgcmVhZHMgKHNlZSBJTy0zMzIpLgoqIElPLTMyOTogIEZpbGVVdGlscy53cml0ZUxpbmVzIHVzZXMgdW5idWZmZXJlZCBJTy4gVGhhbmtzIHRvIHRpdnYuCiogSU8tMzE5OiAgRmlsZVV0aWxzLnNpemVPZkRpcmVjdG9yeSBmb2xsb3dzIHN5bWJvbGljIGxpbmtzLiBUaGFua3MgdG8KcmF2aXByYWsuCgpDb21wYXRpYmlsaXR5IHdpdGggMi4zOgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogWWVzLgpTZW1hbnRpYyBjb21wYXRpYmxlOiBZZXMuCgpDb21wYXRpYmlsaXR5IHdpdGggMi4yIGFuZCAxLjQ6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBObywgc2VlIHRoZSByYXJlIGNhc2UgaW4gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9JTy0zMTguClNlbWFudGljIGNvbXBhdGlibGU6IE5vLCBzZWUgdGhlIHJhcmUgY2FzZSBpbiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0lPLTMxOC4KCkNvbW1vbnMgSU8gMi43IGFuZCB1cCByZXF1aXJlcyBKYXZhIDggb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi42IHJlcXVpcmVzIEphdmEgNyBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjMgdGhyb3VnaCAyLjUgcmVxdWlyZXMgSmF2YSA2IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMiByZXF1aXJlcyBKYXZhIDUgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBcGFjaGUgQ29tbW9ucyBJTyBWZXJzaW9uIDIuMwoKTmV3IGZlYXR1cmVzCi0tLS0tLS0tLS0tLQoKKiBJTy0zMjI6ICBBZGQgYW5kIHVzZSBjbGFzcyBDaGFyc2V0cy4gVGhhbmtzIHRvIGdncmVnb3J5LiAKKiBJTy0zMjE6ICBCeXRlT3JkZXJNYXJrIFVURl8zMkxFIGlzIGluY29ycmVjdC4gVGhhbmtzIHRvIGdncmVnb3J5LiAKKiBJTy0zMTg6ICBBZGQgQ2hhcnNldCBzaXN0ZXIgQVBJcyB0byBtZXRob2QgdGhhdCB0YWtlIGEgU3RyaW5nIGNoYXJzZXQgbmFtZS4gVGhhbmtzIHRvIGdncmVnb3J5LiAKCkNvbXBhdGliaWxpdHkgd2l0aCAyLjIgYW5kIDEuNDoKQmluYXJ5IGNvbXBhdGlibGU6IFllcy4KU291cmNlIGNvbXBhdGlibGU6IE5vLCBzZWUgdGhlIHJhcmUgY2FzZSBpbiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0lPLTMxOC4KU2VtYW50aWMgY29tcGF0aWJsZTogTm8sIHNlZSB0aGUgcmFyZSBjYXNlIGluIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSU8tMzE4LgoKQ29tbW9ucyBJTyAyLjcgYW5kIHVwIHJlcXVpcmVzIEphdmEgOCBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjYgcmVxdWlyZXMgSmF2YSA3IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMyB0aHJvdWdoIDIuNSByZXF1aXJlcyBKYXZhIDYgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4yIHJlcXVpcmVzIEphdmEgNSBvciBhYm92ZS4KQ29tbW9ucyBJTyAxLjQgcmVxdWlyZXMgSmF2YSAxLjMgb3IgYWJvdmUuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkFwYWNoZSBDb21tb25zIElPIFZlcnNpb24gMi4yCgpOZXcgZmVhdHVyZXMKLS0tLS0tLS0tLS0tCgoqIEFkZCBJT1V0aWxzLnRvQnVmZmVyZWRSZWFkZXIoUmVhZGVyKSAgSXNzdWU6IElPLTMxMy4gVGhhbmtzIHRvIGdncmVnb3J5LgoqIEFsbG93IGFwcGxpY2F0aW9ucyB0byBwcm92aWRlIGJ1ZmZlciAob3Igc2l6ZSkgZm9yIGNvcHlMYXJnZSBtZXRob2RzLiAgSXNzdWU6IElPLTMwOC4gVGhhbmtzIHRvIE1hbm9qIE1va2FzaGkuIAoqIE5ldyBjb3B5TGFyZ2UoKSBtZXRob2QgaW4gSU9VdGlscyB0aGF0IHRha2VzIGFkZGl0aW9uYWwgb2Zmc2V0LCBsZW5ndGggYXJndW1lbnRzICBJc3N1ZTogSU8tMzA1LiBUaGFua3MgdG8gTWFub2ogTW9rYXNoaS4gCiogVXNlIHRlcmFieXRlIChUQiksIHBldGFieXRlIChQQikgYW5kIGV4YWJ5dGUgKEVCKSBpbiBGaWxlVXRpbHMuYnl0ZUNvdW50VG9EaXNwbGF5U2l6ZShsb25nIHNpemUpICBJc3N1ZTogSU8tMjg3LiBUaGFua3MgdG8gUm9uIEt1cmlzLCBHYXJ5IEdyZWdvcnkuIAoqIEZpbGVVdGlscy5saXN0RmlsZXMoKSBkb2Vzbid0IHJldHVybiBkaXJlY3RvcmllcyAgSXNzdWU6IElPLTE3My4gVGhhbmtzIHRvIE1hcmNvcyBWaW7tY2l1cyBkYSBTaWx2YS4gCiogQ2hhclNlcXVlbmNlSW5wdXRTdHJlYW0gdG8gZWZmaWNpZW50bHkgc3RyZWFtIGNvbnRlbnQgb2YgYSBDaGFyU2VxdWVuY2UgIElzc3VlOiBJTy0yOTcuIFRoYW5rcyB0byBPbGVnIEthbG5pY2hldnNraS4gCiogVGhlIHNlY29uZCBjb25zdHJ1Y3RvciBvZiBUYWlsZXIgY2xhc3MgZG9lcyBub3QgcGFzcyAnZGVsYXknIHRvIHRoZSB0aGlyZCBvbmUgIElzc3VlOiBJTy0zMDQuIFRoYW5rcyB0byBsaWFuZ2x5LiAKKiBUZWVPdXRwdXRTdHJlYW0gZG9lcyBub3QgY2FsbCBicmFuY2guY2xvc2UoKSB3aGVuIG1haW4uY2xvc2UoKSB0aHJvd3MgYW4gZXhjZXB0aW9uICBJc3N1ZTogSU8tMzAzLiBUaGFua3MgdG8gZmFiaWFuLmJhcm5leS4gCiogQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGluIEJPTUlucHV0U3RyZWFtIHdoZW4gcmVhZGluZyBhIGZpbGUgd2l0aG91dCBCT00gbXVsdGlwbGUgdGltZXMgIElzc3VlOiBJTy0zMDIuIFRoYW5rcyB0byBqc3RldWVyd2FsZCwgZGV0aW5oby4gCiogQWRkIElPVXRpbHMuY2xvc2VRdWlldGx5KFNlbGVjdG9yKSBuZWNlc3NhcnkgIElzc3VlOiBJTy0zMDEuIFRoYW5rcyB0byBrYXlrYXkudW5pcXVlLiAKKiBJT1V0aWxzLmNsb3NlUXVpZXRseSgpIHNob3VsZCB0YWtlIGEgU2VydmVyU29ja2V0IGFzIGEgcGFyYW1ldGVyICBJc3N1ZTogSU8tMjkyLiBUaGFua3MgdG8gc2ViYi4gCiogQWRkIHJlYWQvcmVhZEZ1bGx5IG1ldGhvZHMgdG8gSU9VdGlscyAgSXNzdWU6IElPLTI5MC4gVGhhbmtzIHRvIHNlYmIuIAoqIFN1cHBseSBhIFJldmVyc2VkTGluZXNGaWxlUmVhZGVyICBJc3N1ZTogSU8tMjg4LiBUaGFua3MgdG8gR2VvcmcgSGVuemxlci4gCiogQWRkIG5ldyBmdW5jdGlvbiBGaWxlVXRpbHMuZGlyZWN0b3J5Q29udGFpbnMuICBJc3N1ZTogSU8tMjkxLiBUaGFua3MgdG8gZ2dyZWdvcnkuIAoqIEZpbGVVdGlscy5jb250ZW50RXF1YWxzIGFuZCBJT1V0aWxzLmNvbnRlbnRFcXVhbHMgLSBBZGQgb3B0aW9uIHRvIGlnbm9yZSAibGluZSBlbmRpbmdzIgogICAgICAgIEFkZGVkIGNvbnRlbnRFcXVhbHNJZ25vcmVFT0wgbWV0aG9kcyB0byBib3RoIGNsYXNzZXMgIElzc3VlOiBJTy0yNzUuIFRoYW5rcyB0byBDSiBBc3Byb21nb3MuIAoKRml4ZWQgQnVncwotLS0tLS0tLS0tCgoqIElPVXRpbHMucmVhZChJbnB1dFN0cmVhbS9SZWFkZXIpIGlnbm9yZXMgdGhlIG9mZnNldCBwYXJhbWV0ZXIgIElzc3VlOiBJTy0zMTEuIFRoYW5rcyB0byBSb2JlcnQgTXVpci4gCiogQ2hhclNlcXVlbmNlSW5wdXRTdHJlYW0oQ2hhclNlcXVlbmNlIHMsIENoYXJzZXQgY2hhcnNldCwgaW50IGJ1ZmZlclNpemUpIGlnbm9yZXMgYnVmZmVyU2l6ZSAgSXNzdWU6IElPLTMxMi4gCiogRmlsZVV0aWxzLm1vdmVEaXJlY3RvcnlUb0RpcmVjdG9yeSByZW1vdmVzIHNvdXJjZSBkaXJlY3RvcnkgaWYgZGVzdGluYXRpb24gaXMgYSBzdWJkaXJlY3RvcnkgIElzc3VlOiBJTy0zMDAuIAoqIFJlYWRlcklucHV0U3RyZWFtI3JlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHNob3VsZCBjaGVjayBmb3IgdmFsaWQgcGFyYW1ldGVycyAgSXNzdWU6IElPLTMwNy4gCiogUmVhZGVySW5wdXRTdHJlYW0jcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgc2hvdWxkIGFsd2F5cyByZXR1cm4gMCBmb3IgbGVuZ3RoID09IDAgIElzc3VlOiBJTy0zMDYuIAoqICJGaWxlVXRpbHMjZGVsZXRlRGlyZWN0b3J5T25FeGl0KEZpbGUpIiBkb2VzIG5vdCB3b3JrICBJc3N1ZTogSU8tMjc2LiBUaGFua3MgdG8gbmthbWkuIAoqIEJvdW5kZWRJbnB1dFN0cmVhbS5yZWFkKCkgdHJlYXRzIG1heCBkaWZmZXJlbnRseSBmcm9tIEJvdW5kZWRJbnB1dFN0cmVhbS5yZWFkKGJ5dGVbXS4uLikgIElzc3VlOiBJTy0yNzMuIFRoYW5rcyB0byBzZWJiLiAKKiBWYXJpb3VzIG1ldGhvZHMgb2YgY2xhc3MgJ29yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHMnIGluY29ycmVjdGx5IHN1cHByZXNzICdqYXZhLmlvLklPRXhjZXB0aW9uJyAgSXNzdWU6IElPLTI5OC4gVGhhbmtzIHRvIENocmlzdGlhbiBTY2h1bHRlLiAKCkNoYW5nZXMKLS0tLS0tLQoKKiBSZWFkZXJJbnB1dFN0cmVhbSBvcHRpbWl6YXRpb246IG1vcmUgZWZmaWNpZW50IHJlYWRpbmcgb2Ygc21hbGwgY2h1bmtzIG9mIGRhdGEgIElzc3VlOiBJTy0yOTYuIFRoYW5rcyB0byBPbGVnIEthbG5pY2hldnNraS4gCgpDb21wYXRpYmlsaXR5IHdpdGggMi4xIGFuZCAxLjQ6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMKU291cmNlIGNvbXBhdGlibGU6IFllcwpTZW1hbnRpYyBjb21wYXRpYmxlOiBZZXMuIENoZWNrIHRoZSBidWcgZml4ZXMgc2VjdGlvbiBmb3Igc2VtYW50aWMgYnVnIGZpeGVzCgpDb21tb25zIElPIDIuNyBhbmQgdXAgcmVxdWlyZXMgSmF2YSA4IG9yIGFib3ZlLgpDb21tb25zIElPIDIuNiByZXF1aXJlcyBKYXZhIDcgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4zIHRocm91Z2ggMi41IHJlcXVpcmVzIEphdmEgNiBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjIgcmVxdWlyZXMgSmF2YSA1IG9yIGFib3ZlLgpDb21tb25zIElPIDEuNCByZXF1aXJlcyBKYXZhIDEuMyBvciBhYm92ZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQXBhY2hlIENvbW1vbnMgSU8gVmVyc2lvbiAyLjEKCk5ldyBmZWF0dXJlcwotLS0tLS0tLS0tLS0KCiogVXNlIHN0YW5kYXJkIE1hdmVuIGRpcmVjdG9yeSBsYXlvdXQgIElzc3VlOiBJTy0yODUuIFRoYW5rcyB0byBnZ3JlZ29yeS4gCiogQWRkIElPVXRpbHMgQVBJIHRvU3RyaW5nIGZvciBVUkwgYW5kIFVSSSB0byBnZXQgY29udGVudHMgIElzc3VlOiBJTy0yODQuIFRoYW5rcyB0byBnZ3JlZ29yeS4gCiogQWRkIEFQSSBGaWxlVXRpbHMuY29weUZpbGUoRmlsZSBpbnB1dCwgT3V0cHV0U3RyZWFtIG91dHB1dCkgIElzc3VlOiBJTy0yODIuIFRoYW5rcyB0byBnZ3JlZ29yeS4gCiogRmlsZUFsdGVyYXRpb25PYnNlcnZlciBoYXMgbm8gZ2V0dGVyIGZvciBGaWxlRmlsdGVyICBJc3N1ZTogSU8tMjYyLiAKKiBBZGQgRmlsZVV0aWxzLmdldEZpbGUgQVBJIHdpdGggdmFyYXJncyBwYXJhbWV0ZXIgIElzc3VlOiBJTy0yNjEuIAoqIEFkZCBuZXcgQVBQRU5EIHBhcmFtZXRlciBmb3Igd3JpdGluZyBzdHJpbmcgaW50byBmaWxlcyAgSXNzdWU6IElPLTE4Mi4gCiogQWRkIG5ldyByZWFkIG1ldGhvZCAidG9CeXRlQXJyYXkiIHRvIGhhbmRsZSBJbnB1dFN0cmVhbSB3aXRoIGtub3duIHNpemUuICBJc3N1ZTogSU8tMjUxLiBUaGFua3MgdG8gTWFyY28gQWxiaW5pLiAKCkZpeGVkIEJ1Z3MKLS0tLS0tLS0tLQoKKiBEdWJpb3VzIHVzZSBvZiBta2RpcnMoKSByZXR1cm4gY29kZSAgSXNzdWU6IElPLTI4MC4gVGhhbmtzIHRvIHNlYmIuIAoqIFJlYWRlcklucHV0U3RyZWFtIGVudGVycyBpbmZpbml0ZSBsb29wIHdoZW4gaXQgZW5jb3VudGVycyBhbiB1bm1hcHBhYmxlIGNoYXJhY3RlciAgSXNzdWU6IElPLTI3Ny4gCiogRmlsZVV0aWxzLm1vdmVGaWxlKCkgSmF2YWRvYyBzaG91bGQgc3BlY2lmeSBGaWxlRXhpc3RzRXhjZXB0aW9uIHRocm93biAgSXNzdWU6IElPLTI2NC4gCiogQ2xhc3NMb2FkZXJPYmplY3RJbnB1dFN0cmVhbSBkb2VzIG5vdCBoYW5kbGUgUHJveHkgY2xhc3NlcyAgSXNzdWU6IElPLTI2MC4gCiogVGFpbGVyIHJldHVybmluZyBwYXJ0aWFsIGxpbmVzIHdoZW4gcmVhY2hpbmcgRU9GIGJlZm9yZSBFT0wgIElzc3VlOiBJTy0yNzQuIFRoYW5rcyB0byBGcmFuayBHcmltZXMuIAoqIEZpbGVVdGlscy5jb3B5RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIGNvcHlpbmcgbGFyZ2UgZmlsZXMgdG8gYSBzaGFyZWQgZGlyZWN0b3J5IChvbiBXaW5kb3dzKSAgSXNzdWU6IElPLTI2Ni4gVGhhbmtzIHRvIElnb3IgU21lcmVrYS4gCiogRmlsZVN5c3RlbVV0aWxzLmZyZWVTcGFjZUtiIHRocm93cyBleGNlcHRpb24gZm9yIFdpbmRvd3Mgdm9sdW1lcyB3aXRoIG5vIHZpc2libGUgZmlsZXMuCiAgICAgICAgSW1wcm92ZSBjb3ZlcmFnZSBieSBhbHNvIGxvb2tpbmcgZm9yIGhpZGRlbiBmaWxlcy4gIElzc3VlOiBJTy0yNjMuIFRoYW5rcyB0byBHaWwgQWRhbS4gCgpDaGFuZ2VzCi0tLS0tLS0KCiogRmlsZUFsdGVyYXRpb25Nb25pdG9yLnN0b3AoYm9vbGVhbiBhbGxvd0ludGVydmFsVG9GaW5pc2gpICBJc3N1ZTogSU8tMjU5LiAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkFwYWNoZSBDb21tb25zIElPIFBhY2thZ2UgMi4wLjEKCkNvbXBhdGliaWxpdHkgd2l0aCAyLjAgYW5kIDEuNAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQmluYXJ5IGNvbXBhdGlibGUgLSBZZXMKClNvdXJjZSBjb21wYXRpYmxlIC0gWWVzCgpTZW1hbnRpYyBjb21wYXRpYmxlIC0gWWVzCiAgQ2hlY2sgdGhlIGJ1ZyBmaXhlcyBzZWN0aW9uIGZvciBzZW1hbnRpYyBidWcgZml4ZXMKCkNvbW1vbnMgSU8gMi4wLjEgcmVxdWlyZXMgSmF2YSA1IG9yIGFib3ZlCiAoQ29tbW9ucyBJTyAxLjQgcmVxdWlyZXMgSmF2YSAxLjMgb3IgYWJvdmUpIAoKRW5oYW5jZW1lbnRzIGZyb20gMi4wCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgKiBbSU8tMjU2XSAtIFByb3ZpZGUgdGhyZWFkIGZhY3RvcnkgZm9yIEZpbGVBbHRlcm5hdGlvbk1vbml0b3IKCkJ1ZyBmaXhlcyBmcm9tIDIuMAotLS0tLS0tLS0tLS0tLS0tLS0KCiAgICogW0lPLTI1N10gLSBCT01JbnB1dFN0cmVhbS5yZWFkKGJ5dGVbXSkgY2FuIHJldHVybiAwIHdoaWNoIGl0IHNob3VsZCBub3QKICAgKiBbSU8tMjU4XSAtIFhtbFN0cmVhbVJlYWRlciBjb25zdW1lcyB0aGUgc3RyZWFtIGR1cmluZyBlbmNvZGluZyBkZXRlY3Rpb24KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQXBhY2hlIENvbW1vbnMgSU8gUGFja2FnZSAyLjAKCkNvbXBhdGliaWxpdHkgd2l0aCAxLjQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpCaW5hcnkgY29tcGF0aWJsZSAtIFllcwoKU291cmNlIGNvbXBhdGlibGUgLSBZZXMKClNlbWFudGljIGNvbXBhdGlibGUgLSBZZXMKICBDaGVjayB0aGUgYnVnIGZpeGVzIHNlY3Rpb24gZm9yIHNlbWFudGljIGJ1ZyBmaXhlcwoKQ29tbW9ucyBJTyAyLjAgcmVxdWlyZXMgSmF2YSA1IG9yIGFib2JlCiAoQ29tbW9ucyBJTyAxLjQgcmVxdWlyZXMgSmF2YSAxLjMgb3IgYWJvdmUpIAoKRGVwcmVjYXRpb25zIGZyb20gMS40Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSBJT1V0aWxzCiAgLSB3cml0ZShTdHJpbmdCdWZmZXIsIFdyaXRlcikgaW4gZmF2b3VyIG9mIHdyaXRlKENoYXJTZXF1ZW5jZSwgV3JpdGVyKQogIC0gd3JpdGUoU3RyaW5nQnVmZmVyLCBPdXRwdXRTdHJlYW0pICBpbiBmYXZvdXIgb2Ygd3JpdGUoQ2hhclNlcXVlbmNlLCBPdXRwdXRTdHJlYW0pCiAgLSB3cml0ZShTdHJpbmdCdWZmZXIsIE91dHB1dFN0cmVhbSwgU3RyaW5nKSBpbiBmYXZvdXIgb2Ygd3JpdGUoQ2hhclNlcXVlbmNlLCBPdXRwdXRTdHJlYW0sIFN0cmluZykKCi0gRmlsZUZpbHRlclV0aWxzCiAgLSBhbmRGaWxlRmlsdGVyKElPRmlsZUZpbHRlciwgSU9GaWxlRmlsdGVyKSBpbiBmYXZvdXIgb2YgYW5kKElPRmlsZUZpbHRlci4uLikgCiAgLSBvckZpbGVGaWx0ZXIoSU9GaWxlRmlsdGVyLCBJT0ZpbGVGaWx0ZXIpICBpbiBmYXZvdXIgb2Ygb3IoSU9GaWxlRmlsdGVyLi4uKQoKRW5oYW5jZW1lbnRzIGZyb20gMS40Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAqIFtJTy0xNDBdIE1vdmUgbWluaW11bSBKYXZhIHJlcXVpcmVtZW50IGZyb20gSmF2YSAxLjMgdG8gSmF2YSA1CiAgICAgICAgICAgICAtIHVzZSBHZW5lcmljcwogICAgICAgICAgICAgLSBhZGQgbmV3IENoYXJTZXF1ZW5jZSB3cml0ZSgpIGZsYXZvdXIgbWV0aG9kcyB0byBJT1V0aWxzIGFuZCBGaWxlVXRpbHMKICAgICAgICAgICAgIC0gcmVwbGFjZSBTdHJpbmdCdWZmZXIgd2l0aCBTdHJpbmdCdWlsZGVyLCB3aGVyZSBhcHByb3ByaWF0ZQogICAgICAgICAgICAgLSBhZGQgbmV3IFJlYWRlci9Xcml0ZXIgbWV0aG9kcyB0byBQcm94eVJlYWRlciBhbmQgUHJveHlXcml0ZXIKICAgICAgICAgICAgIC0gQW5ub3RhdGUgd2l0aCBAT3ZlcnJpZGUgYW5kIEBEZXByZWNhdGVkCgogICogW0lPLTE3OF0gTmV3IEJPTUlucHV0U3RyZWFtIGFuZCBCeXRlT3JkZXJNYXJrIGltcGxlbWVudGF0aW9ucyAtIHRvIGRldGVjdCBhbmQgb3B0aW9uYWxseSBleGNsdWRlIGFuIGluaXRpYWwgQnl0ZSBPcmRlciBtYXJrIChCT00pCiAgKiBbSU8tMTk3XSBOZXcgQm91bmRlZElucHV0U3RyZWFtIChjb3BpZWQgZnJvbSBBcGFjaGUgSmFja1JhYmJpdCkKICAqIFtJTy0xOTNdIE5ldyBCcm9rZW4gSW5wdXQgYW5kIE91dHB1dCBzdHJlYW1zCiAgKiBbSU8tMTMyXSBOZXcgRmlsZSBMaXN0ZW5lci9Nb25pdG9yIGZhY2lsaXR5CiAgKiBbSU8tMTU4XSBOZXcgUmVhZGVySW5wdXRTdHJlYW0gYW5kIFdyaXRlck91dHB1dFN0cmVhbSBpbXBsZW1lbnRhdGlvbnMKICAqIFtJTy0xMzldIE5ldyBTdHJpbmdCdWlsZGVyIFdyaXRlciBpbXBsZW1lbnRhdGlvbgogICogW0lPLTE5Ml0gTmV3IFRhZ2dlZCBJbnB1dCBhbmQgT3V0cHV0IHN0cmVhbXMKICAqIFtJTy0xNzddIE5ldyBUYWlsZXIgY2xhc3MgLSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFVuaXggInRhaWwgLWYiIGZ1bmN0aW9uYWxpdHkKICAqIFtJTy0xNjJdIE5ldyBYTUwgU3RyZWFtIFJlYWRlci9Xcml0ZXIgaW1wbGVtZW50YXRpb25zIChmcm9tIFJPTUUgdmlhIHBsZXh1cy11dGlscykKCiAgKiBbSU8tMTQyXSBDb21wYXJhdG9ycyAtIGFkZCBmYWNpbGl0eSB0byBzb3J0IGZpbGUgbGlzdHMvYXJyYXlzCiAgKiBbSU8tMTg2XSBDb21wYXJhdG9ycyAtIG5ldyBDb21wb3NpdGUgYW5kIERpcmVjdG9yeSBGaWxlIENvbXBhcmF0b3IgaW1wbGVtZW50YXRpb25zCiAgKiBbSU8tMTc2XSBEaXJlY3RvcnlXYWxrZXIgLSBhZGQgZmlsdGVyRGlyZWN0b3J5Q29udGVudHMoKSBjYWxsYmFjayBtZXRob2QgZm9yIGZpbHRlcmluZyBkaXJlY3RvcnkgY29udGVudHMKICAqIFtJTy0yMTBdIEZpbGVGaWx0ZXIgLSBuZXcgTWFnaWMgTnVtYmVyIEZpbGVGaWx0ZXIKICAqIFtJTy0yMjFdIEZpbGVGaWx0ZXJVdGlscyAtIGFkZCBtZXRob2RzIGZvciBzdWZmaXggYW5kIHByZWZpeCBmaWx0ZXJzIHdoaWNoIHRha2UgYW4gSU9DYXNlIG9iamVjdAogICogW0lPLTIzMl0gRmlsZUZpbHRlclV0aWxzIC0gYWRkIG1ldGhvZCBmb3IgbmFtZSBmaWx0ZXJzIHdoaWNoIHRha2UgYW4gSU9DYXNlIG9iamVjdAogICogW0lPLTIyOV0gRmlsZUZpbHRlclV0aWxzIC0gYWRkIHZhcmFyZ3MgYW5kKCkgYW5kIG9yKCkgbWV0aG9kcwogICogW0lPLTE5OF0gRmlsZUZpbHRlclV0aWxzIC0gYWRkIGFiaWxpdHkgdG8gYXBwbHkgZmlsZSBmaWx0ZXJzIHRvIGNvbGxlY3Rpb25zIGFuZCBhcnJheXMKICAqIFtJTy0xNTZdIEZpbGVuYW1lVXRpbHMgLSBhZGQgbm9ybWFsaXplKCkgYW5kIG5vcm1hbGl6ZU5vRW5kU2VwYXJhdG9yKCkgbWV0aG9kcyB3aGljaCBhbGxvdyB0aGUgc2VwYXJhdG9yIGNoYXJhY3RlciB0byBiZSBzcGVjaWZpZWQKICAqIFtJTy0xOTRdIEZpbGVTeXN0ZW1VdGlscyAtIGFkZCBmcmVlU3BhY2VLYigpIG1ldGhvZCB3aXRoIG5vIGlucHV0IGFyZ3VtZW50cwogICogW0lPLTE4NV0gRmlsZVN5c3RlbVV0aWxzIC0gYWRkIGZyZWVTcGFjZUtiKCkgbWV0aG9kcyB0aGF0IHRha2UgYSB0aW1lb3V0IHBhcmFtZXRlciAtIGZpeGVzIGZyZWVTcGFjZVdpbmRvd3MoKSBibG9ja3MKICAqIFtJTy0xNTVdIEZpbGVVdGlscyAtIHVzZSBOSU8gdG8gY29weSBmaWxlcwogICogW0lPLTE2OF0gRmlsZVV0aWxzIC0gYWRkIG5ldyBpc1N5bWxpbmsoKSBtZXRob2QKICAqIFtJTy0yMTldIEZpbGVVdGlscyAtIHRocm93IEZpbGVFeGlzdHNFeGNlcHRpb24gd2hlbiBtb3ZpbmcgYSBmaWxlIG9yIGRpcmVjdG9yeSBpZiB0aGUgZGVzdGluYXRpb24gYWxyZWFkeSBleGlzdHMKICAqIFtJTy0yMzRdIEZpbGVVdGlscyAtIGFkZCBNZXRob2RzIGZvciByZXRyaWV2aW5nIFN5c3RlbSBVc2VyL1RlbXAgZGlyZWN0b3JpZXMvcGF0aHMKICAqIFtJTy0yMDhdIEZpbGVVdGlscyAtIGFkZCB0aW1lb3V0IChjb25uZWN0aW9uIGFuZCByZWFkKSBzdXBwb3J0IGZvciBjb3B5VVJMVG9GaWxlKCkgbWV0aG9kIAogICogW0lPLTIzOF0gRmlsZVV0aWxzIC0gYWRkIHNpemVPZihGaWxlKSBtZXRob2QKICAqIFtJTy0xODFdIExpbmVJdGVyYXRvciBub3cgaW1wbGVtZW50cyBJdGVyYWJsZQogICogW0lPLTIyNF0gSU9VdGlscyAtIGFkZCBjbG9zZVF1aWV0bHkoQ2xvc2VhYmxlKSBhbmQgY2xvc2VRdWlldGx5KFNvY2tldCkgbWV0aG9kcwogICogW0lPLTIwM10gSU9VdGlscyAtIGFkZCBza2lwRnVsbHkoKSBtZXRob2QgZm9yIElucHV0U3RyZWFtcwogICogW0lPLTEzN10gSU9VdGlscyBhbmQgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIC0gYWRkIHRvQnVmZmVyZWRJbnB1dFN0cmVhbSgpIG1ldGhvZCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBhcnJheSBhbGxvY2F0aW9uL2NvcHkKICAqIFtJTy0xOTVdIFByb3h5IHN0cmVhbXMvUmVhZGVyL1dyaXRlciAtIHByb3ZpZGUgZXhjZXB0aW9uIGhhbmRsaW5nIG1ldGhvZHMKICAqIFtJTy0yMTFdIFByb3h5IElucHV0L091dHB1dCBzdHJlYW1zIC0gYWRkIHByZS9wb3N0IHByb2Nlc3Npbmcgc3VwcG9ydAogICogW0lPLTI0Ml0gUHJveHkgUmVhZGVyL1dyaXRlciAtIGFkZCBwcmUvcG9zdCBwcm9jZXNzaW5nIHN1cHBvcnQKCkJ1ZyBmaXhlcyBmcm9tIDEuNAotLS0tLS0tLS0tLS0tLS0tLS0KICAqIFtJTy0yMTRdIEJ5dGVBcnJheU91dHB1dFN0cmVhbSAtIGZpeCBpbmNvbnNpc3RlbnQgc3luY2hyb25pemF0aW9uIG9mIGZpZWxkcwogICogW0lPLTIwMV0gQ291bnRpbmcgSW5wdXQvT3V0cHV0IHN0cmVhbXMgLSBmaXggaW5jb25zaXN0ZW50IHN5bmNocm9uaXphdGlvbgogICogW0lPLTE1OV0gRmlsZUNsZWFuaW5nVHJhY2tlciAtIGZpeCByZW1vdmUoKSBuZXZlciByZXR1cm5zIG51bGwKICAqIFtJTy0yMjBdIEZpbGVDbGVhbmluZ1RyYWNrZXIgLSBmaXggVmVjdG9yIHBlcmZvcm1zIGJhZGx5IHVuZGVyIGxvYWQKICAqIFtJTy0xNjddIEZpbGVuYW1lVXRpbHMgLSBmaXggY2FzZS1pbnNlbnNpdGl2ZSBzdHJpbmcgaGFuZGxpbmcgaW4gRmlsZW5hbWVVdGlscyBhbmQgRmlsZXN5c3RlbVV0aWxzCiAgKiBbSU8tMTc5XSBGaWxlbmFtZVV0aWxzIC0gZml4IFN0cmluZ0luZGV4T3V0T2ZCb3VuZHMgZXhjZXB0aW9uIGluIGdldFBhdGhOb0VuZFNlcGFyYXRvcigpCiAgKiBbSU8tMjQ4XSBGaWxlbmFtZVV0aWxzIC0gZml4IGdldEZ1bGxQYXRoTm9FbmRTZXBhcmF0b3IoKSByZXR1cm5zIGVtcHR5IHdoaWxlIHBhdGggaXMgYSBvbmUgbGV2ZWwgZGlyZWN0b3J5CiAgKiBbSU8tMjQ2XSBGaWxlbmFtZVV0aWxzIC0gZml4IHdpbGRjYXJkTWF0Y2ggZ2l2ZXMgaW5jb3JyZWN0IHJlc3VsdHMgCiAgKiBbSU8tMTg3XSBGaWxlU3lzdGVtVXRpbHMgLSBmaXggZnJlZVNwYWNlS2IoKSBkb2Vzbid0IHdvcmsgd2l0aCByZWxhdGl2ZSBwYXRocyBvbiBMaW51eAogICogW0lPLTE2MF0gRmlsZVN5c3RlbVV0aWxzIC0gZml4IGZyZWVTcGFjZSgpIGZhaWxzIG9uIHNvbGFyaXMKICAqIFtJTy0yMDldIEZpbGVTeXN0ZW1VdGlscyAtIGZpeCBmcmVlU3BhY2VLYigpIGZhaWxzIHRvIHJldHVybiBjb3JyZWN0IHNpemUgZm9yIGEgd2luZG93cyBtb3VudCBwb2ludAogICogW0lPLTE2M10gRmlsZVV0aWxzIC0gZml4IHRvVVJMcygpIHVzaW5nIGRlcHJlY2F0ZWQgbWV0aG9kIG9mIGNvbnZlcnNpb24gdG8gVVJMCiAgKiBbSU8tMTY4XSBGaWxlVXRpbHMgLSBmaXggU3ltYm9saWMgbGlua3MgZm9sbG93ZWQgd2hlbiBkZWxldGluZyBkaXJlY3RvcnkKICAqIFtJTy0yMzFdIEZpbGVVdGlscyAtIGZpeCB3cm9uZyBleGNlcHRpb24gbWVzc2FnZSBnZW5lcmF0ZWQgaW4gaXNGaWxlTmV3ZXIoKSBtZXRob2QKICAqIFtJTy0yMDddIEZpbGVVdGlscyAtIGZpeCByYWNlIGNvbmRpdGlvbiBpbiBmb3JjZU1rZGlyKCkgbWV0aG9kCiAgKiBbSU8tMjE3XSBGaWxlVXRpbHMgLSBmaXggY29weURpcmVjdG9yeVRvRGlyZWN0b3J5KCkgbWFrZXMgaW5maW5pdGUgbG9vcHMKICAqIFtJTy0xNjZdIEZpbGVVdGlscyAtIGZpeCBVUkwgZGVjb2RpbmcgaW4gdG9GaWxlKFVSTCkKICAqIFtJTy0xOTBdIEZpbGVVdGlscyAtIGZpeCBjb3B5RGlyZWN0b3J5IG5vdCBwcmVzZXJ2aW5nIGxhc3Rtb2RpZmllZCBkYXRlIG9uIHN1YmRpcmVjdG9yaWVzCiAgKiBbSU8tMjQwXSBGaWxlRmlsdGVyVXRpbHMgLSBlbnN1cmUgY3ZzRmlsdGVyIGFuZCBzdm5GaWx0ZXIgYXJlIG9ubHkgY3JlYXRlZCBvbmNlLgogICogW0lPLTE3NV0gSU9VdGlscyAtIGZpeCBjb3B5RmlsZSgpIGlzc3VlcyB3aXRoIHZlcnkgbGFyZ2UgZmlsZXMKICAqIFtJTy0xOTFdIEltcHJvdmVtZW50cyBmcm9tIHN0YXRpYyBhbmFseXNpcwogICogW0lPLTIxNl0gTG9ja2FibGVGaWxlV3JpdGVyIC0gZGVsZXRlIGZpbGVzIHF1aWV0bHkgd2hlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBpbml0aWFsaXphdGlvbgogICogW0lPLTI0M10gU3dhcHBlZERhdGFJbnB1dFN0cmVhbSAtIGZpeCByZWFkQm9vbGVhbiBpcyBpbnZlcnRlZAogICogW0lPLTIzNV0gVGVzdHMgLSByZW1vdmUgdW51c2VkIFllbGxPbkZsdXNoQW5kQ2xvc2VPdXRwdXRTdHJlYW0gZnJvbSBDb3B5VXRpbHNUZXN0CiAgKiBbSU8tMTYxXSBUZXN0cyAtIGZpeCBGaWxlQ2xlYW5pbmdUcmFja2VyVGVzdENhc2UgaGFuZ2luZwoKRG9jdW1lbnRhdGlvbiBjaGFuZ2VzIGZyb20gMS40Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogW0lPLTE4MyBGaWxlbmFtZVV0aWxzLmdldEV4dGVuc2lvbigpIG1ldGhvZCBkb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cwogICogW0lPLTIyNiBGaWxlVXRpbHMuYnl0ZUNvdW50VG9EaXNwbGF5U2l6ZSgpIGRvY3VtZW50YXRpb24gY29ycmVjdGlvbnMKICAqIFtJTy0yMDUgRmlsZVV0aWxzLmZvcmNlTWtkaXIoKSBkb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cwogICogW0lPLTIxNSBGaWxlVXRpbHMgY29weSBmaWxlL2RpcmVjdG9yeSBpbXByb3ZlIGRvY3VtZW50YXRpb24gcmVnYXJkaW5nIHByZXNlcnZpbmcgdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZQogICogW0lPLTE4OSBIZXhEdW1wLmR1bXAoKSBtZXRob2QgZG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMKICAqIFtJTy0xNzEgSU9DYXNlIGRvY3VtZW50IHRoYXQgaXQgYXNzdW1lcyB0aGVyZSBhcmUgb25seSB0d28gT1NlczogV2luZG93cyBhbmQgVW5peAogICogW0lPLTIyMyBJT1V0aWxzLmNvcHkoKSBkb2N1bWVudGF0aW9uIGNvcnJlY3Rpb25zCiAgKiBbSU8tMjQ3IElPVXRpbHMuY2xvc2VRdWlldGx5KCkgaW1wcm92ZSBkb2N1bWVudGF0aW9uIHdpdGggZXhhbXBsZXMKICAqIFtJTy0yMDIgTm90RmlsZUZpbHRlciBkb2N1bWVudGF0aW9uIGNvcnJlY3Rpb25zCiAgKiBbSU8tMjA2IFByb3h5SW5wdXRTdHJlYW0gLSBmaXggbWlzbGVhZGluZyBwYXJhbWV0ZXIgbmFtZXMKICAqIFtJTy0yMTIgUHJveHlJbnB1dFN0cmVhbS5za2lwKCkgZG9jdW1lbnRhdGlvbiBjb3JyZWN0aW9ucwoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBcGFjaGUgQ29tbW9ucyBJTyBWZXJzaW9uIDEuNAoKQ29tcGF0aWJpbGl0eSB3aXRoIDEuMy4yCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpCaW5hcnkgY29tcGF0aWJsZSAtIFllcwoKU291cmNlIGNvbXBhdGlibGUgLSBZZXMKClNlbWFudGljIGNvbXBhdGlibGUgLSBZZXMKICBDaGVjayB0aGUgYnVnIGZpeGVzIHNlY3Rpb24gZm9yIHNlbWFudGljIGJ1ZyBmaXhlcwoKQ29tbW9ucyBJTyAxLjQgaW50cm9kdWNlcyBmb3VyIG5ldyBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggZGVwZW5kIG9uIEphdmEgNCBmZWF0dXJlcwooQ2hhclNlcXVlbmNlUmVhZGVyLCBGaWxlV3JpdGVyV2l0aEVuY29kaW5nLCBJT0V4Y2VwdGlvbldpdGhDYXVzZSBhbmQgUmVnZXhGaWxlRmlsdGVyKS4KSXQgaGFzIGJlZW4gYnVpbHQgd2l0aCB0aGUgSkRLIHNvdXJjZSBhbmQgdGFyZ2V0IG9wdGlvbnMgc2V0IHRvIEphdmEgMS4zIGFuZCwgZXhjZXB0IGZvcgp0aG9zZSBpbXBsZW1lbnRhdGlvbnMsIGNhbiBiZSB1c2VkIHdpdGggSmF2YSAxLjMgKHNlZSBJTy0xMjcpLgoKRGVwcmVjYXRpb25zIGZyb20gMS4zLjIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGaWxlQ2xlYW5lciBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBGaWxlQ2xlYW5pbmdUcmFja2VyIFtzZWUgSU8tMTE2XQoKQnVnIGZpeGVzIGZyb20gMS4zLjIKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGaWxlVXRpbHMKICAtIGZvcmNlRGVsZXRlIG9mIG9ycGhhbmVkIFNvZnRsaW5rcyBkb2VzIG5vdCB3b3JrIFtJTy0xNDddCiAgLSBJbmZpbml0ZSBsb29wIG9uIEZpbGVVdGlscy5jb3B5RGlyZWN0b3J5IHdoZW4gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBpcyB3aXRoaW4KICAgIHRoZSBzb3VyY2UgZGlyZWN0b3J5IFtJTy0xNDFdCiAgLSBBZGQgYSBjb3B5RGlyZWN0b3J5KCkgbWV0aG9kIHRoYXQgbWFrZXMgdXNlIG9mIEZpbGVGaWx0ZXIgW0lPLTEwNV0KICAtIEFkZCBtb3ZlRGlyZWN0b3J5KCkgYW5kIG1vdmVGaWxlKCkgbWV0aG9kcyBbSU8tNzddCgotIEhleER1bXAKICAtIEhleER1bXAncyB1c2Ugb2Ygc3RhdGljIFN0cmluZ0J1ZmZlcnMgaXNuJ3QgdGhyZWFkLXNhZmUgW0lPLTEzNl0KCkVuaGFuY2VtZW50cyBmcm9tIDEuMy4yCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRmlsZVV0aWxzCiAgLSBBZGQgYSBkZWxldGVRdWlldGx5IG1ldGhvZCBbSU8tMTM1XQoKLSBGaWxlbmFtZVV0aWxzCiAgLSBBZGQgZmlsZSBuYW1lIGV4dGVuc2lvbiBzZXBhcmF0b3IgY29uc3RhbnRzW0lPLTE0OV0KCi0gSU9FeGNlcHRpb25XaXRoQ2F1c2UgW0lPLTE0OF0KICAtIEFkZCBhIG5ldyBJT0V4Y2VwdGlvbiBpbXBsZW1lbnRhdGlvbiB3aXRoIGNvbnN0cnVjdG9ycyB3aGljaCB0YWtlIGEgY2F1c2UKCi0gVGVlSW5wdXRTdHJlYW0gW0lPLTEyOV0KICAtIEFkZCBuZXcgVGVlIGlucHV0IHN0cmVhbSBpbXBsZW1lbnRhdGlvbgoKLSBGaWxlV3JpdGVyV2l0aEVuY29kaW5nIFtJTy0xNTNdCiAgLSBBZGQgbmV3IEZpbGUgV3JpdGVyIGltcGxlbWVudGF0aW9uIHRoYXQgYWNjZXB0cyBhbiBlbmNvZGluZwoKLSBDaGFyU2VxdWVuY2VSZWFkZXIgW0lPLTEzOF0KICAtIEFkZCBuZXcgUmVhZGVyIGltcGxlbWVudGF0aW9uIHRoYXQgaGFuZGxlcyBhbnkgQ2hhclNlcXVlbmNlIChTdHJpbmcsCiAgICBTdHJpbmdCdWZmZXIsIFN0cmluZ0J1aWxkZXIgb3IgQ2hhckJ1ZmZlcikgCgotIFRocmVzaG9sZGluZ091dHB1dFN0cmVhbSBbSU8tMTIxXQogIC0gQWRkIGEgcmVzZXQoKSBtZXRob2Qgd2hpY2ggc2V0cyB0aGUgY291bnQgb2YgdGhlIGJ5dGVzIHdyaXR0ZW4gYmFjayB0byB6ZXJvLgoKLSBEZWZlcnJlZEZpbGVPdXRwdXRTdHJlYW0gW0lPLTEzMF0KICAtIEFkZCBzdXBwb3J0IGZvciB0ZW1wb3JhcnkgZmlsZXMKCi0gQnl0ZUFycmF5T3V0cHV0U3RyZWFtCiAgLSBBZGQgYSBuZXcgd3JpdGUoSW5wdXRTdHJlYW0pIG1ldGhvZCBbSU8tMTUyXQoKLSBOZXcgQ2xvc2VkIElucHV0L091dHB1dCBzdHJlYW0gaW1wbGVtZW50YXRpb25zIFtJTy0xMjJdCiAgLSBBdXRvQ2xvc2VJbnB1dFN0cmVhbSAtIGF1dG9tYXRpY2FsbHkgY2xvc2VzIGFuZCBkaXNjYXJkcyB0aGUgdW5kZXJseWluZyBpbnB1dCBzdHJlYW0KICAtIENsb3NlZElucHV0U3RyZWFtIC0gcmV0dXJucyAtMSBmb3IgYW55IHJlYWQgYXR0ZW1wdHMKICAtIENsb3NlZE91dHB1dFN0cmVhbSAtIHRocm93cyBhbiBJT0V4Y2VwdGlvbiBmb3IgYW55IHdyaXRlIGF0dGVtcHRzCiAgLSBDbG9zZVNoaWVsZElucHV0U3RyZWFtIC0gcHJldmVudHMgdGhlIHVuZGVybHlpbmcgaW5wdXQgc3RyZWFtIGZyb20gYmVpbmcgY2xvc2VkLgogIC0gQ2xvc2VTaGllbGRPdXRwdXRTdHJlYW0gLSBwcmV2ZW50cyB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIGZyb20gYmVpbmcgY2xvc2VkLgoKLSBBZGQgU2luZ2xldG9uIENvbnN0YW50cyB0byBzZXZlcmFsIHN0cmVhbSBjbGFzc2VzIFtJTy0xNDNdCgotIFByZWZpeEZpbGVGaWx0ZXIgW0lPLTEyNl0KICAtIEFkZCBmYWNpbGl0eSB0byBzcGVjaWZ5IGNhc2Ugc2Vuc2l0aXZpdHkgb24gcHJlZml4IG1hdGNoaW5nCgotIFN1ZmZpeEZpbGVGaWx0ZXIgW0lPLTEyNl0KICAtIEFkZCBmYWNpbGl0eSB0byBzcGVjaWZ5IGNhc2Ugc2Vuc2l0aXZpdHkgb24gc3VmZml4IG1hdGNoaW5nCgotIFJlZ2V4RmlsZUZpbHRlciBbSU8tNzRdCiAgLSBBZGQgbmV3IHJlZ3VsYXIgZXhwcmVzc2lvbiBmaWxlIGZpbHRlciBpbXBsZW1lbnRhdGlvbgoKLSBNYWtlIElPRmlsZUZpbHRlciBpbXBsZW1lbnRhdGlvbnMgU2VyaWFsaXphYmxlIFtJTy0xMzFdCgotIEltcHJvdmUgSU9GaWxlRmlsdGVyIHRvU3RyaW5nKCkgbWV0aG9kcyBbSU8tMTIwXQoKLSBNYWtlIGZpZWxkcyBmaW5hbCBzbyBjbGFzc2VzIGFyZSBpbW11dGFibGUvdGhyZWFkc2FmZSBbSU8tMTMzXQogIC0gY2hhbmdlcyB0byBBZ2UsIERlbGVnYXRlLCBOYW1lLCBOb3QsIFByZWZpeCwgUmVnZXgsIFNpemUsIFN1ZmZpeCBhbmQgV2lsZGNhcmQgSU9GaWxlRmlsdGVyCiAgICBpbXBsZW1lbnRhdGlvbnMuCgotIElPQ2FzZQogIC0gQWRkIGEgY29tcGFyZSBtZXRob2QgdG8gSU9DYXNlIFtJTy0xNDRdCgotIEFkZCBhIHBhY2thZ2Ugb2YgamF2YS51dGlsLkNvbXBhcmF0b3IgaW1wbGVtZW50YXRpb25zIGZvciBmaWxlcyBbSU8tMTQ1XQogIC0gRGVmYXVsdEZpbGVDb21wYXJhdG9yIC0gY29tcGFyZSBmaWxlcyB1c2luZyB0aGUgZGVmYXVsdCBGaWxlLmNvbXBhcmVUbyhGaWxlKSBtZXRob2QuCiAgLSBFeHRlbnNpb25GaWxlQ29tcGFyYXRvciAtIGNvbXBhcmVzIGZpbGVzIHVzaW5nIGZpbGUgbmFtZSBleHRlbnNpb25zLgogIC0gTGFzdE1vZGlmaWVkRmlsZUNvbXBhcmF0b3IgLSBjb21wYXJlcyBmaWxlcyB1c2luZyB0aGUgbGFzdCBtb2RpZmllZCBkYXRlL3RpbWUuCiAgLSBOYW1lRmlsZUNvbXBhcmF0b3IgLSBjb21wYXJlcyBmaWxlcyB1c2luZyBmaWxlIG5hbWVzLgogIC0gUGF0aEZpbGVDb21wYXJhdG9yIC0gY29tcGFyZXMgZmlsZXMgdXNpbmcgZmlsZSBwYXRocy4KICAtIFNpemVGaWxlQ29tcGFyYXRvciAtIGNvbXBhcmVzIGZpbGVzIHVzaW5nIGZpbGUgc2l6ZXMuCiAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQXBhY2hlIENvbW1vbnMgSU8gVmVyc2lvbiAxLjMuMgoKQ29tcGF0aWJpbGl0eSB3aXRoIDEuMy4xCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQmluYXJ5IGNvbXBhdGlibGUgLSBZZXMKClNvdXJjZSBjb21wYXRpYmxlIC0gWWVzCgpTZW1hbnRpYyBjb21wYXRpYmxlIC0gWWVzCgpDb21wYXRpYmlsaXR5IHdpdGggMS4zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQmluYXJ5IGNvbXBhdGlibGUgLSBObwogIFNlZSBbSU8tMTEzXQoKU291cmNlIGNvbXBhdGlibGUgLSBObwogIFNlZSBbSU8tMTEzXQoKU2VtYW50aWMgY29tcGF0aWJsZSAtIFllcwoKRW5oYW5jZW1lbnRzIHNpbmNlIDEuMy4xCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSBDcmVhdGVkIHRoZSBGaWxlQ2xlYW5pbmdUcmFja2VyLCBiYXNpY2FsbHkgYSBub24tc3RhdGljIHZlcnNpb24gb2YgdGhlCiAgRmlsZUNsZWFuZXIsIHdoaWNoIGNhbiBiZSBjb250cm9sbGVkIGJ5IHRoZSB1c2VyLiBbSU8tMTE2XQotIFRoZSBGaWxlQ2xlYW5lciBpcyBkZXByZWNhdGVkLgoKQnVnIGZpeGVzIGZyb20gMS4zLjEKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0gU29tZSB0ZXN0cywgd2hpY2ggYXJlIGltcGxpY2l0bHkgYXNzdW1pbmcgYSBVbml4LWxpa2UgZmlsZSBzeXN0ZW0sIGFyZQogIG5vdyBza2lwcGVkIG9uIFdpbmRvd3MuIFtJTy0xMTVdCi0gRW5kaWFuVXRpbHMKICAtIEJvdGggcmVhZFN3YXBwZWRVbnNpZ25lZEludGVnZXIoLi4uKSBtZXRob2RzIGNvdWxkIHJldHVybiBuZWdhdGl2ZSAKICAgIG51bWJlcnMgZHVlIHRvIGludC9sb25nIGNhc3RpbmcuIFtJTy0xMTddCgpCdWcgZml4ZXMgZnJvbSAxLjMKLS0tLS0tLS0tLS0tLS0tLS0tCgotIEZpbGVVdGlscwogIC0gTlBFIGluIG9wZW5PdXRwdXRTdHJlYW0oRmlsZSkgd2hlbiBmaWxlIGhhcyBubyBwYXJlbnQgaW4gcGF0aCBbSU8tMTEyXQogIC0gcmVhZEZpbGVUb1N0cmluZyhGaWxlKSBpcyBub3Qgc3RhdGljIFtJTy0xMTNdCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkFwYWNoZSBDb21tb25zIElPIFZlcnNpb24gMS4zLjEKCkNvbXBhdGliaWxpdHkgd2l0aCAxLjMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpCaW5hcnkgY29tcGF0aWJsZSAtIE5vCiAgU2VlIFtJTy0xMTNdCgpTb3VyY2UgY29tcGF0aWJsZSAtIE5vCiAgU2VlIFtJTy0xMTNdCgpTZW1hbnRpYyBjb21wYXRpYmxlIC0gWWVzCgpCdWcgZml4ZXMgZnJvbSAxLjMKLS0tLS0tLS0tLS0tLS0tLS0tCgotIEZpbGVVdGlscwogIC0gTlBFIGluIG9wZW5PdXRwdXRTdHJlYW0oRmlsZSkgd2hlbiBmaWxlIGhhcyBubyBwYXJlbnQgaW4gcGF0aCBbSU8tMTEyXQogIC0gcmVhZEZpbGVUb1N0cmluZyhGaWxlKSBpcyBub3Qgc3RhdGljIFtJTy0xMTNdCiAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQXBhY2hlIENvbW1vbnMgSU8gVmVyc2lvbiAxLjMKCkNvbXBhdGliaWxpdHkgd2l0aCAxLjIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpCaW5hcnkgY29tcGF0aWJsZSAtIFllcwoKU291cmNlIGNvbXBhdGlibGUgLSBZZXMKClNlbWFudGljIGNvbXBhdGlibGUgLSBZZXMKICBDaGVjayB0aGUgYnVnIGZpeGVzIHNlY3Rpb24gZm9yIHNlbWFudGljIGJ1ZyBmaXhlcwoKRGVwcmVjYXRpb25zIGZyb20gMS4yCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFdpbGRjYXJkRmlsdGVyIGRlcHJlY2F0ZWQsIHJlcGxhY2VkIGJ5IFdpbGRjYXJkRmlsZUZpbHRlcgogIC0gb2xkIGNsYXNzIG9ubHkgYWNjZXB0ZWQgZmlsZXMsIHRodXMgaGFkIGEgY29uZnVzaW5nIGR1YWwgcHVycG9zZQoKLSBGaWxlU3lzdGVtVXRpbHMuZnJlZVNwYWNlIGRlcHJlY2F0ZWQsIHJlcGxhY2VkIGJ5IGZyZWVTcGFjZUtiCiAgLSBmcmVlU3BhY2UgcmV0dXJucyBhIHJlc3VsdCB0aGF0IHZhcmllcyBieSBvcGVyYXRpbmcgc3lzdGVtIGFuZAogICAgdGh1cyBpc24ndCB0aGF0IHVzZWZ1bAogIC0gZnJlZVNwYWNlS2IgcmV0dXJucyBtdWNoIGJldHRlciBhbmQgbW9yZSBjb25zaXN0ZW50IHJlc3VsdHMKICAtIGZyZWVTcGFjZUtiIGV4aXN0ZWQgaW4gdjEuMiwgc28gdGhpcyBpcyBhIGdlbnRsZSBjdXRvdmVyCgpCdWcgZml4ZXMgZnJvbSAxLjIKLS0tLS0tLS0tLS0tLS0tLS0tCi0gTGluZUl0ZXJhdG9yIG5vdyBpbXBsZW1lbnRzIEl0ZXJhdG9yCiAgLSBJdCB3YXMgYWx3YXlzIHN1cHBvc2VkIHRvLi4uCgotIEZpbGVTeXN0ZW1VdGlscy5mcmVlU3BhY2UvZnJlZVNwYWNlS2IgW0lPLTgzXQogIC0gVGhlc2Ugc2hvdWxkIG5vdyB3b3JrIG9uIEFJWCBhbmQgSFAtVVgKCi0gRmlsZVN5c3RlbVV0aWxzLmZyZWVTcGFjZS9mcmVlU3BhY2VLYiBbSU8tOTBdCiAgLSBBdm9pZCBpbmZpbml0ZSBsb29waW5nIGluIFdpbmRvd3MKICAtIENhdGNoIG1vcmUgZXJyb3JzIHdpdGggbmljZSBtZXNzYWdlcwoKLSBGaWxlU3lzdGVtVXRpbHMuZnJlZVNwYWNlIFtJTy05MV0KICAtIFRoaXMgaXMgbm93IGRvY3VtZW50ZWQgbm90IHRvIHdvcmsgb24gU3VuT1MgNQoKLSBGaWxlU3lzdGVtVXRpbHMgW0lPLTkzXQogIC0gRml4ZWQgcmVzb3VyY2UgbGVhayBsZWFkaW5nIHRvICdUb28gbWFueSBvcGVuIGZpbGVzJyBlcnJvcgogIC0gUHJldmlvdXNseSBkaWQgbm90IGRlc3Ryb3kgUHJvY2VzcyBpbnN0YW5jZXMgKGFzIEpESyBKYXZhZG9jIGlzIHNvIHBvb3IpCiAgLSBodHRwOi8vYnVncy5zdW4uY29tL2J1Z2RhdGFiYXNlL3ZpZXdfYnVnLmRvP2J1Z19pZD00ODAxMDI3CgotIEZpbGVVdGlscy50b3VjaCBbSU8tMTAwXQogIC0gVGhlIHRvdWNoIG1ldGhvZCBwcmV2aW91c2x5IGdhdmUgbm8gaW5kaWNhdGlvbiB3aGVuIHRoZSBmaWxlIGNvdWxkIG5vdAogICAgYmUgdG91Y2hlZCBzdWNjZXNzZnVsbHkgKHN1Y2ggYXMgZHVlIHRvIGFjY2VzcyByZXN0cmljdGlvbnMpIC0gaXQgbm93CiAgICB0aHJvd3MgYW4gSU9FeGNlcHRpb24gaWYgdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZSBjYW5ub3QgYmUgY2hhbmdlZAoKLSBGaWxlQ2xlYW5lcgogIC0gVGhpcyBub3cgaGFuZGxlcyB0aGUgc2l0dWF0aW9uIHdoZXJlIGFuIGVycm9yIG9jY3VycyB3aGVuIGRlbGV0aW5nIHRoZSBmaWxlCgotIElPVXRpbHMuY29weSBbSU8tODRdCiAgLSBDb3B5IG1ldGhvZHMgY291bGQgcmV0dXJuIGluYWNjdXJhdGUgYnl0ZS9jaGFyIGNvdW50IGZvciBsYXJnZSBzdHJlYW1zCiAgLSBUaGUgY29weShJbnB1dFN0cmVhbSwgT3V0cHV0U3RyZWFtKSBtZXRob2Qgbm93IHJldHVybnMgLTEgaWYgdGhlIGNvdW50IGlzIGdyZWF0ZXIgdGhhbiBhbiBpbnQKICAtIFRoZSBjb3B5KFJlYWRlciwgV3JpdGVyKSBtZXRob2Qgbm93IHRocm93cyBub3cgcmV0dXJucyAtMSBpZiB0aGUgY291bnQgaXMgZ3JlYXRlciB0aGFuIGFuIGludAogIC0gQWRkZWQgYSBuZXcgY29weUxhcmdlKElucHV0U3RyZWFtLCBPdXRwdXRTdHJlYW0pIG1ldGhvZCB0aGF0IHJldHVybnMgYSBsb25nCiAgLSBBZGRlZCBhIG5ldyBjb3B5TGFyZ2UoUmVhZGVyLCBXcml0ZXIpIG1ldGhvZCB0aGF0IHJldHVybnMgYSBsb25nCgotIENvdW50aW5nSW5wdXRTdHJlYW0vQ291bnRpbmdPdXRwdXRTdHJlYW0gW0lPLTg0XQogIC0gTWV0aG9kcyB3ZXJlIGRlY2xhcmVkIGFzIGludCB0aHVzIHRoZSBjb3VudCB3YXMgaW5hY2N1cmF0ZSBmb3IgbGFyZ2Ugc3RyZWFtcwogIC0gbmV3IGxvbmcgYmFzZWQgbWV0aG9kcyBnZXRCeXRlQ291bnQoKS9yZXNldEJ5dGVDb3VudCgpIGFkZGVkCiAgLSBleGlzdGluZyBtZXRob2RzIGNoYW5nZWQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb3VudCBpcyBncmVhdGVyIHRoYW4gYW4gaW50CgotIEZpbGVCYXNlZFRlc3RDYXNlCiAgLSBGaXhlZCBidWcgaW4gY29tcGFyZSBjb250ZW50IG1ldGhvZHMgaWRlbnRpZmllZCBieSBHTlUgY2xhc3NwYXRoCgotIEVuZGlhblV0aWxzLndyaXRlU3dhcHBlZExvbmcoYnl0ZVtdLCBpbnQpIFtJTy0xMDFdCiAgLSBBbiBpbnQgb3ZlcnJ1biBpbiB0aGUgYml0IHNoaWZ0aW5nIHdoZW4gaXQgc2hvdWxkIGhhdmUgYmVlbiBhIGxvbmcKCi0gRW5kaWFuVXRpbHMud3JpdGVTd2FwcGVkTG9uZyhJbnB1dFN0cmVhbSkgW0lPLTEwMl0KICAtIFRoZSByZXR1cm4gb2YgaW5wdXQucmVhZChieXRlW10pIHdhcyBub3QgYmVpbmcgY2hlY2tlZCB0byBlbnN1cmUgYWxsIDggYnl0ZXMgd2VyZSByZWFkCgpFbmhhbmNlbWVudHMgZnJvbSAxLjIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRGlyZWN0b3J5V2Fsa2VyIFtJTy04Nl0KICAtIE5ldyBjbGFzcyBkZXNpZ25lZCBmb3Igc3ViY2xhc3NpbmcgdG8gd2FsayB0aHJvdWdoIGEgc2V0IG9mIGZpbGVzLgogICAgRGlyZWN0b3J5V2Fsa2VyIHByb3ZpZGVzIHRoZSB3YWxrIG9mIHRoZSBkaXJlY3RvcmllcywgZmlsdGVyaW5nIG9mCiAgICBkaXJlY3RvcmllcyBhbmQgZmlsZXMsIGFuZCBjYW5jZWxsYXRpb24gc3VwcG9ydC4gVGhlIHN1YmNsYXNzIG11c3QgcHJvdmlkZQogICAgdGhlIHNwZWNpZmljIGJlaGF2aW9yLCBzdWNoIGFzIHRleHQgc2VhcmNoaW5nIG9yIGltYWdlIHByb2Nlc3NpbmcuCgotIElPQ2FzZQogIC0gTmV3IGNsYXNzL2VudW1lcmF0aW9uIGZvciBjYXNlLXNlbnNpdGl2aXR5IGNvbnRyb2wKCi0gRmlsZW5hbWVVdGlscwogIC0gTmV3IG1ldGhvZHMgdG8gaGFuZGxlIGNhc2Utc2Vuc2l0aXZpdHkKICAtIHdpbGRjYXJkTWF0Y2ggLSBuZXcgbWV0aG9kIHRoYXQgaGFzIElPQ2FzZSBhcyBhIHBhcmFtZXRlcgogIC0gZXF1YWxzIC0gbmV3IG1ldGhvZCB0aGF0IGhhcyBJT0Nhc2UgYXMgYSBwYXJhbWV0ZXIKCi0gRmlsZVV0aWxzIFtJTy0xMDhdIC0gbmV3IGRlZmF1bHQgZW5jb2RpbmcgbWV0aG9kcyBmb3I6CiAgLSByZWFkRmlsZVRvU3RyaW5nKEZpbGUpCiAgLSByZWFkTGluZXMoRmlsZSkKICAtIGxpbmVJdGVyYXRvcihGaWxlKQogIC0gd3JpdGVTdHJpbmdUb0ZpbGUoRmlsZSwgU3RyaW5nKQogIC0gd3JpdGVMaW5lcyhGaWxlLCBDb2xsZWN0aW9uKQogIC0gd3JpdGVMaW5lcyhGaWxlLCBDb2xsZWN0aW9uLCBTdHJpbmcpCgotIEZpbGVVdGlscy5vcGVuT3V0cHV0U3RyZWFtICBbSU8tMTA3XQogIC0gbmV3IG1ldGhvZCB0byBvcGVuIGEgRmlsZU91dHB1dFN0cmVhbSwgY3JlYXRpbmcgcGFyZW50IGRpcmVjdG9yaWVzIGlmIHJlcXVpcmVkCi0gRmlsZVV0aWxzLnRvdWNoCi0gRmlsZVV0aWxzLmNvcHlVUkxUb0ZpbGUKLSBGaWxlVXRpbHMud3JpdGVTdHJpbmdUb0ZpbGUKLSBGaWxlVXRpbHMud3JpdGVCeXRlQXJyYXlUb0ZpbGUKLSBGaWxlVXRpbHMud3JpdGVMaW5lcwogIC0gZW5oYW5jZWQgdG8gY3JlYXRlIHBhcmVudCBkaXJlY3RvcmllcyBpZiByZXF1aXJlZAotIEZpbGVVdGlscy5vcGVuSW5wdXRTdHJlYW0gIFtJTy0xMDddCiAgLSBuZXcgbWV0aG9kIHRvIG9wZW4gYSBGaWxlSW5wdXRTdHJlYW0sIHByb3ZpZGluZyBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgdGhhbiB0aGUgSkRLCgotIEZpbGVVdGlscy5pc0ZpbGVPbGRlcgogIC0gbmV3IG1ldGhvZHMgdG8gY2hlY2sgaWYgYSBmaWxlIGlzIG9sZGVyIChpLmUuIGlzRmlsZU9sZGVyKCkpIC0gY291bnRlcnBhcnRzCiAgICB0byB0aGUgZXhpc3RpbmcgaXNGaWxlTmV3ZXIoKSBtZXRob2RzLgoKLSBGaWxlVXRpbHMuY2hlY2tzdW0sIEZpbGVVdGlscy5jaGVja3N1bUNSQzMyCiAgLSBuZXcgbWV0aG9kcyB0byBjcmVhdGUgYSBjaGVja3N1bSBvZiBhIGZpbGUKCi0gRmlsZVV0aWxzLmNvcHlGaWxlVG9EaXJlY3RvcnkgIFtJTy0xMDRdCiAgLSBuZXcgdmFyaWFudCB0aGF0IG9wdGlvbmFsbHkgcmV0YWlucyB0aGUgZmlsZSBkYXRlCgotIEZpbGVEZWxldGVTdHJhdGVneQotIEZpbGVDbGVhbmVyICAgIFtJTy01NixJTy03MF0KICAtIEZpbGVEZWxldGVTdHJhdGVneSBpcyBhIHN0cmF0ZWd5IGZvciBoYW5kbGluZyBmaWxlIGRlbGV0aW9uCiAgLSBUaGlzIGNhbiBiZSB1c2VkIGFzIGEgY2FsbGJhY2sgaW4gRmlsZUNsZWFuZXIKICAtIFRvZ2V0aGVyIHRoZXNlIGFsbG93IEZpbGVDbGVhbmVyIHRvIGRvIGEgZm9yY2VEZWxldGUgdG8ga2lsbCBkaXJlY3RvcmllcwoKLSBGaWxlQ2xlYW5lci5leGl0V2hlbkZpbmlzaGVkIFtJTy05OV0KICAtIEEgbmV3IG1ldGhvZCB0aGF0IGFsbG93cyB0aGUgaW50ZXJuYWwgY2xlYW5lciB0aHJlYWQgdG8gYmUgY2xlYW5seSB0ZXJtaW5hdGVkCgotIFdpbGRjYXJkRmlsZUZpbHRlcgogIC0gUmVwbGFjZW1lbnQgZm9yIFdpbGRjYXJkRmlsdGVyCiAgLSBBY2NlcHRzIGJvdGggZmlsZXMgYW5kIGRpcmVjdG9yaWVzCiAgLSBBYmlsaXR5IHRvIGNvbnRyb2wgY2FzZS1zZW5zaXRpdml0eQoKLSBOYW1lRmlsZUZpbHRlcgogIC0gQWJpbGl0eSB0byBjb250cm9sIGNhc2Utc2Vuc2l0aXZpdHkKCi0gRmlsZUZpbGVGaWx0ZXIKICAtIE5ldyBJT0ZpbGVGaWx0ZXIgaW1wbGVtZW50YXRpb24KICAtIEFjY2VwdHMgZmlsZXMgd2hlcmUgRmlsZS5pc0ZpbGUoKSBpcyB0cnVlCiAgLSBJbiBvdGhlciB3b3JkcyBpdCBmaWx0ZXJzIG91dCBkaXJlY3RvcmllcwogIC0gU2luZ2xldG9uIGluc3RhbmNlIHByb3ZpZGVkIChGSUxFKQoKLSBDYW5SZWFkRmlsZUZpbHRlcgogIC0gTmV3IElPRmlsZUZpbHRlciBpbXBsZW1lbnRhdGlvbgogIC0gQWNjZXB0cyBmaWxlcyB3aGVyZSBGaWxlLmNhblJlYWQoKSBpcyB0cnVlCiAgLSBTaW5nbGV0b24gaW5zdGFuY2VzIHByb3ZpZGVkIChDQU5fUkVBRC9DQU5OT1RfUkVBRC9SRUFEX09OTFkpCgotIENhbldyaXRlRmlsZUZpbHRlcgogIC0gTmV3IElPRmlsZUZpbHRlciBpbXBsZW1lbnRhdGlvbgogIC0gQWNjZXB0cyBmaWxlcyB3aGVyZSBGaWxlLmNhbldyaXRlKCkgaXMgdHJ1ZQogIC0gU2luZ2xldG9uIGluc3RhbmNlcyBwcm92aWRlZCAoQ0FOX1dSSVRFL0NBTk5PVF9XUklURSkKCi0gSGlkZGVuRmlsZUZpbHRlcgogIC0gTmV3IElPRmlsZUZpbHRlciBpbXBsZW1lbnRhdGlvbgogIC0gQWNjZXB0cyBmaWxlcyB3aGVyZSBGaWxlLmlzSGlkZGVuKCkgaXMgdHJ1ZQogIC0gU2luZ2xldG9uIGluc3RhbmNlcyBwcm92aWRlZCAoSElEREVOL1ZJU0lCTEUpCgotIEVtcHR5RmlsZUZpbHRlcgogIC0gTmV3IElPRmlsZUZpbHRlciBpbXBsZW1lbnRhdGlvbgogIC0gQWNjZXB0cyBmaWxlcyBvciBkaXJlY3RvcmllcyB0aGF0IGFyZSBlbXB0eQogIC0gU2luZ2xldG9uIGluc3RhbmNlcyBwcm92aWRlZCAoRU1QVFkvTk9UX0VNUFRZKQoKLSBUcnVlRmlsZUZpbHRlci9GYWxzZUZpbGVGaWx0ZXIvRGlyZWN0b3J5RmlsZUZpbHRlcgogIC0gTmV3IHNpbmdsZXRvbiBpbnN0YW5jZSBjb25zdGFudHMgKFRSVUUvRkFMU0UvRElSRUNUT1JZKQogIC0gVGhlIG5ldyBjb25zdGFudHMgYXJlIG1vcmUgSmF2YSA1IGZyaWVuZGx5IHdpdGggcmVnYXJkcyB0byBzdGF0aWMgaW1wb3J0cwogICAgKHdoZXJlYXMgaWYgZXZlcnl0aGluZyB1c2VzIElOU1RBTkNFLCB0aGVuIHRoZXkganVzdCBjbGFzaCkKICAtIFRoZSBvbGQgSU5TVEFOQ0UgY29uc3RhbnRzIGFyZSBzdGlsbCBwcmVzZW50IGFuZCBoYXZlIG5vdCBiZWVuIGRlcHJlY2F0ZWQKCi0gRmlsZUZpbHRlclV0aWxzLnNpemVSYW5nZUZpbGVGaWx0ZXIKICAtIG5ldyBzaXplUmFuZ2VGaWxlRmlsdGVyKGxvbmcgbWluaW11bVNpemUsIGxvbmcgbWF4aW11bVNpemUpIG1ldGhvZCB3aGljaCAKICAgIGNyZWF0ZXMgYSBmaWx0ZXIgdGhhdCBhY2NlcHRzIGZpbGVzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHNpemUgcmFuZ2UuCgotIEZpbGVGaWx0ZXJVdGlscy5tYWtlRGlyZWN0b3J5T25seS9tYWtlRmlsZU9ubHkKICAtIHR3byBuZXcgbWV0aG9kcyB0aGF0IGRlY29yYXRlIGEgZmlsZSBmaWx0ZXIgdG8gbWFrZSBpdCBhcHBseSB0bwogICAgZGlyZWN0b3JpZXMgb25seSBvciBmaWxlcyBvbmx5CgotIE51bGxXcml0ZXIKICAtIE5ldyB3cml0ZXIgdGhhdCBhY3RzIGFzIGEgc2luayBmb3IgYWxsIGRhdGEsIGFzIHBlciAvZGV2L251bGwKCi0gTnVsbElucHV0U3RyZWFtCiAgLSBOZXcgaW5wdXQgc3RyZWFtIHRoYXQgZW11bGF0ZXMgYSBzdHJlYW0gb2YgYSBzcGVjaWZpZWQgc2l6ZQoKLSBOdWxsUmVhZGVyCiAgLSBOZXcgcmVhZGVyIHRoYXQgZW11bGF0ZXMgYSByZWFkZXIgb2YgYSBzcGVjaWZpZWQgc2l6ZQoKLSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gIFtJTy05N10KICAtIFBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cwoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBcGFjaGUgQ29tbW9ucyBJTyBWZXJzaW9uIDEuMgoKQ29tcGF0aWJpbGl0eSB3aXRoIDEuMQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJpbmFyeSBjb21wYXRpYmxlIC0gWWVzCgpTb3VyY2UgY29tcGF0aWJsZSAtIFllcwoKU2VtYW50aWMgY29tcGF0aWJsZSAtIFllcwoKRGVwcmVjYXRpb25zIGZyb20gMS4xCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQnVnIGZpeGVzIGZyb20gMS4xCi0tLS0tLS0tLS0tLS0tLS0tLQotIEZpbGVTeXN0ZW1VdGlscy5mcmVlU3BhY2UoZHJpdmUpCiAgRml4IHRvIGFsbG93IFdpbmRvd3MgYmFzZWQgY29tbWFuZCB0byBmdW5jdGlvbiBpbiBGcmVuY2ggbG9jYWxlCgotIEZpbGVVdGlscy5yZWFkKgogIEluY3JlYXNlIGNlcnRhaW50eSB0aGF0IGZpbGVzIGFyZSBjbG9zZWQgaW4gY2FzZSBvZiBlcnJvcgoKLSBMb2NrYWJsZUZpbGVXcml0ZXIKICBMb2NraW5nIG1lY2hhbmlzbSB3YXMgYnJva2VuIGFuZCBvbmx5IHByb3ZpZGVkIGxpbWl0ZWQgcHJvdGVjdGlvbiBbMzg5NDJdCiAgRmlsZSBkZWxldGlvbiBhbmQgbG9ja2luZyBpbiBjYXNlIG9mIGNvbnN0cnVjdG9yIGVycm9yIHdhcyBicm9rZW4KCkVuaGFuY2VtZW50cyBmcm9tIDEuMQotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBBZ2VGaWxlRmlsdGVyL1NpemVGaWxlRmlsdGVyCiAgTmV3IGZpbGUgZmlsdGVycyB0aGF0IGNvbXBhcmVzIGFnYWluc3QgdGhlIGFnZSBhbmQgc2l6ZSBvZiB0aGUgZmlsZQoKLSBGaWxlU3lzdGVtVXRpbHMuZnJlZVNwYWNlS2IoZHJpdmUpCiAgTmV3IG1ldGhvZCB0aGF0IHVuaWZpZXMgcmVzdWx0IHRvIGJlIGluIGtpbG9ieXRlcyBbMzg1NzRdCgotIEZpbGVVdGlscy5jb250ZW50RXF1YWxzKEZpbGUsRmlsZSkKICBQZXJmb3JtYW5jZSBpbXByb3ZlZCBieSBhZGRpbmcgbGVuZ3RoIGFuZCBmaWxlIGxvY2F0aW9uIGNoZWNraW5nCgotIEZpbGVVdGlscy5pdGVyYXRlRmlsZXMKICBUd28gbmV3IG1ldGhvZCB0byBwcm92aWRlIGRpcmVjdCBhY2Nlc3MgdG8gaXRlcmF0b3JzIG92ZXIgZmlsZXMKCi0gRmlsZVV0aWxzLmxpbmVJdGVyYXRvcgogIElPVXRpbHMubGluZUl0ZXJhdG9yCiAgTmV3IG1ldGhvZHMgdG8gcHJvdmlkZSBhbiBpdGVyYXRvciBvdmVyIHRoZSBsaW5lcyBpbiBhIGZpbGUgWzM4MDgzXQoKLSBGaWxlVXRpbHMuY29weURpcmVjdG9yeVRvRGlyZWN0b3J5CiAgTmV3IG1ldGhvZCB0byBjb3B5IGEgZGlyZWN0b3J5IHRvIHdpdGhpbiBhbm90aGVyIGRpcmVjdG9yeSBbMzYzMTVdCiAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQXBhY2hlIENvbW1vbnMgSU8gVmVyc2lvbiAxLjEKCkluY29tcGF0aWJsZSBjaGFuZ2VzIGZyb20gMS4wCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJpbmFyeSBjb21wYXRpYmxlIC0gWWVzCgpTb3VyY2UgY29tcGF0aWJsZSAtIFllcwoKU2VtYW50aWMgY29tcGF0aWJsZSAtIFllcywgZXhjZXB0OgotIEZpbGVVdGlscy53cml0ZVN0cmluZ1RvRmlsZSgpCiAgICBBIG51bGwgZW5jb2RpbmcgcHJldmlvdXNseSB1c2VkICdJU08tODg1OS0xJywgbm93IGl0IHVzZXMgdGhlIHBsYXRmb3JtIGRlZmF1bHQKICAgIEdlbmVyYWxseSB0aGlzIHdpbGwgbWFrZSBubyBkaWZmZXJlbmNlCgotIExvY2thYmxlRmlsZVdyaXRlcgogICAgSW1wcm92ZWQgdmFsaWRhdGlvbiBhbmQgbm93IGNyZWF0ZSBkaXJlY3RvcmllcyBpZiBuZWNlc3NhcnkKCnBsdXMgdGhlc2UgYnVnIGZpeGVzIG1heSBhZmZlY3QgeW91IHNlbWFudGljYWxseToKLSBGaWxlVXRpbHMudG91Y2goKSAgKEJ1ZyBmaXggMjk4MjEpCiAgICBOb3cgY3JlYXRlcyB0aGUgZmlsZSBpZiBpdCBkaWQgbm90IHByZXZpb3VzbHkgZXhpc3QKCi0gRmlsZVV0aWxzLnRvRmlsZShVUkwpIChCdWcgZml4IDMyNTc1KQogICAgTm93IGhhbmRsZXMgZXNjYXBlIHN5bnRheCBzdWNoIGFzICUyMAoKLSBGaWxlVXRpbHMuc2l6ZU9mRGlyZWN0b3J5KCkgIChCdWcgZml4IDM2ODAxKQogICAgTWF5IG5vdyByZXR1cm4gYSBzaXplIG9mIDAgaWYgdGhlIGRpcmVjdG9yeSBpcyBzZWN1cml0eSByZXN0cmljdGVkCgpEZXByZWNhdGlvbnMgZnJvbSAxLjAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gQ29weVV0aWxzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCiAgICBJdHMgbWV0aG9kcyBoYXZlIGJlZW4gbW92ZWQgdG8gSU9VdGlscy4KICAgIFRoZSBuZXcgSU9VdGlscyBtZXRob2RzIGhhbmRsZSBudWxscyBiZXR0ZXIsIGFuZCBoYXZlIGNsZWFyZXIgbmFtZXMuCgotIElPVXRpbHMudG9CeXRlQXJyYXkoU3RyaW5nKSAtIFVzZSB7QGxpbmsgU3RyaW5nI2dldEJ5dGVzKCl9Ci0gSU9VdGlscy50b1N0cmluZyhieXRlW10pIC0gVXNlIHtAbGluayBTdHJpbmcjU3RyaW5nKGJ5dGVbXSl9Ci0gSU9VdGlscy50b1N0cmluZyhieXRlW10sU3RyaW5nKSAtIFVzZSB7QGxpbmsgU3RyaW5nI1N0cmluZyhieXRlW10sU3RyaW5nKX0KCkJ1ZyBmaXhlcyBmcm9tIDEuMAotLS0tLS0tLS0tLS0tLS0tLS0KLSBGaWxlVXRpbHMgLSB0b3VjaCgpICBbMjk4MjFdCiAgICBOb3cgY3JlYXRlcyB0aGUgZmlsZSBpZiBpdCBkaWQgbm90IHByZXZpb3VzbHkgZXhpc3QKCi0gRmlsZVV0aWxzIC0gdG9GaWxlKFVSTCkgIFszMjU3NV0KICAgIE5vdyBoYW5kbGVzIGVzY2FwZSBzeW50YXggc3VjaCBhcyAlMjAKCi0gRmlsZUZpbHRlclV0aWxzIC0gbWFrZUNWU0F3YXJlKElPRmlsZUZpbHRlcikgIFszMzAyM10KICAgIEZpeGVkIGJ1ZyB0aGF0IGNhdXNlZCBtZXRob2QgdG8gYmUgY29tcGxldGVseSBicm9rZW4KCi0gQ291bnRpbmdJbnB1dFN0cmVhbSAgWzMzMzM2XQogICAgRml4ZWQgYnVnIHRoYXQgY2F1c2VkIHRoZSBjb3VudCB0byByZWR1Y2UgYnkgb25lIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbQoKLSBDb3VudGluZ0lucHV0U3RyZWFtIC0gc2tpcChsb25nKSAgWzM0MzExXQogICAgQnl0ZXMgZnJvbSBjYWxscyB0byB0aGlzIG1ldGhvZCB3ZXJlIG5vdCBwcmV2aW91c2x5IGNvdW50ZWQKCi0gTnVsbE91dHB1dFN0cmVhbSAgWzMzNDgxXQogICAgUmVtb3ZlIHVubmVjZXNzYXJ5IHN5bmNocm9uaXphdGlvbgoKLSBBYnN0cmFjdEZpbGVGaWx0ZXIgLSBhY2NlcHQoRmlsZSwgU3RyaW5nKSAgWzMwOTkyXQogICAgRml4ZWQgYnJva2VuIGltcGxlbWVudGF0aW9uCgotIEZpbGVVdGlscyAgWzM2ODAxXQogICAgUHJldmlvdXNseSB0aHJldyBOUEUgd2hlbiBsaXN0aW5nIGZpbGVzIGluIGEgc2VjdXJpdHkgcmVzdHJpY3RlZCBkaXJlY3RvcnkKICAgIE5vdyB0aHJvdyBJT0V4Y2VwdGlvbiB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UKCi0gRmlsZVV0aWxzIC0gd3JpdGVTdHJpbmdUb0ZpbGUoKQogICAgTnVsbCBlbmNvZGluZyBub3cgY29ycmVjdGx5IHVzZXMgdGhlIHBsYXRmb3JtIGRlZmF1bHQKCkVuaGFuY2VtZW50cyBmcm9tIDEuMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGaWxlbmFtZVV0aWxzIC0gbmV3IGNsYXNzICBbMzMzMDMsMjkzNTFdCiAgICBBIHN0YXRpYyB1dGlsaXR5IGNsYXNzIGZvciB3b3JraW5nIHdpdGggZmlsZW5hbWVzCiAgICBTZWVrcyB0byBlYXNlIHRoZSBwYWluIG9mIGRldmVsb3Bpbmcgb24gV2luZG93cyBhbmQgZGVwbG95aW5nIG9uIFVuaXgKCi0gRmlsZVN5c3RlbVV0aWxzIC0gbmV3IGNsYXNzICBbMzI5ODIsMzYzMjVdCiAgICBBIHN0YXRpYyB1dGlsaXR5IGNsYXNzIGZvciB3b3JraW5nIHdpdGggZmlsZSBzeXN0ZW1zCiAgICBQcm92aWRlcyBvbmUgbWV0aG9kIGF0IHByZXNlbnQsIHRvIGdldCB0aGUgZnJlZSBzcGFjZSBvbiB0aGUgZmlsaW5nIHN5c3RlbQoKLSBJT1V0aWxzIC0gbmV3IHB1YmxpYyBjb25zdGFudHMKICAgIENvbnN0YW50cyBmb3IgZGlyZWN0b3J5IGFuZCBsaW5lIHNlcGFyYXRvcnMgb24gV2luZG93cyBhbmQgVW5peAoKLSBJT1V0aWxzIC0gdG9CeXRlQXJyYXkoUmVhZGVyLGVuY29kaW5nKQogICAgSGFuZGxlcyBlbmNvZGluZ3Mgd2hlbiByZWFkaW5nIHRvIGEgYnl0ZSBhcnJheQoKLSBJT1V0aWxzIC0gdG9DaGFyQXJyYXkoSW5wdXRTdHJlYW0pICBbMjg5NzldCiAgICAgICAgICAtIHRvQ2hhckFycmF5KElucHV0U3RyZWFtLGVuY29kaW5nKQogICAgICAgICAgLSB0b0NoYXJBcnJheShSZWFkZXIpCiAgICBSZWFkcyBhIHN0cmVhbS9yZWFkZXIgaW50byBhIGNoYXJhY3RlciBhcnJheQoKLSBJT1V0aWxzIC0gcmVhZExpbmVzKElucHV0U3RyZWFtKSAgWzM2MjE0XQogICAgICAgICAgLSByZWFkTGluZXMoSW5wdXRTdHJlYW0sZW5jb2RpbmcpCiAgICAgICAgICAtIHJlYWRMaW5lcyhSZWFkZXIpCiAgICBSZWFkcyBhIHN0cmVhbS9yZWFkZXIgbGluZSBieSBsaW5lIGludG8gYSBMaXN0IG9mIFN0cmluZ3MKCi0gSU9VdGlscyAtIHRvSW5wdXRTdHJlYW0oU3RyaW5nKSAgWzMyOTU4XQogICAgICAgICAgLSB0b0lucHV0U3RyZWFtKFN0cmluZyxlbmNvZGluZykKICAgIENyZWF0ZXMgYW4gaW5wdXQgc3RyZWFtIHRoYXQgdXNlcyB0aGUgc3RyaW5nIGFzIGEgc291cmNlIG9mIGRhdGEKCi0gSU9VdGlscyAtIHdyaXRlTGluZXMoQ29sbGVjdGlvbixsaW5lRW5kaW5nLE91dHB1dFN0cmVhbSkgIFszNjIxNF0KICAgICAgICAgIC0gd3JpdGVMaW5lcyhDb2xsZWN0aW9uLGxpbmVFbmRpbmcsT3V0cHV0U3RyZWFtLGVuY29kaW5nKQogICAgICAgICAgLSB3cml0ZUxpbmVzKENvbGxlY3Rpb24sbGluZUVuZGluZyxXcml0ZXIpCiAgICBXcml0ZXMgYSBjb2xsZWN0aW9uIHRvIGEgc3RyZWFtL3dyaXRlciBsaW5lIGJ5IGxpbmUKCi0gSU9VdGlscyAtIHdyaXRlKC4uLikKICAgIFdyaXRlIGRhdGEgdG8gYSBzdHJlYW0vd3JpdGVyIChtb3ZlZCBmcm9tIENvcHlVdGlscyB3aXRoIGJldHRlciBudWxsIGhhbmRsaW5nKQoKLSBJT1V0aWxzIC0gY29weSguLi4pCiAgICBDb3B5IGRhdGEgYmV0d2VlbiBzdHJlYW1zIChtb3ZlZCBmcm9tIENvcHlVdGlscyB3aXRoIGJldHRlciBudWxsIGhhbmRsaW5nKQoKLSBJT1V0aWxzIC0gY29udGVudEVxdWFscyhSZWFkZXIsUmVhZGVyKQogICAgTWV0aG9kIHRvIGNvbXBhcmUgdGhlIGNvbnRlbnRzIG9mIHR3byByZWFkZXJzCgotIEZpbGVVdGlscyAtIHRvRmlsZXMoVVJMW10pCiAgICBDb252ZXJ0cyBhbiBhcnJheSBvZiBVUkxzIHRvIGFuIGFycmF5IG9mIEZpbGVzCgotIEZpbGVVdGlscyAtIGNvcHlEaXJlY3RvcnkoKSAgWzMyOTQ0XQogICAgTmV3IG1ldGhvZHMgdG8gY29weSBhIGRpcmVjdG9yeQoKLSBGaWxlVXRpbHMgLSByZWFkRmlsZVRvQnl0ZUFycmF5KEZpbGUpCiAgICBSZWFkcyBhbiBlbnRpcmUgZmlsZSBpbnRvIGEgYnl0ZSBhcnJheQoKLSBGaWxlVXRpbHMgLSB3cml0ZUJ5dGVBcnJheVRvRmlsZShGaWxlLGJ5dGVbXSkKICAgIFdyaXRlcyBhIGJ5dGUgYXJyYXkgdG8gYSBmaWxlCgotIEZpbGVVdGlscyAtIHJlYWRMaW5lcyhGaWxlLGVuY29kaW5nKSAgWzM2MjE0XQogICAgUmVhZHMgYSBmaWxlIGxpbmUgYnkgbGluZSBpbnRvIGEgTGlzdCBvZiBTdHJpbmdzCgotIEZpbGVVdGlscyAtIHdyaXRlTGluZXMoRmlsZSxlbmNvZGluZyxMaXN0KQogICAgICAgICAgICAgIHdyaXRlTGluZXMoRmlsZSxlbmNvZGluZyxMaXN0LGxpbmVFbmRpbmcpCiAgICBXcml0ZXMgYSBjb2xsZWN0aW9uIHRvIGEgZmlsZSBsaW5lIGJ5IGxpbmUKCi0gRmlsZVV0aWxzIC0gRU1QVFlfRklMRV9BUlJBWQogICAgQ29uc3RhbnQgZm9yIGFuIGVtcHR5IGFycmF5IG9mIEZpbGUgb2JqZWN0cwoKLSBDb25kaXRpb25hbEZpbGVGaWx0ZXIgLSBuZXcgaW50ZXJmYWNlICBbMzA3MDVdCiAgICBEZWZpbmVzIHRoZSBiZWhhdmlvciBvZiBsaXN0IGJhc2VkIGZpbHRlcnMKCi0gQW5kRmlsZUZpbHRlciwgT3JGaWxlRmlsdGVyICBbMzA3MDVdCiAgICBOb3cgc3VwcG9ydCBhIGxpc3Qgb2YgZmlsdGVycyB0byBhbmQvb3IKCi0gV2lsZGNhcmRGaWx0ZXIgIFszMTExNV0KICAgIE5ldyBmaWx0ZXIgdGhhdCBjYW4gbWF0Y2ggdXNpbmcgd2lsZGNhcmQgZmlsZSBuYW1lcwoKLSBGaWxlRmlsdGVyVXRpbHMgLSBtYWtlU1ZOQXdhcmUoSU9GaWxlRmlsdGVyKQogICAgTmV3IG1ldGhvZCwgbGlrZSBtYWtlQ1ZTQXdhcmUsIHRoYXQgaWdub3JlcyBTdWJ2ZXJzaW9uIHNvdXJjZSBjb250cm9sIGRpcmVjdG9yaWVzCgotIENsYXNzTG9hZGVyT2JqZWN0SW5wdXRTdHJlYW0KICAgIEFuIE9iamVjdElucHV0U3RyZWFtIHRoYXQgc3VwcG9ydHMgYSBDbGFzc0xvYWRlcgoKLSBDb3VudGluZ0lucHV0U3RyZWFtLENvdW50aW5nT3V0cHV0U3RyZWFtIC0gcmVzZXRDb3VudCgpICBbMjg5NzZdCiAgICBBZGRzIHRoZSBhYmlsaXR5IHRvIHJlc2V0IHRoZSBjb3VudCBwYXJ0IHdheSB0aHJvdWdoIHJlYWRpbmcvd3JpdGluZyB0aGUgc3RyZWFtCgotIERlZmVycmVkRmlsZU91dHB1dFN0cmVhbSAtIHdyaXRlVG8oT3V0cHV0U3RyZWFtKSAgWzM0MTczXQogICAgTmV3IG1ldGhvZCB0byBhbGxvdyBjdXJyZW50IGNvbnRlbnRzIHRvIGJlIHdyaXR0ZW4gdG8gYSBzdHJlYW0KCi0gRGVmZXJyZWRGaWxlT3V0cHV0U3RyZWFtICBbMzQxNDJdCiAgICBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIGF2b2lkaW5nIGRvdWJsZSBidWZmZXJpbmcKCi0gTG9ja2FibGVGaWxlV3JpdGVyIC0gZW5jb2Rpbmcgc3VwcG9ydCBbMzY4MjVdCiAgICBBZGQgc3VwcG9ydCBmb3IgY2hhcmFjdGVyIGVuY29kaW5ncyB0byBMb2NrYWJsZUZpbGVXcml0ZXIKICAgIEltcHJvdmUgdGhlIHZhbGlkYXRpb24KICAgIENyZWF0ZSBkaXJlY3RvcmllcyBpZiBuZWNlc3NhcnkKCi0gSU9VdGlscyBhbmQgRW5kaWFuVXRpbHMgYXJlIG5vIGxvbmdlciBmaW5hbCAgWzI4OTc4XQogICAgQWxsb3dzIGRldmVsb3BlcnMgdG8gaGF2ZSBzdWJjbGFzc2VzIGlmIGRlc2lyZWQgICAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpGZWVkYmFjawotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCk9wZW4gc291cmNlIHdvcmtzIGJlc3Qgd2hlbiB5b3UgZ2l2ZSBmZWVkYmFjazoKaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvaW8vCgpQbGVhc2UgZGlyZWN0IGFsbCBidWcgcmVwb3J0cyB0byBKSVJBCmh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSU8KCk9yIHN1YnNjcmliZSB0byB0aGUgY29tbW9ucy11c2VyIG1haWxpbmcgbGlzdCAocHJlZml4IGVtYWlscyBieSBbaW9dKQpodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9tYWlsLWxpc3RzLmh0bWwKClRoZSBDb21tb25zLUlPIFRlYW0K