CkFwYWNoZSBDb21tb25zIElPIApWZXJzaW9uIDIuMTUuMQpSZWxlYXNlIE5vdGVzCgpJTlRST0RVQ1RJT046CgpDb21tb25zIElPIGlzIGEgcGFja2FnZSBvZiBKYXZhIHV0aWxpdHkgY2xhc3NlcyBsaWtlIGphdmEuaW8uICAKQ2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc28gc3RhbmRhcmQgYW5kIG9mIHN1Y2ggaGlnaCAKcmV1c2UgYXMgdG8ganVzdGlmeSBleGlzdGVuY2UgaW4gamF2YS5pby4KClRoZSBBcGFjaGUgQ29tbW9ucyBJTyBsaWJyYXJ5IGNvbnRhaW5zIHV0aWxpdHkgY2xhc3Nlcywgc3RyZWFtIGltcGxlbWVudGF0aW9ucywgZmlsZSBmaWx0ZXJzLApmaWxlIGNvbXBhcmF0b3JzLCBlbmRpYW4gdHJhbnNmb3JtYXRpb24gY2xhc3NlcywgYW5kIG11Y2ggbW9yZS4KCkphdmEgOCBpcyByZXF1aXJlZC4KCkNoYW5nZXMgaW4gdGhpcyB2ZXJzaW9uIGluY2x1ZGU6CgoKRml4ZWQgQnVnczoKbyAgICAgICAgICAgRml4IHdyb25nIGlzc3VlIGlkIGluIGNoYW5nZSBsb2cgIzUwMy4gVGhhbmtzIHRvIEdyZWdvciBEc2NodW5nLiAKbyAgICAgICAgICAgQWRkIHRlc3QgZm9yIEZpbGVDaGFubmVscy5jb250ZW50RXF1YWxzKCkgIzUwOS4gVGhhbmtzIHRvIFN0ZXBoYW4gTWFya3dhbGRlciwgR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgRml4IEZpbGVDaGFubmVscy5jb250ZW50RXF1YWxzKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBGaXggc29tZSBKYXZhZG9jIGlzc3VlcyBpbiBMaW5lSXRlcmF0b3IgYW5kIElPVXRpbHMuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBTaW1wbGlmeSBGaWxlQWx0ZXJhdGlvbk9ic2VydmVyIGludGVybmFsIHByb2Nlc3NpbmcuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBdm9pZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBSZWdleEZpbGVGaWx0ZXIuUmVnZXhGaWxlRmlsdGVyKFBhdHRlcm4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQXZvaWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gUmVnZXhGaWxlRmlsdGVyLmFjY2VwdChQYXRoLCBCYXNpY0ZpbGVBdHRyaWJ1dGVzKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEZpeCBTcG90QnVncyBlcnJvcjogQ2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmlvLmZpbGVmaWx0ZXIuUmVnZXhGaWxlRmlsdGVyIGRlZmluZXMgbm9uLXRyYW5zaWVudCBub24tc2VyaWFsaXphYmxlIGluc3RhbmNlIGZpZWxkIHBhdGhUb1N0cmluZyBbb3JnLmFwYWNoZS5jb21tb25zLmlvLmZpbGVmaWx0ZXIuUmVnZXhGaWxlRmlsdGVyXSBJbiBSZWdleEZpbGVGaWx0ZXIuamF2YSBTRV9CQURfRklFTEQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBGaXggU3BvdEJ1Z3MgZXJyb3I6IENsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5pby5maWxlZmlsdGVyLkRlbGVnYXRlRmlsZUZpbHRlciBkZWZpbmVzIG5vbi10cmFuc2llbnQgbm9uLXNlcmlhbGl6YWJsZSBpbnN0YW5jZSBmaWVsZCBmaWxlRmlsdGVyIFtvcmcuYXBhY2hlLmNvbW1vbnMuaW8uZmlsZWZpbHRlci5EZWxlZ2F0ZUZpbGVGaWx0ZXJdIEluIERlbGVnYXRlRmlsZUZpbHRlci5qYXZhIFNFX0JBRF9GSUVMRC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEZpeCBTcG90QnVncyBlcnJvcjogQ2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmlvLmZpbGVmaWx0ZXIuRGVsZWdhdGVGaWxlRmlsdGVyIGRlZmluZXMgbm9uLXRyYW5zaWVudCBub24tc2VyaWFsaXphYmxlIGluc3RhbmNlIGZpZWxkIGZpbGVOYW1lRmlsdGVyIFtvcmcuYXBhY2hlLmNvbW1vbnMuaW8uZmlsZWZpbHRlci5EZWxlZ2F0ZUZpbGVGaWx0ZXJdIEluIERlbGVnYXRlRmlsZUZpbHRlci5qYXZhIFNFX0JBRF9GSUVMRC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEZpeCBTcG90QnVncyBlcnJvcjogb3JnLmFwYWNoZS5jb21tb25zLmlvLmZ1bmN0aW9uLklPU3RyZWFtJDEubmV4dCgpIGNhbm5vdCB0aHJvdyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIFtvcmcuYXBhY2hlLmNvbW1vbnMuaW8uZnVuY3Rpb24uSU9TdHJlYW0kMV0gQXQgSU9TdHJlYW0uamF2YTpbbGluZSA5OF0gSVRfTk9fU1VDSF9FTEVNRU5ULiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgRml4IFNwb3RCdWdzIGVycm9yOiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8ubW9uaXRvci5GaWxlQWx0ZXJhdGlvbk1vbml0b3IuZ2V0T2JzZXJ2ZXJzKCkgbWF5IGV4cG9zZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBieSByZXR1cm5pbmcgRmlsZUFsdGVyYXRpb25Nb25pdG9yLm9ic2VydmVycyBbb3JnLmFwYWNoZS5jb21tb25zLmlvLm1vbml0b3IuRmlsZUFsdGVyYXRpb25Nb25pdG9yXSBBdCBGaWxlQWx0ZXJhdGlvbk1vbml0b3IuamF2YTpbbGluZSAxMjRdIEVJX0VYUE9TRV9SRVAuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBGaXggU3BvdEJ1Z3MgZXJyb3I6IENsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5pby5tb25pdG9yLkZpbGVBbHRlcmF0aW9uT2JzZXJ2ZXIgZGVmaW5lcyBub24tdHJhbnNpZW50IG5vbi1zZXJpYWxpemFibGUgaW5zdGFuY2UgZmllbGQgZmlsZUZpbHRlciBbb3JnLmFwYWNoZS5jb21tb25zLmlvLm1vbml0b3IuRmlsZUFsdGVyYXRpb25PYnNlcnZlcl0gSW4gRmlsZUFsdGVyYXRpb25PYnNlcnZlci5qYXZhIFNFX0JBRF9GSUVMRC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEZpeCBTcG90QnVncyBlcnJvcjogQ2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmlvLm1vbml0b3IuRmlsZUFsdGVyYXRpb25PYnNlcnZlciBkZWZpbmVzIG5vbi10cmFuc2llbnQgbm9uLXNlcmlhbGl6YWJsZSBpbnN0YW5jZSBmaWVsZCBsaXN0ZW5lcnMgW29yZy5hcGFjaGUuY29tbW9ucy5pby5tb25pdG9yLkZpbGVBbHRlcmF0aW9uT2JzZXJ2ZXJdIEluIEZpbGVBbHRlcmF0aW9uT2JzZXJ2ZXIuamF2YSBTRV9CQURfRklFTEQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBGaXggU3BvdEJ1Z3MgZXJyb3I6IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlQ2xlYW5pbmdUcmFja2VyLmdldERlbGV0ZUZhaWx1cmVzKCkgbWF5IGV4cG9zZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBieSByZXR1cm5pbmcgRmlsZUNsZWFuaW5nVHJhY2tlci5kZWxldGVGYWlsdXJlcyBbb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVDbGVhbmluZ1RyYWNrZXJdIEF0IEZpbGVDbGVhbmluZ1RyYWNrZXIuamF2YTpbbGluZSAyMThdIEVJX0VYUE9TRV9SRVAuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBGaXggU3BvdEJ1Z3MgZXJyb3I6IG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT0V4Y2VwdGlvbkxpc3QuZ2V0Q2F1c2VMaXN0KCkgbWF5IGV4cG9zZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBieSByZXR1cm5pbmcgSU9FeGNlcHRpb25MaXN0LmNhdXNlTGlzdCBbb3JnLmFwYWNoZS5jb21tb25zLmlvLklPRXhjZXB0aW9uTGlzdF0gQXQgSU9FeGNlcHRpb25MaXN0LmphdmE6W2xpbmUgMTE4XSBFSV9FWFBPU0VfUkVQLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgRml4IFNwb3RCdWdzIGVycm9yOiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9FeGNlcHRpb25MaXN0LmdldENhdXNlTGlzdChDbGFzcykgbWF5IGV4cG9zZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBieSByZXR1cm5pbmcgSU9FeGNlcHRpb25MaXN0LmNhdXNlTGlzdCBbb3JnLmFwYWNoZS5jb21tb25zLmlvLklPRXhjZXB0aW9uTGlzdF0gQXQgSU9FeGNlcHRpb25MaXN0LmphdmE6W2xpbmUgMTI5XSBFSV9FWFBPU0VfUkVQLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgRml4IFNwb3RCdWdzIGVycm9yOiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uZmlsZS5BY2N1bXVsYXRvclBhdGhWaXNpdG9yLmdldERpckxpc3QoKSBtYXkgZXhwb3NlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGJ5IHJldHVybmluZyBBY2N1bXVsYXRvclBhdGhWaXNpdG9yLmRpckxpc3QgW29yZy5hcGFjaGUuY29tbW9ucy5pby5maWxlLkFjY3VtdWxhdG9yUGF0aFZpc2l0b3JdIEF0IEFjY3VtdWxhdG9yUGF0aFZpc2l0b3IuamF2YTpbbGluZSAxNzldIEVJX0VYUE9TRV9SRVAuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBGaXggU3BvdEJ1Z3MgZXJyb3I6IG9yZy5hcGFjaGUuY29tbW9ucy5pby5maWxlLkFjY3VtdWxhdG9yUGF0aFZpc2l0b3IuZ2V0RmlsZUxpc3QoKSBtYXkgZXhwb3NlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGJ5IHJldHVybmluZyBBY2N1bXVsYXRvclBhdGhWaXNpdG9yLmZpbGVMaXN0IFtvcmcuYXBhY2hlLmNvbW1vbnMuaW8uZmlsZS5BY2N1bXVsYXRvclBhdGhWaXNpdG9yXSBBdCBBY2N1bXVsYXRvclBhdGhWaXNpdG9yLmphdmE6W2xpbmUgMTg4XSBFSV9FWFBPU0VfUkVQLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgRml4IFNwb3RCdWdzIGVycm9yOiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uaW5wdXQuT2JzZXJ2YWJsZUlucHV0U3RyZWFtLmdldE9ic2VydmVycygpIG1heSBleHBvc2UgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gYnkgcmV0dXJuaW5nIE9ic2VydmFibGVJbnB1dFN0cmVhbS5vYnNlcnZlcnMgW29yZy5hcGFjaGUuY29tbW9ucy5pby5pbnB1dC5PYnNlcnZhYmxlSW5wdXRTdHJlYW1dIEF0IE9ic2VydmFibGVJbnB1dFN0cmVhbS5qYXZhOltsaW5lIDE4N10gRUlfRVhQT1NFX1JFUC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEZpeCBTcG90QnVncyBlcnJvcjogRXhjZXB0aW9uIHRocm93biBpbiBjbGFzcyBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uaW5wdXQuVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlJbnB1dFN0cmVhbSBhdCBuZXcgb3JnLmFwYWNoZS5jb21tb25zLmlvLmlucHV0LlVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZVtdLCBpbnQpIHdpbGwgbGVhdmUgdGhlIGNvbnN0cnVjdG9yLiBUaGUgb2JqZWN0IHVuZGVyIGNvbnN0cnVjdGlvbiByZW1haW5zIHBhcnRpYWxseSBpbml0aWFsaXplZCBhbmQgbWF5IGJlIHZ1bG5lcmFibGUgdG8gRmluYWxpemVyIGF0dGFja3MuIFtvcmcuYXBhY2hlLmNvbW1vbnMuaW8uaW5wdXQuVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlJbnB1dFN0cmVhbSwgb3JnLmFwYWNoZS5jb21tb25zLmlvLmlucHV0LlVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW1dIEF0IFVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW0uamF2YTpbbGluZSAyMDJdQXQgVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlJbnB1dFN0cmVhbS5qYXZhOltsaW5lIDIwMl0gQ1RfQ09OU1RSVUNUT1JfVEhST1cuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBGaXggU3BvdEJ1Z3MgZXJyb3I6IEV4Y2VwdGlvbiB0aHJvd24gaW4gY2xhc3Mgb3JnLmFwYWNoZS5jb21tb25zLmlvLmlucHV0LlVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW0gYXQgbmV3IG9yZy5hcGFjaGUuY29tbW9ucy5pby5pbnB1dC5VbnN5bmNocm9uaXplZEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVbXSwgaW50LCBpbnQpIHdpbGwgbGVhdmUgdGhlIGNvbnN0cnVjdG9yLiBUaGUgb2JqZWN0IHVuZGVyIGNvbnN0cnVjdGlvbiByZW1haW5zIHBhcnRpYWxseSBpbml0aWFsaXplZCBhbmQgbWF5IGJlIHZ1bG5lcmFibGUgdG8gRmluYWxpemVyIGF0dGFja3MuIFtvcmcuYXBhY2hlLmNvbW1vbnMuaW8uaW5wdXQuVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlJbnB1dFN0cmVhbSwgb3JnLmFwYWNoZS5jb21tb25zLmlvLmlucHV0LlVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW1dIEF0IFVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW0uamF2YTpbbGluZSAyMjNdQXQgVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlJbnB1dFN0cmVhbS5qYXZhOltsaW5lIDIyM10gQ1RfQ09OU1RSVUNUT1JfVEhST1cuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoKQ2hhbmdlczoKbyAgICAgICAgICAgQnVtcCBvcmcuY29kZWhhdXMubW9qbzpleGVjLW1hdmVuLXBsdWdpbiBmcm9tIDMuMS4wIHRvIDMuMS4xICM1MTIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBCdW1wIGNvbW1vbnMtbGFuZzMgZnJvbSAzLjEzLjAgdG8gMy4xNC4wLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQnVtcCBjb21tb25zLmJ5dGVidWRkeS52ZXJzaW9uIGZyb20gMS4xNC45IHRvIDEuMTQuMTAgIzUxNi4gVGhhbmtzIHRvIERlcGVuZGFib3QuIApvICAgICAgICAgICBCdW1wIGNvbW1vbnMtcGFyZW50IGZyb20gNjQgdG8gNjUuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKCkNvbXBhdGliaWxpdHkgd2l0aCAyLjY6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBZZXMuClNlbWFudGljIGNvbXBhdGlibGU6IFllcy4KCkNvbW1vbnMgSU8gMi43IGFuZCB1cCByZXF1aXJlcyBKYXZhIDggb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi42IHJlcXVpcmVzIEphdmEgNyBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjMgdGhyb3VnaCAyLjUgcmVxdWlyZXMgSmF2YSA2IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMiByZXF1aXJlcyBKYXZhIDUgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlLgoKSGlzdG9yaWNhbCBsaXN0IG9mIGNoYW5nZXM6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2NoYW5nZXMtcmVwb3J0Lmh0bWwKCkZvciBjb21wbGV0ZSBpbmZvcm1hdGlvbiBvbiBBcGFjaGUgQ29tbW9ucyBJTywgaW5jbHVkaW5nIGluc3RydWN0aW9ucyBvbiBob3cgdG8gc3VibWl0IGJ1ZyByZXBvcnRzLApwYXRjaGVzLCBvciBzdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnQsIHNlZSB0aGUgQXBhY2hlIENvbW1vbnMgSU8gd2Vic2l0ZToKCmh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvLwoKRG93bmxvYWQgcGFnZTogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vZG93bmxvYWRfaW8uY2dpCgpIYXZlIGZ1biEKLUFwYWNoZSBDb21tb25zIFRlYW0KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQXBhY2hlIENvbW1vbnMgSU8gClZlcnNpb24gMi4xNS4wClJlbGVhc2UgTm90ZXMKCklOVFJPRFVDVElPTjoKCkNvbW1vbnMgSU8gaXMgYSBwYWNrYWdlIG9mIEphdmEgdXRpbGl0eSBjbGFzc2VzIGxpa2UgamF2YS5pby4gIApDbGFzc2VzIGluIHRoaXMgcGFja2FnZSBhcmUgY29uc2lkZXJlZCB0byBiZSBzbyBzdGFuZGFyZCBhbmQgb2Ygc3VjaCBoaWdoIApyZXVzZSBhcyB0byBqdXN0aWZ5IGV4aXN0ZW5jZSBpbiBqYXZhLmlvLgoKVGhlIEFwYWNoZSBDb21tb25zIElPIGxpYnJhcnkgY29udGFpbnMgdXRpbGl0eSBjbGFzc2VzLCBzdHJlYW0gaW1wbGVtZW50YXRpb25zLCBmaWxlIGZpbHRlcnMsCmZpbGUgY29tcGFyYXRvcnMsIGVuZGlhbiB0cmFuc2Zvcm1hdGlvbiBjbGFzc2VzLCBhbmQgbXVjaCBtb3JlLgoKSmF2YSA4IGlzIHJlcXVpcmVkLgoKQ2hhbmdlcyBpbiB0aGlzIHZlcnNpb24gaW5jbHVkZToKCk5ldyBmZWF0dXJlczoKbyAgICAgICAgICAgQWRkIG9yZy5hcGFjaGUuY29tbW9ucy5pby5jaGFubmVscy5GaWxlQ2hhbm5lbHMuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgUmFuZG9tQWNjZXNzRmlsZXMjY29udGVudEVxdWFscyhSYW5kb21BY2Nlc3NGaWxlLCBSYW5kb21BY2Nlc3NGaWxlKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBSYW5kb21BY2Nlc3NGaWxlcyNyZXNldChSYW5kb21BY2Nlc3NGaWxlKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBQYXRoVXRpbHNDb250ZW50RXF1YWxzQmVuY2htYXJrLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIG9yZy5hcGFjaGUuY29tbW9ucy5pby5TdHJlYW1JdGVyYXRvci4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBNZXNzYWdlRGlnZXN0SW5wdXRTdHJlYW0gYW5kIGRlcHJlY2F0ZSBNZXNzYWdlRGlnZXN0Q2FsY3VsYXRpbmdJbnB1dFN0cmVhbS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCgpGaXhlZCBCdWdzOgpvIElPLTgxNTogIFhtbFN0cmVhbVJlYWRlciBlbmNvZGluZyBtYXRjaCBSRSBpcyB0b28gc3RyaWN0LiBUaGFua3MgdG8gTGF1cmVuY2UgR29uc2FsdmVzLiAKbyBJTy04MTA6ICBKYXZhZG9jIGluIEZpbGVVdGlscyBkb2VzIG5vdCByZWZsZWN0IGNvZGUgZm9yIHRocm93biBleGNlcHRpb25zLiBUaGFua3MgdG8gR3JlZ29yIERzY2h1bmcsIEdhcnkgR3JlZ29yeS4gCm8gSU8tODEyOiAgSmF2YWRvYyBzaG91bGQgbWVudGlvbiBjbG9zaW5nIFN0cmVhbXMgYmFzZWQgb24gZmlsZSByZXNvdXJjZXMuIFRoYW5rcyB0byBBZGFtIFJhdWNoLCBHYXJ5IEdyZWdvcnkuIApvIElPLTgxMTogIEluIHRlc3RzLCBGaWxlcy53YWxrKCkgZGlyZWN0IGFuZCBpbmRpcmVjdCBjYWxsZXJzIGZhaWwgdG8gY2xvc2UgdGhlIHJldHVybmVkIFN0cmVhbS4gVGhhbmtzIHRvIEFkYW0gUmF1Y2gsIEdhcnkgR3JlZ29yeS4gCm8gSU8tODExOiAgRmlsZVV0aWxzLmxpc3RGaWxlcyhGaWxlLCBTdHJpbmdbXSwgYm9vbGVhbikgZmFpbHMgdG8gY2xvc2UgaXRzIGludGVybmFsIFN0cmVhbS4gVGhhbmtzIHRvIEFkYW0gUmF1Y2gsIEdhcnkgR3JlZ29yeS4gCm8gSU8tODExOiAgRmlsZVV0aWxzLml0ZXJhdGVGaWxlcyhGaWxlLCBTdHJpbmdbXSwgYm9vbGVhbikgZmFpbHMgdG8gY2xvc2UgaXRzIGludGVybmFsIFN0cmVhbS4gVGhhbmtzIHRvIEFkYW0gUmF1Y2gsIEdhcnkgR3JlZ29yeS4gCm8gSU8tODExOiAgU3RyZWFtSXRlcmF0b3IgZmFpbHMgdG8gY2xvc2UgaXRzIGludGVybmFsIFN0cmVhbS4gVGhhbmtzIHRvIEFkYW0gUmF1Y2gsIEdhcnkgR3JlZ29yeS4gCm8gSU8tODE0OiAgRG9uJ3QgdGhyb3cgVW5jaGVja2VkSU9FeGNlcHRpb24gIzQ5MS4gVGhhbmtzIHRvIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZCwgR2FyeSBHcmVnb3J5LiAKbyBJTy00MTQ6ICBEb24ndCB3cml0ZSBhIEJPTSBvbiBldmVyeSAob3IgYW55KSBsaW5lICM0OTIuIFRoYW5rcyB0byBFbGxpb3R0ZSBSdXN0eSBIYXJvbGQsIEdhcnkgR3JlZ29yeS4gCm8gSU8tODE0OiAgUmFuZG9tQWNjZXNzRmlsZU1vZGUuY3JlYXRlKFBhdGgpIHByb3ZpZGVzIGEgYmV0dGVyIE51bGxQb2ludGVyRXhjZXB0aW9uIG1lc3NhZ2UuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBJbXByb3ZlIHBlcmZvcm1hbmNlIG9mIFBhdGhVdGlscy5maWxlQ29udGVudEVxdWFscyhQYXRoLCBQYXRoLCBMaW5rT3B0aW9uW10sIE9wZW5PcHRpb25bXSkgYnkgYWJvdXQgNjAlLCBzZWUgUGF0aFV0aWxzQ29udGVudEVxdWFsc0JlbmNobWFyay4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEltcHJvdmUgcGVyZm9ybWFuY2Ugb2YgUGF0aFV0aWxzLmZpbGVDb250ZW50RXF1YWxzKFBhdGgsIFBhdGgpIGJ5IGFib3V0IDYwJSwgc2VlIFBhdGhVdGlsc0NvbnRlbnRFcXVhbHNCZW5jaG1hcmsuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBJbXByb3ZlIHBlcmZvcm1hbmNlIG9mIEZpbGVVdGlscy5jb250ZW50RXF1YWxzKEZpbGUsIEZpbGUpIGJ5IGFib3V0IDYwJSwgc2VlIFBhdGhVdGlsc0NvbnRlbnRFcXVhbHNCZW5jaG1hcmsuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBSZW1vdmUgdW51c2VkIHRlc3QgY29kZSAjNDk0LiBUaGFua3MgdG8gRWxsaW90dGUgUnVzdHkgSGFyb2xkLiAKbyAgICAgICAgICAgW0phdmFkb2NdIElPVXRpbHMjY29udGVudEVxdWFscyBkb2VzIG5vdCB0aHJvdyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAjNDk2LiBUaGFua3MgdG8gc2ViYkFTRi4gCm8gICAgICAgICAgIEZpeCBDb2RlUUwgd2FybmluZ3MgaW4gVW5zeW5jaHJvbml6ZWRCdWZmZXJlZElucHV0U3RyZWFtOiBJbXBsaWNpdCBuYXJyb3dpbmcgY29udmVyc2lvbiBpbiBjb21wb3VuZCBhc3NpZ25tZW50LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgTWVzc2FnZURpZ2VzdENhbGN1bGF0aW5nSW5wdXRTdHJlYW0uTWVzc2FnZURpZ2VzdE1haW50YWluaW5nT2JzZXJ2ZXIuTWVzc2FnZURpZ2VzdE1haW50YWluaW5nT2JzZXJ2ZXIoTWVzc2FnZURpZ2VzdCkgbm93IHRocm93cyBhIE51bGxQb2ludGVyRXhjZXB0aW9uCiAgICAgICAgaWYgdGhlIE1lc3NhZ2VEaWdlc3QgaXMgbnVsbC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIE1lc3NhZ2VEaWdlc3RDYWxjdWxhdGluZ0lucHV0U3RyZWFtLk1lc3NhZ2VEaWdlc3RDYWxjdWxhdGluZ0lucHV0U3RyZWFtKElucHV0U3RyZWFtLCBNZXNzYWdlRGlnZXN0KSBub3cgdGhyb3dzIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24KICAgICAgICBpZiB0aGUgTWVzc2FnZURpZ2VzdCBpcyBudWxsLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy04MTY6ICBVbnN5bmNocm9uaXplZEJ1ZmZlcmVkSW5wdXRTdHJlYW0ucmVhZChieXRlW10sIGludCwgaW50KSBkb2VzIG5vdCB1c2UgYnVmZmVyLiBUaGFua3MgdG8gQW5kcmVhcyBMb3RoLCBHYXJ5IEdyZWdvcnkuIAoKQ2hhbmdlczoKbyAgICAgICAgICAgQnVtcCBvcmcuYXBhY2hlLmNvbW1vbnM6Y29tbW9ucy1wYXJlbnQgZnJvbSA2MiB0byA2NC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCgpDb21wYXRpYmlsaXR5IHdpdGggMi42OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogWWVzLgpTZW1hbnRpYyBjb21wYXRpYmxlOiBZZXMuCgpDb21tb25zIElPIDIuNyBhbmQgdXAgcmVxdWlyZXMgSmF2YSA4IG9yIGFib3ZlLgpDb21tb25zIElPIDIuNiByZXF1aXJlcyBKYXZhIDcgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4zIHRocm91Z2ggMi41IHJlcXVpcmVzIEphdmEgNiBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjIgcmVxdWlyZXMgSmF2YSA1IG9yIGFib3ZlLgpDb21tb25zIElPIDEuNCByZXF1aXJlcyBKYXZhIDEuMyBvciBhYm92ZS4KCkhpc3RvcmljYWwgbGlzdCBvZiBjaGFuZ2VzOiBodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby9jaGFuZ2VzLXJlcG9ydC5odG1sCgpGb3IgY29tcGxldGUgaW5mb3JtYXRpb24gb24gQXBhY2hlIENvbW1vbnMgSU8sIGluY2x1ZGluZyBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHN1Ym1pdCBidWcgcmVwb3J0cywKcGF0Y2hlcywgb3Igc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50LCBzZWUgdGhlIEFwYWNoZSBDb21tb25zIElPIHdlYnNpdGU6CgpodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby8KCkRvd25sb2FkIHBhZ2U6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2Rvd25sb2FkX2lvLmNnaQoKSGF2ZSBmdW4hCi1BcGFjaGUgQ29tbW9ucyBUZWFtCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkFwYWNoZSBDb21tb25zIElPIApWZXJzaW9uIDIuMTQuMApSZWxlYXNlIE5vdGVzCgpJTlRST0RVQ1RJT046CgpDb21tb25zIElPIGlzIGEgcGFja2FnZSBvZiBKYXZhIHV0aWxpdHkgY2xhc3NlcyBsaWtlIGphdmEuaW8uICAKQ2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc28gc3RhbmRhcmQgYW5kIG9mIHN1Y2ggaGlnaCAKcmV1c2UgYXMgdG8ganVzdGlmeSBleGlzdGVuY2UgaW4gamF2YS5pby4KClRoZSBBcGFjaGUgQ29tbW9ucyBJTyBsaWJyYXJ5IGNvbnRhaW5zIHV0aWxpdHkgY2xhc3Nlcywgc3RyZWFtIGltcGxlbWVudGF0aW9ucywgZmlsZSBmaWx0ZXJzLApmaWxlIGNvbXBhcmF0b3JzLCBlbmRpYW4gdHJhbnNmb3JtYXRpb24gY2xhc3NlcywgYW5kIG11Y2ggbW9yZS4KCkphdmEgOCByZXF1aXJlZC4KCkNoYW5nZXMgaW4gdGhpcyB2ZXJzaW9uIGluY2x1ZGU6CgpOZXcgZmVhdHVyZXM6Cm8gICAgICAgICAgIEFkZCBEZWZlcnJlZEZpbGVPdXRwdXRTdHJlYW0uZ2V0UGF0aCgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIEZpbGVDbGVhbmluZ1RyYWNrZXIudHJhY2soUGF0aCwgT2JqZWN0WywgRmlsZURlbGV0ZVN0cmF0ZWd5XSkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgSU9VdGlscy5za2lwW0Z1bGx5XShJbnB1dFN0cmVhbSwgbG9uZywgU3VwcGxpZXI8Ynl0ZVtdPikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgRmlsZXNVbmNoZWNrLmZpbmQoUGF0aCwgaW50LCBCaVByZWRpY2F0ZSVsdDtQYXRoLCBCYXNpY0ZpbGVBdHRyaWJ1dGVzPiwgRmlsZVZpc2l0T3B0aW9uLi4uKSBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIElPSW50U3VwcGxpZXIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgSU9Mb25nU3VwcGxpZXIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgVW5jaGVjay5nZXRBc0ludChJT0ludFN1cHBsaWVyIFssIFN1cHBsaWVyPFN0cmluZz5dKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBVbmNoZWNrLmdldEFzTG9uZyhJT0xvbmdTdXBwbGllciBbLCBTdXBwbGllcjxTdHJpbmc+XSkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgVW5jaGVjay5ydW4oSU9SdW5uYWJsZSwgU3VwcGxpZXI8U3RyaW5nPikgVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBVbmNoZWNrLmdldChJT1N1cHBsaWVyLCBTdXBwbGllcjxTdHJpbmc+KSBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgSU9GaWxlRmlsdGVyIG5vdyBhbHNvIGV4dGVuZHMgamF2YS5uaW8uZmlsZS5QYXRoTWF0Y2hlci4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBQYXRoTWF0Y2hlckZpbGVGaWx0ZXIgdG8gYWRhcHQgamF2YS5uaW8uZmlsZS5QYXRoTWF0Y2hlci4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBUaHJlc2hvbGRpbmdPdXRwdXRTdHJlYW0uZ2V0T3V0cHV0U3RyZWFtKCkgYW5kIGRlcHJlY2F0ZSBnZXRTdHJlYW0oKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBEZWZlcnJlZEZpbGVPdXRwdXRTdHJlYW0uQnVpbGRlci5zZXRPdXRwdXRGaWxlKFBhdGgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIERlZmVycmVkRmlsZU91dHB1dFN0cmVhbS5CdWlsZGVyLnNldERpcmVjdG9yeShQYXRoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBBYnN0cmFjdFN0cmVhbUJ1aWxkZXIuc2V0QnVmZmVyU2l6ZUNoZWNrZXIoSW50VG9JbnRGdW5jdGlvbikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgQWJzdHJhY3RTdHJlYW1CdWlsZGVyLnNldEJ1ZmZlclNpemVNYXgoaW50KS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCgpGaXhlZCBCdWdzOgpvIElPLTc5OTogIFJlYWRlcklucHV0U3RyZWFtLnJlYWQoKSB0aHJvd3MgYW4gZXhjZXB0aW9uIGluc3RlYWQgb2YgcmV0dXJuaW5nIC0xIHdoZW4gY2FsbGVkIGFnYWluIGFmdGVyIHJldHVybmluZyAtMS4gVGhhbmtzIHRvIEplcm9lbiB2YW4gZGVyIFZlZ3QsIEdhcnkgR3JlZ29yeS4gCm8gSU8tODA0OiAgRmlsZVV0aWxzLmZvcmNlTWtkaXJQYXJlbnQoKSBKYXZhZG9jIGlzIGluY29ycmVjdC4gVGhhbmtzIHRvIEVsbGlvdHRlIFJ1c3R5IEhhcm9sZCwgR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgW1N0ZXBTZWN1cml0eV0gY2k6IEhhcmRlbiBHaXRIdWIgQWN0aW9ucyAjNDYxLiBUaGFua3MgdG8gc3RlcC1zZWN1cml0eS1ib3QsIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIE1hZ2ljTnVtYmVyRmlsZUZpbHRlci5hY2NlcHQoUGF0aCwgQmFzaWNGaWxlQXR0cmlidXRlcykgZG9lc24ndCBpdHMgYnl0ZU9mZnNldCBiZWZvcmUgcmVhZGluZy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEphdmFkb2MgaW1wcm92ZW1lbnRzLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgU3BlbGxpbmcgIzQ2OC4gVGhhbmtzIHRvIEpvc2ggU29yZWYsIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIFVzZSBhc3NlcnRUaHJvd3MgIzQ3NS4gVGhhbmtzIHRvIEpha3ViIEt1cGN6eWsuIAoKQ2hhbmdlczoKbyAgICAgICAgICAgQnVtcCBqaW1mcyBmcm9tIDEuMiB0byAxLjMuMCAjNDY1ICh0ZXN0cykuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKbyAgICAgICAgICAgQnVtcCBjb21tb25zLXBhcmVudCBmcm9tIDU4IHRvIDYyLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQnVtcCBjb21tb25zLWxhbmczIGZyb20gMy4xMiB0byAzLjEzLjAuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuNjoKQmluYXJ5IGNvbXBhdGlibGU6IFllcy4KU291cmNlIGNvbXBhdGlibGU6IFllcy4KU2VtYW50aWMgY29tcGF0aWJsZTogWWVzLgoKQ29tbW9ucyBJTyAyLjcgYW5kIHVwIHJlcXVpcmVzIEphdmEgOCBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjYgcmVxdWlyZXMgSmF2YSA3IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMyB0aHJvdWdoIDIuNSByZXF1aXJlcyBKYXZhIDYgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4yIHJlcXVpcmVzIEphdmEgNSBvciBhYm92ZS4KQ29tbW9ucyBJTyAxLjQgcmVxdWlyZXMgSmF2YSAxLjMgb3IgYWJvdmUuCgpIaXN0b3JpY2FsIGxpc3Qgb2YgY2hhbmdlczogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vY2hhbmdlcy1yZXBvcnQuaHRtbAoKRm9yIGNvbXBsZXRlIGluZm9ybWF0aW9uIG9uIEFwYWNoZSBDb21tb25zIElPLCBpbmNsdWRpbmcgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBzdWJtaXQgYnVnIHJlcG9ydHMsCnBhdGNoZXMsIG9yIHN1Z2dlc3Rpb25zIGZvciBpbXByb3ZlbWVudCwgc2VlIHRoZSBBcGFjaGUgQ29tbW9ucyBJTyB3ZWJzaXRlOgoKaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vCgpEb3dubG9hZCBwYWdlOiBodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby9kb3dubG9hZF9pby5jZ2kKCkhhdmUgZnVuIQotQXBhY2hlIENvbW1vbnMgVGVhbQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpBcGFjaGUgQ29tbW9ucyBJTyAKVmVyc2lvbiAyLjEzLjAKUmVsZWFzZSBOb3RlcwoKSU5UUk9EVUNUSU9OOgoKQ29tbW9ucyBJTyBpcyBhIHBhY2thZ2Ugb2YgSmF2YSB1dGlsaXR5IGNsYXNzZXMgbGlrZSBqYXZhLmlvLiAgCkNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGFyZSBjb25zaWRlcmVkIHRvIGJlIHNvIHN0YW5kYXJkIGFuZCBvZiBzdWNoIGhpZ2ggCnJldXNlIGFzIHRvIGp1c3RpZnkgZXhpc3RlbmNlIGluIGphdmEuaW8uCgpUaGUgQXBhY2hlIENvbW1vbnMgSU8gbGlicmFyeSBjb250YWlucyB1dGlsaXR5IGNsYXNzZXMsIHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMsIGZpbGUgZmlsdGVycywKZmlsZSBjb21wYXJhdG9ycywgZW5kaWFuIHRyYW5zZm9ybWF0aW9uIGNsYXNzZXMsIGFuZCBtdWNoIG1vcmUuCgpKYXZhIDggcmVxdWlyZWQuCgpDaGFuZ2VzIGluIHRoaXMgdmVyc2lvbiBpbmNsdWRlOgoKTmV3IGZlYXR1cmVzOgpvICAgICAgICAgICBBZGQgQ2hhclNlcXVlbmNlSW5wdXRTdHJlYW0uQnVpbGRlci4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBDaHVua2VkT3V0cHV0U3RyZWFtLkJ1aWxkZXIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgQWJzdHJhY3RTdHJlYW1CdWlsZGVyLnNldE9wZW5PcHRpb25zKE9wZW5PcHRpb24uLi4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIHNvbWUgbWlzc2luZyBjb252ZXJzaW9ucyB0byBBYnN0cmFjdE9yaWdpbiBzdWJjbGFzc2VzLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIEFic3RyYWN0T3JpZ2luLmdldEJ5dGVBcnJheShsb25nLCBpbnQpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIGFuZCB1c2UgUmFuZG9tQWNjZXNzRmlsZXMuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgQWJzdHJhY3RPcmlnaW4uc2l6ZSgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIFBhdGhVdGlscy5FTVBUWV9GSUxFX0FUVFJJQlVURV9BUlJBWS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBDaGFyU2VxdWVuY2VJbnB1dFN0cmVhbS5CdWlsZGVyLnNldENoYXJzZXRFbmNvZGVyKENoYXJzZXRFbmNvZGVyKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBDaGFyc2V0RW5jb2RlcnMudG9DaGFyc2V0RW5jb2RlcihDaGFyc2V0RW5jb2RlciwgU3VwcGxpZXI8Q2hhcnNldEVuY29kZXI+KS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCgpGaXhlZCBCdWdzOgpvIElPLTc5MTogIFJlZ3Jlc3Npb24gaW4gRmlsZVV0aWxzLnRvdWNoKCkgLSBubyBsb25nZXIgY3JlYXRlcyBwYXJlbnQgZGlyZWN0b3JpZXMuIFRoYW5rcyB0byBDaGFkIFdpbHNvbiwgR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQnl0ZUFycmF5T3JpZ2luIHNob3VsZCBiZSBhYmxlIGNvbnZlcnQgYSBieXRlW10gdG8gYSBCeXRlQXJyYXlJbnB1dFN0cmVhbS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFic3RyYWN0T3JpZ2luU3VwcGxpZXIuY2hlY2tPcmlnaW4oKSBub3cgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpbnN0ZWFkIG9mIE51bGxQb2ludGVyRXhjZXB0aW9uLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy03OTY6ICBGaWxlQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbiBpbiBQYXRoVXRpbHMuY3JlYXRlUGFyZW50RGlyZWN0b3JpZXMoUGF0aCwgTGlua09wdGlvbiwgRmlsZUF0dHJpYnV0ZS4uLikuIFRoYW5rcyB0byBHaWFjb21vIEJvY2NhcmRvLCBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBPbmx5IHJlYWQgdGhlIHJlbGV2YW50IHBvcnRpb24gb2YgYSBmaWxlIGluIEFic3RyYWN0T3JpZ2luLkZpbGVPcmlnaW4uZ2V0Qnl0ZUFycmF5KGxvbmcsIGludCkgVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIE9ubHkgcmVhZCB0aGUgcmVsZXZhbnQgcG9ydGlvbiBvZiBhIGZpbGUgaW4gQWJzdHJhY3RPcmlnaW4uUGF0aE9yaWdpbi5nZXRCeXRlQXJyYXkobG9uZywgaW50KSBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy03OTg6ICBEZWZlcnJlZEZpbGVPdXRwdXRTdHJlYW0gdGhyb3dzIGV4Y2VwdGlvbiB3aGVuIHN5c3RlbSB0ZW1wIGRpciBpcyBhIHN5bWxpbmsuIFRoYW5rcyB0byBTaGFpIFNoYXBpcmEsIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIFJlYWRlcklucHV0U3RyZWFtLkJ1aWxkZXIuc2V0Q2hhcnNldEVuY29kZXIobnVsbCkgc2hvdWxkIHJlc2V0IHRvIGEgZGVmYXVsdCBvYmplY3QsIG5vdCB0aHJvdyBhbiBOUEUuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBSZWFkZXJJbnB1dFN0cmVhbS5CdWlsZGVyLnNldENoYXJzZXQobnVsbCkgc2hvdWxkIHJlc2V0IHRvIGEgZGVmYXVsdCBvYmplY3QsIG5vdCB0aHJvdyBhbiBOUEUuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoKQ2hhbmdlczoKbyAgICAgICAgICAgQnVtcCBjb21tb25zLXBhcmVudCBmcm9tIDU3IHRvIDU4LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LCBEZXBlbmRhYm90LiAKCkNvbXBhdGliaWxpdHkgd2l0aCAyLjY6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBZZXMuClNlbWFudGljIGNvbXBhdGlibGU6IFllcy4KCkNvbW1vbnMgSU8gMi43IGFuZCB1cCByZXF1aXJlcyBKYXZhIDggb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi42IHJlcXVpcmVzIEphdmEgNyBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjMgdGhyb3VnaCAyLjUgcmVxdWlyZXMgSmF2YSA2IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMiByZXF1aXJlcyBKYXZhIDUgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlLgoKSGlzdG9yaWNhbCBsaXN0IG9mIGNoYW5nZXM6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2NoYW5nZXMtcmVwb3J0Lmh0bWwKCkZvciBjb21wbGV0ZSBpbmZvcm1hdGlvbiBvbiBBcGFjaGUgQ29tbW9ucyBJTywgaW5jbHVkaW5nIGluc3RydWN0aW9ucyBvbiBob3cgdG8gc3VibWl0IGJ1ZyByZXBvcnRzLApwYXRjaGVzLCBvciBzdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnQsIHNlZSB0aGUgQXBhY2hlIENvbW1vbnMgSU8gd2Vic2l0ZToKCmh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvLwoKRG93bmxvYWQgcGFnZTogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vZG93bmxvYWRfaW8uY2dpCgpIYXZlIGZ1biEKLUFwYWNoZSBDb21tb25zIFRlYW0KCkFwYWNoZSBDb21tb25zIElPIApWZXJzaW9uIDIuMTIuMApSZWxlYXNlIE5vdGVzCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCklOVFJPRFVDVElPTjoKCkNvbW1vbnMgSU8gaXMgYSBwYWNrYWdlIG9mIEphdmEgdXRpbGl0eSBjbGFzc2VzIGxpa2UgamF2YS5pby4gIApDbGFzc2VzIGluIHRoaXMgcGFja2FnZSBhcmUgY29uc2lkZXJlZCB0byBiZSBzbyBzdGFuZGFyZCBhbmQgb2Ygc3VjaCBoaWdoIApyZXVzZSBhcyB0byBqdXN0aWZ5IGV4aXN0ZW5jZSBpbiBqYXZhLmlvLgoKVGhlIEFwYWNoZSBDb21tb25zIElPIGxpYnJhcnkgY29udGFpbnMgdXRpbGl0eSBjbGFzc2VzLCBzdHJlYW0gaW1wbGVtZW50YXRpb25zLCBmaWxlIGZpbHRlcnMsCmZpbGUgY29tcGFyYXRvcnMsIGVuZGlhbiB0cmFuc2Zvcm1hdGlvbiBjbGFzc2VzLCBhbmQgbXVjaCBtb3JlLgoKSmF2YSA4IHJlcXVpcmVkLgoKQ2hhbmdlcyBpbiB0aGlzIHZlcnNpb24gaW5jbHVkZToKCk5ldyBmZWF0dXJlczoKbyBJTy03NDY6ICBEcm9wIHVubmVjZXNzYXJ5IGNhc3RzIGFuZCBjb252ZXJzaW9ucyAjMjY3LiBUaGFua3MgdG8gRGF2aWRlIEFuZ2Vsb2NvbGEuIApvICAgICAgICAgICBBZGQgR2l0SHViIGNvdmVyYWdlLnltbC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBCcm9rZW5SZWFkZXIuSU5TVEFOQ0UuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgVW5jaGVja2VkQnVmZmVyZWRSZWFkZXIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgVW5jaGVja2VkRmlsdGVyUmVhZGVyLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIFVuY2hlY2tlZEZpbHRlcldyaXRlci4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBTdHJpbmdJbnB1dFN0cmVhbS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBVbmNoZWNrZWRGaWx0ZXJJbnB1dFN0cmVhbS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBVbmNoZWNrZWRGaWx0ZXJPdXRwdXRTdHJlYW0uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgQnJva2VuSW5wdXRTdHJlYW0uSU5TVEFOQ0UuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgQ2xvc2VkSW5wdXRTdHJlYW0uSU5TVEFOQ0UgYW5kIGRlcHJlY2F0ZSBDTE9TRURfSU5QVVRfU1RSRUFNLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIENsb3NlZFJlYWRlci5JTlNUQU5DRSBhbmQgZGVwcmVjYXRlIENMT1NFRF9SRUFERVIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgQnJva2VuV3JpdGVyLklOU1RBTkNFLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIENsb3NlZE91dHB1dFN0cmVhbS5JTlNUQU5DRSBhbmQgZGVwcmVjYXRlIENMT1NFRF9PVVRQVVRfU1RSRUFNLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIENsb3NlZFdyaXRlci5JTlNUQU5DRSBhbmQgZGVwcmVjYXRlIENMT1NFRF9XUklURVIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRSBhbmQgZGVwcmVjYXRlIE5VTExfT1VUUFVUX1NUUkVBTS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBOdWxsUHJpbnRTdHJlYW0uSU5TVEFOQ0UgYW5kIGRlcHJlY2F0ZSBOVUxMX1BSSU5UX1NUUkVBTS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBOdWxsV3JpdGVyLklOU1RBTkNFIGFuZCBkZXByZWNhdGUgTlVMTF9XUklURVIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgTnVsbElucHV0U3RyZWFtLklOU1RBTkNFLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIE51bGxSZWFkZXIuSU5TVEFOQ0UuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgUGF0aFV0aWxzLnJlYWRTdHJpbmcoUGF0aCwgQ2hhcnNldCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgRmlsZVV0aWxzLm5ld091dHB1dFN0cmVhbShGaWxlLCBib29sZWFuKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBQYXRoVXRpbHMubmV3T3V0cHV0U3RyZWFtKFBhdGgsIGJvb2xlYW4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIFVuY2hlY2tlZEFwcGVuZGFibGUuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgYW5kIHJldXNlIFVuY2hlY2tlZElPRXhjZXB0aW9ucy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBQYXRoVXRpbHMuZ2V0VGVtcERpcmVjdG9yeSgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIEZpbGVTeXN0ZW0uZ2V0TmFtZVNlcGFyYXRvcigpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIEZpbGVTeXN0ZW0ubm9ybWFsaXplU2VwYXJhdG9ycygpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIFBhdGhVdGlscy5pc05ld2VyKFBhdGgsIEZpbGVUaW1lLCBMaW5rT3B0aW9uLi4uKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBQYXRoVXRpbHMuaXNOZXdlcihQYXRoLCBJbnN0YW50LCBMaW5rT3B0aW9uLi4uKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBBZ2VGaWxlRmlsdGVyLkFnZUZpbGVGaWx0ZXIoSW5zdGFudCkuCiAgICAgICAgQWRkIEFnZUZpbGVGaWx0ZXIuQWdlRmlsZUZpbHRlcihJbnN0YW50LCBib29sZWFuKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBGaWxlVXRpbHMubGFzdE1vZGlmaWVkRmlsZVRpbWUoRmlsZSkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgRmlsZVRpbWVzLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIFBhdGhVdGlscy53YWl0Rm9yKFBhdGgsIER1cmF0aW9uLCBMaW5rT3B0aW9uLi4uKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uaW5wdXQuVGFpbGVyLmdldERlbGF5RHVyYXRpb24oKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBGaWxlVXRpbHMuY3VycmVudCgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIGFuZCB1c2UgUGF0aFV0aWxzLnNldExhc3RNb2RpZmllZFRpbWUoUGF0aCkgZm9yIG1vcmUgcHJlY2lzaW9uLgogICAgICAgIEFkZCBhbmQgdXNlIFBhdGhVdGlscy5zZXRMYXN0TW9kaWZpZWRUaW1lKFBhdGgsIFBhdGgpIGZvciBtb3JlIHByZWNpc2lvbi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBhbmQgdXNlIFBhdGhVdGlscy5pc05ld2VyKFBhdGgsIENocm9ub1pvbmVkRGF0ZVRpbWUsIExpbmtPcHRpb24uLi4pIGZvciBtb3JlIHByZWNpc2lvbi4KICAgICAgICBBZGQgYW5kIHVzZSBQYXRoVXRpbHMuaXNOZXdlcihQYXRoLCBQYXRoKSBmb3IgbW9yZSBwcmVjaXNpb24uCiAgICAgICAgQWRkIGFuZCB1c2UgRmlsZVV0aWxzLmlzTmV3ZXIoRmlsZSwgRmlsZVRpbWUpIGZvciBtb3JlIHByZWNpc2lvbi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBhbmQgdXNlIFBhdGhVdGlscy5pc09sZGVyKFBhdGgsIEZpbGVUaW1lLCBMaW5rT3B0aW9uLi4uKS4KICAgICAgICBBZGQgYW5kIHVzZSBQYXRoVXRpbHMuaXNPbGRlcihQYXRoLCBJbnN0YW50LCBMaW5rT3B0aW9uLi4uKS4KICAgICAgICBBZGQgYW5kIHVzZSBQYXRoVXRpbHMuaXNPbGRlcihQYXRoLCBsb25nLCBMaW5rT3B0aW9uLi4uKS4KICAgICAgICBBZGQgYW5kIHVzZSBQYXRoVXRpbHMuaXNPbGRlcihQYXRoLCBQYXRoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBhbmQgdXNlIFBhdGhVdGlscy5zaXplT2YoUGF0aCkuCiAgICAgICAgQWRkIGFuZCB1c2UgUGF0aFV0aWxzLnNpemVPZkFzQmlnSW50ZWdlcihQYXRoKS4KICAgICAgICBBZGQgYW5kIHVzZSBQYXRoVXRpbHMuc2l6ZU9mRGlyZWN0b3J5KFBhdGgpLgogICAgICAgIEFkZCBhbmQgdXNlIFBhdGhVdGlscy5zaXplT2ZEaXJlY3RvcnlBc0JpZ0ludGVnZXIoUGF0aCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgYW5kIHVzZSBJT0Nhc2UudmFsdWUoSU9DYXNlLCBJT0Nhc2UpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIFRhaWxlci5UYWlsYWJsZSBpbnRlcmZhY2UgdG8gYWxsb3cgdGFpbGluZyBvZiByZW1vdGUgZmlsZXMgZm9yIGV4YW1wbGUgdXNpbmcgakNJRlMuIFRoYW5rcyB0byBKb24gRnJlZWRtYW4sIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBhbmQgdXNlIFJhbmRvbUFjY2Vzc0ZpbGVNb2RlLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIFBhdGhVdGlscy53cml0ZVN0cmluZyhQYXRoLCBDaGFyU2VxdWVuY2UsIENoYXJzZXQsIE9wZW5PcHRpb24uLi4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIFBhdGhVdGlGaWxlcy5nZXRGaWxlQXR0cmlidXRlVmlldygpIHNob3J0aGFuZHM6CiAgICAgICAgICAtIFBhdGhVdGlscy5nZXRBY2xGaWxlQXR0cmlidXRlVmlldyhQYXRoLCBMaW5rT3B0aW9uLi4uKQogICAgICAgICAgLSBQYXRoVXRpbHMuZ2V0RG9zRmlsZUF0dHJpYnV0ZVZpZXcoUGF0aCwgTGlua09wdGlvbi4uLikKICAgICAgICAgIC0gUGF0aFV0aWxzLmdldFBvc2l4RmlsZUF0dHJpYnV0ZVZpZXcoUGF0aCwgTGlua09wdGlvbi4uLikgVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gSU8tNzQ3OiAgTWFrZSBjb21tb25zLWlvIGEgSlBNUyBtb2R1bGUgYnkgYWRkaW5nIG1vZHVsZS1pbmZvLmNsYXNzLiAKbyBJTy03NTM6ICBBZGQgSU9VdGlscyBtZXRob2QgdG8gY29weSBvdXRwdXQgc3RyZWFtIHRvIGlucHV0IHN0cmVhbSAjMjgxLiBUaGFua3MgdG8gU2ViYXN0aWFuRGlldHJpY2gsIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBQYXRoVXRpbHMuaXNQb3NpeChQYXRoLCBMaW5rT3B0aW9uLi4uKS4gIzI5MCBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIFBhdGhVdGlscy5yZWFkQXR0cmlidXRlcyhQYXRoLCBDbGFzcywgTGlua09wdGlvbi4uLikuICMyOTAgVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBJT0V4Y2VwdGlvbkxpc3QuY2hlY2tFbXB0eShMaXN0LCBPYmplY3QpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIElPQmlDb25zdW1lciwgSU9UcmlDb25zdW1lciwgSU9Db21wYXJhdG9yLCBJT1VuYXJ5T3BlcmF0b3IsIElPQmluYXJ5T3BlcmF0b3IuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgYW5kIHJldXNlIElPQ29uc3VtZXIgZm9yQWxsKCopLCBmb3JFYWNoKCopLCBhbmQgZm9yRWFjaEluZGV4ZWQoKikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgQ2hhcnNldEVuY29kZXJzLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIENoYXJzZXREZWNvZGVycy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBQYXRoVXRpbHMuY3JlYXRlUGFyZW50RGlyZWN0b3JpZXMoUGF0aCwgTGlua09wdGlvbiwgRmlsZUF0dHJpYnV0ZS4uLikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBVcGRhdGUgRmlsZUVudHJ5IHRvIHVzZSBGaWxlVGltZSBpbnN0ZWFkIG9mIGxvbmcgZm9yIGZpbGUgdGltZSBzdGFtcHMuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIElPLTY4MDogIEFkZCBtb3JlIHRlc3RzIGZvciBJT1V0aWxzLmNvbnRlbnRFcXVhbHNJZ25vcmVFT0wgIzEzNy4gVGhhbmtzIHRvIFhlbm9BbWVzcywgc2ViYkFTRiwgR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgUmVkdWNlIGJvaWxlcnBsYXRlIHRocm91Z2ggbmV3IFVuY2hlY2tlZElPIGNsYXNzIGFuZCBmcmllbmRzIGluIG9yZy5hcGFjaGUuY29tbW9ucy5pby5mdW5jdGlvbi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBQYXRoVXRpbHMudG91Y2goUGF0aCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgRmlsZVN5c3RlbS5nZXRJbGxlZ2FsRmlsZU5hbWVDb2RlUG9pbnRzKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgRmlsZVV0aWxzLmlzRmlsZU5ld2VyKEZpbGUsIENocm9ub0xvY2FsRGF0ZSwgT2Zmc2V0VGltZSkuCiAgICAgICAgQWRkIEZpbGVVdGlscy5pc0ZpbGVOZXdlcihGaWxlLCBPZmZzZXREYXRlVGltZSkuCiAgICAgICAgQWRkIEZpbGVVdGlscy5pc0ZpbGVPbGRlcihGaWxlLCBDaHJvbm9Mb2NhbERhdGUsIE9mZnNldFRpbWUpLgogICAgICAgIEFkZCBGaWxlVXRpbHMuaXNGaWxlT2xkZXIoRmlsZSwgT2Zmc2V0RGF0ZVRpbWUpLiBUaGFua3MgdG8gSXNpcmEgU2VuZXZpcmF0bmUsIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBJT0JpQ29uc3VtZXIubm9vcCgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIElPVXRpbHMuY2xvc2VRdWlldGx5KEl0ZXJhYmxlPENsb3NlYWJsZT4pLgogICAgICAgIEFkZCBJT1V0aWxzLmNsb3NlUXVpZXRseShTdHJlYW08Q2xvc2VhYmxlPikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgQ2hhcnNldHMudG9DaGFyc2V0KENoYXJzZXQsIENoYXJzZXQpLgogICAgICAgIEFkZCBDaGFyc2V0cy50b0NoYXJzZXQoU3RyaW5nLCBDaGFyc2V0KS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBYbWxTdHJlYW1Xcml0ZXIoT3V0cHV0U3RyZWFtLCBDaGFyc2V0KS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBQYXRoVXRpbHMuZ2V0TGFzdE1vZGlmaWVkRmlsZVRpbWUoKikuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgSU9CaUZ1bmN0aW9uLCBJT1RyaUZ1bmN0aW9uLCBJT1F1YWRGdW5jdGlvbiwgSU9QcmVkaWNhdGUsIElPSXRlcmF0b3IsIElPU3BsaXRlcmF0b3IsIElPQmFzZVN0cmVhbSwgSU9TdHJlYW0sIEZpbGVzVW5jaGVjay4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBJT1V0aWxzLmNvbnN1bWUoUmVhZGVyKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBJT1N1cHBsaWVyLmFzU3VwcGxpZXIoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBJT0Z1bmN0aW9uLmFzRnVuY3Rpb24oKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBJT0NvbnN1bWVyLmFzQ29uc3VtZXIoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBUaW1lc3RhbXBlZE9ic2VydmVyLmlzQ2xvc2VkKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBJT0V4Y2VwdGlvbkxpc3QgaW1wbGVtZW50cyBJdGVyYWJsZS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gSU8tNzg0OiAgQWRkIHN1cHBvcnQgZm9yIEFwcGVuZGFibGUgdG8gSGV4RHVtcCAjNDE4LiBUaGFua3MgdG8gRnJlZHJpayBLamVsbGJlcmcsIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEFkZCBhbmQgdXNlIFRocmVhZFV0aWxzLiBUaGFua3MgdG8gRGFHZVJlLCBHYXJ5IEdyZWdvcnkuIApvIElPLTc4NjogIEFkZCBVbnN5bmNocm9uaXplZEZpbHRlcklucHV0U3RyZWFtLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy03ODY6ICBBZGQgVW5zeW5jaHJvbml6ZWRCdWZmZXJlZElucHV0U3RyZWFtLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LCBCZW5vaXQgVGVsbGllci4gCm8gICAgICAgICAgIEFkZCBGaWxlU3lzdGVtLmdldEJsb2NrU2l6ZSgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIGJ1aWxkZXJzIGFuZCBhdm9pZCBjcmVhdGluZyBtb3JlIGNvbnN0cnVjdG9ycyBmb3IgYWxsIHBlcm11dGF0aW9ucyBvZiBjdXJyZW50IG9wdGlvbnMuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBSZWZhY3RvciB1c2luZyBuZXcgU3VwcGxpZXIgQVBJIElPVXRpbHMudG9TdHJpbmcoSU9TdXBwbGllcjxJbnB1dFN0cmVhbT4sIENoYXJzZXRbLCBJT1N1cHBsaWVyPFN0cmluZz5dKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeSwgbWF4eGVkZXYuIApvICAgICAgICAgICBSZWZhY3RvciB1c2luZyBuZXcgU3VwcGxpZXIgQVBJIG9yZy5hcGFjaGUuY29tbW9ucy5pby5maWxlLlBhdGhVdGlscy5jb3B5KElPU3VwcGxpZXI8SW5wdXRTdHJlYW0+LCBQYXRoLCBDb3B5T3B0aW9uLi4uKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeSwgbWF4eGVkZXYuIAoKRml4ZWQgQnVnczoKbyBJTy02OTc6ICBJT1V0aWxzLnRvQnl0ZUFycmF5IHNpemUgdmFsaWRhdGlvbiBkb2VzIG5vdCBtYXRjaCBkb2N1bWVudGF0aW9uLiBUaGFua3MgdG8gb3R0ZXI2MDYuIApvICAgICAgICAgICBGaXggSmF2YWRvYyBsaW5rcyB0byB0aGUgSlJFIEphdmFkb2MgOC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gSU8tNzQ0OiAgRmlsZVdyaXRlcldpdGhFbmNvZGluZyBmb3IgYW4gZXhpc3RpbmcgZmlsZSBubyBsb25nZXIgdHJ1bmNhdGVzIHRoZSBmaWxlLiAjMjUxLiBUaGFua3MgdG8gUkJSaSwgR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQSBudWxsIENoYXJzZXQgb3IgQ2hhcnNldCBuYW1lIGluIEZpbGVXcml0ZXJXaXRoRW5jb2RpbmcgY29uc3RydWN0b3JzIHVzZXMgdGhlIGRlZmF1bHQgQ2hhcnNldC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEZpeCB1c2FnZSBvZiBhc3NlcnROb3ROdWxsICMyNjkuIFRoYW5rcyB0byBEYXZpZGUgQW5nZWxvY29sYS4gCm8gSU8tNzI3OiAgRmlsZW5hbWVVdGlscyBkaXJlY3RvcnlDb250YWlucygpIHNob3VsZCBoYW5kbGUgZmlsZXMgd2l0aCB0aGUgc2FtZSBwcmVmaXggIzIxNy4gVGhhbmtzIHRvIHRydW5nUGEsIEdhcnkgR3JlZ29yeS4gCm8gSU8tNzQ4OiAgRmlsZVV0aWxzLm1vdmVUb0RpcmVjdG9yeSgpIGV4Y2VwdGlvbiBkb2N1bWVudGF0aW9uIGFuZCBleGNlcHRpb24gbWVzc2FnZSBlcnJvci4gVGhhbmtzIHRvIERpcmsgSGVpbnJpY2hzLCBHYXJ5IEdyZWdvcnksIEVsYW5nbyBSYXZpLiAKbyAgICAgICAgICAgVGhyZWFkTW9uaXRvci5zbGVlcChEdXJhdGlvbikgaWdub3JlcyBuYW5vc2Vjb25kcy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEZpeCBKYXZhZG9jIGluIFRocmVhZE1vbml0b3IjcnVuKCkgbWV0aG9kLiAjMjczLiBUaGFua3MgdG8gQXJ0dXJvIEJlcm5hbC4gCm8gSU8tNzQ5OiAgRmlsZVV0aWxzLmxpc3RGaWxlcygpIGRvZXMgbm90IGxpc3QgbWF0Y2hpbmcgZmlsZXMgaWYgRmlsZSBwYXJhbWV0ZXIgaXMgYSBzeW1ib2xpYyBsaW5rLiBUaGFua3MgdG8gaGFpaHVpeWFuZywgR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgRml4IHR5cG8gaW4gSmF2YWRvY3MgZm9yIEZpbGVVdGlscyNjb252ZXJ0RmlsZUNvbGxlY3Rpb25Ub0ZpbGVBcnJheSgpICMyNzYuIFRoYW5rcyB0byBuaXJhbmphbmdodWxlLCBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBdm9pZCBDb2RlIER1cGxpY2F0aW9uOiBSZXVzZSBTbGVlcCBmcm9tIFRocmVhZE1vbml0b3IgIzY2LiBUaGFua3MgdG8gRGFHZVJlLCBHYXJ5IEdyZWdvcnkuIApvIElPLTc1MDogIEZpbGVVdGlscy5pdGVyYXRlRmlsZXMgYWxzbyBsaXN0cyBkaXJlY3Rvcmllcy4gVGhhbmtzIHRvIFNpdGEgR2XfbmVyLCBTZWJhc3RpYW4gUGV0ZXJzLCBHYXJ5IEdyZWdvcnkuIApvIElPLTcyMTogIFdyb25nIGV4Y2VwdGlvbiBtZXNzYWdlIGluIEZpbGVVdGlscy5zZXRMYXN0TW9kaWZpZWQoRmlsZSwgRmlsZSkuIFRoYW5rcyB0byBEaXJrIEhlaW5yaWNocywgR2FyeSBHcmVnb3J5LiAKbyBJTy03MTc6ICBJbmZpbml0ZSBsb29wIGluIFJlYWRlcklucHV0U3RyZWFtIGluc3RlYWQgb2YgdGhyb3dpbmcgZXhjZXB0aW9uIGZvciBDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlQuIFRoYW5rcyB0byBNYXJjb25vMTIzNCwgR2FyeSBHcmVnb3J5LiAKbyBJTy03MTY6ICBSZWFkZXJJbnB1dFN0cmVhbSBlbnRlciBpbmZpbml0ZSBsb29wIGZvciB0b28gc21hbGwgYnVmZmVyIHNpemVzLiBUaGFua3MgdG8gTWFyY29ubzEyMzQsIEdhcnkgR3JlZ29yeS4gCm8gSU8tNjM4OiAgSW5maW5pdGUgbG9vcCBpbiBDaGFyU2VxdWVuY2VJbnB1dFN0cmVhbS5yZWFkIGZvciA0LWJ5dGUgY2hhcmFjdGVycyB3aXRoIFVURi04IGFuZCAzLWJ5dGUgYnVmZmVyLiBUaGFua3MgdG8gVGhheW5lIE1jQ29tYnMsIEdhcnkgR3JlZ29yeS4gCm8gSU8tNjM4OiAgUGF0aFV0aWxzLnNldFJlYWRPbmx5KFBhdGgsIGJvb2xlYW4sIExpbmtPcHRpb24uLi4pIHNob3VsZCBhZGQgUkVBRF8qIGZpbGUgYXR0cmlidXRlcyB3aGVuIHVzaW5nIFBPU0lYLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy02Mzg6ICBQYXRoVXRpbHMuc2V0UmVhZE9ubHkoUGF0aCwgYm9vbGVhbiwgTGlua09wdGlvbi4uLikgcmVhZE9ubHkgYXJndW1lbnQgaXMgYWx3YXlzIGFzc3VtZWQgdHJ1ZSBvbiBQT1NJWC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gSU8tNzI5OiAgUHJldmVudCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25zIGluIEJyb2tlbklucHV0U3RyZWFtL1JlYWRlci9PdXRwdXRTdHJlYW0vV3JpdGVyICMyNzguIFRoYW5rcyB0byBSb2IgU3Bvb3IsIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEZpbGVVdGlscy5jb3B5VVJMVG9GaWxlKFVSTCwgRmlsZSwgaW50LCBpbnQpIGxlYWtzIGl0cyBVUkxDb25uZWN0aW9uLgogICAgICAgIENhbGxlZCBieSBGaWxlVXRpbHMuY29weVVSTFRvRmlsZShVUkwsIEZpbGUpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy03MTQ6ICBGaXhlZCBSZWFkZXJJbnB1dFN0cmVhbSBub3QgY2FsbGluZyBDaGFyc2V0RW5jb2Rlci5mbHVzaCBpc3N1ZSAjMjgzLiBUaGFua3MgdG8ga2V2aW53YW5nMTk3NSwgR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgTWlub3IgY2hhbmdlcyAjMjg3LiBUaGFua3MgdG8gQXJ0dXJvIEJlcm5hbC4gCm8gSU8tNzU2OiAgVXBkYXRlIEZpbGVXcml0ZXJXaXRoRW5jb2RpbmcgdG8gZXh0ZW5kIFByb3h5V3JpdGVyICMyOTYuIFRoYW5rcyB0byB3b2RlbmNhZmUsIEdhcnkgR3JlZ29yeSwgQnJ1bm8gUC4gS2lub3NoaXRhLiAKbyAgICAgICAgICAgSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBvZiBhbiBJT0V4Y2VwdGlvbkxpc3QgdG8gYSBkZWZhdWx0IGlmIG51bGwuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIElPLTc1MTogIFdoZW4gZGVsZXRpbmcgc3ltbGlua3MsIEZpbGUvUGF0aFV0aWxzLmRlbGV0ZURpcmVjdG9yeSgpIGNoYW5nZXMgZmlsZSBwZXJtaXNzaW9ucyBvZiB0aGUgdGFyZ2V0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LCBSaWNoYXJkIEN5Z2FuaWFrLiAKbyAgICAgICAgICAgUmVhZGVySW5wdXRTdHJlYW0gbWFwcyBudWxsIENoYXJzZXQsIENoYXJzZXQgbmFtZSwgYW5kIENoYXJzZXRFbmNvZGVyIHRvIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGluc3RlYWQgb2YgdGhyb3dpbmcgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIENoYXJTZXF1ZW5jZUlucHV0U3RyZWFtIG1hcHMgbnVsbCBDaGFyc2V0IGFuZCBDaGFyc2V0IG5hbWUgdG8gdGhlIHBsYXRmb3JtIGRlZmF1bHQgaW5zdGVhZCBvZiB0aHJvd2luZyBhIE51bGxQb2ludGVyRXhjZXB0aW9uLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgV3JpdGVyT3V0cHV0U3RyZWFtIG1hcHMgbnVsbCBDaGFyc2V0LCBDaGFyc2V0IG5hbWUsIGFuZCBDaGFyc2V0RW5jb2RlciBuYW1lIHRvIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGluc3RlYWQgb2YgdGhyb3dpbmcgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEZpbGVVdGlscy5jb3B5VVJMVG9GaWxlIHNob3VsZCBjcmVhdGUgdGFyZ2V0IHBhcmVudCBkaXJlY3RvcmllcyBhbmQgb3ZlcndyaXRlIHRhcmdldCBmaWxlICMzMTkuIFRoYW5rcyB0byBDaGFkIFdpbHNvbiwgR2FyeSBHcmVnb3J5LiAKbyBJTy00ODQ6ICBGaXggaW5jb3JyZWN0IEZpbGVuYW1lVXRpbHMgSmF2YWRvYyBmb3IgbnVsbCBieXRlcyAjMzEwLiBUaGFua3MgdG8gTWFyY29ubzEyMzQsIEdhcnkgR3JlZ29yeS4gCm8gSU8tNDg0OiAgQ2hhbmdlIHRvIHVwcGVyY2FzZSB2YXJpYWJsZSBjb25zdGFudC4gIzMyMy4gVGhhbmtzIHRvIEFydHVybyBCZXJuYWwuIApvIElPLTQ4NDogIElPQ2FzZS5pc0Nhc2VTZW5zaXRpdmUoSU9DYXNlKSByZXN1bHQgaXMgYmFja3dhcmQgIzMyNS4gVGhhbmtzIHRvIERhdmlkIEh1YW5nLCBHYXJ5IEdyZWdvcnkuIApvIElPLTc1ODogIERlcHJlY2F0ZSBQYXRoVXRpbHMuTk9GT0xMT1dfTElOS19PUFRJT05fQVJSQVkgaW4gZmF2b3Igb2Ygbm9Gb2xsb3dMaW5rT3B0aW9uQXJyYXkoKS4gVGhhbmtzIHRvIE1hcmNvbm8xMjM0LCBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBJbXByb3ZlIFJlYWRlcklucHV0U3RyZWFtIGRvY3VtZW50YXRpb24gIzI5MS4gVGhhbmtzIHRvIE1hcmNvbm8xMjM0LCBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBGaXggbWlzbGVhZGluZyBjb21tZW50cyBpbiBGaWxlRmlsdGVyVGVzdCAjMzM0LiBUaGFua3MgdG8gcmljaGFyZGEyMy4gCm8gICAgICAgICAgIEFkZCBtaXNzaW5nIEphdmFkb2MgZm9yIGV4Y2VwdGlvbnMgdGhyb3duIGZvciBpbnZhbGlkIGFyZ3VtZW50cyAjMzM5LiBUaGFua3MgdG8gRGllZ28gTWFyY2lsaW8uIApvICAgICAgICAgICBGaWxlRmlsdGVyVGVzdCBtaW5vciBmaXhlcyAjMzQwLiBUaGFua3MgdG8gcmljaGFyZGEyMy4gCm8gSU8tNzY0OiAgSU9VdGlscy53cml0ZSgpIHRocm93cyBPdXRPZk1lbW9yeUVycm9yL05lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uIHdoaWxlIHdyaXRpbmcgYmlnIHN0cmluZ3MgIzM0My4gVGhhbmtzIHRvIERhR2VSZSwgR2FyeSBHcmVnb3J5LiAKbyBJTy03Njg6ICBBZGQgcmVzZXJ2ZWQgV2luZG93cyBmaWxlIG5hbWVzIENPTklOJCBhbmQgQ09OT1VUJCB0byBGaWxlU3lzdGVtICMzNTUuIFRoYW5rcyB0byBNYXJjb25vMTIzNCwgTWljaGFlbCBPc2lwb3YuIApvIElPLTc3MzogIFJlZ2V4RmlsZUZpbHRlciBpcyBubyBsb25nZXIgU2VyaWFsaXphYmxlLiBUaGFua3MgdG8gRG9taW5payBSZWluYXJ6LCBHYXJ5IEdyZWdvcnkuIApvIElPLTc2MzogIFtKYXZhZG9jXSBGaWxlRmlsdGVyVXRpbHMgZG9jIGRvZXMgbm90IG1hdGNoIGltcGw6IG1pc3Npbmcgc29tZSBmaWxlIGZpbHRlcnMuIFRoYW5rcyB0byBSaWNoYXJkIEFkYW1zLCBHYXJ5IEdyZWdvcnkuIApvIElPLTc2MjogIEZpbGVTeXN0ZW0uV0lORE9XUy5pc1Jlc2VydmVkRmlsZU5hbWUgZG9lc24ndCBjaGVjayBmb3IgZmlsZSBleHRlbnNpb24uIFRoYW5rcyB0byBMZW9uaWRhcyBDaGlyb24sIEdhcnkgR3JlZ29yeS4gCm8gSU8tNzcyOiAgQ29uZnVzaW5nIEphdmFkb2Mgb24gSU9VdGlscyNyZXNvdXJjZVRvVVJMKCkgYW5kIG90aGVyIHJlc291cmNlKiBtZXRob2RzLiBUaGFua3MgdG8gRGFuIFppZW1iYSwgR2FyeSBHcmVnb3J5LiAKbyBJTy00NDM6ICBGaWxlVXRpbHMuY29weUZpbGUgbWV0aG9kcyB0aHJvdyBhbiB1bm5lY2Vzc2FyeSAiRmFpbGVkIHRvIGNvcHkgZnVsbCBjb250ZW50cyBmcm9tIiBleGNlcHRpb24uIFRoYW5rcyB0byBEYW4gWmllbWJhLCBHYXJ5IEdyZWdvcnkuIApvIElPLTU2NDogIFBpY2sgdXAgSmF2YWRvYyBmcm9tIHN1cGVyIGZvciBvdmVycmlkZSB3cml0ZSgpIG1ldGhvZHMgaW4gQWJzdHJhY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYW5kIEJ5dGVBcnJheU91dHB1dFN0cmVhbS4gVGhhbmtzIHRvIEhhbyBaaG9uZywgQmVybmQgRWNrZW5mZWxzLCBQYXNjYWwgU2NodW1hY2hlciwgR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgRml4IG1pbm9yIHR5cG9zICMzNjcuIFRoYW5rcyB0byBNYXJjIFdyb2JlbC4gCm8gSU8tNzc2OiAgRml4IHBhcmFtZXRlcnMgdG8gcmVxdWlyZU5vbk51bGwgY2FsbCBpbiBEZWZlcnJlZE91dHB1dFN0ZWFtICMzNjguIFRoYW5rcyB0byBDaHJpcyBQb3ZpcmsuIApvICAgICAgICAgICBGaXggUGF0aFV0aWxzLmNvcHlGaWxlVG9EaXJlY3RvcnkoVVJMLFBhdGgsQ29weU9wdGlvbltdKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gSU8tMzg2OiAgRmlsZVV0aWxzLmRvQ29weUZpbGUgdXNlcyBkaWZmZXJlbnQgbWV0aG9kcyB0byBjaGVjayB0aGUgZmlsZSBzaXplcy4gVGhhbmtzIHRvIFNlYmIsIEJlcm5kIEVja2VuZmVscywgemhpcGVuZ3h1LCBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBGaXggdHlwb3MgIzM3NS4gVGhhbmtzIHRvIE1pY2hhZWwgRXJuc3QuIApvIElPLTYxMTogIEZpbGVuYW1lVXRpbHMubm9ybWFsaXplIGphdmFkb2MgYW5kIHRlc3RzICMzODMuIFRoYW5rcyB0byBGZWRvciBVcnZhbm92LiAKbyBJTy02MTE6ICBCZXR0ZXIgZG9jcyBpbiBJT1V0aWxzIGFuZCBJT1V0aWxzLmJ5dGVBcnJheShpbnQgc2l6ZSkgIzM3NC4gVGhhbmtzIHRvIEFyZGVuTC1MaXUsIEJydW5vIFAuIEtpbm9zaGl0YSwgR2FyeSBHcmVnb3J5LiAKbyBJTy03ODI6ICBTZXF1ZW5jZVJlYWRlciBzaG91bGQgY2xvc2UgcmVhZGVycyB3aGVuIGl0cyBjbG9zZSBtZXRob2QgaXMgY2FsbGVkICMzOTEuIFRoYW5rcyB0byBNYXR0ZW8gRGkgR2lvdmluYXp6bywgR2FyeSBHcmVnb3J5LiAKbyBJTy03OTA6ICBGaXggc3ltYm9saWMgbGluayBmaWxlIGZpbHRlciAjNDUwLiBUaGFua3MgdG8gTWlndWVsIE118W96LCBHYXJ5IEdyZWdvcnkuIApvIElPLTc5MDogIEFwcGx5IG5hbm9zZWNvbmRzIHByZWNpc2lvbiBmb3IgUXVldWVJbnB1dFN0cmVhbSB0aW1lb3V0IGR1cmF0aW9uLiAjNDUzLiBUaGFua3MgdG8gbWF4eGVkZXYsIEdhcnkgR3JlZ29yeSwgQnJ1bm8gUC4gS2lub3NoaXRhLiAKbyAgICAgICAgICAgRml4IG92ZXJmbG93IGZvciBGaWxlVXRpbHNUZXN0IGNvbnN0YW50cyAjNDU2LiBUaGFua3MgdG8gTWFyY29ubzEyMzQuIApvICAgICAgICAgICBTZXJpYWxpemF0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAzLjAuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBGaWxlU3lzdGVtVXRpbHMucGVyZm9ybUNvbW1hbmQoU3RyaW5nW10sIGludCwgRHVyYXRpb24pOiBVc2UgTG9jYWxlLmdldERlZmF1bHQoKSBpbnN0ZWFkIG9mIEVOR0xJU0guIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIElPLTcyNjogIEFkZCBNZW1vcnlNYXBwZWRGaWxlSW5wdXRTdHJlYW0gIzIxNS4gVGhhbmtzIHRvIHNob2xsYW5kZXIsIEdhcnkgR3JlZ29yeS4gCgpDaGFuZ2VzOgpvICAgICAgICAgICBCdW1wIGFjdGlvbnMvY2FjaGUgZnJvbSAyLjEuNiB0byAzLjAuMTAgIzMwNywgIzMzNywgIzM5My4gVGhhbmtzIHRvIERlcGVuZGFib3QsIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEJ1bXAgYWN0aW9ucy9jaGVja291dCBmcm9tIDIuMy40IHRvIDMuMS4wICMyODYsICMyOTgsICMzMzAsICMzOTIuIFRoYW5rcyB0byBEZXBlbmRhYm90LCBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBCdW1wIGFjdGlvbnMvc2V0dXAtamF2YSBmcm9tIDIgdG8gMy42LjAgIzM0NiwgIzM5Ny4gVGhhbmtzIHRvIERlcGVuZGFib3QuIApvICAgICAgICAgICBCdW1wIGdpdGh1Yi9jb2RlcWwtYWN0aW9uIGZyb20gMSB0byAyICMzNTMuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKbyAgICAgICAgICAgQnVtcCBNYXZlbiBKYXZhZG9jIHBsdWdpbiBmcm9tIDMuMi4wIHRvIDMuNC4xLiBUaGFua3MgdG8gRGVwZW5kYWJvdCwgR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQnVtcCBzcG90YnVncy1tYXZlbi1wbHVnaW4gZnJvbSA0LjIuMyB0byA0LjcuMy4wICMyNTAsICMyNTksICMyNzIsICMyNzQsICMyODUsICMyODgsICMyODksICMzMDUsICMzMTUsICMzMjYsICMzMzgsICMzNjAsICMzNjYsICMzNzAsICMzODAsICMzOTUsICM0MDMuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKbyAgICAgICAgICAgQnVtcCBzcG90YnVncyBmcm9tIDQuNS4yIHRvIDQuNy4zICMzMTMsICMzMTcsICMzNTcsICMzODIsICMzOTguIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnksIERlcGVuZGFib3QuIApvICAgICAgICAgICBCdW1wIEpVbml0IGZyb20gNS43LjIgdG8gNS44LjIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBCdW1wIG1hdmVuLWVuZm9yY2VyLXBsdWdpbiBmcm9tIDMuMC4wLU0zIHRvIDMuMy4wICMyNTUsICMzNjMsICM0MzEsICM0NDYuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKbyAgICAgICAgICAgQnVtcCBjaGVja3N0eWxlIGZyb20gOC40NCB0byA5LjMgIzI1NiwgIzI1NywgIzI2NiwgIzI3OSwgIzI5Mi4gIzMwOC4gVGhhbmtzIHRvIERlcGVuZGFib3QsIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEJ1bXAganVuaXQtYm9tIGZyb20gNS44LjAtTTEgdG8gNS45LjEgIzI2MCwgIzI3MSwgIzI3NSwgIzMwOSwgIzM4Ni4gVGhhbmtzIHRvIERlcGVuZGFib3QuIApvICAgICAgICAgICBCdW1wIG1vY2tpdG8taW5saW5lIGZyb20gMy4xMS4yIHRvIDQuMTEuMCAjMjYyLCAjMjY0LCAjMjgyLCAjMzA2LCAjMzE0LCAjMzMxLCAjMzQ4LCAjMzU5LCAjMzgxLCAjMzk5LCAjNDA1LCAjNDE0LCAjNDIwLiBUaGFua3MgdG8gRGVwZW5kYWJvdCwgR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQnVtcCBqbWgudmVyc2lvbiBmcm9tIDEuMzIgdG8gMS4zNiAjMjU4LCAjMzE2LCAjMzQyLCAjNDA0LiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCm8gICAgICAgICAgIEJ1bXAgbW9kaXRlY3QtbWF2ZW4tcGx1Z2luIGZyb20gMS4wLjAuUkMxIHRvIDEuMC4wLkZpbmFsICMyODAsICM0MzksICM0NDUuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKbyAgICAgICAgICAgQnVtcCBqdW5pdC1waW9uZWVyIGZyb20gMS40LjIgdG8gMS45LjEgIzMwNC4gIzMzNSwgIzM2MiwgIzQwMiwgIzQwNiwgIzQwOS4gVGhhbmtzIHRvIERlcGVuZGFib3QsIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEJ1bXAgamFwaWNtcC1tYXZlbi1wbHVnaW4gZnJvbSAwLjE1LjMgdG8gMC4xNi4wLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQnVtcCBjb21tb25zLXBhcmVudCBmcm9tIDUyIHRvIDU3ICMzODgsICM0MTUsICM0MjEsICMxODQuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnksIERlcGVuZGFib3QuIApvICAgICAgICAgICBCdW1wIGphY29jby1tYXZlbi1wbHVnaW4gZnJvbSAwLjguNyB0byAwLjguOC4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEJ1bXAgbWF2ZW4tYW50cnVuLXBsdWdpbiBmcm9tIDMuMC4wIHRvIDMuMS4wICMzNTQuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKbyAgICAgICAgICAgQnVtcCBjb21tb25zLnN1cmVmaXJlLnZlcnNpb24gMy4wLjAtTTUgdG8gMy4wLjAtTTcuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBCdW1wIFBNRCBmcm9tIDYuNDQuMCB0byA2LjUyLjAuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBCdW1wIG1hdmVuLXBtZC1wbHVnaW4gZnJvbSAzLjE2LjAgdG8gMy4xOS4wLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQnVtcCBhcGFjaGUtcmF0IGZyb20gMC4xMyB0byAwLjE0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQnVtcCBleGVjLW1hdmVuLXBsdWdpbiBmcm9tIDMuMC4wIHRvIDMuMS4wICMzNjkuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKbyAgICAgICAgICAgQnVtcCBtYXZlbi1jaGVja3N0eWxlLXBsdWdpbiBmcm9tIDMuMS4yIHRvIDMuMi4wICMzNzYuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKbyAgICAgICAgICAgQnVtcCBhcGFjaGUtcmF0LXBsdWdpbiBmcm9tIDAuMTQgdG8gMC4xNSAjMzg3LiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCm8gICAgICAgICAgIEJ1bXAgZGVmYXVsdCBidWZmZXIgc2l6ZSBmb3IgQ2hhclNlcXVlbmNlSW5wdXRTdHJlYW0gdG8gSU9VdGlscyNERUZBVUxUX0JVRkZFUl9TSVpFLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQnVtcCBkZWZhdWx0IGJ1ZmZlciBzaXplIGZvciBDaHVua2VkT3V0cHV0U3RyZWFtIHRvIElPVXRpbHMjREVGQVVMVF9CVUZGRVJfU0laRS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEJ1bXAgZGVmYXVsdCBidWZmZXIgc2l6ZSBmb3IgQ2h1bmtlZFdyaXRlciB0byBJT1V0aWxzI0RFRkFVTFRfQlVGRkVSX1NJWkUuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBCdW1wIGRlZmF1bHQgYnVmZmVyIHNpemUgZm9yIFJlYWRlcklucHV0U3RyZWFtIHRvIElPVXRpbHMjREVGQVVMVF9CVUZGRVJfU0laRS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgIEJ1bXAgZGVmYXVsdCBidWZmZXIgc2l6ZSBmb3IgV3JpdGVyT3V0cHV0U3RyZWFtIHRvIElPVXRpbHMjREVGQVVMVF9CVUZGRVJfU0laRS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCgpDb21wYXRpYmlsaXR5IHdpdGggMi42OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogWWVzLgpTZW1hbnRpYyBjb21wYXRpYmxlOiBZZXMuCgpDb21tb25zIElPIDIuNyBhbmQgdXAgcmVxdWlyZXMgSmF2YSA4IG9yIGFib3ZlLgpDb21tb25zIElPIDIuNiByZXF1aXJlcyBKYXZhIDcgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4zIHRocm91Z2ggMi41IHJlcXVpcmVzIEphdmEgNiBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjIgcmVxdWlyZXMgSmF2YSA1IG9yIGFib3ZlLgpDb21tb25zIElPIDEuNCByZXF1aXJlcyBKYXZhIDEuMyBvciBhYm92ZS4KCkhpc3RvcmljYWwgbGlzdCBvZiBjaGFuZ2VzOiBodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby9jaGFuZ2VzLXJlcG9ydC5odG1sCgpGb3IgY29tcGxldGUgaW5mb3JtYXRpb24gb24gQXBhY2hlIENvbW1vbnMgSU8sIGluY2x1ZGluZyBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHN1Ym1pdCBidWcgcmVwb3J0cywKcGF0Y2hlcywgb3Igc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50LCBzZWUgdGhlIEFwYWNoZSBDb21tb25zIElPIHdlYnNpdGU6CgpodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby8KCkRvd25sb2FkIHBhZ2U6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2Rvd25sb2FkX2lvLmNnaQoKSGF2ZSBmdW4hCi1BcGFjaGUgQ29tbW9ucyBUZWFtCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkFwYWNoZSBDb21tb25zIElPIApWZXJzaW9uIDIuMTEuMApSZWxlYXNlIE5vdGVzCgpJTlRST0RVQ1RJT046CgpDb21tb25zIElPIGlzIGEgcGFja2FnZSBvZiBKYXZhIHV0aWxpdHkgY2xhc3NlcyBsaWtlIGphdmEuaW8uICAKQ2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc28gc3RhbmRhcmQgYW5kIG9mIHN1Y2ggaGlnaCAKcmV1c2UgYXMgdG8ganVzdGlmeSBleGlzdGVuY2UgaW4gamF2YS5pby4KClRoZSBBcGFjaGUgQ29tbW9ucyBJTyBsaWJyYXJ5IGNvbnRhaW5zIHV0aWxpdHkgY2xhc3Nlcywgc3RyZWFtIGltcGxlbWVudGF0aW9ucywgZmlsZSBmaWx0ZXJzLApmaWxlIGNvbXBhcmF0b3JzLCBlbmRpYW4gdHJhbnNmb3JtYXRpb24gY2xhc3NlcywgYW5kIG11Y2ggbW9yZS4KCkphdmEgOCByZXF1aXJlZC4KCkNoYW5nZXMgaW4gdGhpcyB2ZXJzaW9uIGluY2x1ZGU6CgoKRml4ZWQgQnVnczoKbyBJTy03NDE6ICBGaWxlVXRpbHMubGlzdEZpbGVzIGRvZXMgbm90IGxpc3QgbWF0Y2hpbmcgZmlsZXMgaWYgRmlsZSBwYXJhbWV0ZXIgaXMgYSBzeW1ib2xpYyBsaW5rLiBUaGFua3MgdG8gWmFjaCBTaGVybWFuLiAKbyBJTy03MjQ6ICBGaWxlVXRpbHMjZGVsZXRlRGlyZWN0b3J5KEZpbGUpIGV4Y2VwdGlvbiBKYXZhZG9jIGluYWNjdXJhdGUgdXBkYXRlICMyNDUuIFRoYW5rcyB0byBsaXJhbjIwMDAuIApvICAgICAgICAgIE1pbm9yIGNoYW5nZXMgIzI0My4gVGhhbmtzIHRvIEFydHVybyBCZXJuYWwuIApvICAgICAgICAgIFJlcGxhY2UgY29uc3RydWN0aW9uIG9mIEZpbGVJbnB1dFN0cmVhbSBhbmQgRmlsZU91dHB1dFN0cmVhbSBvYmplY3RzIHdpdGggRmlsZXMgTklPIEFQSXMuICMyMjEuIFRoYW5rcyB0byBBcnR1cm8gQmVybmFsLiAKbyAgICAgICAgICBGaXggSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpbiBJT0V4Y2VwdGlvbkxpc3QgY29uc3RydWN0b3JzLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBSZW1vdmUgSU9FeGNlcHRpb24gZnJvbSB0aGUgbWV0aG9kIHNpZ25hdHVyZXMgdGhhdCBubyBsb25nZXIgdGhyb3cgSU9FeGNlcHRpb24uCiAgICAgICAgICAgVGhpcyBtYWludGFpbnMgYmluYXJ5IGNvbXBhdGliaWxpdHkgYnV0IG5vdCBzb3VyY2UgY29tcGF0aWJpbGl0eS4KICAgICAgICAgICAtIEZpbGVuYW1lVXRpbHMKICAgICAgICAgICAgICAgZGlyZWN0b3J5Q29udGFpbnMoU3RyaW5nLCBTdHJpbmcpCiAgICAgICAgICAgLSBCb3VuZGVkUmVhZGVyCiAgICAgICAgICAgICAgIEJvdW5kZWRSZWFkZXIoamF2YS5pby5SZWFkZXIsIGludCkKICAgICAgICAgICAtIElPVXRpbHMKICAgICAgICAgICAgICAgbGluZUl0ZXJhdG9yKGphdmEuaW8uSW5wdXRTdHJlYW0sIENoYXJzZXQpCiAgICAgICAgICAgICAgIGxpbmVJdGVyYXRvcihqYXZhLmlvLklucHV0U3RyZWFtLCBTdHJpbmcpCiAgICAgICAgICAgICAgIHRvQnl0ZUFycmF5KFN0cmluZykKICAgICAgICAgICAgICAgdG9JbnB1dFN0cmVhbShDaGFyU2VxdWVuY2UsIFN0cmluZykKICAgICAgICAgICAgICAgdG9JbnB1dFN0cmVhbShTdHJpbmcsIFN0cmluZykKICAgICAgICAgICAgICAgdG9TdHJpbmcoYnl0ZVtdKQogICAgICAgICAgICAgICB0b1N0cmluZyhieXRlW10sIFN0cmluZykgVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCgpDaGFuZ2VzOgpvICAgICAgICAgIEFkZCBTeW1ib2xpY0xpbmtGaWxlRmlsdGVyLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBBZGQgdGVzdCB0byBtYWtlIHN1cmUgdGhlIHNldHRlciBvZiBBbmRGaWxlRmlsdGVyIHdvcmtzIGNvcnJlY3RseSAjMjQ0LiBUaGFua3MgdG8gdHJuY2F0ZS4KbyAgICAgICAgICBBZGQgWG1sU3RyZWFtUmVhZGVyKFBhdGgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICBCdW1wIG1vY2tpdG8taW5saW5lIGZyb20gMy4xMS4wIHRvIDMuMTEuMiAjMjQ3LiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCm8gICAgICAgICAgQnVtcCBqbWgudmVyc2lvbiBmcm9tIDEuMjcgdG8gMS4zMiAjMjM3LiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCm8gICAgICAgICAgQnVtcCBzcG90YnVncyBmcm9tIDQuMi4zIHRvIDQuMy4wICMyNDkuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKCkNvbXBhdGliaWxpdHkgd2l0aCAyLjY6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBZZXMuClNlbWFudGljIGNvbXBhdGlibGU6IFllcy4KCkNvbW1vbnMgSU8gMi43IGFuZCB1cCByZXF1aXJlcyBKYXZhIDggb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi42IHJlcXVpcmVzIEphdmEgNyBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjMgdGhyb3VnaCAyLjUgcmVxdWlyZXMgSmF2YSA2IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMiByZXF1aXJlcyBKYXZhIDUgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlLgoKSGlzdG9yaWNhbCBsaXN0IG9mIGNoYW5nZXM6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2NoYW5nZXMtcmVwb3J0Lmh0bWwKCkZvciBjb21wbGV0ZSBpbmZvcm1hdGlvbiBvbiBBcGFjaGUgQ29tbW9ucyBJTywgaW5jbHVkaW5nIGluc3RydWN0aW9ucyBvbiBob3cgdG8gc3VibWl0IGJ1ZyByZXBvcnRzLApwYXRjaGVzLCBvciBzdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnQsIHNlZSB0aGUgQXBhY2hlIENvbW1vbnMgSU8gd2Vic2l0ZToKCmh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvLwoKRG93bmxvYWQgcGFnZTogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vZG93bmxvYWRfaW8uY2dpCgpIYXZlIGZ1biEKLUFwYWNoZSBDb21tb25zIFRlYW0KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQXBhY2hlIENvbW1vbnMgSU8gClZlcnNpb24gMi4xMC4wClJlbGVhc2UgTm90ZXMKCklOVFJPRFVDVElPTjoKCkNvbW1vbnMgSU8gaXMgYSBwYWNrYWdlIG9mIEphdmEgdXRpbGl0eSBjbGFzc2VzIGxpa2UgamF2YS5pby4gIApDbGFzc2VzIGluIHRoaXMgcGFja2FnZSBhcmUgY29uc2lkZXJlZCB0byBiZSBzbyBzdGFuZGFyZCBhbmQgb2Ygc3VjaCBoaWdoIApyZXVzZSBhcyB0byBqdXN0aWZ5IGV4aXN0ZW5jZSBpbiBqYXZhLmlvLgoKVGhlIEFwYWNoZSBDb21tb25zIElPIGxpYnJhcnkgY29udGFpbnMgdXRpbGl0eSBjbGFzc2VzLCBzdHJlYW0gaW1wbGVtZW50YXRpb25zLCBmaWxlIGZpbHRlcnMsCmZpbGUgY29tcGFyYXRvcnMsIGVuZGlhbiB0cmFuc2Zvcm1hdGlvbiBjbGFzc2VzLCBhbmQgbXVjaCBtb3JlLgoKSmF2YSA4IHJlcXVpcmVkLgoKQ2hhbmdlcyBpbiB0aGlzIHZlcnNpb24gaW5jbHVkZToKCk5ldyBmZWF0dXJlczoKbyAgICAgICAgICAgQWRkIGFuZCB1c2UgUmVnZXhGaWxlRmlsdGVyLnRvU3RyaW5nKCkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICBBZGQgYW5kIHVzZSBSZWdleEZpbGVGaWx0ZXIuUmVnZXhGaWxlRmlsdGVyKFBhdHRlcm4sIEZ1bmN0aW9uPFBhdGg+LCBTdHJpbmc+KSBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgQWRkIGFuZCB1c2UgSU9DYXNlLmlzQ2FzZVNlbnNpdGl2ZShJT0Nhc2UpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKCkZpeGVkIEJ1Z3M6Cm8gSU8tNzMzOiAgUmVnZXhGaWxlRmlsdGVyIHVzZXMgdGhlIHBhdGggYW5kIGZpbGUgbmFtZSBpbnN0ZWFkIG9mIGp1c3QgdGhlIGZpbGUgbmFtZS4gVGhhbmtzIHRvIEppbSBTZWxsZXJzLCBHYXJ5IEdyZWdvcnkuIApvIElPLTczNDogIFRoZSBPU0dpIG1hbmlmZXN0IG5vdyBjb250YWlucyBzdW4uKiBpbXBvcnQgcGFja2FnZXMgIzIzOS4gVGhhbmtzIHRvIEVyaWMgTm9ybWFuLiAKbyBJTy01ODU6ICBTYW5pdGl6ZSBkb3VibGUgc2xhc2ggYWZ0ZXIgcHJlZml4ICM3OS4gVGhhbmtzIHRvIEFkYW0gTWNDbGVuYWdoYW4uIAoKQ2hhbmdlczoKbyAgICAgICAgICAgQnVtcCBhY3Rpb25zL2NhY2hlIGZyb20gMi4xLjUgdG8gMi4xLjYgIzIzOC4gVGhhbmtzIHRvIERlcGVuZGFib3QuIApvICAgICAgICAgICBCdW1wIGp1bml0LXBpb25lZXIgZnJvbSAxLjQuMSB0byAxLjQuMiAjMjQwLiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCm8gICAgICAgICAgIEJ1bXAgY2hlY2tzdHlsZSBmcm9tIDguNDIgdG8gOC40MyAjMjQxLiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCm8gICAgICAgICAgIEJ1bXAgbW9ja2l0by1pbmxpbmUgZnJvbSAzLjEwLjAgdG8gMy4xMS4wICMyNDIuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKCkNvbXBhdGliaWxpdHkgd2l0aCAyLjY6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBZZXMuClNlbWFudGljIGNvbXBhdGlibGU6IFllcy4KCkNvbW1vbnMgSU8gMi43IGFuZCB1cCByZXF1aXJlcyBKYXZhIDggb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi42IHJlcXVpcmVzIEphdmEgNyBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjMgdGhyb3VnaCAyLjUgcmVxdWlyZXMgSmF2YSA2IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMiByZXF1aXJlcyBKYXZhIDUgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlLgoKSGlzdG9yaWNhbCBsaXN0IG9mIGNoYW5nZXM6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2NoYW5nZXMtcmVwb3J0Lmh0bWwKCkZvciBjb21wbGV0ZSBpbmZvcm1hdGlvbiBvbiBBcGFjaGUgQ29tbW9ucyBJTywgaW5jbHVkaW5nIGluc3RydWN0aW9ucyBvbiBob3cgdG8gc3VibWl0IGJ1ZyByZXBvcnRzLApwYXRjaGVzLCBvciBzdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnQsIHNlZSB0aGUgQXBhY2hlIENvbW1vbnMgSU8gd2Vic2l0ZToKCmh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvLwoKRG93bmxvYWQgcGFnZTogaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvcHJvcGVyL2NvbW1vbnMtaW8vZG93bmxvYWRfaW8uY2dpCgpIYXZlIGZ1biEKLUFwYWNoZSBDb21tb25zIFRlYW0KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQXBhY2hlIENvbW1vbnMgSU8gClZlcnNpb24gMi44LjAKUmVsZWFzZSBOb3RlcwoKSU5UUk9EVUNUSU9OOgoKQ29tbW9ucyBJTyBpcyBhIHBhY2thZ2Ugb2YgSmF2YSB1dGlsaXR5IGNsYXNzZXMgbGlrZSBqYXZhLmlvLiAgCkNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGFyZSBjb25zaWRlcmVkIHRvIGJlIHNvIHN0YW5kYXJkIGFuZCBvZiBzdWNoIGhpZ2ggCnJldXNlIGFzIHRvIGp1c3RpZnkgZXhpc3RlbmNlIGluIGphdmEuaW8uCgpUaGUgQXBhY2hlIENvbW1vbnMgSU8gbGlicmFyeSBjb250YWlucyB1dGlsaXR5IGNsYXNzZXMsIHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMsIGZpbGUgZmlsdGVycywKZmlsZSBjb21wYXJhdG9ycywgZW5kaWFuIHRyYW5zZm9ybWF0aW9uIGNsYXNzZXMsIGFuZCBtdWNoIG1vcmUuCgpKYXZhIDggcmVxdWlyZWQuCgpDaGFuZ2VzIGluIHRoaXMgdmVyc2lvbiBpbmNsdWRlOgoKTmV3IGZlYXR1cmVzOgpvIEFkZCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uaW5wdXQuQ2lyY3VsYXJJbnB1dFN0cmVhbS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gQWRkIG9yZy5hcGFjaGUuY29tbW9ucy5pby5maWxlLlBhdGhVdGlscy5jbGVhbkRpcmVjdG9yeShQYXRoLCBGaWxlVmlzaXRPcHRpb24uLi4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBBZGQgb3JnLmFwYWNoZS5jb21tb25zLmlvLmZpbGUuUGF0aFV0aWxzLmRlbGV0ZURpcmVjdG9yeShQYXRoLCBGaWxlVmlzaXRPcHRpb24uLi4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBBZGQgTnVsbEFwcGVuZGFibGUuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIEFkZCBQYXRoVXRpbHMuZ2V0QWNsRW50cnlMaXN0KFBhdGgpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBOdWxsLWd1YXJkIElPVXRpbHMuY2xvc2UoQ2xvc2VhYmxlLCBJT0NvbnN1bWVyKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gQWRkIFJldmVyc2VkTGluZXNGaWxlUmVhZGVyLnJlYWRMaW5lcyhpbnQpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBBZGQgUmV2ZXJzZWRMaW5lc0ZpbGVSZWFkZXIudG9TdHJpbmcoaW50KS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gSU8tNjg0OiAgQWRkIFBhdGhVdGlscy5kZWxldGUoUGF0aCwgRGVsZXRlT3B0aW9uLi4uKS4KICAgICAgICBBZGQgUGF0aFV0aWxzLmRlbGV0ZURpcmVjdG9yeShQYXRoLCBEZWxldGVPcHRpb24uLi4pLgogICAgICAgIEFkZCBQYXRoVXRpbHMuZGVsZXRlRmlsZShQYXRoLCBEZWxldGVPcHRpb24uLi4pLgogICAgICAgIEFkZCBQYXRoVXRpbHMuc2V0UmVhZE9ubHkoUGF0aCwgYm9vbGVhbiwgTGlua09wdGlvbi4uLikuCiAgICAgICAgQWRkIENsZWFuaW5nUGF0aFZpc2l0b3IuQ2xlYW5pbmdQYXRoVmlzaXRvcihQYXRoQ291bnRlcnMsIERlbGV0ZU9wdGlvbltdLCBTdHJpbmcuLi4pLgogICAgICAgIEFkZCBEZWxldGluZ1BhdGhWaXNpdG9yLkRlbGV0aW5nUGF0aFZpc2l0b3IoUGF0aENvdW50ZXJzLCBEZWxldGVPcHRpb25bXSwgU3RyaW5nLi4uKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeSwgUm9iaW4gSmFuc29obi4gCm8gQWRkIFJhbmRvbUFjY2Vzc0ZpbGVJbnB1dFN0cmVhbS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gSU8tNjgxOiAgSU9VdGlscy5jbG9zZShDbG9zZWFibGUpIHNob3VsZCBhbGxvdyBhIGxpc3Qgb2YgY2xvc2VhYmxlcy4gCm8gQWRkIElPVXRpbHMuY29uc3VtZShJbnB1dFN0cmVhbSkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIElPLTY3NjogIEFkZCBpc0ZpbGVOZXdlcigpIGFuZCBpc0ZpbGVPbGRlcigpIG1ldGhvZHMgdGhhdCBzdXBwb3J0IHRoZSBKYXZhIDggRGF0ZS9UaW1lIEFQSS4gIzEyNC4gVGhhbmtzIHRvIElzaXJhIFNlbmV2aXJhdG5lLCBHYXJ5IEdyZWdvcnkuIApvIEFkZCBhIE1hcmtTaGllbGRJbnB1dFN0cmVhbSAjMTE5LiBUaGFua3MgdG8gQWRhbSBSZXR0ZXIsIEdhcnkgR3JlZ29yeS4gCm8gRGVwcmVjYXRlIElPVXRpbHMuTElORV9TRVBBUkFUT1IgaW4gZmF2b3Igb2YgSmF2YSA3J3MgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCgpGaXhlZCBCdWdzOgpvIENoYXJTZXF1ZW5jZVJlYWRlci5za2lwIHNob3VsZCByZXR1cm4gMCBpbnN0ZWFkIG9mIEVPRiBvbiBzdHJlYW0gZW5kICMxMjMuIFRoYW5rcyB0byBSb2IgU3Bvb3IsIEpvY2hlbiBXaWVkbWFubi4gCm8gSW1wbGVtZW50IENoYXJTZXF1ZW5jZVJlYWRlci5yZWFkeSgpICMxMjIuIFRoYW5rcyB0byBSb2IgU3Bvb3IuIApvIElPLTY2OTogIEZpeCBjb2RlIHNtZWxsczsgZml4IHR5cG9zICMxMTUuIFRoYW5rcyB0byBYZW5vQW1lc3MsIEdhcnkgR3JlZ29yeS4gCm8gQWRkIGNhY2hpbmcgZm9yIHJlcXVpcmVkIGNoYXJzZXRzICMxMjAuIFRoYW5rcyB0byBKZXJvbWUgV29sZmYsIEdhcnkgR3JlZ29yeS4gCm8gSU8tNjczOiAgTWFrZSBzb21lIHNpbXBsaWZpY2F0aW9ucyAjMTIxLiBUaGFua3MgdG8gSmVyb21lIFdvbGZmLiAKbyBJTy02NzQ6ICBJbmZpbml0ZUNpcmN1bGFySW5wdXRTdHJlYW0gaXMgbm90IGluZmluaXRlIGlmIGl0cyBpbnB1dCBidWZmZXIgY29udGFpbnMgLTEuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIElPLTY3NTogIEluZmluaXRlQ2lyY3VsYXJJbnB1dFN0cmVhbSB0aHJvd3MgYSBkaXZpZGUtYnktemVybyBleGNlcHRpb24gd2hlbiByZWFkaW5nIGlmIGl0cyBpbnB1dCBidWZmZXIgaXMgc2l6ZSAwLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy02Nzc6ICBGaWxlU3lzdGVtLmdldEN1cnJlbnQoKSBkb2VzIG5vdCByZXR1cm4gdGhlIGNvcnJlY3QgZW51bS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gSU8tNjc5OiAgaW5wdXQuQWJzdHJhY3RDaGFyYWN0ZXJGaWx0ZXJSZWFkZXIgcGFzc2VzIGNvdW50IG9mIGNoYXJzIHJlYWQgIzEzMi4gVGhhbmtzIHRvIHByb25lZWwuIApvIElPLTY4MzogIENpcmN1bGFyQnVmZmVySW5wdXRTdHJlYW0ucmVhZCgpIGZhaWxzIHRvIGNvbnZlcnQgYnl0ZSB0byB1bnNpZ25lZCBpbnQgCm8gRml4IFNwb3RCdWdzIGlzc3VlcyBpbiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy02NzI6ICBDb3B5aW5nIGEgRmlsZSBzZXRzIGxhc3QgbW9kaWZpZWQgZGF0ZSB0byAwMSBKYW51YXJ5IDE5NzAuIApvIElPLTY3NjogIFByZXZlbnQgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gUmV2ZXJzZWRMaW5lc0ZpbGVSZWFkZXIgY29uc3RydWN0b3JzICMxMTcuIFRoYW5rcyB0byBNaWNoYWVsIEVybnN0LCBHYXJ5IEdyZWdvcnkuIAoKQ2hhbmdlczoKbyBSZXBsYWNlIEZpbmRCdWdzIHdpdGggU3BvdEJ1Z3MuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIG1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luIDMuMS4wIC0+IDMuMS4xLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBVcGRhdGUgdGVzdHMgZnJvbSBvcmcuYXBhY2hlLmNvbW1vbnM6Y29tbW9ucy1sYW5nMyAzLjEwIHRvIDMuMTEuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIFVwZGF0ZSBjb21tb25zLXBhcmVudCBmcm9tIDUwIHRvIDUxICMxMjkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIFVwZGF0ZSBhY3Rpb25zL2NoZWNrb3V0IGZyb20gdjEgdG8gdjIuMy4xICMxMjYuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIFVwZGF0ZSBqdW5pdC1waW9uZWVyIGZyb20gMC42LjAgdG8gMC44LjAsICMxMjcsICMxMzUuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIFVwZGF0ZSBtb2NraXRvLWNvcmUgZnJvbSAzLjMuMyB0byAzLjUuOSAjMTI4LCAjMTMzLCAjMTQ1LCAjMTQ5LCAjMTUxLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBVcGRhdGUgc3BvdGJ1Z3MgZnJvbSA0LjAuNiB0byA0LjEuMSAjMTM0LiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCm8gVXBkYXRlIGp1bml0LXBpb25lZXIgZnJvbSAwLjguMCB0byAwLjkuMCAjMTM4LiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCm8gVXBkYXRlIGFjdGlvbnMvY2hlY2tvdXQgZnJvbSB2Mi4zLjEgdG8gdjIuMy4yICMxNDAuIFRoYW5rcyB0byBEZXBlbmRhYm90LiAKbyBVcGRhdGUgYWN0aW9ucy9zZXR1cC1qYXZhIGZyb20gdjEuNC4wIHRvIHYxLjQuMiAjMTQxLCAjMTQ4LiBUaGFua3MgdG8gRGVwZW5kYWJvdC4gCgpDb21wYXRpYmlsaXR5IHdpdGggMi43OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogWWVzLgpTZW1hbnRpYyBjb21wYXRpYmxlOiBZZXMuCgpDb21tb25zIElPIDIuNyBhbmQgdXAgcmVxdWlyZXMgSmF2YSA4IG9yIGFib3ZlLgpDb21tb25zIElPIDIuNiByZXF1aXJlcyBKYXZhIDcgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4zIHRocm91Z2ggMi41IHJlcXVpcmVzIEphdmEgNiBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjIgcmVxdWlyZXMgSmF2YSA1IG9yIGFib3ZlLgpDb21tb25zIElPIDEuNCByZXF1aXJlcyBKYXZhIDEuMyBvciBhYm92ZS4KCkhpc3RvcmljYWwgbGlzdCBvZiBjaGFuZ2VzOiBodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby9jaGFuZ2VzLXJlcG9ydC5odG1sCgpGb3IgY29tcGxldGUgaW5mb3JtYXRpb24gb24gQXBhY2hlIENvbW1vbnMgSU8sIGluY2x1ZGluZyBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHN1Ym1pdCBidWcgcmVwb3J0cywKcGF0Y2hlcywgb3Igc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50LCBzZWUgdGhlIEFwYWNoZSBDb21tb25zIElPIHdlYnNpdGU6CgpodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby8KCkRvd25sb2FkIHBhZ2U6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2Rvd25sb2FkX2lvLmNnaQoKSGF2ZSBmdW4hCi1BcGFjaGUgQ29tbW9ucyBUZWFtCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkFwYWNoZSBDb21tb25zIElPIApWZXJzaW9uIDIuNwpSZWxlYXNlIE5vdGVzCgpJTlRST0RVQ1RJT046CgpDb21tb25zIElPIGlzIGEgcGFja2FnZSBvZiBKYXZhIHV0aWxpdHkgY2xhc3NlcyBsaWtlIGphdmEuaW8uICAKQ2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc28gc3RhbmRhcmQgYW5kIG9mIHN1Y2ggaGlnaCAKcmV1c2UgYXMgdG8ganVzdGlmeSBleGlzdGVuY2UgaW4gamF2YS5pby4KClRoZSBBcGFjaGUgQ29tbW9ucyBJTyBsaWJyYXJ5IGNvbnRhaW5zIHV0aWxpdHkgY2xhc3Nlcywgc3RyZWFtIGltcGxlbWVudGF0aW9ucywgZmlsZSBmaWx0ZXJzLApmaWxlIGNvbXBhcmF0b3JzLCBlbmRpYW4gdHJhbnNmb3JtYXRpb24gY2xhc3NlcywgYW5kIG11Y2ggbW9yZS4KCkphdmEgOCByZXF1aXJlZC4KCkNoYW5nZXMgaW4gdGhpcyB2ZXJzaW9uIGluY2x1ZGU6CgpOZXcgZmVhdHVyZXM6Cm8gICAgICAgICAgIEFkZGluZyB0aGUgQ2lyY3VsYXJCdWZmZXJJbnB1dFN0cmVhbSwgYW5kIHRoZSBQZWVrYWJsZUlucHV0U3RyZWFtLiAKbyBJTy01NTM6ICBBZGQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVuYW1lVXRpbHMuaXNJbGxlZ2FsV2luZG93c0ZpbGVOYW1lKGNoYXIpLiAKbyBJTy01Nzc6ICBBZGQgcmVhZGVycyB0byBmaWx0ZXIgb3V0IGdpdmVuIGNoYXJhY3RlcnM6IENoYXJhY3RlclNldEZpbHRlclJlYWRlciBhbmQgQ2hhcmFjdGVyRmlsdGVyUmVhZGVyLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy01OTQ6ICBBZGQgSU9VdGlscyBjb3B5IG1ldGhvZHMgd2l0aCBqYXZhLmxhbmcuQXBwZW5kYWJsZSBhcyB0aGUgdGFyZ2V0LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy02MDU6ICBBZGQgY2xhc3MgQ2FuRXhlY3V0ZUZpbGVGaWx0ZXIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIElPLTU3ODogIFN1cHBvcnQgamF2YS5uaW8uUGF0aCBhbmQgbm9uLWRlZmF1bHQgZmlsZSBzeXN0ZW1zIGZvciBSZXZlcnNlZExpbmVzRmlsZVJlYWRlciAoIzYyKS4gVGhhbmtzIHRvIE1hcmsgQ2hlc25leS4gCm8gSU8tNjA4OiAgQWRkIGEgY29udmVuaWVuY2UgTnVsbFByaW50U3RyZWFtLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy02MTI6ICBBZGQgY2xhc3MgVGVlUmVhZGVyLiBUaGFua3MgdG8gUm9iIFNwb29yLCBHYXJ5IEdyZWdvcnkuIApvIElPLTYxMzogIEFkZCBjbGFzc2VzIENsb3NlZFJlYWRlciBhbmQgQ2xvc2VTaGllbGRSZWFkZXIuICM4NC4gVGhhbmtzIHRvIFJvYiBTcG9vciwgR2FyeSBHcmVnb3J5LiAKbyBJTy02MTQ6ICBBZGQgY2xhc3NlcyBUYWdnZWRXcml0ZXIsIENsb3NlZFdyaXRlciBhbmQgQnJva2VuV3JpdGVyLiAjODYuIFRoYW5rcyB0byBSb2IgU3Bvb3IuIApvIElPLTYxNTogIEFkZCBjbGFzc2VzIFRlZVdyaXRlciwgRmlsdGVyQ29sbGVjdGlvbldyaXRlciwgUHJveHlDb2xsZWN0aW9uV3JpdGVyLCBJT0V4Y2VwdGlvbkxpc3QsIElPSW5kZXhlZEV4Y2VwdGlvbi4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeSwgUm9iIFNwb29yLiAKbyBJTy02MTY6ICBBZGQgY2xhc3MgQXBwZW5kYWJsZVdyaXRlci4gIzg3LiBUaGFua3MgdG8gUm9iIFNwb29yLiAKbyBJTy02MTc6ICBBZGQgY2xhc3MgQ2xvc2VTaGllbGRXcml0ZXIuICM4My4gVGhhbmtzIHRvIFJvYiBTcG9vciwgR2FyeSBHcmVnb3J5LiAKbyBJTy02MTg6ICBBZGQgY2xhc3NlcyBBZGRlZCBUYWdnZWRSZWFkZXIsIENsb3NlZFJlYWRlciBhbmQgQnJva2VuUmVhZGVyLiAjODUuIFRoYW5rcyB0byBSb2IgU3Bvb3IuIApvIElPLTYxOTogIFN1cHBvcnQgc3ViIHNlcXVlbmNlcyBpbiBDaGFyU2VxdWVuY2VSZWFkZXIuICM5MS4gVGhhbmtzIHRvIFJvYiBTcG9vci4gCm8gSU8tNjMxOiAgQWRkIGEgQ291bnRpbmdGaWxlVmlzaXRvciAoYXMgdGhlIGJhc2lzIGZvciBhIGZvcnRoY29taW5nIERlbGV0aW5nRmlsZVZpc2l0b3IpLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy02MzI6ICBBZGQgUGF0aFV0aWxzIGZvciBvcGVyYXRpb25zIG9uIE5JTyBQYXRoLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy02MzM6ICBBZGQgRGVsZXRpbmdGaWxlVmlzaXRvci4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gSU8tNjM1OiAgQWRkIG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzLmNsb3NlKENsb3NlYWJsZSkuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIElPLTYzNjogIEFkZCBhbmQgcmV1c2Ugb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHMuY2xvc2VRdWl0ZWx5KENsb3NlYWJsZSwgQ29uc3VtZXI8SU9FeGNlcHRpb24+KS4KICAgICAgICAgICBBZGQgYW5kIHJldXNlIG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzLmNsb3NlKENsb3NlYWJsZSwgSU9Db25zdW1lcjxJT0V4Y2VwdGlvbj4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy02NDU6ICBBZGQgb3JnLmFwYWNoZS5jb21tb25zLmlvLmZpbGUuUGF0aFV0aWxzLmZpbGVDb250ZW50RXF1YWxzKFBhdGgsIFBhdGgsIE9wZW5PcHRpb24uLi4pLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy00NTg6ICBBZGQgYSBTZXF1ZW5jZVJlYWRlciBzaW1pbGFyIHRvIGphdmEuaW8uU2VxdWVuY2VJbnB1dFN0cmVhbS4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeSwgSm9zaHVhIEdpdGxpbi4gCm8gSU8tNjQ4OiAgSW1wbGVtZW50IGRpcmVjdG9yeSBjb250ZW50IGVxdWFsaXR5LiAxMDAjLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy02NDg6ICBSZWZhY3RvciBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gaW50byBzeW5jaHJvbml6ZWQgYW5kIHVuc3luY2hyb25pemVkIHZlcnNpb25zICMxMDguIFRoYW5rcyB0byBBZGFtIFJldHRlciwgQWxleCBIZXJiZXJ0LCBHYXJ5IEdyZWdvcnkuIApvIElPLTY2MjogIFJlZmFjdG9yIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBpbnRvIHN5bmNocm9uaXplZCBhbmQgdW5zeW5jaHJvbml6ZWQgdmVyc2lvbnMgIzEwOC4gVGhhbmtzIHRvIEFkYW0gUmV0dGVyLCBHYXJ5IEdyZWdvcnkuIAoKRml4ZWQgQnVnczoKbyBJTy01ODk6ICBTb21lIHRlc3RzIGZhaWwgaWYgdGhlIGJhc2UgcGF0aCBjb250YWlucyBhIHNwYWNlLiAKbyBJTy01ODI6ICBNYWtlIG1ldGhvZHMgaW4gT2JzZXJ2YWJsZUlucHV0U3RyZWFtLk9ic2VydmVyIHB1YmxpYy4gVGhhbmtzIHRvIEJydW5vIFBhbG9zLgpvIElPLTUzNTogIFRocmVhZCBidWcgaW4gRmlsZUFsdGVyYXRpb25Nb25pdG9yLnN0b3AoaW50KS4gVGhhbmtzIHRvIFN2ZXRsaW4gWmFyZXYsIEFudGhvbnkgUmF5bW9uZC4gCm8gSU8tNTU3OiAgUGVyZm9ybSBsb2NhbGUgaW5kZXBlbmRlbnQgdXBwZXIgY2FzZSBjb252ZXJzaW9ucy4gVGhhbmtzIHRvIGx1Y2Npb21hbi4gCm8gSU8tNTcwOiAgTWlzc2luZyBKYXZhZG9jIGluIEZpbGVuYW1lVXRpbHMgY2F1c2luZyBUcmF2aXMtQ0kgYnVpbGQgdG8gZmFpbC4gVGhhbmtzIHRvIFByYW5ldCBWZXJtYS4gCm8gSU8tNTcxOiAgUmVtb3ZlIHJlZHVuZGFudCBpc0RpcmVjdG9yeSgpIGNoZWNrIGluIG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHMubGlzdEZpbGVzQW5kRGlycyhGaWxlLCBJT0ZpbGVGaWx0ZXIsIElPRmlsZUZpbHRlcikuIFRoYW5rcyB0byBwcmFuZXQuIApvIElPLTU1OTogIEZpbGVuYW1lVXRpbHMubm9ybWFsaXplIG5vdyB2ZXJpZmllcyBob3N0bmFtZSBzeW50YXggaW4gVU5DIHBhdGguIApvIElPLTU1NDogIEZpbGVVdGlscy5jb3B5VG9GaWxlKElucHV0U3RyZWFtIHNvdXJjZSwgRmlsZSBkZXN0aW5hdGlvbikgc2hvdWxkIG5vdCBjbG9zZSBpbnB1dCBzdHJlYW0uIFRoYW5rcyB0byBNaWNoZWxlIE1hcmlvdHRpLiAKbyBJTy02MDQ6ICBGaWxlVXRpbHMuZG9Db3B5RmlsZShGaWxlLCBGaWxlLCBib29sZWFuKSBjYW4gdGhyb3cgQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24uIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIElPLTYyNTogIENvcnJlY3RlZCBtaXNsZWFkaW5nIGV4Y2VwdGlvbiBtZXNzYWdlIGZvciBGaWxlVXRpbHMuY29weURpcmVjdG9yeVRvRGlyZWN0b3J5LiBUaGFua3MgdG8gTWlra28gTWF1bnUuIApvIElPLTYyNjogIEEgbWlzdGFrZSBpbiB0aGUgRmlsZW5hbWVVdGlscy5jb25jYXQoKSdzIEphdmFkb2MgYWJvdXQgYW4gYWJzb2x1dGUgcGF0aC4gVGhhbmtzIHRvIFl1amkgS29uaXNoaS4gCm8gSU8tNjQwOiAgTlBFIGluIG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzLmNvbnRlbnRFcXVhbHMoSW5wdXRTdHJlYW0sIElucHV0U3RyZWFtKSB3aGVuIG9ubHkgb25lIGlucHV0IGlzIG51bGwuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIElPLTY0MTogIE5QRSBpbiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlscy5jb250ZW50RXF1YWxzKFJlYWRlciwgUmVhZGVyKSB3aGVuIG9ubHkgb25lIGlucHV0IGlzIG51bGwuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIElPLTY0MzogIE5QRSBpbiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlscy5jb250ZW50RXF1YWxzSWdub3JlRU9MKFJlYWRlciwgUmVhZGVyKSB3aGVuIG9ubHkgb25lIGlucHV0IGlzIG51bGwuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvIElPLTY0NDogIE5QRSBpbiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzLmNvbnRlbnRFcXVhbHNJZ25vcmVFT0woRmlsZSwgRmlsZSkgd2hlbiBvbmx5IG9uZSBpbnB1dCBpcyBudWxsLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy02NjQ6ICBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzLmNvcHlVUkxUb0ZpbGUoKikgb3BlbiBidXQgZG8gbm90IGNsb3NlIHN0cmVhbXMuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIAoKQ2hhbmdlczoKbyBJTy01NzI6ICBSZWZhY3RvciBkdXBsaWNhdGUgY29kZSBpbiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzLiBUaGFua3MgdG8gUHJhbmV0IFZlcm1hLiAKbyBJTy01ODA6ICBVcGRhdGUgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVuYW1lVXRpbHMuaXNFeHRlbnNpb24oU3RyaW5nLCBTdHJpbmdbXSkgdG8gdXNlIHZhciBhcmdzLiAKbyBJTy03MDE6ICBNYWtlIGFycmF5IGRlY2xhcmF0aW9uIGluIFRocmVzaG9sZGluZ091dHB1dFN0cmVhbSBjb25zaXN0ZW50IHdpdGggb3RoZXIgYXJyYXkgZGVjbGFyYXRpb25zIGluIHRoZSBsaWJyYXJ5ICM3Ny4gVGhhbmtzIHRvIFJheW1vbmQgVGFuLiAKbyBJTy02MDc6ICBVcGRhdGUgZnJvbSBKYXZhIDcgdG8gSmF2YSA4LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy02MTA6ICBSZW1vdmUgdGhyb3dzIElPRXhjZXB0aW9uIGluIG1ldGhvZCBpc1N5bWxpbmsoKSAjODAuIFRoYW5rcyB0byBTZWJhc3RpYW4uIApvIElPLTYyODogIE1pZ3JhdGlvbiB0byBKVW5pdCBKdXBpdGVyICM5Ny4gVGhhbmtzIHRvIEFsbG9uIE11cmVpbmlrLiAKbyBJTy02MzA6ICBEZXByZWNhdGUgb3JnLmFwYWNoZS5jb21tb25zLmlvLm91dHB1dC5OdWxsT3V0cHV0U3RyZWFtLk51bGxPdXRwdXRTdHJlYW0oKSBpbiBmYXZvciBvZiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8ub3V0cHV0Lk51bGxPdXRwdXRTdHJlYW0uTlVMTF9PVVRQVVRfU1RSRUFNLiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyBJTy02Mjk6ICBGaWxlVXRpbHMjZm9yY2VEZWxldGUgc2hvdWxkIHVzZSBGaWxlcyNkZWxldGUgcmF0aGVyIHRoYW4gRmlsZSNkZWxldGUgc28gZXhjZXB0aW9uIG1lc3NhZ2VzIGluY2x1ZGVzIHJlYXNvbiBmb3IgZmFpbHVyZS4gVGhhbmtzIHRvIElhbiBTcHJpbmdlciwgSWFuIFNwcmluZ2VyLCBHYXJ5IEdyZWdvcnkuIApvIElPLTYzNDogIE1ha2UgZ2V0Q2F1c2Ugc3luY2hyb25pemVkIGFuZCB1c2UgYSBEZXF1ZSBpbnN0ZWFkIG9mIGEgU3RhY2sgIzY0LiBUaGFua3MgdG8gVuFjbGF2IEhhaXNtYW4sIEJydW5vIFAuIEtpbm9zaGl0YSwgR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgIFVwZGF0ZSB0ZXN0cyBmcm9tIEFwYWNoZSBDb21tb25zIExhbmcgMy45IHRvIDMuMTAuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICAgVXBkYXRlIHRlc3RzIG9yZy5qdW5pdC1waW9uZWVyOmp1bml0LXBpb25lZXIgMC4zLjAgLT4gMC42LjAuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICAgVXBkYXRlIHRlc3RzIG9yZy5qdW5pdC5qdXBpdGVyOmp1bml0LWp1cGl0ZXIgNS41LjIgLT4gNS42LjIuIFRoYW5rcyB0byBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICAgVXBkYXRlIHRlc3RzIG9yZy5tb2NraXRvOm1vY2tpdG8tY29yZSAzLjAuMCAtPiAzLjMuMy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gSU8tNjY2OiAgTm9ybWFsaXplIGludGVybmFsIGJ1ZmZlcnMgdG8gODE5MiBieXRlcy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gSU8tNjY1OiAgRW5zdXJlIHRoYXQgcGFzc2luZyBhIG51bGwgSW5wdXRTdHJlYW0gcmVzdWx0cyBpbiBOUEUgd2l0aCB0ZXN0cyAjMTEyLiBUaGFua3MgdG8gT3R0byBGb3dsZXIsIEdhcnkgR3JlZ29yeS4gCm8gICAgICAgICAgICBjb21tb25zLmphY29jby52ZXJzaW9uIDAuOC40IC0+IDAuOC41LiBUaGFua3MgdG8gR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgIGNvbS5naXRodWIuc2lvbTc5LmphcGljbXA6amFwaWNtcC1tYXZlbi1wbHVnaW4gMC4xNC4xIC0+IDAuMTQuMy4gVGhhbmtzIHRvIEdhcnkgR3JlZ29yeS4gCm8gSU8tNjY3OiAgQWRkIGZ1bmN0aW9uYWwgaW50ZXJmYWNlcyBJT0Z1bmN0aW9uIGFuZCBJT1N1cHBsaWVyICMxMTAuIFRoYW5rcyB0byBBZGFtIFJldHRlciwgR2FyeSBHcmVnb3J5LiAKbyAgICAgICAgICAgIFN1cHBvcnQgc3ViIHNlcXVlbmNlcyBpbiBDaGFyU2VxdWVuY2VSZWFkZXIgIzkxLiBUaGFua3MgdG8gUm9iIFNwb29yLCBHYXJ5IEdyZWdvcnkuIApvICAgICAgICAgICAgUmVtb3ZlIGRlcHJlY2F0ZWQgc3VkbyBzZXR0aW5nLiAjMTEzLiBUaGFua3MgdG8gZGVuZ2xpbWluZy4gCgpDb21wYXRpYmlsaXR5IHdpdGggMi42OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogWWVzLgpTZW1hbnRpYyBjb21wYXRpYmxlOiBZZXMuCgpDb21tb25zIElPIDIuNyBhbmQgdXAgcmVxdWlyZXMgSmF2YSA4IG9yIGFib3ZlLgpDb21tb25zIElPIDIuNiByZXF1aXJlcyBKYXZhIDcgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4zIHRocm91Z2ggMi41IHJlcXVpcmVzIEphdmEgNiBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjIgcmVxdWlyZXMgSmF2YSA1IG9yIGFib3ZlLgpDb21tb25zIElPIDEuNCByZXF1aXJlcyBKYXZhIDEuMyBvciBhYm92ZS4KCkhpc3RvcmljYWwgbGlzdCBvZiBjaGFuZ2VzOiBodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby9jaGFuZ2VzLXJlcG9ydC5odG1sCgpGb3IgY29tcGxldGUgaW5mb3JtYXRpb24gb24gQXBhY2hlIENvbW1vbnMgSU8sIGluY2x1ZGluZyBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHN1Ym1pdCBidWcgcmVwb3J0cywKcGF0Y2hlcywgb3Igc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50LCBzZWUgdGhlIEFwYWNoZSBDb21tb25zIElPIHdlYnNpdGU6CgpodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9wcm9wZXIvY29tbW9ucy1pby8KCkRvd25sb2FkIHBhZ2U6IGh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL3Byb3Blci9jb21tb25zLWlvL2Rvd25sb2FkX2lvLmNnaQoKSGF2ZSBmdW4hCi1BcGFjaGUgQ29tbW9ucyBUZWFtCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkFwYWNoZSBDb21tb25zIElPIFZlcnNpb24gMi42CgpJTlRST0RVQ1RJT046CgpBcGFjaGUgQ29tbW9ucyBJTyBpcyBhIHBhY2thZ2Ugb2YgSmF2YSB1dGlsaXR5IGNsYXNzZXMgbGlrZSBqYXZhLmlvLgpDbGFzc2VzIGluIHRoaXMgcGFja2FnZSBhcmUgY29uc2lkZXJlZCB0byBiZSBzbyBzdGFuZGFyZCBhbmQgb2Ygc3VjaCBoaWdoCnJldXNlIGFzIHRvIGp1c3RpZnkgZXhpc3RlbmNlIGluIGphdmEuaW8uCgpUaGUgQXBhY2hlIENvbW1vbnMgSU8gbGlicmFyeSBjb250YWlucyB1dGlsaXR5IGNsYXNzZXMsIHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMsCmZpbGUgZmlsdGVycywgZmlsZSBjb21wYXJhdG9ycywgZW5kaWFuIHRyYW5zZm9ybWF0aW9uIGNsYXNzZXMsIGFuZCBtdWNoIG1vcmUuCgpBcGFjaGUgQ29tbW9ucyBJTyAyLjYgcmVxdWlyZXMgYXQgbGVhc3QgSmF2YSA3IHRvIGJ1aWxkIGFuZCBydW4uCgoKREVQUkVDQVRJT05TCj09PT09PT09PT09PQoKQWxsIGNsb3NlUXVpZXRseSBvdmVybG9hZHMgaW4gb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHMgaGF2ZSBiZWVuCmRlcHJlY2F0ZWQuIFVzZSB0aGUgdHJ5LXdpdGgtcmVzb3VyY2VzIHN0YXRlbWVudCBvciBoYW5kbGUgc3VwcHJlc3NlZApleGNlcHRpb25zIG1hbnVhbGx5LgoKVGhlIGNsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlU3lzdGVtVXRpbHMgaGFzIGJlZW4gZGVwcmVjYXRlZC4KVXNlIGVxdWl2YWxlbnQgbWV0aG9kcyBpbiBqYXZhLm5pby5maWxlLkZpbGVTdG9yZSBpbnN0ZWFkLCBlLmcuCkZpbGVzLmdldEZpbGVTdG9yZShQYXRocy5nZXQoIi9ob21lIikpLmdldFVzYWJsZVNwYWNlKCkgb3IgaXRlcmF0ZSBvdmVyCkZpbGVTeXN0ZW1zLmdldERlZmF1bHQoKS5nZXRGaWxlU3RvcmVzKCkuCgoKQ09NUEFUSUJJTElUWSBXSVRIIEpBVkEgOQo9PT09PT09PT09PT09PT09PT0KClRoZSBNQU5JRkVTVC5NRiBub3cgY29udGFpbnMgYW4gYWRkaXRpb25hbCBlbnRyeToKCiAgQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8KClRoaXMgc2hvdWxkIG1ha2UgaXQgcG9zc2libGUgdG8gdXNlIENvbW1vbnMgSU8gMi42IGFzIGEgbW9kdWxlIGluIHRoZSBKYXZhIDkKbW9kdWxlIHN5c3RlbS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSBjb3JyZXNwb25kaW5nIGlzc3VlOgoKICAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSU8tNTUxCgpCdWlsZGluZyBDb21tb25zIElPIDIuNiBzaG91bGQgd29yayBvdXQgb2YgdGhlIGJveCB3aXRoIHRoZSBsYXRlc3QgSmF2YSA5CnJlbGVhc2UuIFBsZWFzZSByZXBvcnQgYW55IEphdmEgOSByZWxhdGVkIGlzc3VlcyBhdDoKCiAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0lPCgoKTkVXIEZFQVRVUkVTCj09PT09PT09PT09PQoKbyBJTy01NTE6IEFkZCBBdXRvbWF0aWMtTW9kdWxlLU5hbWUgTUFOSUZFU1QgZW50cnkgZm9yIEphdmEgOSBjb21wYXRpYmlsaXR5LgpvIElPLTM2NzogQWRkIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGNvcHlUb0RpcmVjdG9yeS4gVGhhbmtzIHRvIEphbWVzIFNhd2xlLgpvIElPLTQ5MzogQWRkIGluZmluaXRlIGNpcmN1bGFyIGlucHV0IHN0cmVhbS4gVGhhbmtzIHRvIFBpb3RyIFR1cnNraS4KbyBJTy01MDc6IEFkZCBhIEJ5dGVPcmRlclV0aWxzIGNsYXNzLgpvIElPLTUxODogQWRkIE9ic2VydmFibGVJbnB1dFN0cmVhbS4KbyBJTy01MTk6IEFkZCBNZXNzYWdlRGlnZXN0Q2FsY3VsYXRpbmdJbnB1dFN0cmVhbS4KbyBJTy01MTM6IEFkZCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciByZWFkaW5nIGNsYXNzIHBhdGggcmVzb3VyY2VzLgogICAgICAgICAgVGhhbmtzIHRvIEJlaHJhbmcgU2FlZWR6YWRlaC4KCkZJWEVEIEJVR1MKPT09PT09PT09PQoKbyBJTy01NDY6IENsb3NlZE91dHB1dFN0cmVhbSNmbHVzaCBzaG91bGQgdGhyb3cuIFRoYW5rcyB0byBUb21hcyBDZWxheWEuCm8gSU8tNTUwOiBEb2N1bWVudGF0aW9uIGlzc3VlLCBmaXggNDA0IEphdmFkb2MgaXNzdWVzIGluIHRoZSBkZXNjcmlwdGlvbiBwYWdlLgogICAgICAgICAgVGhhbmtzIHRvIEppbWkgQWRyaWFuLgpvIElPLTQ0MjogSmF2YWRvYyBjb250cmFkaWN0b3J5IGZvciBGaWxlRmlsdGVyVXRpbHMuYWdlRmlsZUZpbHRlcihjdXRvZmYpIGFuZAogICAgICAgICAgdGhlIGZpbHRlciBpdCBjb25zdHJ1Y3RzOiBBZ2VGaWxlRmlsdGVyKGN1dG9mZikuCiAgICAgICAgICBUaGFua3MgdG8gU2ltb24gUm9iaW5zb24uCm8gSU8tNTM0OiBGaWxlVXRpbFRlc3RDYXNlLnRlc3RGb3JjZURlbGV0ZURpcigpIHNob3VsZCBub3QgZGVsZXRlIHRlc3REaXJlY3RvcnkKICAgICAgICAgIHBhcmVudC4KbyBJTy01Mjg6IEZpeCBUYWlsZXIucnVuIHJhY2UgY29uZGl0aW9uIHJ1bmF3YXkgbG9nZ2luZy4gVGhhbmtzIHRvIERhdmUgTW90ZW4uCm8gSU8tNDgzOiBnZXRQcmVmaXhMZW5ndGggcmV0dXJuIC0xIGlmIFVuaXggZmlsZSBjb250YWlucyBjb2xvbi4KICAgICAgICAgIFRoYW5rcyB0byBNYXJrbyBWYXNpYy4KbyBJTy01MjA6IEZpbGVVdGlsc1Rlc3RDYXNlI3Rlc3RDb250ZW50RXF1YWxzSWdub3JlRU9MIGZhaWxzIG9uIFdpbmRvd3MuCm8gSU8tNTE2OiAuZ2l0YXR0cmlidXRlcyBub3QgY29ycmVjdGx5IGFwcGxpZWQuIFRoYW5rcyB0byBKYXNvbiBQeWVyb24uCm8gSU8tNTE1OiBBbGxvdyBTcGVjaWZ5aW5nIEluaXRpYWwgQnVmZmVyIFNpemUgb2YgRGVmZXJyZWRGaWxlT3V0cHV0U3RyZWFtLgogICAgICAgICAgVGhhbmtzIHRvIEJyZXR0IExvdW5zYnVyeSwgR2FyeSBHcmVnb3J5LgpvIElPLTUxMjogVGhyZXNob2xkaW5nT3V0cHV0U3RyZWFtLnRocmVzaG9sZFJlYWNoZWQoKSByZXN1bHRzIGluCiAgICAgICAgICBGaWxlTm90Rm91bmRFeGNlcHRpb24uIFRoYW5rcyB0byBSYWxmIEhhdXNlci4KbyBJTy01MTE6IEFmdGVyIGEgZmV3IHVuaXQgdGVzdHMsIGEgZmV3IG5ld2x5IGNyZWF0ZWQgZGlyZWN0b3JpZXMgbm90IGNsZWFuZWQKICAgICAgICAgIGNvbXBsZXRlbHkuIFRoYW5rcyB0byBBaG1ldCBDZWxpay4KbyBJTy01MDI6IEV4Y2VwdGlvbnMgYXJlIHN1cHByZXNzZWQgaW5jb3JyZWN0bHkgd2hlbiBjb3B5aW5nIGZpbGVzLgogICAgICAgICAgVGhhbmtzIHRvIENocmlzdGlhbiBTY2h1bHRlLgpvIElPLTUwMzogVXBkYXRlIHBsYXRmb3JtIHJlcXVpcmVtZW50IHRvIEphdmEgNy4KbyBJTy01Mzc6IEJPTUlucHV0U3RyZWFtIHNob3VsZG4ndCBzb3J0IGFycmF5IG9mIEJPTXMgaW4tcGxhY2UuCiAgICAgICAgICBUaGFua3MgdG8gQm9yeXMgWmlicm92LgoKQ0hBTkdFUwo9PT09PT09CgpvIElPLTU1MzogTWFrZSBjb2RlIHN0eWxlIG9mIGhhc0JPTSgpIGNvbnNpc3RlbnQgd2l0aCBnZXRCT01DaGFyc2V0TmFtZSgpLgogICAgICAgICAgVGhhbmtzIHRvIE1pY2hhZWwgRXJuc3QuCm8gSU8tNTQyOiBGaWxlVXRpbHMjcmVhZEZpbGVUb0J5dGVBcnJheTogb3B0aW1pemUgcmVhZGluZyBvZiBmaWxlcyB3aXRoIGtub3duCiAgICAgICAgICBzaXplLiBUaGFua3MgdG8gSWxtYXJzIFBvaWthbnMuCm8gSU8tNTQ3OiBUaHJvdyBhIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbnN0ZWFkIG9mIE51bGxQb2ludGVyRXhjZXB0aW9uIGluCiAgICAgICAgICBGaWxlU3lzdGVtVXRpbHMuZnJlZVNwYWNlV2luZG93cygpLiBUaGFua3MgdG8gTmlraGlsIFNoaW5kZSwKICAgICAgICAgIE1pY2hhZWwgRXJuc3QsIEdhcnkgR3Jlb3J5LgpvIElPLTUwNjogRGVwcmVjYXRlIG1ldGhvZHMgRmlsZVN5c3RlbVV0aWxzLmZyZWVTcGFjZUtiKCkuCiAgICAgICAgICBUaGFua3MgdG8gQ2hyaXN0aWFuIFNjaHVsdGUuCm8gSU8tNTA1OiBNYWtlIExpbmVJdGVyYXRvciBpbXBsZW1lbnQgQ2xvc2VhYmxlIHRvIHN1cHBvcnQgdHJ5LXdpdGgtcmVzb3VyY2VzCiAgICAgICAgICBzdGF0ZW1lbnRzLiBUaGFua3MgdG8gQ2hyaXN0aWFuIFNjaHVsdGUuCm8gSU8tNTA0OiBEZXByZWNhdGVkIG9mIGFsbCBJT1V0aWxzLmNsb3NlUXVpZXRseSgpIG1ldGhvZHMgYW5kIHVzZQogICAgICAgICAgdHJ5LXdpdGgtcmVzb3VyY2VzIGludGVybmFsbHkuIFRoYW5rcyB0byBDaHJpc3RpYW4gU2NodWx0ZS4KClJFTU9WRUQKPT09PT09PQoKbyBJTy01MTQ6IFJlbW92ZSBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSmF2YTdTdXBwb3J0LgoKQ09NUEFUSUJJTElUWSBXSVRIIE9MREVSIFZFUlNJT05TCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuNToKQmluYXJ5IGNvbXBhdGlibGU6IFllcy4KU291cmNlIGNvbXBhdGlibGU6IFllcy4KU2VtYW50aWMgY29tcGF0aWJsZTogWWVzLgoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuNiBhbmQgMS40OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogTm8sIHNlZSB0aGUgcmFyZSBjYXNlIGluCiAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9JTy0zMTguClNlbWFudGljIGNvbXBhdGlibGU6IE5vLCBzZWUgdGhlIHJhcmUgY2FzZSBpbgogIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSU8tMzE4LgoKQ29tbW9ucyBJTyAyLjcgYW5kIHVwIHJlcXVpcmVzIEphdmEgOCBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjYgcmVxdWlyZXMgSmF2YSA3IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMyB0aHJvdWdoIDIuNSByZXF1aXJlcyBKYXZhIDYgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4yIHJlcXVpcmVzIEphdmEgNSBvciBhYm92ZS4KQ29tbW9ucyBJTyAxLjQgcmVxdWlyZXMgSmF2YSAxLjMgb3IgYWJvdmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkFwYWNoZSBDb21tb25zIElPIFZlcnNpb24gMi41CgpOZXcgZmVhdHVyZXMgYW5kIGJ1ZyBmaXhlcy4KCkNoYW5nZXMgaW4gdGhpcyB2ZXJzaW9uIGluY2x1ZGU6CgpOZXcgZmVhdHVyZXM6Cm8gSU8tNDg3OiAgQWRkIFZhbGlkYXRpbmdPYmplY3RJbnB1dFN0cmVhbSBmb3IgY29udHJvbGxlZCBkZXNlcmlhbGl6YXRpb24gCm8gSU8tNDcxOiAgU3VwcG9ydCBmb3IgYWRkaXRpb25hbCBlbmNvZGluZ3MgaW4gUmV2ZXJzZWRMaW5lc0ZpbGVSZWFkZXIgVGhhbmtzIHRvIExlYW5kcm8gUmVpcy4gCm8gSU8tNDI1OiAgU2V0dGVyIG1ldGhvZCBmb3IgdGhyZXNob2xkIG9uIFRocmVzaG9sZGluZ091dHB1dFN0cmVhbSBUaGFua3MgdG8gQ3JhaWcgU3dhbmsuIApvIElPLTQwNjogIEludHJvZHVjZSBuZXcgY2xhc3MgQXBwZW5kYWJsZU91dHB1dFN0cmVhbSBUaGFua3MgdG8gTmlhbGwgUGVtYmVydG9uLiAKbyBJTy00NTk6ICBBZGQgV2luZG93c0xpbmVFbmRpbmdJbnB1dFN0cmVhbSBhbmQgVW5peExpbmVFbmRpbmdJbnB1dFN0cmVhbS4gVGhhbmtzIHRvIEtyaXN0aWFuIFJvc2Vudm9sZC4gCm8gSU8tNDU3OiAgQWRkIGEgQm91bmRlZFJlYWRlciwgYSB3cmFwcGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uc3RyYWluIGFjY2VzcwogICAgICAgIHRvIGFuIHVuZGVybHlpbmcgc3RyZWFtIHdoZW4gdXNlZCB3aXRoIG1hcmsvcmVzZXQgLQogICAgICAgIHRvIGF2b2lkIG92ZXJmbG93aW5nIHRoZSBtYXJrIGxpbWl0IG9mIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlci4gVGhhbmtzIHRvIEtyaXN0aWFuIFJvc2Vudm9sZC4gCm8gSU8tNDI2OiAgQWRkIEFQSSBJT1V0aWxzLmNsb3NlUXVpZXRseShDbG9zZWFibGUuLi4pIApvIElPLTQxMDogIFJlYWRmdWxseSgpIFRoYXQgUmV0dXJucyBBIEJ5dGUgQXJyYXkgVGhhbmtzIHRvIEJlbHVnYSBCZWhyLiAKbyBJTy0zOTU6ICBPdmVybG9hZCBJT1V0aWxzIGJ1ZmZlciBtZXRob2RzIHRvIGFjY2VwdCBidWZmZXIgc2l6ZSBUaGFua3MgdG8gQmVsdWdhIEJlaHIuIApvIElPLTM4MjogIENodW5rZWQgSU8gZm9yIGxhcmdlIGFycmF5cy4KICAgICAgICAgQWRkZWQgd3JpdGVDaHVua2VkKGJ5dGVbXSwgT3V0cHV0U3RyZWFtKSBhbmQgd3JpdGVDaHVua2VkKGNoYXJbXSBXcml0ZXIpCiAgICAgICAgIEFkZGVkIENodW5rZWRPdXRwdXRTdHJlYW0sIENodW5rZWRXcml0ZXIgCm8gSU8tMjMzOiAgQWRkIE1ldGhvZHMgZm9yIEJ1ZmZlcmluZyBTdHJlYW1zL1dyaXRlcnMgVG8gSU9VdGlscwogICAgICAgICBBZGRlZCBvdmVybG9hZGVkIGJ1ZmZlcigpIG1ldGhvZHMgLSBzZWUgYWxzbyBJTy0zMzAgCm8gSU8tMzMwOiAgSU9VdGlscyN0b0J1ZmZlcmVkT3V0cHV0U3RyZWFtL3RvQnVmZmVyZWRXcml0ZXIgdG8gY29uZGl0aW9uYWxseSB3cmFwIHRoZSBvdXRwdXQKICAgICAgICAgQWRkZWQgb3ZlcmxvYWRlZCBidWZmZXIoKSBtZXRob2RzIC0gc2VlIGFsc28gSU8tMjMzIApvIElPLTM4MTogIEFkZCBGaWxlVXRpbHMuY29weUlucHV0U3RyZWFtVG9GaWxlIEFQSSB3aXRoIG9wdGlvbiB0byBsZWF2ZSB0aGUgc291cmNlIG9wZW4uCiAgICAgICAgU2VlIGNvcHlJbnB1dFN0cmVhbVRvRmlsZShmaW5hbCBJbnB1dFN0cmVhbSBzb3VyY2UsIGZpbmFsIEZpbGUgZGVzdGluYXRpb24sIGJvb2xlYW4gY2xvc2VTb3VyY2UpIApvIElPLTM3OTogIENoYXJTZXF1ZW5jZUlucHV0U3RyZWFtIC0gYWRkIHRlc3RzIGZvciBhdmFpbGFibGUoKQogICAgICAgICBGaXggY29kZSBzbyBpdCByZWFsbHkgZG9lcyByZWZsZWN0IGEgbWluaW11bSBhdmFpbGFibGUuIApvIElPLTM0NjogIEFkZCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0udG9JbnB1dFN0cmVhbSgpIApvIElPLTM0MTogIEEgY29uc3RhbnQgZm9yIGhvbGRpbmcgdGhlIEJPTSBjaGFyYWN0ZXIgKFUrRkVGRikgCm8gSU8tMzYxOiAgQWRkIEFQSSBGaWxlVXRpbHMuZm9yY2VNa2RpcnNQYXJlbnQoKS4gCm8gSU8tMzYwOiAgQWRkIEFQSSBDaGFyc2V0cy5yZXF1aXJlZENoYXJzZXRzKCkuIApvIElPLTM1OTogIEFkZCBJT1V0aWxzLnNraXAgYW5kIHNraXBGdWxseShSZWFkYWJsZUJ5dGVDaGFubmVsLCBsb25nKS4gVGhhbmtzIHRvIHl1a29iYS4gCm8gSU8tMzU4OiAgQWRkIElPVXRpbHMucmVhZCBhbmQgcmVhZEZ1bGx5KFJlYWRhYmxlQnl0ZUNoYW5uZWwsIEJ5dGVCdWZmZXIgYnVmZmVyKS4gVGhhbmtzIHRvIHl1a29iYS4gCm8gSU8tMzUzOiAgQWRkIEFQSSBJT1V0aWxzLmNvcHkoSW5wdXRTdHJlYW0sIE91dHB1dFN0cmVhbSwgaW50KSBUaGFua3MgdG8gZ2dyZWdvcnkuIApvIElPLTM0OTogIEFkZCBBUEkgd2l0aCBhcnJheSBvZmZzZXQgYW5kIGxlbmd0aCBhcmd1bWVudCB0byBGaWxlVXRpbHMud3JpdGVCeXRlQXJyYXlUb0ZpbGUuIFRoYW5rcyB0byBzY29wLiAKbyBJTy0zNDg6ICBNaXNzaW5nIGluZm9ybWF0aW9uIGluIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB0aHJvd24gYnkgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlscyN2YWxpZGF0ZUxpc3RGaWxlc1BhcmFtZXRlcnMuIFRoYW5rcyB0byBwbGNzdHBpZXJyZS4gCm8gSU8tMzQ1OiAgU3VwcGx5IGEgaG9vayBtZXRob2QgYWxsb3dpbmcgVGFpbGVyIGFjdGl2ZWx5IGRldGVybWluaW5nIHN0b3AgY29uZGl0aW9uLiBUaGFua3MgdG8gbWtyZXNzZS4gCm8gSU8tNDM3OiAgTWFrZSBJT1V0aWxzLkVPRiBwdWJsaWMgYW5kIHJldXNlIGl0IGluIHZhcmlvdXMgY2xhc3Nlcy4gCgpGaXhlZCBCdWdzOgpvIElPLTQ0NjogIGFkZHMgYW4gZW5kT2ZGaWxlUmVhY2hlZCBtZXRob2QgdG8gdGhlIFRhaWxlckxpc3RlbmVyIFRoYW5rcyB0byBKZWZmcmV5IEJhcnJ1cy4gCm8gSU8tNDg0OiAgRmlsZW5hbWVVdGlscyBzaG91bGQgaGFuZGxlIGVtYmVkZGVkIG51bGwgYnl0ZXMgVGhhbmtzIHRvIFBoaWxpcHBlIEFydGVhdS4gCm8gSU8tNDgxOiAgQ2hhbmdlZC9Db3JyZWN0ZWQgYWxnb3JpdGhtIGZvciB3YWl0Rm9yIApvIElPLTQyODogIEJPTUlucHV0U3RyZWFtLnNraXAgcmV0dXJucyB3cm9uZyBjb3VudCBpZiBzdHJlYW0gY29udGFpbnMgbm8gQk9NIFRoYW5rcyB0byBTdGVmYW4gR21laW5lci4gCm8gSU8tNDg4OiAgRmlsZVV0aWxzLndhaXRGb3IoLi4uKSBzd2FsbG93cyB0aHJlYWQgaW50ZXJydXB0ZWQgc3RhdHVzIFRoYW5rcyB0byBCavZybiBCdWNobmVyLiAKbyBJTy00NTI6ICBTdXBwb3J0IGZvciBzeW1saW5rcyB3aXRoIG1pc3NpbmcgdGFyZ2V0LiBBZGRlZCBzdXBwb3J0IGZvciBKREs3IHN5bWxpbmsgZmVhdHVyZXMgd2hlbiBwcmVzZW50IFRoYW5rcyB0byBEYXZpZCBTdGFuZGlzaC4gCm8gSU8tNDUzOiAgUmVncmVzc2lvbiBpbiBGaWxlVXRpbHMucmVhZEZpbGVUb1N0cmluZyBmcm9tIDIuMC4xIFRoYW5rcyB0byBTdGV2ZW4gQ2hyaXN0b3UuIApvIElPLTQ1MTogIGFudCB0ZXN0IGZhaWxzIC0gcmVzb3VyY2VzIG1pc3NpbmcgZnJvbSB0ZXN0IGNsYXNzcGF0aCBUaGFua3MgdG8gRGF2aWQgU3RhbmRpc2guIApvIElPLTQzNTogIERvY3VtZW50IHRoYXQgRmlsZVV0aWxzLmRlbGV0ZURpcmVjdG9yeSwgZGlyZWN0b3J5Q29udGFpbnMgYW5kIGNsZWFuRGlyZWN0b3J5CiAgICAgICAgIG1heSB0aHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSB0aGUgcGFzc2VkIGRpcmVjdG9yeSBkb2VzIG5vdAogICAgICAgICBleGlzdCBvciBpcyBub3QgYSBkaXJlY3RvcnkuIFRoYW5rcyB0byBEb21pbmlrIFN0YWRsZXIuIApvIElPLTQyNDogIEphdmFkb2MgZml4ZXMsIG1vc3RseSB0byBhcHBlYXNlIDEuOC4wIFRoYW5rcyB0byBWaWxsZSBTa3l0dOQuIApvIElPLTM4OTogIEZpbGVVdGlscy5zaXplT2ZEaXJlY3RvcnkgY2FuIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaGFua3MgdG8gQXVzdGluIERvdXBuaWsuIApvIElPLTM5MDogIEZpbGVVdGlscy5zaXplT2ZEaXJlY3RvcnlBc0JpZ0ludGVnZXIgY2FuIG92ZXJmbG93LgogICAgICAgICBFbnN1cmUgdGhhdCByZWN1cnNpdmUgY2FsbHMgYWxsIHVzZSBCaWdJbnRlZ2VyIApvIElPLTM4NTogIEZpbGVVdGlscy5kb0NvcHlGaWxlIGNhbiBwb3RlbnRpYWxseSBsb29wIGZvciBldmVyCiAgICAgICAgIEV4aXQgbG9vcCBpZiBubyBkYXRhIHRvIGNvcHkgCm8gSU8tMzgzOiAgRmlsZVV0aWxzLmRvQ29weUZpbGUgY2FjaGVzIHRoZSBmaWxlIHNpemU7IG5lZWRzIHRvIGJlIGRvY3VtZW50ZWQKICAgICAgICAgQWRkZWQgSmF2YWRvYzsgc2hvdyBmaWxlIGxlbmd0aHMgaW4gZXhjZXB0aW9uIG1lc3NhZ2UgCm8gSU8tMzgwOiAgRmlsZVV0aWxzLmNvcHlJbnB1dFN0cmVhbVRvRmlsZSBzaG91bGQgZG9jdW1lbnQgaXQgY2xvc2VzIHRoZSBpbnB1dCBzb3VyY2UgVGhhbmtzIHRvIGNsYXVkaW9fY2guIApvIElPLTI3OTogIFRhaWxlciBlcnJvbmVvdXNseSBjb25zaWRlcnMgZmlsZSBhcyBuZXcuCiAgICAgICAgRml4IHRvIHVzZSBmaWxlLmxhc3RNb2RpZmllZCgpIHJhdGhlciB0aGFuIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIApvIElPLTM1NjogIENoYXJTZXF1ZW5jZUlucHV0U3RyZWFtI3Jlc2V0KCkgYmVoYXZlcyBpbmNvcnJlY3RseSBpbiBjYXNlIHdoZW4gYnVmZmVyIHNpemUgaXMgbm90IGRpdmlkYWJsZSBieSBkYXRhIHNpemUuCiAgICAgICAgIEZpeCBjb2RlIHNvIHNraXAgcmVsYXRlcyB0byB0aGUgZW5jb2RlZCBieXRlczsgcmVzZXQgbm93IHJlLWVuY29kZXMgdGhlIGRhdGEgdXAgdG8gdGhlIHBvaW50IG9mIHRoZSBtYXJrIApvIElPLTM2ODogIENsYXNzTG9hZGVyT2JqZWN0SW5wdXRTdHJlYW0gZG9lcyBub3QgaGFuZGxlIHByaW1pdGl2ZSB0eXBlZCBtZW1iZXJzIApvIElPLTMxNDogIERlcHJlY2F0ZSBhbGwgbWV0aG9kcyB0aGF0IHVzZSB0aGUgZGVmYXVsdCBlbmNvZGluZyAKbyBJTy0zMzg6ICBXaGVuIGEgZmlsZSBpcyByb3RhdGVkLCBmaW5pc2ggcmVhZGluZyBwcmV2aW91cyBmaWxlIHByaW9yIHRvIHN0YXJ0aW5nIG5ldyBvbmUgCm8gSU8tMzU0OiAgQ29tbW9ucyBJTyBUYWlsZXIgZG9lcyBub3QgcmVzcGVjdCBVVEYtOCBDaGFyc2V0LiAKbyBJTy0zMjM6ICBXaGF0IHNob3VsZCBoYXBwZW4gaW4gRmlsZVV0aWxzLnNpemVPZltEaXJlY3RvcnldIHdoZW4gYW4gb3ZlcmZsb3cgdGFrZXMgcGxhY2U/CiAgICAgICAgQWRkZWQgSmF2YWRvYy4gCm8gSU8tMzcyOiAgRmlsZVV0aWxzLm1vdmVEaXJlY3RvcnkgY2FuIHByb2R1Y2UgbWlzbGVhZGluZyBlcnJvciBtZXNzYWdlIG9uIGZhaWx1cmUKbyBJTy0zNjI6ICBJT1V0aWxzLmNvbnRlbnRFcXVhbHMqIG1ldGhvZHMgcmV0dXJucyBmYWxzZSBpZiBpbnB1dDEgPT0gaW5wdXQyLCBzaG91bGQgcmV0dXJuIHRydWUuIFRoYW5rcyB0byBtbWFkc29uLCBnZ3JlZ29yeS4gCm8gSU8tMzU3OiAgW1RhaWxlcl0gSW50ZXJydXB0ZWRFeGNlcHRpb24gd2hpbGUgdGhlIHRocmVhZCBpcyBzbGVlcGluZyBpcyBzaWxlbnRseSBpZ25vcmVkIFRoYW5rcyB0byBtb3J0ZW5oLiAKbyBJTy0zNTI6ICBTcGVsbGluZyBmaXhlcy4gVGhhbmtzIHRvIHNjb3AuIApvIElPLTQzNjogIEltcHJvcGVyIEphdmFkb2MgY29tbWVudCBmb3IgRmlsZW5hbWVVdGlscy5pbmRleE9mRXh0ZW5zaW9uLiBUaGFua3MgdG8gY2hyaXN0b3BoLnNjaG5lZWdhbnMuIAoKQ2hhbmdlczoKbyBJTy00MzM6ICBDb252ZXJ0ZWQgYWxsIHRlc3RjYXNlcyB0byBKVW5pdCA0IApvIElPLTQ2NjogIEFkZGVkIHRlc3RjYXNlIHRvIHNob3cgdGhpcyB3YXMgZml4ZWQgd2l0aCBJTy00MjMgCm8gSU8tNDc5OiAgQ29ycmVjdCBleGNlcHRpb24gbWVzc2FnZSBpbiBGaWxlVXRpbHMuZ2V0RmlsZShGaWxlLCBTdHJpbmcuLi4pIFRoYW5rcyB0byBaaG91Y2UgQ2hlbi4gCm8gSU8tNDY1OiAgVXBkYXRlIHRvIEpVbml0IDQuMTIgVGhhbmtzIHRvIGJhc2VkMi4gCm8gSU8tNDYyOiAgSU9FeGNlcHRpb25XaXRoQ2F1c2Ugbm8gbG9uZ2VyIG5lZWRlZCAKbyBJTy00MjI6ICBEZXByZWNhdGUgQ2hhcnNldHMgQ2hhcnNldCBjb25zdGFudHMgaW4gZmF2b3Igb2YgSmF2YSA3J3MgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzIApvIElPLTIzOTogIENvbnZlcnQgSU9DYXNlIHRvIGEgSmF2YSAxLjUrIEVudW1lcmF0aW9uCiAgICAgICAgIFtOLkIuIHRoaXMgaXMgYmluYXJ5IGNvbXBhdGlibGVdIApvIElPLTMyODogIGdldFByZWZpeExlbmd0aCByZXR1cm5zIG51bGwgaWYgZmlsZW5hbWUgaGFzIGxlYWRpbmcgc2xhc2hlcwogICAgICAgIEphdmFkb2M6IGFkZCBleGFtcGxlcyB0byBzaG93IGNvcnJlY3QgYmVoYXZpb3I7IGFkZCB1bml0IHRlc3RzIApvIElPLTI5OTogIEZpbGVVdGlscy5saXN0RmlsZXNBbmREaXJzIGluY2x1ZGVzIG9yaWdpbmFsIGRpciBpbiByZXN1bHRzIGV2ZW4gd2hlbiBpdCBkb2Vzbid0IG1hdGNoIGZpbHRlcgogICAgICAgIEphdmFkb2M6IGNsYXJpZnkgdGhhdCBvcmlnaW5hbCBkaXIgaXMgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMgCm8gSU8tMzc1OiAgRmlsZW5hbWVVdGlscy5zcGxpdE9uVG9rZW5zKFN0cmluZyB0ZXh0KSBjaGVjayBmb3IgJyoqJyBjb3VsZCBiZSBzaW1wbGlmaWVkIApvIElPLTM3NDogIFdpbGRjYXJkRmlsZUZpbHRlciBjdG9ycyBzaG91bGQgbm90IHVzZSBudWxsIHRvIG1lYW4gSU9DYXNlLlNFTlNJVElWRSB3aGVuIGRlbGVnYXRpbmcgdG8gb3RoZXIgY3RvcnMgCgpDb21wYXRpYmlsaXR5IHdpdGggMi40OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogWWVzLgpTZW1hbnRpYyBjb21wYXRpYmxlOiBZZXMuCgpDb21wYXRpYmlsaXR5IHdpdGggMi4yIGFuZCAxLjQ6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBObywgc2VlIHRoZSByYXJlIGNhc2UgaW4gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9JTy0zMTguClNlbWFudGljIGNvbXBhdGlibGU6IE5vLCBzZWUgdGhlIHJhcmUgY2FzZSBpbiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0lPLTMxOC4KCkNvbW1vbnMgSU8gMi43IGFuZCB1cCByZXF1aXJlcyBKYXZhIDggb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi42IHJlcXVpcmVzIEphdmEgNyBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjMgdGhyb3VnaCAyLjUgcmVxdWlyZXMgSmF2YSA2IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMiByZXF1aXJlcyBKYXZhIDUgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpBcGFjaGUgQ29tbW9ucyBJTyBWZXJzaW9uIDIuNAoKQ2hhbmdlcyBpbiB0aGlzIHZlcnNpb24gaW5jbHVkZToKCk5ldyBmZWF0dXJlczoKbyBJTy0yNjk6ICBUYWlsZXIgbG9ja3MgZmlsZSBmcm9tIGRlbGV0aW9uL3JlbmFtZSBvbiBXaW5kb3dzLiBUaGFua3MgdG8Kc2ViYi4KbyBJTy0zMzM6ICBFeHBvcnQgT1NHaSBwYWNrYWdlcyBhdCB2ZXJzaW9uIDEueCBpbiBhZGRpdGlvbiB0byAyLnguIFRoYW5rcwp0byBmbWVzY2hiZS4KbyBJTy0zMjA6ICBBZGQgWG1sU3RyZWFtUmVhZGVyIHN1cHBvcnQgZm9yIFVURi0zMi4gVGhhbmtzIHRvIGdncmVnb3J5LgpvIElPLTMzMTogIEJPTUlucHV0U3RyZWFtIHdyb25nbHkgZGV0ZWN0cyBVVEYtMzJMRV9CT00gZmlsZXMgYXMKVVRGLTE2TEVfQk9NIGZpbGVzIGluIG1ldGhvZCBnZXRCT00oKS4gVGhhbmtzIHRvIGdncmVnb3J5LgpvIElPLTMyNzogIEFkZCBieXRlQ291bnRUb0Rpc3BsYXlTaXplKEJpZ0ludGVnZXIpLiBUaGFua3MgdG8gZ2dyZWdvcnkuCm8gSU8tMzI2OiAgQWRkIG5ldyBGaWxlVXRpbHMuc2l6ZU9mW0RpcmVjdG9yeV0gQVBJcyB0byByZXR1cm4gQmlnSW50ZWdlci4KVGhhbmtzIHRvIGdncmVnb3J5LgpvIElPLTMyNTogIEFkZCBJT1V0aWxzLnRvQnl0ZUFycmF5IG1ldGhvZHMgdG8gd29yayB3aXRoIFVSTCBhbmQgVVJJLiBUaGFua3MKdG8gcmF2aXByYWsuCm8gSU8tMzI0OiAgQWRkIG1pc3NpbmcgQ2hhcnNldCBzaXN0ZXIgQVBJcyB0byBtZXRob2QgdGhhdCB0YWtlIGEgU3RyaW5nCmNoYXJzZXQgbmFtZS4gVGhhbmtzIHRvIHJhdmlwcmFrLgoKRml4ZWQgQnVnczoKbyBJTy0zMzY6ICBZb3R0YWJ5dGUgKFlCKSBpbmNvcnJlY3RseSBkZWZpbmVkIGluIEZpbGVVdGlscy4gVGhhbmtzIHRvCnJsZWF2ZWxsZS4KbyBJTy0yNzk6ICBUYWlsZXIgZXJyb25lb3VzbHkgY29uc2lkZXJzIGZpbGUgYXMgbmV3LiBUaGFua3MgdG8gU2VyZ2lvCkJvc3NhLCBDaHJpcyBCYXJvbi4KbyBJTy0zMzU6ICBUYWlsZXIjcmVhZExpbmVzIC0gaW5jb3JyZWN0IENSIGhhbmRsaW5nLgpvIElPLTMzNDogIEZpbGVVdGlscy50b1VSTHMgdGhyb3dzIE5QRSBmb3IgbnVsbCBwYXJhbWV0ZXI7IGRvY3VtZW50IHRoZQpiZWhhdmlvci4KbyBJTy0zMzI6ICBJbXByb3ZlIHRhaWxlcidzIHJlYWRpbmcgcGVyZm9ybWFuY2UuIFRoYW5rcyB0byBsaWFuZ2x5LgpvIElPLTI3OTogIEltcHJvdmUgVGFpbGVyIHBlcmZvcm1hbmNlIHdpdGggYnVmZmVyZWQgcmVhZHMgKHNlZSBJTy0zMzIpLgpvIElPLTMyOTogIEZpbGVVdGlscy53cml0ZUxpbmVzIHVzZXMgdW5idWZmZXJlZCBJTy4gVGhhbmtzIHRvIHRpdnYuCm8gSU8tMzE5OiAgRmlsZVV0aWxzLnNpemVPZkRpcmVjdG9yeSBmb2xsb3dzIHN5bWJvbGljIGxpbmtzLiBUaGFua3MgdG8KcmF2aXByYWsuCgoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuMzoKQmluYXJ5IGNvbXBhdGlibGU6IFllcy4KU291cmNlIGNvbXBhdGlibGU6IFllcy4KU2VtYW50aWMgY29tcGF0aWJsZTogWWVzLgoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuMiBhbmQgMS40OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogTm8sIHNlZSB0aGUgcmFyZSBjYXNlIGluIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSU8tMzE4LgpTZW1hbnRpYyBjb21wYXRpYmxlOiBObywgc2VlIHRoZSByYXJlIGNhc2UgaW4gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9JTy0zMTguCgpDb21tb25zIElPIDIuNyBhbmQgdXAgcmVxdWlyZXMgSmF2YSA4IG9yIGFib3ZlLgpDb21tb25zIElPIDIuNiByZXF1aXJlcyBKYXZhIDcgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4zIHRocm91Z2ggMi41IHJlcXVpcmVzIEphdmEgNiBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjIgcmVxdWlyZXMgSmF2YSA1IG9yIGFib3ZlLgpDb21tb25zIElPIDEuNCByZXF1aXJlcyBKYXZhIDEuMyBvciBhYm92ZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQXBhY2hlIENvbW1vbnMgSU8gVmVyc2lvbiAyLjMKCkNoYW5nZXMgaW4gdGhpcyB2ZXJzaW9uIGluY2x1ZGU6CgpOZXcgZmVhdHVyZXM6Cm8gSU8tMzIyOiAgQWRkIGFuZCB1c2UgY2xhc3MgQ2hhcnNldHMuIFRoYW5rcyB0byBnZ3JlZ29yeS4gCm8gSU8tMzIxOiAgQnl0ZU9yZGVyTWFyayBVVEZfMzJMRSBpcyBpbmNvcnJlY3QuIFRoYW5rcyB0byBnZ3JlZ29yeS4gCm8gSU8tMzE4OiAgQWRkIENoYXJzZXQgc2lzdGVyIEFQSXMgdG8gbWV0aG9kIHRoYXQgdGFrZSBhIFN0cmluZyBjaGFyc2V0IG5hbWUuIFRoYW5rcyB0byBnZ3JlZ29yeS4gCgpDb21wYXRpYmlsaXR5IHdpdGggMi4yIGFuZCAxLjQ6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBObywgc2VlIHRoZSByYXJlIGNhc2UgaW4gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9JTy0zMTguClNlbWFudGljIGNvbXBhdGlibGU6IE5vLCBzZWUgdGhlIHJhcmUgY2FzZSBpbiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0lPLTMxOC4KCkNvbW1vbnMgSU8gMi43IGFuZCB1cCByZXF1aXJlcyBKYXZhIDggb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi42IHJlcXVpcmVzIEphdmEgNyBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjMgdGhyb3VnaCAyLjUgcmVxdWlyZXMgSmF2YSA2IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMiByZXF1aXJlcyBKYXZhIDUgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpBcGFjaGUgQ29tbW9ucyBJTyBWZXJzaW9uIDIuMgoKQ2hhbmdlcyBpbiB0aGlzIHZlcnNpb24gaW5jbHVkZToKCk5ldyBmZWF0dXJlczoKbyBBZGQgSU9VdGlscy50b0J1ZmZlcmVkUmVhZGVyKFJlYWRlcikgIElzc3VlOiBJTy0zMTMuIFRoYW5rcyB0byBnZ3JlZ29yeS4KbyBBbGxvdyBhcHBsaWNhdGlvbnMgdG8gcHJvdmlkZSBidWZmZXIgKG9yIHNpemUpIGZvciBjb3B5TGFyZ2UgbWV0aG9kcy4gIElzc3VlOiBJTy0zMDguIFRoYW5rcyB0byBNYW5vaiBNb2thc2hpLiAKbyBOZXcgY29weUxhcmdlKCkgbWV0aG9kIGluIElPVXRpbHMgdGhhdCB0YWtlcyBhZGRpdGlvbmFsIG9mZnNldCwgbGVuZ3RoIGFyZ3VtZW50cyAgSXNzdWU6IElPLTMwNS4gVGhhbmtzIHRvIE1hbm9qIE1va2FzaGkuIApvIFVzZSB0ZXJhYnl0ZSAoVEIpLCBwZXRhYnl0ZSAoUEIpIGFuZCBleGFieXRlIChFQikgaW4gRmlsZVV0aWxzLmJ5dGVDb3VudFRvRGlzcGxheVNpemUobG9uZyBzaXplKSAgSXNzdWU6IElPLTI4Ny4gVGhhbmtzIHRvIFJvbiBLdXJpcywgR2FyeSBHcmVnb3J5LiAKbyBGaWxlVXRpbHMubGlzdEZpbGVzKCkgZG9lc24ndCByZXR1cm4gZGlyZWN0b3JpZXMgIElzc3VlOiBJTy0xNzMuIFRoYW5rcyB0byBNYXJjb3MgVmlu7WNpdXMgZGEgU2lsdmEuIApvIENoYXJTZXF1ZW5jZUlucHV0U3RyZWFtIHRvIGVmZmljaWVudGx5IHN0cmVhbSBjb250ZW50IG9mIGEgQ2hhclNlcXVlbmNlICBJc3N1ZTogSU8tMjk3LiBUaGFua3MgdG8gT2xlZyBLYWxuaWNoZXZza2kuIApvIFRoZSBzZWNvbmQgY29uc3RydWN0b3Igb2YgVGFpbGVyIGNsYXNzIGRvZXMgbm90IHBhc3MgJ2RlbGF5JyB0byB0aGUgdGhpcmQgb25lICBJc3N1ZTogSU8tMzA0LiBUaGFua3MgdG8gbGlhbmdseS4gCm8gVGVlT3V0cHV0U3RyZWFtIGRvZXMgbm90IGNhbGwgYnJhbmNoLmNsb3NlKCkgd2hlbiBtYWluLmNsb3NlKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbiAgSXNzdWU6IElPLTMwMy4gVGhhbmtzIHRvIGZhYmlhbi5iYXJuZXkuIApvIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpbiBCT01JbnB1dFN0cmVhbSB3aGVuIHJlYWRpbmcgYSBmaWxlIHdpdGhvdXQgQk9NIG11bHRpcGxlIHRpbWVzICBJc3N1ZTogSU8tMzAyLiBUaGFua3MgdG8ganN0ZXVlcndhbGQsIGRldGluaG8uIApvIEFkZCBJT1V0aWxzLmNsb3NlUXVpZXRseShTZWxlY3RvcikgbmVjZXNzYXJ5ICBJc3N1ZTogSU8tMzAxLiBUaGFua3MgdG8ga2F5a2F5LnVuaXF1ZS4gCm8gSU9VdGlscy5jbG9zZVF1aWV0bHkoKSBzaG91bGQgdGFrZSBhIFNlcnZlclNvY2tldCBhcyBhIHBhcmFtZXRlciAgSXNzdWU6IElPLTI5Mi4gVGhhbmtzIHRvIHNlYmIuIApvIEFkZCByZWFkL3JlYWRGdWxseSBtZXRob2RzIHRvIElPVXRpbHMgIElzc3VlOiBJTy0yOTAuIFRoYW5rcyB0byBzZWJiLiAKbyBTdXBwbHkgYSBSZXZlcnNlZExpbmVzRmlsZVJlYWRlciAgSXNzdWU6IElPLTI4OC4gVGhhbmtzIHRvIEdlb3JnIEhlbnpsZXIuIApvIEFkZCBuZXcgZnVuY3Rpb24gRmlsZVV0aWxzLmRpcmVjdG9yeUNvbnRhaW5zLiAgSXNzdWU6IElPLTI5MS4gVGhhbmtzIHRvIGdncmVnb3J5LiAKbyBGaWxlVXRpbHMuY29udGVudEVxdWFscyBhbmQgSU9VdGlscy5jb250ZW50RXF1YWxzIC0gQWRkIG9wdGlvbiB0byBpZ25vcmUgImxpbmUgZW5kaW5ncyIKICAgICAgICBBZGRlZCBjb250ZW50RXF1YWxzSWdub3JlRU9MIG1ldGhvZHMgdG8gYm90aCBjbGFzc2VzICBJc3N1ZTogSU8tMjc1LiBUaGFua3MgdG8gQ0ogQXNwcm9tZ29zLiAKCkZpeGVkIEJ1Z3M6Cm8gSU9VdGlscy5yZWFkKElucHV0U3RyZWFtL1JlYWRlcikgaWdub3JlcyB0aGUgb2Zmc2V0IHBhcmFtZXRlciAgSXNzdWU6IElPLTMxMS4gVGhhbmtzIHRvIFJvYmVydCBNdWlyLiAKbyBDaGFyU2VxdWVuY2VJbnB1dFN0cmVhbShDaGFyU2VxdWVuY2UgcywgQ2hhcnNldCBjaGFyc2V0LCBpbnQgYnVmZmVyU2l6ZSkgaWdub3JlcyBidWZmZXJTaXplICBJc3N1ZTogSU8tMzEyLiAKbyBGaWxlVXRpbHMubW92ZURpcmVjdG9yeVRvRGlyZWN0b3J5IHJlbW92ZXMgc291cmNlIGRpcmVjdG9yeSBpZiBkZXN0aW5hdGlvbiBpcyBhIHN1YmRpcmVjdG9yeSAgSXNzdWU6IElPLTMwMC4gCm8gUmVhZGVySW5wdXRTdHJlYW0jcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgc2hvdWxkIGNoZWNrIGZvciB2YWxpZCBwYXJhbWV0ZXJzICBJc3N1ZTogSU8tMzA3LiAKbyBSZWFkZXJJbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSBzaG91bGQgYWx3YXlzIHJldHVybiAwIGZvciBsZW5ndGggPT0gMCAgSXNzdWU6IElPLTMwNi4gCm8gIkZpbGVVdGlscyNkZWxldGVEaXJlY3RvcnlPbkV4aXQoRmlsZSkiIGRvZXMgbm90IHdvcmsgIElzc3VlOiBJTy0yNzYuIFRoYW5rcyB0byBua2FtaS4gCm8gQm91bmRlZElucHV0U3RyZWFtLnJlYWQoKSB0cmVhdHMgbWF4IGRpZmZlcmVudGx5IGZyb20gQm91bmRlZElucHV0U3RyZWFtLnJlYWQoYnl0ZVtdLi4uKSAgSXNzdWU6IElPLTI3My4gVGhhbmtzIHRvIHNlYmIuIApvIFZhcmlvdXMgbWV0aG9kcyBvZiBjbGFzcyAnb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlscycgaW5jb3JyZWN0bHkgc3VwcHJlc3MgJ2phdmEuaW8uSU9FeGNlcHRpb24nICBJc3N1ZTogSU8tMjk4LiBUaGFua3MgdG8gQ2hyaXN0aWFuIFNjaHVsdGUuIAoKQ2hhbmdlczoKbyBSZWFkZXJJbnB1dFN0cmVhbSBvcHRpbWl6YXRpb246IG1vcmUgZWZmaWNpZW50IHJlYWRpbmcgb2Ygc21hbGwgY2h1bmtzIG9mIGRhdGEgIElzc3VlOiBJTy0yOTYuIFRoYW5rcyB0byBPbGVnIEthbG5pY2hldnNraS4gCgoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuMSBhbmQgMS40OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzClNvdXJjZSBjb21wYXRpYmxlOiBZZXMKU2VtYW50aWMgY29tcGF0aWJsZTogWWVzLiBDaGVjayB0aGUgYnVnIGZpeGVzIHNlY3Rpb24gZm9yIHNlbWFudGljIGJ1ZyBmaXhlcwoKQ29tbW9ucyBJTyAyLjcgYW5kIHVwIHJlcXVpcmVzIEphdmEgOCBvciBhYm92ZS4KQ29tbW9ucyBJTyAyLjYgcmVxdWlyZXMgSmF2YSA3IG9yIGFib3ZlLgpDb21tb25zIElPIDIuMyB0aHJvdWdoIDIuNSByZXF1aXJlcyBKYXZhIDYgb3IgYWJvdmUuCkNvbW1vbnMgSU8gMi4yIHJlcXVpcmVzIEphdmEgNSBvciBhYm92ZS4KQ29tbW9ucyBJTyAxLjQgcmVxdWlyZXMgSmF2YSAxLjMgb3IgYWJvdmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkFwYWNoZSBDb21tb25zIElPIFZlcnNpb24gMi4xCgpOZXcgZmVhdHVyZXM6Cm8gVXNlIHN0YW5kYXJkIE1hdmVuIGRpcmVjdG9yeSBsYXlvdXQgIElzc3VlOiBJTy0yODUuIFRoYW5rcyB0byBnZ3JlZ29yeS4gCm8gQWRkIElPVXRpbHMgQVBJIHRvU3RyaW5nIGZvciBVUkwgYW5kIFVSSSB0byBnZXQgY29udGVudHMgIElzc3VlOiBJTy0yODQuIFRoYW5rcyB0byBnZ3JlZ29yeS4gCm8gQWRkIEFQSSBGaWxlVXRpbHMuY29weUZpbGUoRmlsZSBpbnB1dCwgT3V0cHV0U3RyZWFtIG91dHB1dCkgIElzc3VlOiBJTy0yODIuIFRoYW5rcyB0byBnZ3JlZ29yeS4gCm8gRmlsZUFsdGVyYXRpb25PYnNlcnZlciBoYXMgbm8gZ2V0dGVyIGZvciBGaWxlRmlsdGVyICBJc3N1ZTogSU8tMjYyLiAKbyBBZGQgRmlsZVV0aWxzLmdldEZpbGUgQVBJIHdpdGggdmFyYXJncyBwYXJhbWV0ZXIgIElzc3VlOiBJTy0yNjEuIApvIEFkZCBuZXcgQVBQRU5EIHBhcmFtZXRlciBmb3Igd3JpdGluZyBzdHJpbmcgaW50byBmaWxlcyAgSXNzdWU6IElPLTE4Mi4gCm8gQWRkIG5ldyByZWFkIG1ldGhvZCAidG9CeXRlQXJyYXkiIHRvIGhhbmRsZSBJbnB1dFN0cmVhbSB3aXRoIGtub3duIHNpemUuICBJc3N1ZTogSU8tMjUxLiBUaGFua3MgdG8gTWFyY28gQWxiaW5pLiAKCkZpeGVkIEJ1Z3M6Cm8gRHViaW91cyB1c2Ugb2YgbWtkaXJzKCkgcmV0dXJuIGNvZGUgIElzc3VlOiBJTy0yODAuIFRoYW5rcyB0byBzZWJiLiAKbyBSZWFkZXJJbnB1dFN0cmVhbSBlbnRlcnMgaW5maW5pdGUgbG9vcCB3aGVuIGl0IGVuY291bnRlcnMgYW4gdW5tYXBwYWJsZSBjaGFyYWN0ZXIgIElzc3VlOiBJTy0yNzcuIApvIEZpbGVVdGlscy5tb3ZlRmlsZSgpIEphdmFkb2Mgc2hvdWxkIHNwZWNpZnkgRmlsZUV4aXN0c0V4Y2VwdGlvbiB0aHJvd24gIElzc3VlOiBJTy0yNjQuIApvIENsYXNzTG9hZGVyT2JqZWN0SW5wdXRTdHJlYW0gZG9lcyBub3QgaGFuZGxlIFByb3h5IGNsYXNzZXMgIElzc3VlOiBJTy0yNjAuIApvIFRhaWxlciByZXR1cm5pbmcgcGFydGlhbCBsaW5lcyB3aGVuIHJlYWNoaW5nIEVPRiBiZWZvcmUgRU9MICBJc3N1ZTogSU8tMjc0LiBUaGFua3MgdG8gRnJhbmsgR3JpbWVzLiAKbyBGaWxlVXRpbHMuY29weUZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gd2hlbiBjb3B5aW5nIGxhcmdlIGZpbGVzIHRvIGEgc2hhcmVkIGRpcmVjdG9yeSAob24gV2luZG93cykgIElzc3VlOiBJTy0yNjYuIFRoYW5rcyB0byBJZ29yIFNtZXJla2EuIApvIEZpbGVTeXN0ZW1VdGlscy5mcmVlU3BhY2VLYiB0aHJvd3MgZXhjZXB0aW9uIGZvciBXaW5kb3dzIHZvbHVtZXMgd2l0aCBubyB2aXNpYmxlIGZpbGVzLgogICAgICAgIEltcHJvdmUgY292ZXJhZ2UgYnkgYWxzbyBsb29raW5nIGZvciBoaWRkZW4gZmlsZXMuICBJc3N1ZTogSU8tMjYzLiBUaGFua3MgdG8gR2lsIEFkYW0uIAoKQ2hhbmdlczoKbyBGaWxlQWx0ZXJhdGlvbk1vbml0b3Iuc3RvcChib29sZWFuIGFsbG93SW50ZXJ2YWxUb0ZpbmlzaCkgIElzc3VlOiBJTy0yNTkuIAoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpBcGFjaGUgQ29tbW9ucyBJTyBQYWNrYWdlIDIuMC4xCgpDb21wYXRpYmlsaXR5IHdpdGggMi4wIGFuZCAxLjQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJpbmFyeSBjb21wYXRpYmxlIC0gWWVzCgpTb3VyY2UgY29tcGF0aWJsZSAtIFllcwoKU2VtYW50aWMgY29tcGF0aWJsZSAtIFllcwogIENoZWNrIHRoZSBidWcgZml4ZXMgc2VjdGlvbiBmb3Igc2VtYW50aWMgYnVnIGZpeGVzCgpDb21tb25zIElPIDIuMC4xIHJlcXVpcmVzIEphdmEgNSBvciBhYm92ZQogKENvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlKSAKCkVuaGFuY2VtZW50cyBmcm9tIDIuMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICogW0lPLTI1Nl0gLSBQcm92aWRlIHRocmVhZCBmYWN0b3J5IGZvciBGaWxlQWx0ZXJuYXRpb25Nb25pdG9yCgpCdWcgZml4ZXMgZnJvbSAyLjAKLS0tLS0tLS0tLS0tLS0tLS0tCgogICAqIFtJTy0yNTddIC0gQk9NSW5wdXRTdHJlYW0ucmVhZChieXRlW10pIGNhbiByZXR1cm4gMCB3aGljaCBpdCBzaG91bGQgbm90CiAgICogW0lPLTI1OF0gLSBYbWxTdHJlYW1SZWFkZXIgY29uc3VtZXMgdGhlIHN0cmVhbSBkdXJpbmcgZW5jb2RpbmcgZGV0ZWN0aW9uCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkFwYWNoZSBDb21tb25zIElPIFBhY2thZ2UgMi4wCgpDb21wYXRpYmlsaXR5IHdpdGggMS40Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQmluYXJ5IGNvbXBhdGlibGUgLSBZZXMKClNvdXJjZSBjb21wYXRpYmxlIC0gWWVzCgpTZW1hbnRpYyBjb21wYXRpYmxlIC0gWWVzCiAgQ2hlY2sgdGhlIGJ1ZyBmaXhlcyBzZWN0aW9uIGZvciBzZW1hbnRpYyBidWcgZml4ZXMKCkNvbW1vbnMgSU8gMi4wIHJlcXVpcmVzIEphdmEgNSBvciBhYm9iZQogKENvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEphdmEgMS4zIG9yIGFib3ZlKSAKCkRlcHJlY2F0aW9ucyBmcm9tIDEuNAotLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0gSU9VdGlscwogIC0gd3JpdGUoU3RyaW5nQnVmZmVyLCBXcml0ZXIpIGluIGZhdm91ciBvZiB3cml0ZShDaGFyU2VxdWVuY2UsIFdyaXRlcikKICAtIHdyaXRlKFN0cmluZ0J1ZmZlciwgT3V0cHV0U3RyZWFtKSAgaW4gZmF2b3VyIG9mIHdyaXRlKENoYXJTZXF1ZW5jZSwgT3V0cHV0U3RyZWFtKQogIC0gd3JpdGUoU3RyaW5nQnVmZmVyLCBPdXRwdXRTdHJlYW0sIFN0cmluZykgaW4gZmF2b3VyIG9mIHdyaXRlKENoYXJTZXF1ZW5jZSwgT3V0cHV0U3RyZWFtLCBTdHJpbmcpCgotIEZpbGVGaWx0ZXJVdGlscwogIC0gYW5kRmlsZUZpbHRlcihJT0ZpbGVGaWx0ZXIsIElPRmlsZUZpbHRlcikgaW4gZmF2b3VyIG9mIGFuZChJT0ZpbGVGaWx0ZXIuLi4pIAogIC0gb3JGaWxlRmlsdGVyKElPRmlsZUZpbHRlciwgSU9GaWxlRmlsdGVyKSAgaW4gZmF2b3VyIG9mIG9yKElPRmlsZUZpbHRlci4uLikKCkVuaGFuY2VtZW50cyBmcm9tIDEuNAotLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgKiBbSU8tMTQwXSBNb3ZlIG1pbmltdW0gSmF2YSByZXF1aXJlbWVudCBmcm9tIEphdmEgMS4zIHRvIEphdmEgNQogICAgICAgICAgICAgLSB1c2UgR2VuZXJpY3MKICAgICAgICAgICAgIC0gYWRkIG5ldyBDaGFyU2VxdWVuY2Ugd3JpdGUoKSBmbGF2b3VyIG1ldGhvZHMgdG8gSU9VdGlscyBhbmQgRmlsZVV0aWxzCiAgICAgICAgICAgICAtIHJlcGxhY2UgU3RyaW5nQnVmZmVyIHdpdGggU3RyaW5nQnVpbGRlciwgd2hlcmUgYXBwcm9wcmlhdGUKICAgICAgICAgICAgIC0gYWRkIG5ldyBSZWFkZXIvV3JpdGVyIG1ldGhvZHMgdG8gUHJveHlSZWFkZXIgYW5kIFByb3h5V3JpdGVyCiAgICAgICAgICAgICAtIEFubm90YXRlIHdpdGggQE92ZXJyaWRlIGFuZCBARGVwcmVjYXRlZAoKICAqIFtJTy0xNzhdIE5ldyBCT01JbnB1dFN0cmVhbSBhbmQgQnl0ZU9yZGVyTWFyayBpbXBsZW1lbnRhdGlvbnMgLSB0byBkZXRlY3QgYW5kIG9wdGlvbmFsbHkgZXhjbHVkZSBhbiBpbml0aWFsIEJ5dGUgT3JkZXIgbWFyayAoQk9NKQogICogW0lPLTE5N10gTmV3IEJvdW5kZWRJbnB1dFN0cmVhbSAoY29waWVkIGZyb20gQXBhY2hlIEphY2tSYWJiaXQpCiAgKiBbSU8tMTkzXSBOZXcgQnJva2VuIElucHV0IGFuZCBPdXRwdXQgc3RyZWFtcwogICogW0lPLTEzMl0gTmV3IEZpbGUgTGlzdGVuZXIvTW9uaXRvciBmYWNpbGl0eQogICogW0lPLTE1OF0gTmV3IFJlYWRlcklucHV0U3RyZWFtIGFuZCBXcml0ZXJPdXRwdXRTdHJlYW0gaW1wbGVtZW50YXRpb25zCiAgKiBbSU8tMTM5XSBOZXcgU3RyaW5nQnVpbGRlciBXcml0ZXIgaW1wbGVtZW50YXRpb24KICAqIFtJTy0xOTJdIE5ldyBUYWdnZWQgSW5wdXQgYW5kIE91dHB1dCBzdHJlYW1zCiAgKiBbSU8tMTc3XSBOZXcgVGFpbGVyIGNsYXNzIC0gc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBVbml4ICJ0YWlsIC1mIiBmdW5jdGlvbmFsaXR5CiAgKiBbSU8tMTYyXSBOZXcgWE1MIFN0cmVhbSBSZWFkZXIvV3JpdGVyIGltcGxlbWVudGF0aW9ucyAoZnJvbSBST01FIHZpYSBwbGV4dXMtdXRpbHMpCgogICogW0lPLTE0Ml0gQ29tcGFyYXRvcnMgLSBhZGQgZmFjaWxpdHkgdG8gc29ydCBmaWxlIGxpc3RzL2FycmF5cwogICogW0lPLTE4Nl0gQ29tcGFyYXRvcnMgLSBuZXcgQ29tcG9zaXRlIGFuZCBEaXJlY3RvcnkgRmlsZSBDb21wYXJhdG9yIGltcGxlbWVudGF0aW9ucwogICogW0lPLTE3Nl0gRGlyZWN0b3J5V2Fsa2VyIC0gYWRkIGZpbHRlckRpcmVjdG9yeUNvbnRlbnRzKCkgY2FsbGJhY2sgbWV0aG9kIGZvciBmaWx0ZXJpbmcgZGlyZWN0b3J5IGNvbnRlbnRzCiAgKiBbSU8tMjEwXSBGaWxlRmlsdGVyIC0gbmV3IE1hZ2ljIE51bWJlciBGaWxlRmlsdGVyCiAgKiBbSU8tMjIxXSBGaWxlRmlsdGVyVXRpbHMgLSBhZGQgbWV0aG9kcyBmb3Igc3VmZml4IGFuZCBwcmVmaXggZmlsdGVycyB3aGljaCB0YWtlIGFuIElPQ2FzZSBvYmplY3QKICAqIFtJTy0yMzJdIEZpbGVGaWx0ZXJVdGlscyAtIGFkZCBtZXRob2QgZm9yIG5hbWUgZmlsdGVycyB3aGljaCB0YWtlIGFuIElPQ2FzZSBvYmplY3QKICAqIFtJTy0yMjldIEZpbGVGaWx0ZXJVdGlscyAtIGFkZCB2YXJhcmdzIGFuZCgpIGFuZCBvcigpIG1ldGhvZHMKICAqIFtJTy0xOThdIEZpbGVGaWx0ZXJVdGlscyAtIGFkZCBhYmlsaXR5IHRvIGFwcGx5IGZpbGUgZmlsdGVycyB0byBjb2xsZWN0aW9ucyBhbmQgYXJyYXlzCiAgKiBbSU8tMTU2XSBGaWxlbmFtZVV0aWxzIC0gYWRkIG5vcm1hbGl6ZSgpIGFuZCBub3JtYWxpemVOb0VuZFNlcGFyYXRvcigpIG1ldGhvZHMgd2hpY2ggYWxsb3cgdGhlIHNlcGFyYXRvciBjaGFyYWN0ZXIgdG8gYmUgc3BlY2lmaWVkCiAgKiBbSU8tMTk0XSBGaWxlU3lzdGVtVXRpbHMgLSBhZGQgZnJlZVNwYWNlS2IoKSBtZXRob2Qgd2l0aCBubyBpbnB1dCBhcmd1bWVudHMKICAqIFtJTy0xODVdIEZpbGVTeXN0ZW1VdGlscyAtIGFkZCBmcmVlU3BhY2VLYigpIG1ldGhvZHMgdGhhdCB0YWtlIGEgdGltZW91dCBwYXJhbWV0ZXIgLSBmaXhlcyBmcmVlU3BhY2VXaW5kb3dzKCkgYmxvY2tzCiAgKiBbSU8tMTU1XSBGaWxlVXRpbHMgLSB1c2UgTklPIHRvIGNvcHkgZmlsZXMKICAqIFtJTy0xNjhdIEZpbGVVdGlscyAtIGFkZCBuZXcgaXNTeW1saW5rKCkgbWV0aG9kCiAgKiBbSU8tMjE5XSBGaWxlVXRpbHMgLSB0aHJvdyBGaWxlRXhpc3RzRXhjZXB0aW9uIHdoZW4gbW92aW5nIGEgZmlsZSBvciBkaXJlY3RvcnkgaWYgdGhlIGRlc3RpbmF0aW9uIGFscmVhZHkgZXhpc3RzCiAgKiBbSU8tMjM0XSBGaWxlVXRpbHMgLSBhZGQgTWV0aG9kcyBmb3IgcmV0cmlldmluZyBTeXN0ZW0gVXNlci9UZW1wIGRpcmVjdG9yaWVzL3BhdGhzCiAgKiBbSU8tMjA4XSBGaWxlVXRpbHMgLSBhZGQgdGltZW91dCAoY29ubmVjdGlvbiBhbmQgcmVhZCkgc3VwcG9ydCBmb3IgY29weVVSTFRvRmlsZSgpIG1ldGhvZCAKICAqIFtJTy0yMzhdIEZpbGVVdGlscyAtIGFkZCBzaXplT2YoRmlsZSkgbWV0aG9kCiAgKiBbSU8tMTgxXSBMaW5lSXRlcmF0b3Igbm93IGltcGxlbWVudHMgSXRlcmFibGUKICAqIFtJTy0yMjRdIElPVXRpbHMgLSBhZGQgY2xvc2VRdWlldGx5KENsb3NlYWJsZSkgYW5kIGNsb3NlUXVpZXRseShTb2NrZXQpIG1ldGhvZHMKICAqIFtJTy0yMDNdIElPVXRpbHMgLSBhZGQgc2tpcEZ1bGx5KCkgbWV0aG9kIGZvciBJbnB1dFN0cmVhbXMKICAqIFtJTy0xMzddIElPVXRpbHMgYW5kIEJ5dGVBcnJheU91dHB1dFN0cmVhbSAtIGFkZCB0b0J1ZmZlcmVkSW5wdXRTdHJlYW0oKSBtZXRob2QgdG8gYXZvaWQgdW5uZWNlc3NhcnkgYXJyYXkgYWxsb2NhdGlvbi9jb3B5CiAgKiBbSU8tMTk1XSBQcm94eSBzdHJlYW1zL1JlYWRlci9Xcml0ZXIgLSBwcm92aWRlIGV4Y2VwdGlvbiBoYW5kbGluZyBtZXRob2RzCiAgKiBbSU8tMjExXSBQcm94eSBJbnB1dC9PdXRwdXQgc3RyZWFtcyAtIGFkZCBwcmUvcG9zdCBwcm9jZXNzaW5nIHN1cHBvcnQKICAqIFtJTy0yNDJdIFByb3h5IFJlYWRlci9Xcml0ZXIgLSBhZGQgcHJlL3Bvc3QgcHJvY2Vzc2luZyBzdXBwb3J0CgpCdWcgZml4ZXMgZnJvbSAxLjQKLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBbSU8tMjE0XSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gLSBmaXggaW5jb25zaXN0ZW50IHN5bmNocm9uaXphdGlvbiBvZiBmaWVsZHMKICAqIFtJTy0yMDFdIENvdW50aW5nIElucHV0L091dHB1dCBzdHJlYW1zIC0gZml4IGluY29uc2lzdGVudCBzeW5jaHJvbml6YXRpb24KICAqIFtJTy0xNTldIEZpbGVDbGVhbmluZ1RyYWNrZXIgLSBmaXggcmVtb3ZlKCkgbmV2ZXIgcmV0dXJucyBudWxsCiAgKiBbSU8tMjIwXSBGaWxlQ2xlYW5pbmdUcmFja2VyIC0gZml4IFZlY3RvciBwZXJmb3JtcyBiYWRseSB1bmRlciBsb2FkCiAgKiBbSU8tMTY3XSBGaWxlbmFtZVV0aWxzIC0gZml4IGNhc2UtaW5zZW5zaXRpdmUgc3RyaW5nIGhhbmRsaW5nIGluIEZpbGVuYW1lVXRpbHMgYW5kIEZpbGVzeXN0ZW1VdGlscwogICogW0lPLTE3OV0gRmlsZW5hbWVVdGlscyAtIGZpeCBTdHJpbmdJbmRleE91dE9mQm91bmRzIGV4Y2VwdGlvbiBpbiBnZXRQYXRoTm9FbmRTZXBhcmF0b3IoKQogICogW0lPLTI0OF0gRmlsZW5hbWVVdGlscyAtIGZpeCBnZXRGdWxsUGF0aE5vRW5kU2VwYXJhdG9yKCkgcmV0dXJucyBlbXB0eSB3aGlsZSBwYXRoIGlzIGEgb25lIGxldmVsIGRpcmVjdG9yeQogICogW0lPLTI0Nl0gRmlsZW5hbWVVdGlscyAtIGZpeCB3aWxkY2FyZE1hdGNoIGdpdmVzIGluY29ycmVjdCByZXN1bHRzIAogICogW0lPLTE4N10gRmlsZVN5c3RlbVV0aWxzIC0gZml4IGZyZWVTcGFjZUtiKCkgZG9lc24ndCB3b3JrIHdpdGggcmVsYXRpdmUgcGF0aHMgb24gTGludXgKICAqIFtJTy0xNjBdIEZpbGVTeXN0ZW1VdGlscyAtIGZpeCBmcmVlU3BhY2UoKSBmYWlscyBvbiBzb2xhcmlzCiAgKiBbSU8tMjA5XSBGaWxlU3lzdGVtVXRpbHMgLSBmaXggZnJlZVNwYWNlS2IoKSBmYWlscyB0byByZXR1cm4gY29ycmVjdCBzaXplIGZvciBhIHdpbmRvd3MgbW91bnQgcG9pbnQKICAqIFtJTy0xNjNdIEZpbGVVdGlscyAtIGZpeCB0b1VSTHMoKSB1c2luZyBkZXByZWNhdGVkIG1ldGhvZCBvZiBjb252ZXJzaW9uIHRvIFVSTAogICogW0lPLTE2OF0gRmlsZVV0aWxzIC0gZml4IFN5bWJvbGljIGxpbmtzIGZvbGxvd2VkIHdoZW4gZGVsZXRpbmcgZGlyZWN0b3J5CiAgKiBbSU8tMjMxXSBGaWxlVXRpbHMgLSBmaXggd3JvbmcgZXhjZXB0aW9uIG1lc3NhZ2UgZ2VuZXJhdGVkIGluIGlzRmlsZU5ld2VyKCkgbWV0aG9kCiAgKiBbSU8tMjA3XSBGaWxlVXRpbHMgLSBmaXggcmFjZSBjb25kaXRpb24gaW4gZm9yY2VNa2RpcigpIG1ldGhvZAogICogW0lPLTIxN10gRmlsZVV0aWxzIC0gZml4IGNvcHlEaXJlY3RvcnlUb0RpcmVjdG9yeSgpIG1ha2VzIGluZmluaXRlIGxvb3BzCiAgKiBbSU8tMTY2XSBGaWxlVXRpbHMgLSBmaXggVVJMIGRlY29kaW5nIGluIHRvRmlsZShVUkwpCiAgKiBbSU8tMTkwXSBGaWxlVXRpbHMgLSBmaXggY29weURpcmVjdG9yeSBub3QgcHJlc2VydmluZyBsYXN0bW9kaWZpZWQgZGF0ZSBvbiBzdWJkaXJlY3RvcmllcwogICogW0lPLTI0MF0gRmlsZUZpbHRlclV0aWxzIC0gZW5zdXJlIGN2c0ZpbHRlciBhbmQgc3ZuRmlsdGVyIGFyZSBvbmx5IGNyZWF0ZWQgb25jZS4KICAqIFtJTy0xNzVdIElPVXRpbHMgLSBmaXggY29weUZpbGUoKSBpc3N1ZXMgd2l0aCB2ZXJ5IGxhcmdlIGZpbGVzCiAgKiBbSU8tMTkxXSBJbXByb3ZlbWVudHMgZnJvbSBzdGF0aWMgYW5hbHlzaXMKICAqIFtJTy0yMTZdIExvY2thYmxlRmlsZVdyaXRlciAtIGRlbGV0ZSBmaWxlcyBxdWlldGx5IHdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgaW5pdGlhbGl6YXRpb24KICAqIFtJTy0yNDNdIFN3YXBwZWREYXRhSW5wdXRTdHJlYW0gLSBmaXggcmVhZEJvb2xlYW4gaXMgaW52ZXJ0ZWQKICAqIFtJTy0yMzVdIFRlc3RzIC0gcmVtb3ZlIHVudXNlZCBZZWxsT25GbHVzaEFuZENsb3NlT3V0cHV0U3RyZWFtIGZyb20gQ29weVV0aWxzVGVzdAogICogW0lPLTE2MV0gVGVzdHMgLSBmaXggRmlsZUNsZWFuaW5nVHJhY2tlclRlc3RDYXNlIGhhbmdpbmcKCkRvY3VtZW50YXRpb24gY2hhbmdlcyBmcm9tIDEuNAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFtJTy0xODMgRmlsZW5hbWVVdGlscy5nZXRFeHRlbnNpb24oKSBtZXRob2QgZG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMKICAqIFtJTy0yMjYgRmlsZVV0aWxzLmJ5dGVDb3VudFRvRGlzcGxheVNpemUoKSBkb2N1bWVudGF0aW9uIGNvcnJlY3Rpb25zCiAgKiBbSU8tMjA1IEZpbGVVdGlscy5mb3JjZU1rZGlyKCkgZG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMKICAqIFtJTy0yMTUgRmlsZVV0aWxzIGNvcHkgZmlsZS9kaXJlY3RvcnkgaW1wcm92ZSBkb2N1bWVudGF0aW9uIHJlZ2FyZGluZyBwcmVzZXJ2aW5nIHRoZSBsYXN0IG1vZGlmaWVkIGRhdGUKICAqIFtJTy0xODkgSGV4RHVtcC5kdW1wKCkgbWV0aG9kIGRvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzCiAgKiBbSU8tMTcxIElPQ2FzZSBkb2N1bWVudCB0aGF0IGl0IGFzc3VtZXMgdGhlcmUgYXJlIG9ubHkgdHdvIE9TZXM6IFdpbmRvd3MgYW5kIFVuaXgKICAqIFtJTy0yMjMgSU9VdGlscy5jb3B5KCkgZG9jdW1lbnRhdGlvbiBjb3JyZWN0aW9ucwogICogW0lPLTI0NyBJT1V0aWxzLmNsb3NlUXVpZXRseSgpIGltcHJvdmUgZG9jdW1lbnRhdGlvbiB3aXRoIGV4YW1wbGVzCiAgKiBbSU8tMjAyIE5vdEZpbGVGaWx0ZXIgZG9jdW1lbnRhdGlvbiBjb3JyZWN0aW9ucwogICogW0lPLTIwNiBQcm94eUlucHV0U3RyZWFtIC0gZml4IG1pc2xlYWRpbmcgcGFyYW1ldGVyIG5hbWVzCiAgKiBbSU8tMjEyIFByb3h5SW5wdXRTdHJlYW0uc2tpcCgpIGRvY3VtZW50YXRpb24gY29ycmVjdGlvbnMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQXBhY2hlIENvbW1vbnMgSU8gVmVyc2lvbiAxLjQKCkNvbXBhdGliaWxpdHkgd2l0aCAxLjMuMgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQmluYXJ5IGNvbXBhdGlibGUgLSBZZXMKClNvdXJjZSBjb21wYXRpYmxlIC0gWWVzCgpTZW1hbnRpYyBjb21wYXRpYmxlIC0gWWVzCiAgQ2hlY2sgdGhlIGJ1ZyBmaXhlcyBzZWN0aW9uIGZvciBzZW1hbnRpYyBidWcgZml4ZXMKCkNvbW1vbnMgSU8gMS40IGludHJvZHVjZXMgZm91ciBuZXcgaW1wbGVtZW50YXRpb25zIHdoaWNoIGRlcGVuZCBvbiBKYXZhIDQgZmVhdHVyZXMKKENoYXJTZXF1ZW5jZVJlYWRlciwgRmlsZVdyaXRlcldpdGhFbmNvZGluZywgSU9FeGNlcHRpb25XaXRoQ2F1c2UgYW5kIFJlZ2V4RmlsZUZpbHRlcikuCkl0IGhhcyBiZWVuIGJ1aWx0IHdpdGggdGhlIEpESyBzb3VyY2UgYW5kIHRhcmdldCBvcHRpb25zIHNldCB0byBKYXZhIDEuMyBhbmQsIGV4Y2VwdCBmb3IKdGhvc2UgaW1wbGVtZW50YXRpb25zLCBjYW4gYmUgdXNlZCB3aXRoIEphdmEgMS4zIChzZWUgSU8tMTI3KS4KCkRlcHJlY2F0aW9ucyBmcm9tIDEuMy4yCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRmlsZUNsZWFuZXIgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgRmlsZUNsZWFuaW5nVHJhY2tlciBbc2VlIElPLTExNl0KCkJ1ZyBmaXhlcyBmcm9tIDEuMy4yCi0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRmlsZVV0aWxzCiAgLSBmb3JjZURlbGV0ZSBvZiBvcnBoYW5lZCBTb2Z0bGlua3MgZG9lcyBub3Qgd29yayBbSU8tMTQ3XQogIC0gSW5maW5pdGUgbG9vcCBvbiBGaWxlVXRpbHMuY29weURpcmVjdG9yeSB3aGVuIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaXMgd2l0aGluCiAgICB0aGUgc291cmNlIGRpcmVjdG9yeSBbSU8tMTQxXQogIC0gQWRkIGEgY29weURpcmVjdG9yeSgpIG1ldGhvZCB0aGF0IG1ha2VzIHVzZSBvZiBGaWxlRmlsdGVyIFtJTy0xMDVdCiAgLSBBZGQgbW92ZURpcmVjdG9yeSgpIGFuZCBtb3ZlRmlsZSgpIG1ldGhvZHMgW0lPLTc3XQoKLSBIZXhEdW1wCiAgLSBIZXhEdW1wJ3MgdXNlIG9mIHN0YXRpYyBTdHJpbmdCdWZmZXJzIGlzbid0IHRocmVhZC1zYWZlIFtJTy0xMzZdCgpFbmhhbmNlbWVudHMgZnJvbSAxLjMuMgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZpbGVVdGlscwogIC0gQWRkIGEgZGVsZXRlUXVpZXRseSBtZXRob2QgW0lPLTEzNV0KCi0gRmlsZW5hbWVVdGlscwogIC0gQWRkIGZpbGUgbmFtZSBleHRlbnNpb24gc2VwYXJhdG9yIGNvbnN0YW50c1tJTy0xNDldCgotIElPRXhjZXB0aW9uV2l0aENhdXNlIFtJTy0xNDhdCiAgLSBBZGQgYSBuZXcgSU9FeGNlcHRpb24gaW1wbGVtZW50YXRpb24gd2l0aCBjb25zdHJ1Y3RvcnMgd2hpY2ggdGFrZSBhIGNhdXNlCgotIFRlZUlucHV0U3RyZWFtIFtJTy0xMjldCiAgLSBBZGQgbmV3IFRlZSBpbnB1dCBzdHJlYW0gaW1wbGVtZW50YXRpb24KCi0gRmlsZVdyaXRlcldpdGhFbmNvZGluZyBbSU8tMTUzXQogIC0gQWRkIG5ldyBGaWxlIFdyaXRlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGFjY2VwdHMgYW4gZW5jb2RpbmcKCi0gQ2hhclNlcXVlbmNlUmVhZGVyIFtJTy0xMzhdCiAgLSBBZGQgbmV3IFJlYWRlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGhhbmRsZXMgYW55IENoYXJTZXF1ZW5jZSAoU3RyaW5nLAogICAgU3RyaW5nQnVmZmVyLCBTdHJpbmdCdWlsZGVyIG9yIENoYXJCdWZmZXIpIAoKLSBUaHJlc2hvbGRpbmdPdXRwdXRTdHJlYW0gW0lPLTEyMV0KICAtIEFkZCBhIHJlc2V0KCkgbWV0aG9kIHdoaWNoIHNldHMgdGhlIGNvdW50IG9mIHRoZSBieXRlcyB3cml0dGVuIGJhY2sgdG8gemVyby4KCi0gRGVmZXJyZWRGaWxlT3V0cHV0U3RyZWFtIFtJTy0xMzBdCiAgLSBBZGQgc3VwcG9ydCBmb3IgdGVtcG9yYXJ5IGZpbGVzCgotIEJ5dGVBcnJheU91dHB1dFN0cmVhbQogIC0gQWRkIGEgbmV3IHdyaXRlKElucHV0U3RyZWFtKSBtZXRob2QgW0lPLTE1Ml0KCi0gTmV3IENsb3NlZCBJbnB1dC9PdXRwdXQgc3RyZWFtIGltcGxlbWVudGF0aW9ucyBbSU8tMTIyXQogIC0gQXV0b0Nsb3NlSW5wdXRTdHJlYW0gLSBhdXRvbWF0aWNhbGx5IGNsb3NlcyBhbmQgZGlzY2FyZHMgdGhlIHVuZGVybHlpbmcgaW5wdXQgc3RyZWFtCiAgLSBDbG9zZWRJbnB1dFN0cmVhbSAtIHJldHVybnMgLTEgZm9yIGFueSByZWFkIGF0dGVtcHRzCiAgLSBDbG9zZWRPdXRwdXRTdHJlYW0gLSB0aHJvd3MgYW4gSU9FeGNlcHRpb24gZm9yIGFueSB3cml0ZSBhdHRlbXB0cwogIC0gQ2xvc2VTaGllbGRJbnB1dFN0cmVhbSAtIHByZXZlbnRzIHRoZSB1bmRlcmx5aW5nIGlucHV0IHN0cmVhbSBmcm9tIGJlaW5nIGNsb3NlZC4KICAtIENsb3NlU2hpZWxkT3V0cHV0U3RyZWFtIC0gcHJldmVudHMgdGhlIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbSBmcm9tIGJlaW5nIGNsb3NlZC4KCi0gQWRkIFNpbmdsZXRvbiBDb25zdGFudHMgdG8gc2V2ZXJhbCBzdHJlYW0gY2xhc3NlcyBbSU8tMTQzXQoKLSBQcmVmaXhGaWxlRmlsdGVyIFtJTy0xMjZdCiAgLSBBZGQgZmFjaWxpdHkgdG8gc3BlY2lmeSBjYXNlIHNlbnNpdGl2aXR5IG9uIHByZWZpeCBtYXRjaGluZwoKLSBTdWZmaXhGaWxlRmlsdGVyIFtJTy0xMjZdCiAgLSBBZGQgZmFjaWxpdHkgdG8gc3BlY2lmeSBjYXNlIHNlbnNpdGl2aXR5IG9uIHN1ZmZpeCBtYXRjaGluZwoKLSBSZWdleEZpbGVGaWx0ZXIgW0lPLTc0XQogIC0gQWRkIG5ldyByZWd1bGFyIGV4cHJlc3Npb24gZmlsZSBmaWx0ZXIgaW1wbGVtZW50YXRpb24KCi0gTWFrZSBJT0ZpbGVGaWx0ZXIgaW1wbGVtZW50YXRpb25zIFNlcmlhbGl6YWJsZSBbSU8tMTMxXQoKLSBJbXByb3ZlIElPRmlsZUZpbHRlciB0b1N0cmluZygpIG1ldGhvZHMgW0lPLTEyMF0KCi0gTWFrZSBmaWVsZHMgZmluYWwgc28gY2xhc3NlcyBhcmUgaW1tdXRhYmxlL3RocmVhZHNhZmUgW0lPLTEzM10KICAtIGNoYW5nZXMgdG8gQWdlLCBEZWxlZ2F0ZSwgTmFtZSwgTm90LCBQcmVmaXgsIFJlZ2V4LCBTaXplLCBTdWZmaXggYW5kIFdpbGRjYXJkIElPRmlsZUZpbHRlcgogICAgaW1wbGVtZW50YXRpb25zLgoKLSBJT0Nhc2UKICAtIEFkZCBhIGNvbXBhcmUgbWV0aG9kIHRvIElPQ2FzZSBbSU8tMTQ0XQoKLSBBZGQgYSBwYWNrYWdlIG9mIGphdmEudXRpbC5Db21wYXJhdG9yIGltcGxlbWVudGF0aW9ucyBmb3IgZmlsZXMgW0lPLTE0NV0KICAtIERlZmF1bHRGaWxlQ29tcGFyYXRvciAtIGNvbXBhcmUgZmlsZXMgdXNpbmcgdGhlIGRlZmF1bHQgRmlsZS5jb21wYXJlVG8oRmlsZSkgbWV0aG9kLgogIC0gRXh0ZW5zaW9uRmlsZUNvbXBhcmF0b3IgLSBjb21wYXJlcyBmaWxlcyB1c2luZyBmaWxlIG5hbWUgZXh0ZW5zaW9ucy4KICAtIExhc3RNb2RpZmllZEZpbGVDb21wYXJhdG9yIC0gY29tcGFyZXMgZmlsZXMgdXNpbmcgdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZS90aW1lLgogIC0gTmFtZUZpbGVDb21wYXJhdG9yIC0gY29tcGFyZXMgZmlsZXMgdXNpbmcgZmlsZSBuYW1lcy4KICAtIFBhdGhGaWxlQ29tcGFyYXRvciAtIGNvbXBhcmVzIGZpbGVzIHVzaW5nIGZpbGUgcGF0aHMuCiAgLSBTaXplRmlsZUNvbXBhcmF0b3IgLSBjb21wYXJlcyBmaWxlcyB1c2luZyBmaWxlIHNpemVzLgogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkFwYWNoZSBDb21tb25zIElPIFZlcnNpb24gMS4zLjIKCkNvbXBhdGliaWxpdHkgd2l0aCAxLjMuMQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJpbmFyeSBjb21wYXRpYmxlIC0gWWVzCgpTb3VyY2UgY29tcGF0aWJsZSAtIFllcwoKU2VtYW50aWMgY29tcGF0aWJsZSAtIFllcwoKQ29tcGF0aWJpbGl0eSB3aXRoIDEuMwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJpbmFyeSBjb21wYXRpYmxlIC0gTm8KICBTZWUgW0lPLTExM10KClNvdXJjZSBjb21wYXRpYmxlIC0gTm8KICBTZWUgW0lPLTExM10KClNlbWFudGljIGNvbXBhdGlibGUgLSBZZXMKCkVuaGFuY2VtZW50cyBzaW5jZSAxLjMuMQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0gQ3JlYXRlZCB0aGUgRmlsZUNsZWFuaW5nVHJhY2tlciwgYmFzaWNhbGx5IGEgbm9uLXN0YXRpYyB2ZXJzaW9uIG9mIHRoZQogIEZpbGVDbGVhbmVyLCB3aGljaCBjYW4gYmUgY29udHJvbGxlZCBieSB0aGUgdXNlci4gW0lPLTExNl0KLSBUaGUgRmlsZUNsZWFuZXIgaXMgZGVwcmVjYXRlZC4KCkJ1ZyBmaXhlcyBmcm9tIDEuMy4xCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgotIFNvbWUgdGVzdHMsIHdoaWNoIGFyZSBpbXBsaWNpdGx5IGFzc3VtaW5nIGEgVW5peC1saWtlIGZpbGUgc3lzdGVtLCBhcmUKICBub3cgc2tpcHBlZCBvbiBXaW5kb3dzLiBbSU8tMTE1XQotIEVuZGlhblV0aWxzCiAgLSBCb3RoIHJlYWRTd2FwcGVkVW5zaWduZWRJbnRlZ2VyKC4uLikgbWV0aG9kcyBjb3VsZCByZXR1cm4gbmVnYXRpdmUgCiAgICBudW1iZXJzIGR1ZSB0byBpbnQvbG9uZyBjYXN0aW5nLiBbSU8tMTE3XQoKQnVnIGZpeGVzIGZyb20gMS4zCi0tLS0tLS0tLS0tLS0tLS0tLQoKLSBGaWxlVXRpbHMKICAtIE5QRSBpbiBvcGVuT3V0cHV0U3RyZWFtKEZpbGUpIHdoZW4gZmlsZSBoYXMgbm8gcGFyZW50IGluIHBhdGggW0lPLTExMl0KICAtIHJlYWRGaWxlVG9TdHJpbmcoRmlsZSkgaXMgbm90IHN0YXRpYyBbSU8tMTEzXQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpBcGFjaGUgQ29tbW9ucyBJTyBWZXJzaW9uIDEuMy4xCgpDb21wYXRpYmlsaXR5IHdpdGggMS4zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQmluYXJ5IGNvbXBhdGlibGUgLSBObwogIFNlZSBbSU8tMTEzXQoKU291cmNlIGNvbXBhdGlibGUgLSBObwogIFNlZSBbSU8tMTEzXQoKU2VtYW50aWMgY29tcGF0aWJsZSAtIFllcwoKQnVnIGZpeGVzIGZyb20gMS4zCi0tLS0tLS0tLS0tLS0tLS0tLQoKLSBGaWxlVXRpbHMKICAtIE5QRSBpbiBvcGVuT3V0cHV0U3RyZWFtKEZpbGUpIHdoZW4gZmlsZSBoYXMgbm8gcGFyZW50IGluIHBhdGggW0lPLTExMl0KICAtIHJlYWRGaWxlVG9TdHJpbmcoRmlsZSkgaXMgbm90IHN0YXRpYyBbSU8tMTEzXQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkFwYWNoZSBDb21tb25zIElPIFZlcnNpb24gMS4zCgpDb21wYXRpYmlsaXR5IHdpdGggMS4yCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQmluYXJ5IGNvbXBhdGlibGUgLSBZZXMKClNvdXJjZSBjb21wYXRpYmxlIC0gWWVzCgpTZW1hbnRpYyBjb21wYXRpYmxlIC0gWWVzCiAgQ2hlY2sgdGhlIGJ1ZyBmaXhlcyBzZWN0aW9uIGZvciBzZW1hbnRpYyBidWcgZml4ZXMKCkRlcHJlY2F0aW9ucyBmcm9tIDEuMgotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBXaWxkY2FyZEZpbHRlciBkZXByZWNhdGVkLCByZXBsYWNlZCBieSBXaWxkY2FyZEZpbGVGaWx0ZXIKICAtIG9sZCBjbGFzcyBvbmx5IGFjY2VwdGVkIGZpbGVzLCB0aHVzIGhhZCBhIGNvbmZ1c2luZyBkdWFsIHB1cnBvc2UKCi0gRmlsZVN5c3RlbVV0aWxzLmZyZWVTcGFjZSBkZXByZWNhdGVkLCByZXBsYWNlZCBieSBmcmVlU3BhY2VLYgogIC0gZnJlZVNwYWNlIHJldHVybnMgYSByZXN1bHQgdGhhdCB2YXJpZXMgYnkgb3BlcmF0aW5nIHN5c3RlbSBhbmQKICAgIHRodXMgaXNuJ3QgdGhhdCB1c2VmdWwKICAtIGZyZWVTcGFjZUtiIHJldHVybnMgbXVjaCBiZXR0ZXIgYW5kIG1vcmUgY29uc2lzdGVudCByZXN1bHRzCiAgLSBmcmVlU3BhY2VLYiBleGlzdGVkIGluIHYxLjIsIHNvIHRoaXMgaXMgYSBnZW50bGUgY3V0b3ZlcgoKQnVnIGZpeGVzIGZyb20gMS4yCi0tLS0tLS0tLS0tLS0tLS0tLQotIExpbmVJdGVyYXRvciBub3cgaW1wbGVtZW50cyBJdGVyYXRvcgogIC0gSXQgd2FzIGFsd2F5cyBzdXBwb3NlZCB0by4uLgoKLSBGaWxlU3lzdGVtVXRpbHMuZnJlZVNwYWNlL2ZyZWVTcGFjZUtiIFtJTy04M10KICAtIFRoZXNlIHNob3VsZCBub3cgd29yayBvbiBBSVggYW5kIEhQLVVYCgotIEZpbGVTeXN0ZW1VdGlscy5mcmVlU3BhY2UvZnJlZVNwYWNlS2IgW0lPLTkwXQogIC0gQXZvaWQgaW5maW5pdGUgbG9vcGluZyBpbiBXaW5kb3dzCiAgLSBDYXRjaCBtb3JlIGVycm9ycyB3aXRoIG5pY2UgbWVzc2FnZXMKCi0gRmlsZVN5c3RlbVV0aWxzLmZyZWVTcGFjZSBbSU8tOTFdCiAgLSBUaGlzIGlzIG5vdyBkb2N1bWVudGVkIG5vdCB0byB3b3JrIG9uIFN1bk9TIDUKCi0gRmlsZVN5c3RlbVV0aWxzIFtJTy05M10KICAtIEZpeGVkIHJlc291cmNlIGxlYWsgbGVhZGluZyB0byAnVG9vIG1hbnkgb3BlbiBmaWxlcycgZXJyb3IKICAtIFByZXZpb3VzbHkgZGlkIG5vdCBkZXN0cm95IFByb2Nlc3MgaW5zdGFuY2VzIChhcyBKREsgSmF2YWRvYyBpcyBzbyBwb29yKQogIC0gaHR0cDovL2J1Z3Muc3VuLmNvbS9idWdkYXRhYmFzZS92aWV3X2J1Zy5kbz9idWdfaWQ9NDgwMTAyNwoKLSBGaWxlVXRpbHMudG91Y2ggW0lPLTEwMF0KICAtIFRoZSB0b3VjaCBtZXRob2QgcHJldmlvdXNseSBnYXZlIG5vIGluZGljYXRpb24gd2hlbiB0aGUgZmlsZSBjb3VsZCBub3QKICAgIGJlIHRvdWNoZWQgc3VjY2Vzc2Z1bGx5IChzdWNoIGFzIGR1ZSB0byBhY2Nlc3MgcmVzdHJpY3Rpb25zKSAtIGl0IG5vdwogICAgdGhyb3dzIGFuIElPRXhjZXB0aW9uIGlmIHRoZSBsYXN0IG1vZGlmaWVkIGRhdGUgY2Fubm90IGJlIGNoYW5nZWQKCi0gRmlsZUNsZWFuZXIKICAtIFRoaXMgbm93IGhhbmRsZXMgdGhlIHNpdHVhdGlvbiB3aGVyZSBhbiBlcnJvciBvY2N1cnMgd2hlbiBkZWxldGluZyB0aGUgZmlsZQoKLSBJT1V0aWxzLmNvcHkgW0lPLTg0XQogIC0gQ29weSBtZXRob2RzIGNvdWxkIHJldHVybiBpbmFjY3VyYXRlIGJ5dGUvY2hhciBjb3VudCBmb3IgbGFyZ2Ugc3RyZWFtcwogIC0gVGhlIGNvcHkoSW5wdXRTdHJlYW0sIE91dHB1dFN0cmVhbSkgbWV0aG9kIG5vdyByZXR1cm5zIC0xIGlmIHRoZSBjb3VudCBpcyBncmVhdGVyIHRoYW4gYW4gaW50CiAgLSBUaGUgY29weShSZWFkZXIsIFdyaXRlcikgbWV0aG9kIG5vdyB0aHJvd3Mgbm93IHJldHVybnMgLTEgaWYgdGhlIGNvdW50IGlzIGdyZWF0ZXIgdGhhbiBhbiBpbnQKICAtIEFkZGVkIGEgbmV3IGNvcHlMYXJnZShJbnB1dFN0cmVhbSwgT3V0cHV0U3RyZWFtKSBtZXRob2QgdGhhdCByZXR1cm5zIGEgbG9uZwogIC0gQWRkZWQgYSBuZXcgY29weUxhcmdlKFJlYWRlciwgV3JpdGVyKSBtZXRob2QgdGhhdCByZXR1cm5zIGEgbG9uZwoKLSBDb3VudGluZ0lucHV0U3RyZWFtL0NvdW50aW5nT3V0cHV0U3RyZWFtIFtJTy04NF0KICAtIE1ldGhvZHMgd2VyZSBkZWNsYXJlZCBhcyBpbnQgdGh1cyB0aGUgY291bnQgd2FzIGluYWNjdXJhdGUgZm9yIGxhcmdlIHN0cmVhbXMKICAtIG5ldyBsb25nIGJhc2VkIG1ldGhvZHMgZ2V0Qnl0ZUNvdW50KCkvcmVzZXRCeXRlQ291bnQoKSBhZGRlZAogIC0gZXhpc3RpbmcgbWV0aG9kcyBjaGFuZ2VkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY291bnQgaXMgZ3JlYXRlciB0aGFuIGFuIGludAoKLSBGaWxlQmFzZWRUZXN0Q2FzZQogIC0gRml4ZWQgYnVnIGluIGNvbXBhcmUgY29udGVudCBtZXRob2RzIGlkZW50aWZpZWQgYnkgR05VIGNsYXNzcGF0aAoKLSBFbmRpYW5VdGlscy53cml0ZVN3YXBwZWRMb25nKGJ5dGVbXSwgaW50KSBbSU8tMTAxXQogIC0gQW4gaW50IG92ZXJydW4gaW4gdGhlIGJpdCBzaGlmdGluZyB3aGVuIGl0IHNob3VsZCBoYXZlIGJlZW4gYSBsb25nCgotIEVuZGlhblV0aWxzLndyaXRlU3dhcHBlZExvbmcoSW5wdXRTdHJlYW0pIFtJTy0xMDJdCiAgLSBUaGUgcmV0dXJuIG9mIGlucHV0LnJlYWQoYnl0ZVtdKSB3YXMgbm90IGJlaW5nIGNoZWNrZWQgdG8gZW5zdXJlIGFsbCA4IGJ5dGVzIHdlcmUgcmVhZAoKRW5oYW5jZW1lbnRzIGZyb20gMS4yCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIERpcmVjdG9yeVdhbGtlciBbSU8tODZdCiAgLSBOZXcgY2xhc3MgZGVzaWduZWQgZm9yIHN1YmNsYXNzaW5nIHRvIHdhbGsgdGhyb3VnaCBhIHNldCBvZiBmaWxlcy4KICAgIERpcmVjdG9yeVdhbGtlciBwcm92aWRlcyB0aGUgd2FsayBvZiB0aGUgZGlyZWN0b3JpZXMsIGZpbHRlcmluZyBvZgogICAgZGlyZWN0b3JpZXMgYW5kIGZpbGVzLCBhbmQgY2FuY2VsbGF0aW9uIHN1cHBvcnQuIFRoZSBzdWJjbGFzcyBtdXN0IHByb3ZpZGUKICAgIHRoZSBzcGVjaWZpYyBiZWhhdmlvciwgc3VjaCBhcyB0ZXh0IHNlYXJjaGluZyBvciBpbWFnZSBwcm9jZXNzaW5nLgoKLSBJT0Nhc2UKICAtIE5ldyBjbGFzcy9lbnVtZXJhdGlvbiBmb3IgY2FzZS1zZW5zaXRpdml0eSBjb250cm9sCgotIEZpbGVuYW1lVXRpbHMKICAtIE5ldyBtZXRob2RzIHRvIGhhbmRsZSBjYXNlLXNlbnNpdGl2aXR5CiAgLSB3aWxkY2FyZE1hdGNoIC0gbmV3IG1ldGhvZCB0aGF0IGhhcyBJT0Nhc2UgYXMgYSBwYXJhbWV0ZXIKICAtIGVxdWFscyAtIG5ldyBtZXRob2QgdGhhdCBoYXMgSU9DYXNlIGFzIGEgcGFyYW1ldGVyCgotIEZpbGVVdGlscyBbSU8tMTA4XSAtIG5ldyBkZWZhdWx0IGVuY29kaW5nIG1ldGhvZHMgZm9yOgogIC0gcmVhZEZpbGVUb1N0cmluZyhGaWxlKQogIC0gcmVhZExpbmVzKEZpbGUpCiAgLSBsaW5lSXRlcmF0b3IoRmlsZSkKICAtIHdyaXRlU3RyaW5nVG9GaWxlKEZpbGUsIFN0cmluZykKICAtIHdyaXRlTGluZXMoRmlsZSwgQ29sbGVjdGlvbikKICAtIHdyaXRlTGluZXMoRmlsZSwgQ29sbGVjdGlvbiwgU3RyaW5nKQoKLSBGaWxlVXRpbHMub3Blbk91dHB1dFN0cmVhbSAgW0lPLTEwN10KICAtIG5ldyBtZXRob2QgdG8gb3BlbiBhIEZpbGVPdXRwdXRTdHJlYW0sIGNyZWF0aW5nIHBhcmVudCBkaXJlY3RvcmllcyBpZiByZXF1aXJlZAotIEZpbGVVdGlscy50b3VjaAotIEZpbGVVdGlscy5jb3B5VVJMVG9GaWxlCi0gRmlsZVV0aWxzLndyaXRlU3RyaW5nVG9GaWxlCi0gRmlsZVV0aWxzLndyaXRlQnl0ZUFycmF5VG9GaWxlCi0gRmlsZVV0aWxzLndyaXRlTGluZXMKICAtIGVuaGFuY2VkIHRvIGNyZWF0ZSBwYXJlbnQgZGlyZWN0b3JpZXMgaWYgcmVxdWlyZWQKLSBGaWxlVXRpbHMub3BlbklucHV0U3RyZWFtICBbSU8tMTA3XQogIC0gbmV3IG1ldGhvZCB0byBvcGVuIGEgRmlsZUlucHV0U3RyZWFtLCBwcm92aWRpbmcgYmV0dGVyIGVycm9yIG1lc3NhZ2VzIHRoYW4gdGhlIEpESwoKLSBGaWxlVXRpbHMuaXNGaWxlT2xkZXIKICAtIG5ldyBtZXRob2RzIHRvIGNoZWNrIGlmIGEgZmlsZSBpcyBvbGRlciAoaS5lLiBpc0ZpbGVPbGRlcigpKSAtIGNvdW50ZXJwYXJ0cwogICAgdG8gdGhlIGV4aXN0aW5nIGlzRmlsZU5ld2VyKCkgbWV0aG9kcy4KCi0gRmlsZVV0aWxzLmNoZWNrc3VtLCBGaWxlVXRpbHMuY2hlY2tzdW1DUkMzMgogIC0gbmV3IG1ldGhvZHMgdG8gY3JlYXRlIGEgY2hlY2tzdW0gb2YgYSBmaWxlCgotIEZpbGVVdGlscy5jb3B5RmlsZVRvRGlyZWN0b3J5ICBbSU8tMTA0XQogIC0gbmV3IHZhcmlhbnQgdGhhdCBvcHRpb25hbGx5IHJldGFpbnMgdGhlIGZpbGUgZGF0ZQoKLSBGaWxlRGVsZXRlU3RyYXRlZ3kKLSBGaWxlQ2xlYW5lciAgICBbSU8tNTYsSU8tNzBdCiAgLSBGaWxlRGVsZXRlU3RyYXRlZ3kgaXMgYSBzdHJhdGVneSBmb3IgaGFuZGxpbmcgZmlsZSBkZWxldGlvbgogIC0gVGhpcyBjYW4gYmUgdXNlZCBhcyBhIGNhbGxiYWNrIGluIEZpbGVDbGVhbmVyCiAgLSBUb2dldGhlciB0aGVzZSBhbGxvdyBGaWxlQ2xlYW5lciB0byBkbyBhIGZvcmNlRGVsZXRlIHRvIGtpbGwgZGlyZWN0b3JpZXMKCi0gRmlsZUNsZWFuZXIuZXhpdFdoZW5GaW5pc2hlZCBbSU8tOTldCiAgLSBBIG5ldyBtZXRob2QgdGhhdCBhbGxvd3MgdGhlIGludGVybmFsIGNsZWFuZXIgdGhyZWFkIHRvIGJlIGNsZWFubHkgdGVybWluYXRlZAoKLSBXaWxkY2FyZEZpbGVGaWx0ZXIKICAtIFJlcGxhY2VtZW50IGZvciBXaWxkY2FyZEZpbHRlcgogIC0gQWNjZXB0cyBib3RoIGZpbGVzIGFuZCBkaXJlY3RvcmllcwogIC0gQWJpbGl0eSB0byBjb250cm9sIGNhc2Utc2Vuc2l0aXZpdHkKCi0gTmFtZUZpbGVGaWx0ZXIKICAtIEFiaWxpdHkgdG8gY29udHJvbCBjYXNlLXNlbnNpdGl2aXR5CgotIEZpbGVGaWxlRmlsdGVyCiAgLSBOZXcgSU9GaWxlRmlsdGVyIGltcGxlbWVudGF0aW9uCiAgLSBBY2NlcHRzIGZpbGVzIHdoZXJlIEZpbGUuaXNGaWxlKCkgaXMgdHJ1ZQogIC0gSW4gb3RoZXIgd29yZHMgaXQgZmlsdGVycyBvdXQgZGlyZWN0b3JpZXMKICAtIFNpbmdsZXRvbiBpbnN0YW5jZSBwcm92aWRlZCAoRklMRSkKCi0gQ2FuUmVhZEZpbGVGaWx0ZXIKICAtIE5ldyBJT0ZpbGVGaWx0ZXIgaW1wbGVtZW50YXRpb24KICAtIEFjY2VwdHMgZmlsZXMgd2hlcmUgRmlsZS5jYW5SZWFkKCkgaXMgdHJ1ZQogIC0gU2luZ2xldG9uIGluc3RhbmNlcyBwcm92aWRlZCAoQ0FOX1JFQUQvQ0FOTk9UX1JFQUQvUkVBRF9PTkxZKQoKLSBDYW5Xcml0ZUZpbGVGaWx0ZXIKICAtIE5ldyBJT0ZpbGVGaWx0ZXIgaW1wbGVtZW50YXRpb24KICAtIEFjY2VwdHMgZmlsZXMgd2hlcmUgRmlsZS5jYW5Xcml0ZSgpIGlzIHRydWUKICAtIFNpbmdsZXRvbiBpbnN0YW5jZXMgcHJvdmlkZWQgKENBTl9XUklURS9DQU5OT1RfV1JJVEUpCgotIEhpZGRlbkZpbGVGaWx0ZXIKICAtIE5ldyBJT0ZpbGVGaWx0ZXIgaW1wbGVtZW50YXRpb24KICAtIEFjY2VwdHMgZmlsZXMgd2hlcmUgRmlsZS5pc0hpZGRlbigpIGlzIHRydWUKICAtIFNpbmdsZXRvbiBpbnN0YW5jZXMgcHJvdmlkZWQgKEhJRERFTi9WSVNJQkxFKQoKLSBFbXB0eUZpbGVGaWx0ZXIKICAtIE5ldyBJT0ZpbGVGaWx0ZXIgaW1wbGVtZW50YXRpb24KICAtIEFjY2VwdHMgZmlsZXMgb3IgZGlyZWN0b3JpZXMgdGhhdCBhcmUgZW1wdHkKICAtIFNpbmdsZXRvbiBpbnN0YW5jZXMgcHJvdmlkZWQgKEVNUFRZL05PVF9FTVBUWSkKCi0gVHJ1ZUZpbGVGaWx0ZXIvRmFsc2VGaWxlRmlsdGVyL0RpcmVjdG9yeUZpbGVGaWx0ZXIKICAtIE5ldyBzaW5nbGV0b24gaW5zdGFuY2UgY29uc3RhbnRzIChUUlVFL0ZBTFNFL0RJUkVDVE9SWSkKICAtIFRoZSBuZXcgY29uc3RhbnRzIGFyZSBtb3JlIEphdmEgNSBmcmllbmRseSB3aXRoIHJlZ2FyZHMgdG8gc3RhdGljIGltcG9ydHMKICAgICh3aGVyZWFzIGlmIGV2ZXJ5dGhpbmcgdXNlcyBJTlNUQU5DRSwgdGhlbiB0aGV5IGp1c3QgY2xhc2gpCiAgLSBUaGUgb2xkIElOU1RBTkNFIGNvbnN0YW50cyBhcmUgc3RpbGwgcHJlc2VudCBhbmQgaGF2ZSBub3QgYmVlbiBkZXByZWNhdGVkCgotIEZpbGVGaWx0ZXJVdGlscy5zaXplUmFuZ2VGaWxlRmlsdGVyCiAgLSBuZXcgc2l6ZVJhbmdlRmlsZUZpbHRlcihsb25nIG1pbmltdW1TaXplLCBsb25nIG1heGltdW1TaXplKSBtZXRob2Qgd2hpY2ggCiAgICBjcmVhdGVzIGEgZmlsdGVyIHRoYXQgYWNjZXB0cyBmaWxlcyB3aXRoaW4gdGhlIHNwZWNpZmllZCBzaXplIHJhbmdlLgoKLSBGaWxlRmlsdGVyVXRpbHMubWFrZURpcmVjdG9yeU9ubHkvbWFrZUZpbGVPbmx5CiAgLSB0d28gbmV3IG1ldGhvZHMgdGhhdCBkZWNvcmF0ZSBhIGZpbGUgZmlsdGVyIHRvIG1ha2UgaXQgYXBwbHkgdG8KICAgIGRpcmVjdG9yaWVzIG9ubHkgb3IgZmlsZXMgb25seQoKLSBOdWxsV3JpdGVyCiAgLSBOZXcgd3JpdGVyIHRoYXQgYWN0cyBhcyBhIHNpbmsgZm9yIGFsbCBkYXRhLCBhcyBwZXIgL2Rldi9udWxsCgotIE51bGxJbnB1dFN0cmVhbQogIC0gTmV3IGlucHV0IHN0cmVhbSB0aGF0IGVtdWxhdGVzIGEgc3RyZWFtIG9mIGEgc3BlY2lmaWVkIHNpemUKCi0gTnVsbFJlYWRlcgogIC0gTmV3IHJlYWRlciB0aGF0IGVtdWxhdGVzIGEgcmVhZGVyIG9mIGEgc3BlY2lmaWVkIHNpemUKCi0gQnl0ZUFycmF5T3V0cHV0U3RyZWFtICBbSU8tOTddCiAgLSBQZXJmb3JtYW5jZSBlbmhhbmNlbWVudHMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQXBhY2hlIENvbW1vbnMgSU8gVmVyc2lvbiAxLjIKCkNvbXBhdGliaWxpdHkgd2l0aCAxLjEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpCaW5hcnkgY29tcGF0aWJsZSAtIFllcwoKU291cmNlIGNvbXBhdGlibGUgLSBZZXMKClNlbWFudGljIGNvbXBhdGlibGUgLSBZZXMKCkRlcHJlY2F0aW9ucyBmcm9tIDEuMQotLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkJ1ZyBmaXhlcyBmcm9tIDEuMQotLS0tLS0tLS0tLS0tLS0tLS0KLSBGaWxlU3lzdGVtVXRpbHMuZnJlZVNwYWNlKGRyaXZlKQogIEZpeCB0byBhbGxvdyBXaW5kb3dzIGJhc2VkIGNvbW1hbmQgdG8gZnVuY3Rpb24gaW4gRnJlbmNoIGxvY2FsZQoKLSBGaWxlVXRpbHMucmVhZCoKICBJbmNyZWFzZSBjZXJ0YWludHkgdGhhdCBmaWxlcyBhcmUgY2xvc2VkIGluIGNhc2Ugb2YgZXJyb3IKCi0gTG9ja2FibGVGaWxlV3JpdGVyCiAgTG9ja2luZyBtZWNoYW5pc20gd2FzIGJyb2tlbiBhbmQgb25seSBwcm92aWRlZCBsaW1pdGVkIHByb3RlY3Rpb24gWzM4OTQyXQogIEZpbGUgZGVsZXRpb24gYW5kIGxvY2tpbmcgaW4gY2FzZSBvZiBjb25zdHJ1Y3RvciBlcnJvciB3YXMgYnJva2VuCgpFbmhhbmNlbWVudHMgZnJvbSAxLjEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gQWdlRmlsZUZpbHRlci9TaXplRmlsZUZpbHRlcgogIE5ldyBmaWxlIGZpbHRlcnMgdGhhdCBjb21wYXJlcyBhZ2FpbnN0IHRoZSBhZ2UgYW5kIHNpemUgb2YgdGhlIGZpbGUKCi0gRmlsZVN5c3RlbVV0aWxzLmZyZWVTcGFjZUtiKGRyaXZlKQogIE5ldyBtZXRob2QgdGhhdCB1bmlmaWVzIHJlc3VsdCB0byBiZSBpbiBraWxvYnl0ZXMgWzM4NTc0XQoKLSBGaWxlVXRpbHMuY29udGVudEVxdWFscyhGaWxlLEZpbGUpCiAgUGVyZm9ybWFuY2UgaW1wcm92ZWQgYnkgYWRkaW5nIGxlbmd0aCBhbmQgZmlsZSBsb2NhdGlvbiBjaGVja2luZwoKLSBGaWxlVXRpbHMuaXRlcmF0ZUZpbGVzCiAgVHdvIG5ldyBtZXRob2QgdG8gcHJvdmlkZSBkaXJlY3QgYWNjZXNzIHRvIGl0ZXJhdG9ycyBvdmVyIGZpbGVzCgotIEZpbGVVdGlscy5saW5lSXRlcmF0b3IKICBJT1V0aWxzLmxpbmVJdGVyYXRvcgogIE5ldyBtZXRob2RzIHRvIHByb3ZpZGUgYW4gaXRlcmF0b3Igb3ZlciB0aGUgbGluZXMgaW4gYSBmaWxlIFszODA4M10KCi0gRmlsZVV0aWxzLmNvcHlEaXJlY3RvcnlUb0RpcmVjdG9yeQogIE5ldyBtZXRob2QgdG8gY29weSBhIGRpcmVjdG9yeSB0byB3aXRoaW4gYW5vdGhlciBkaXJlY3RvcnkgWzM2MzE1XQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkFwYWNoZSBDb21tb25zIElPIFZlcnNpb24gMS4xCgpJbmNvbXBhdGlibGUgY2hhbmdlcyBmcm9tIDEuMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpCaW5hcnkgY29tcGF0aWJsZSAtIFllcwoKU291cmNlIGNvbXBhdGlibGUgLSBZZXMKClNlbWFudGljIGNvbXBhdGlibGUgLSBZZXMsIGV4Y2VwdDoKLSBGaWxlVXRpbHMud3JpdGVTdHJpbmdUb0ZpbGUoKQogICAgQSBudWxsIGVuY29kaW5nIHByZXZpb3VzbHkgdXNlZCAnSVNPLTg4NTktMScsIG5vdyBpdCB1c2VzIHRoZSBwbGF0Zm9ybSBkZWZhdWx0CiAgICBHZW5lcmFsbHkgdGhpcyB3aWxsIG1ha2Ugbm8gZGlmZmVyZW5jZQoKLSBMb2NrYWJsZUZpbGVXcml0ZXIKICAgIEltcHJvdmVkIHZhbGlkYXRpb24gYW5kIG5vdyBjcmVhdGUgZGlyZWN0b3JpZXMgaWYgbmVjZXNzYXJ5CgpwbHVzIHRoZXNlIGJ1ZyBmaXhlcyBtYXkgYWZmZWN0IHlvdSBzZW1hbnRpY2FsbHk6Ci0gRmlsZVV0aWxzLnRvdWNoKCkgIChCdWcgZml4IDI5ODIxKQogICAgTm93IGNyZWF0ZXMgdGhlIGZpbGUgaWYgaXQgZGlkIG5vdCBwcmV2aW91c2x5IGV4aXN0CgotIEZpbGVVdGlscy50b0ZpbGUoVVJMKSAoQnVnIGZpeCAzMjU3NSkKICAgIE5vdyBoYW5kbGVzIGVzY2FwZSBzeW50YXggc3VjaCBhcyAlMjAKCi0gRmlsZVV0aWxzLnNpemVPZkRpcmVjdG9yeSgpICAoQnVnIGZpeCAzNjgwMSkKICAgIE1heSBub3cgcmV0dXJuIGEgc2l6ZSBvZiAwIGlmIHRoZSBkaXJlY3RvcnkgaXMgc2VjdXJpdHkgcmVzdHJpY3RlZAoKRGVwcmVjYXRpb25zIGZyb20gMS4wCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIENvcHlVdGlscyBoYXMgYmVlbiBkZXByZWNhdGVkLgogICAgSXRzIG1ldGhvZHMgaGF2ZSBiZWVuIG1vdmVkIHRvIElPVXRpbHMuCiAgICBUaGUgbmV3IElPVXRpbHMgbWV0aG9kcyBoYW5kbGUgbnVsbHMgYmV0dGVyLCBhbmQgaGF2ZSBjbGVhcmVyIG5hbWVzLgoKLSBJT1V0aWxzLnRvQnl0ZUFycmF5KFN0cmluZykgLSBVc2Uge0BsaW5rIFN0cmluZyNnZXRCeXRlcygpfQotIElPVXRpbHMudG9TdHJpbmcoYnl0ZVtdKSAtIFVzZSB7QGxpbmsgU3RyaW5nI1N0cmluZyhieXRlW10pfQotIElPVXRpbHMudG9TdHJpbmcoYnl0ZVtdLFN0cmluZykgLSBVc2Uge0BsaW5rIFN0cmluZyNTdHJpbmcoYnl0ZVtdLFN0cmluZyl9CgpCdWcgZml4ZXMgZnJvbSAxLjAKLS0tLS0tLS0tLS0tLS0tLS0tCi0gRmlsZVV0aWxzIC0gdG91Y2goKSAgWzI5ODIxXQogICAgTm93IGNyZWF0ZXMgdGhlIGZpbGUgaWYgaXQgZGlkIG5vdCBwcmV2aW91c2x5IGV4aXN0CgotIEZpbGVVdGlscyAtIHRvRmlsZShVUkwpICBbMzI1NzVdCiAgICBOb3cgaGFuZGxlcyBlc2NhcGUgc3ludGF4IHN1Y2ggYXMgJTIwCgotIEZpbGVGaWx0ZXJVdGlscyAtIG1ha2VDVlNBd2FyZShJT0ZpbGVGaWx0ZXIpICBbMzMwMjNdCiAgICBGaXhlZCBidWcgdGhhdCBjYXVzZWQgbWV0aG9kIHRvIGJlIGNvbXBsZXRlbHkgYnJva2VuCgotIENvdW50aW5nSW5wdXRTdHJlYW0gIFszMzMzNl0KICAgIEZpeGVkIGJ1ZyB0aGF0IGNhdXNlZCB0aGUgY291bnQgdG8gcmVkdWNlIGJ5IG9uZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KCi0gQ291bnRpbmdJbnB1dFN0cmVhbSAtIHNraXAobG9uZykgIFszNDMxMV0KICAgIEJ5dGVzIGZyb20gY2FsbHMgdG8gdGhpcyBtZXRob2Qgd2VyZSBub3QgcHJldmlvdXNseSBjb3VudGVkCgotIE51bGxPdXRwdXRTdHJlYW0gIFszMzQ4MV0KICAgIFJlbW92ZSB1bm5lY2Vzc2FyeSBzeW5jaHJvbml6YXRpb24KCi0gQWJzdHJhY3RGaWxlRmlsdGVyIC0gYWNjZXB0KEZpbGUsIFN0cmluZykgIFszMDk5Ml0KICAgIEZpeGVkIGJyb2tlbiBpbXBsZW1lbnRhdGlvbgoKLSBGaWxlVXRpbHMgIFszNjgwMV0KICAgIFByZXZpb3VzbHkgdGhyZXcgTlBFIHdoZW4gbGlzdGluZyBmaWxlcyBpbiBhIHNlY3VyaXR5IHJlc3RyaWN0ZWQgZGlyZWN0b3J5CiAgICBOb3cgdGhyb3cgSU9FeGNlcHRpb24gd2l0aCBhIGJldHRlciBtZXNzYWdlCgotIEZpbGVVdGlscyAtIHdyaXRlU3RyaW5nVG9GaWxlKCkKICAgIE51bGwgZW5jb2Rpbmcgbm93IGNvcnJlY3RseSB1c2VzIHRoZSBwbGF0Zm9ybSBkZWZhdWx0CgpFbmhhbmNlbWVudHMgZnJvbSAxLjAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRmlsZW5hbWVVdGlscyAtIG5ldyBjbGFzcyAgWzMzMzAzLDI5MzUxXQogICAgQSBzdGF0aWMgdXRpbGl0eSBjbGFzcyBmb3Igd29ya2luZyB3aXRoIGZpbGVuYW1lcwogICAgU2Vla3MgdG8gZWFzZSB0aGUgcGFpbiBvZiBkZXZlbG9waW5nIG9uIFdpbmRvd3MgYW5kIGRlcGxveWluZyBvbiBVbml4CgotIEZpbGVTeXN0ZW1VdGlscyAtIG5ldyBjbGFzcyAgWzMyOTgyLDM2MzI1XQogICAgQSBzdGF0aWMgdXRpbGl0eSBjbGFzcyBmb3Igd29ya2luZyB3aXRoIGZpbGUgc3lzdGVtcwogICAgUHJvdmlkZXMgb25lIG1ldGhvZCBhdCBwcmVzZW50LCB0byBnZXQgdGhlIGZyZWUgc3BhY2Ugb24gdGhlIGZpbGluZyBzeXN0ZW0KCi0gSU9VdGlscyAtIG5ldyBwdWJsaWMgY29uc3RhbnRzCiAgICBDb25zdGFudHMgZm9yIGRpcmVjdG9yeSBhbmQgbGluZSBzZXBhcmF0b3JzIG9uIFdpbmRvd3MgYW5kIFVuaXgKCi0gSU9VdGlscyAtIHRvQnl0ZUFycmF5KFJlYWRlcixlbmNvZGluZykKICAgIEhhbmRsZXMgZW5jb2RpbmdzIHdoZW4gcmVhZGluZyB0byBhIGJ5dGUgYXJyYXkKCi0gSU9VdGlscyAtIHRvQ2hhckFycmF5KElucHV0U3RyZWFtKSAgWzI4OTc5XQogICAgICAgICAgLSB0b0NoYXJBcnJheShJbnB1dFN0cmVhbSxlbmNvZGluZykKICAgICAgICAgIC0gdG9DaGFyQXJyYXkoUmVhZGVyKQogICAgUmVhZHMgYSBzdHJlYW0vcmVhZGVyIGludG8gYSBjaGFyYWN0ZXIgYXJyYXkKCi0gSU9VdGlscyAtIHJlYWRMaW5lcyhJbnB1dFN0cmVhbSkgIFszNjIxNF0KICAgICAgICAgIC0gcmVhZExpbmVzKElucHV0U3RyZWFtLGVuY29kaW5nKQogICAgICAgICAgLSByZWFkTGluZXMoUmVhZGVyKQogICAgUmVhZHMgYSBzdHJlYW0vcmVhZGVyIGxpbmUgYnkgbGluZSBpbnRvIGEgTGlzdCBvZiBTdHJpbmdzCgotIElPVXRpbHMgLSB0b0lucHV0U3RyZWFtKFN0cmluZykgIFszMjk1OF0KICAgICAgICAgIC0gdG9JbnB1dFN0cmVhbShTdHJpbmcsZW5jb2RpbmcpCiAgICBDcmVhdGVzIGFuIGlucHV0IHN0cmVhbSB0aGF0IHVzZXMgdGhlIHN0cmluZyBhcyBhIHNvdXJjZSBvZiBkYXRhCgotIElPVXRpbHMgLSB3cml0ZUxpbmVzKENvbGxlY3Rpb24sbGluZUVuZGluZyxPdXRwdXRTdHJlYW0pICBbMzYyMTRdCiAgICAgICAgICAtIHdyaXRlTGluZXMoQ29sbGVjdGlvbixsaW5lRW5kaW5nLE91dHB1dFN0cmVhbSxlbmNvZGluZykKICAgICAgICAgIC0gd3JpdGVMaW5lcyhDb2xsZWN0aW9uLGxpbmVFbmRpbmcsV3JpdGVyKQogICAgV3JpdGVzIGEgY29sbGVjdGlvbiB0byBhIHN0cmVhbS93cml0ZXIgbGluZSBieSBsaW5lCgotIElPVXRpbHMgLSB3cml0ZSguLi4pCiAgICBXcml0ZSBkYXRhIHRvIGEgc3RyZWFtL3dyaXRlciAobW92ZWQgZnJvbSBDb3B5VXRpbHMgd2l0aCBiZXR0ZXIgbnVsbCBoYW5kbGluZykKCi0gSU9VdGlscyAtIGNvcHkoLi4uKQogICAgQ29weSBkYXRhIGJldHdlZW4gc3RyZWFtcyAobW92ZWQgZnJvbSBDb3B5VXRpbHMgd2l0aCBiZXR0ZXIgbnVsbCBoYW5kbGluZykKCi0gSU9VdGlscyAtIGNvbnRlbnRFcXVhbHMoUmVhZGVyLFJlYWRlcikKICAgIE1ldGhvZCB0byBjb21wYXJlIHRoZSBjb250ZW50cyBvZiB0d28gcmVhZGVycwoKLSBGaWxlVXRpbHMgLSB0b0ZpbGVzKFVSTFtdKQogICAgQ29udmVydHMgYW4gYXJyYXkgb2YgVVJMcyB0byBhbiBhcnJheSBvZiBGaWxlcwoKLSBGaWxlVXRpbHMgLSBjb3B5RGlyZWN0b3J5KCkgIFszMjk0NF0KICAgIE5ldyBtZXRob2RzIHRvIGNvcHkgYSBkaXJlY3RvcnkKCi0gRmlsZVV0aWxzIC0gcmVhZEZpbGVUb0J5dGVBcnJheShGaWxlKQogICAgUmVhZHMgYW4gZW50aXJlIGZpbGUgaW50byBhIGJ5dGUgYXJyYXkKCi0gRmlsZVV0aWxzIC0gd3JpdGVCeXRlQXJyYXlUb0ZpbGUoRmlsZSxieXRlW10pCiAgICBXcml0ZXMgYSBieXRlIGFycmF5IHRvIGEgZmlsZQoKLSBGaWxlVXRpbHMgLSByZWFkTGluZXMoRmlsZSxlbmNvZGluZykgIFszNjIxNF0KICAgIFJlYWRzIGEgZmlsZSBsaW5lIGJ5IGxpbmUgaW50byBhIExpc3Qgb2YgU3RyaW5ncwoKLSBGaWxlVXRpbHMgLSB3cml0ZUxpbmVzKEZpbGUsZW5jb2RpbmcsTGlzdCkKICAgICAgICAgICAgICB3cml0ZUxpbmVzKEZpbGUsZW5jb2RpbmcsTGlzdCxsaW5lRW5kaW5nKQogICAgV3JpdGVzIGEgY29sbGVjdGlvbiB0byBhIGZpbGUgbGluZSBieSBsaW5lCgotIEZpbGVVdGlscyAtIEVNUFRZX0ZJTEVfQVJSQVkKICAgIENvbnN0YW50IGZvciBhbiBlbXB0eSBhcnJheSBvZiBGaWxlIG9iamVjdHMKCi0gQ29uZGl0aW9uYWxGaWxlRmlsdGVyIC0gbmV3IGludGVyZmFjZSAgWzMwNzA1XQogICAgRGVmaW5lcyB0aGUgYmVoYXZpb3Igb2YgbGlzdCBiYXNlZCBmaWx0ZXJzCgotIEFuZEZpbGVGaWx0ZXIsIE9yRmlsZUZpbHRlciAgWzMwNzA1XQogICAgTm93IHN1cHBvcnQgYSBsaXN0IG9mIGZpbHRlcnMgdG8gYW5kL29yCgotIFdpbGRjYXJkRmlsdGVyICBbMzExMTVdCiAgICBOZXcgZmlsdGVyIHRoYXQgY2FuIG1hdGNoIHVzaW5nIHdpbGRjYXJkIGZpbGUgbmFtZXMKCi0gRmlsZUZpbHRlclV0aWxzIC0gbWFrZVNWTkF3YXJlKElPRmlsZUZpbHRlcikKICAgIE5ldyBtZXRob2QsIGxpa2UgbWFrZUNWU0F3YXJlLCB0aGF0IGlnbm9yZXMgU3VidmVyc2lvbiBzb3VyY2UgY29udHJvbCBkaXJlY3RvcmllcwoKLSBDbGFzc0xvYWRlck9iamVjdElucHV0U3RyZWFtCiAgICBBbiBPYmplY3RJbnB1dFN0cmVhbSB0aGF0IHN1cHBvcnRzIGEgQ2xhc3NMb2FkZXIKCi0gQ291bnRpbmdJbnB1dFN0cmVhbSxDb3VudGluZ091dHB1dFN0cmVhbSAtIHJlc2V0Q291bnQoKSAgWzI4OTc2XQogICAgQWRkcyB0aGUgYWJpbGl0eSB0byByZXNldCB0aGUgY291bnQgcGFydCB3YXkgdGhyb3VnaCByZWFkaW5nL3dyaXRpbmcgdGhlIHN0cmVhbQoKLSBEZWZlcnJlZEZpbGVPdXRwdXRTdHJlYW0gLSB3cml0ZVRvKE91dHB1dFN0cmVhbSkgIFszNDE3M10KICAgIE5ldyBtZXRob2QgdG8gYWxsb3cgY3VycmVudCBjb250ZW50cyB0byBiZSB3cml0dGVuIHRvIGEgc3RyZWFtCgotIERlZmVycmVkRmlsZU91dHB1dFN0cmVhbSAgWzM0MTQyXQogICAgUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyBhdm9pZGluZyBkb3VibGUgYnVmZmVyaW5nCgotIExvY2thYmxlRmlsZVdyaXRlciAtIGVuY29kaW5nIHN1cHBvcnQgWzM2ODI1XQogICAgQWRkIHN1cHBvcnQgZm9yIGNoYXJhY3RlciBlbmNvZGluZ3MgdG8gTG9ja2FibGVGaWxlV3JpdGVyCiAgICBJbXByb3ZlIHRoZSB2YWxpZGF0aW9uCiAgICBDcmVhdGUgZGlyZWN0b3JpZXMgaWYgbmVjZXNzYXJ5CgotIElPVXRpbHMgYW5kIEVuZGlhblV0aWxzIGFyZSBubyBsb25nZXIgZmluYWwgIFsyODk3OF0KICAgIEFsbG93cyBkZXZlbG9wZXJzIHRvIGhhdmUgc3ViY2xhc3NlcyBpZiBkZXNpcmVkICAgCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KRmVlZGJhY2sKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpPcGVuIHNvdXJjZSB3b3JrcyBiZXN0IHdoZW4geW91IGdpdmUgZmVlZGJhY2s6Cmh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL2lvLwoKUGxlYXNlIGRpcmVjdCBhbGwgYnVnIHJlcG9ydHMgdG8gSklSQQpodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0lPCgpPciBzdWJzY3JpYmUgdG8gdGhlIGNvbW1vbnMtdXNlciBtYWlsaW5nIGxpc3QgKHByZWZpeCBlbWFpbHMgYnkgW2lvXSkKaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvbWFpbC1saXN0cy5odG1sCgpUaGUgQ29tbW9ucy1JTyBUZWFtCg==