ZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5M2MzZmEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDFmOWM0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi1zcmMuaW5jbHVkZXMgPSBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmVlY2M0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci0gIGJvZHkgewotICAgIHNpemU6IDguNWluIDExLjBpbjsKLSAgICBtYXJnaW46IDAuMjVpbiAwLjVpbiAwLjI1aW4gMC41aW47Ci0gICAgdGFiLWludGVydmFsOiAwLjVpbjsKLSAgICB9Ci0gIHAgeyAgCQotICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwotICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKLSAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKLSAgICB9Ci0gIHAubGlzdCB7Ci0gIAltYXJnaW4tbGVmdDogMC41aW47Ci0gICAgbWFyZ2luLXRvcDogIDAuMDVlbTsKLSAgICBtYXJnaW4tYm90dG9tOiAwLjA1ZW07Ci0gICAgfQotICA8L3N0eWxlPgotCi08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLQotPGgyPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvaDI+Ci0KLTxwPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCi1QVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SCi1ESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTCi1BR1JFRU1FTlQuPC9wPgotCi08cD48Yj4xLiBERUZJTklUSU9OUzwvYj48L3A+Ci0KLTxwPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwKLWNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDwvcD4KLTxwIGNsYXNzPSJsaXN0Ij5iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9wPgotPHAgY2xhc3M9Imxpc3QiPmlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9wPgotPHAgY2xhc3M9Imxpc3QiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtCi1vcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQQotQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZQotUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2gKLUNvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbgotY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpCi1hcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uPC9wPgotCi08cD4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzCi10aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMmcXVvdDsgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYQotQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzCi1Db250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlCi13aXRoIHRoaXMgQWdyZWVtZW50LjwvcD4KLQotPHA+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIKLXRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3A+Ci0KLTxwPjxiPjIuIEdSQU5UIE9GIFJJR0hUUzwvYj48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAotQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCi1yb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MKLW9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZQotQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4KLXNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCi1Db250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKLXJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwKLW9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50Ci1saWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUKLVByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLAotc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQKLWJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlcgotY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvcgotZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzCi1hcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCi1wYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoCi1Db250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5Ci1hbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1vciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMKLWdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvcgotZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQKLXRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUKLXRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQKLWhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudAotdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC48L3A+Ci0KLTxwPjxiPjMuIFJFUVVJUkVNRU5UUzwvYj48L3A+Ci0KLTxwPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlCi1mb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcwotQWdyZWVtZW50OyBhbmQ8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCi1hbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMKLW9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IKLWNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTs8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKLWFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czs8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMKLUFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyCi1wYXJ0eTsgYW5kPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUKLWZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYQotcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZQotZXhjaGFuZ2UuPC9wPgotCi08cD5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoCi1jb3B5IG9mIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQKLXdpdGhpbiB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzCi1Db250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50Ci1SZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uPC9wPgotCi08cD48Yj40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvYj48L3A+Ci0KLTxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbgotcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlCi1saWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YKLXRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlCi1wb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvcgotaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKLSgmcXVvdDtDb21tZXJjaWFsIENvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQKLWluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspCi1hZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KQotYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkCi1wYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUKLWFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQotb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluCi1vcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkKLXRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZQotSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24KLWV4cGVuc2UuPC9wPgotCi08cD5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsCi1Db250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlCi1jbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5Ci1hbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvCi1kZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlCi1wZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlcgotQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3A+Ci0KLTxwPjxiPjUuIE5PIFdBUlJBTlRZPC9iPjwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTCi1QUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMKLU9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLAotQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZCi1PUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cwotZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywKLWRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCi1pbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy48L3A+Ci0KLTxwPjxiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9iPjwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UCi1OT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORwotV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUgotRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKLUhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgotCi08cD48Yj43LiBHRU5FUkFMPC9iPjwvcD4KLQotPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZgotdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uCi1ieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtCi1leHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvcD4KLQotPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5Ci0oaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUKLVByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIKLXNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUKLWRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLjwvcD4KLQotPHA+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQKLWZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzCi1BZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZQotYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzCi11bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLjwvcD4KLQotPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMKLUFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUKLUFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nCi1yZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUKLUFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZQotRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKLWFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEKLXN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUKLWdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKLUNvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUKLUFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzCi1leHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubwotcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyCi10aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgotb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvcD4KLQotPHA+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZAotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5Ci10byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUKLXRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzCi1yaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3A+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE0OGVlOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoIgotICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgdmVyc2lvbj0iMy4yLjUucXVhbGlmaWVyIgotICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICAgPGRlc2NyaXB0aW9uPiVkZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0KLSAgICA8Y29weXJpZ2h0PiVjb3B5cmlnaHQ8L2NvcHlyaWdodD4KLQotICAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPiVsaWNlbnNlPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlIiB2ZXJzaW9uPSIzLjIuNS52MjAxMTA3MjlfMTIwMi0zMEY4XzhzNzM1NTQ2M0hhMjg0NSIgcGF0Y2g9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLTx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDE0LCAyMDEwPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KLQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi0KLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQotICAgICAgIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuPC9wPgotCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZyBQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLQotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjE2NmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJtb25pdG9ydWkvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZjY1YmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLW1vbml0b3J1aS5qYXIKLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLW9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpXzMuMC4wLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMGU5ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aSBwbHVnaW4KLQotIyBUdXJuIG9uIGdlbmVyYWwgdHJhY2luZwotb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvZGVidWc9dHJ1ZQotCi0jIFRyYWNpbmcgb3B0aW9ucwotb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvY29uZmlnPWZhbHNlCi1vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9maW5lc3Q9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3dhcm5pbmc9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3NldmVyZT1mYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTMwODFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc0J1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc05hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiZTQzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBOb3YgMTAgMTc6MTE6MzUgSFNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyMDg1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLSNUaHUgU2VwIDEzIDE1OjI1OjA2IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gsKi50ZXN0c3VpdGUsKi5kZXBsb3ksKi5sb2NhdGlvbiwqLmV4ZWN1dGlvbiwqLmRhdGFwb29sLCouYXJ0aWZhY3QsKi5odG1sLCouc3ZnCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmZmEyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNGcmkgRmViIDIzIDIxOjE2OjI4IEVTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGE2MGU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNTYXQgQXByIDIyIDE4OjM2OjE0IEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk1Yjk3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNTA4LnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnM7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDMsMi4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmRkY2Q3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvCi1zb3VyY2UuLiA9IG1vbml0b3J1aS8KLW91dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jbGNsMTYvY2xlYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jbGNsMTYvY2xlYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODk5NTRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L2NsZWFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L2h0dHBIZWFkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jbGNsMTYvaHR0cEhlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMjBjMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jbGNsMTYvaHR0cEhlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9waW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jbGNsMTYvcGluLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM1MGI3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9waW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jbGNsMTYvc29ydFJlc3BvbnNlVGltZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9zb3J0UmVzcG9uc2VUaW1lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzNGU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9zb3J0UmVzcG9uc2VUaW1lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY3ZpZXcxNi9tb25pdG9yVmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2N2aWV3MTYvbW9uaXRvclZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzc0ZjEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY3ZpZXcxNi9tb25pdG9yVmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2RsY2wxNi9jbGVhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2RsY2wxNi9jbGVhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZjk4YzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9kbGNsMTYvY2xlYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9kbGNsMTYvaHR0cEhlYWRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2RsY2wxNi9odHRwSGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ3MWE4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2RsY2wxNi9odHRwSGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L3Bpbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2RsY2wxNi9waW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTYxNWQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L3Bpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2RsY2wxNi9zb3J0UmVzcG9uc2VUaW1lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L3NvcnRSZXNwb25zZVRpbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmUwYzczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L3NvcnRSZXNwb25zZVRpbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvY2xlYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvY2xlYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODk5NTRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L2NsZWFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L2h0dHBIZWFkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvaHR0cEhlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMjBjMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvaHR0cEhlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9waW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvcGluLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM1MGI3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9waW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvcmVzZW5kUmVxdWVzdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9yZXNlbmRSZXF1ZXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2MmI2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9yZXNlbmRSZXF1ZXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L3NvcnRSZXNwb25zZVRpbWUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvc29ydFJlc3BvbnNlVGltZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMzRlOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvc29ydFJlc3BvbnNlVGltZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2V0b29sMTYvZWRpdFJlcXVlc3QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9ldG9vbDE2L2VkaXRSZXF1ZXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NGU1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2V0b29sMTYvZWRpdFJlcXVlc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9ldmlldzE2L21vbml0b3JWaWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZXZpZXcxNi9tb25pdG9yVmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNzRmMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9ldmlldzE2L21vbml0b3JWaWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvaG9zdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL29iajE2L2hvc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTFhZTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvaG9zdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL29iajE2L21vbml0b3JPZmYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9vYmoxNi9tb25pdG9yT2ZmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlNWYzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL29iajE2L21vbml0b3JPZmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9vYmoxNi9tb25pdG9yT24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9vYmoxNi9tb25pdG9yT24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmYzOTc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvdGNwLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvdGNwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2ZTIxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL29iajE2L3RjcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Db250ZXh0SWRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Db250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMWQxYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKLS8qKgotICogQ29uc3RhbnQgaWRzIGZvciBjb250ZXh0IGhlbHAuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGV4dElkcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFVyA9IE1vbml0b3JVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRtdncwMDAwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX1RSRUUgPSBNb25pdG9yVUlQbHVnaW4uUExVR0lOX0lEICsgIi50bXZ3MDAwMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19SRVFVRVNUID0gTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIudG12dzAwMDQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfUkVTUE9OU0UgPSBNb25pdG9yVUlQbHVnaW4uUExVR0lOX0lEICsgIi50bXZ3MDAwNiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGID0gTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIudG1wcjAwMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU0hPVyA9IE1vbml0b3JVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRtcHIwMDAyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX01PTklUT1JTID0gTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIudG1wcjAwMDQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfRElBTE9HID0gTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIudG1wcjAwMDYiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTVjNDM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBUaWFuY2hhbyBMaSAoVGlhbmNoYW8uTGlAZ21haWwuY29tKSAtIFN0YXJ0IG1vbml0b3JzIGJ5IGRlZmF1bHQgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotLyoqCi0gKiBUcmFuc2xhdGVkIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRNb25pdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld01vbml0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYWxQb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW90ZUhvc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3RlUG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdGVHcm91cDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25uZWN0aW9uVGltZW91dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdXRvU3RhcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZmVyZW5jZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZTaG93VmlldzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb25pdG9yTGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5TdGF0dXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uUmVtb3RlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbHVtblR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uTG9jYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uQXV0b1N0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGFydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdG9wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXJ0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RvcHBlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBoZWFkZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbWFnZVZpZXdJbnZhbGlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbFZpZXdJbnZhbGlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGh0bWxWaWV3SW52YWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3RGF0ZUZvcm1hdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3VGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3UmVzcG9uc2VUaW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdSZXNwb25zZVRpbWVGb3JtYXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1NpemU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld0VuY29kaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdSZXNwb25zZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3UmVxdWVzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Tb3J0QnlSZXNwb25zZVRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1NpemVGb3JtYXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uQ2xlYXJUb29sVGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblNob3dIZWFkZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUGluOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblByb3BlcnRpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgeWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRFbmNvZGluZ09wdGlvbjsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIuaW50ZXJuYWwuTWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWM3MTc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgVGlhbmNoYW8gTGkgKFRpYW5jaGFvLkxpQGdtYWlsLmNvbSkgLSBTdGFydCBtb25pdG9ycyBieSBkZWZhdWx0IAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIC0tLS0tLS0tLS0tLS0tLSBUQ1AvSVAgTW9uaXRvciB2aWV3IC0tLS0tLS0tLS0tLS0tLQotCi0jIExhYmVscwotdmlld1JlcXVlc3Q9UmVxdWVzdDogezB9Ci12aWV3UmVzcG9uc2U9UmVzcG9uc2U6IHswfQotdmlld1RpbWU9VGltZSBvZiByZXF1ZXN0OiB7MH0KLXZpZXdUeXBlPVR5cGU6IHswfQotdmlld1Jlc3BvbnNlVGltZT1SZXNwb25zZSBUaW1lOiB7MH0KLXZpZXdTaXplPVNpemU6IHswfQotdmlld1Jlc3BvbnNlVGltZUZvcm1hdD17MH0gbXMKLXZpZXdTaXplRm9ybWF0PXswfSAoezF9KSBieXRlcwotdmlld0VuY29kaW5nPUVuY29kaW5nOgotCi0jIFRoZSBmb2xsb3dpbmcgc3RyaW5nIGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSB0aW1lIGZvcm1hdCBvZiB0aGUgVENQL0lQIG1vbml0b3IKLSMgdmlldy4gSXQgdXNlcyB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGZvdW5kIGluIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OgotIyAgIGsgLSBob3VyIGluIGRheSwgaCAtIGhvdXIgaW4gYW0vcG0sIG0gLSBtaW51dGUsIHMgLSBzZWNvbmQsIFMgLSBtaWxsaXNlY29uZCwKLSMgICBhIC0gYW0vcG0gbWFya2VyLiB1c2UgZHVwbGljYXRlIGNoYXJzIChlLmcuICdtbScpIHRvIGZpbGwgd2l0aCB6ZXJvcyAoaS5lLiAKLSMgICAnMDEnIGluc3RlYWQgb2YgJzEnKQotdmlld0RhdGVGb3JtYXQ9aDptbS5zLlMgYQotCi0jIEFjdGlvbnMKLWFjdGlvblNvcnRCeVJlc3BvbnNlVGltZT1Tb3J0IEJ5IFJlc3BvbnNlIFRpbWUKLWFjdGlvbkNsZWFyVG9vbFRpcD1DbGVhcgotYWN0aW9uU2hvd0hlYWRlcj1TaG93IEhlYWRlcgotYWN0aW9uUGluPVBpbiBTZWxlY3Rpb24KLWFjdGlvblByb3BlcnRpZXM9UHJvcGVydGllcwotCi0KLSMgLS0tLS0tLS0tLS0tLS0tIFJlcXVlc3RSZXNwb25zZSBWaWV3ZXJzIC0tLS0tLS0tLS0tLS0tLQotaGVhZGVyTGFiZWw9SGVhZGVyOiB7MH0KLWltYWdlVmlld0ludmFsaWQ9PE5vdCBhIHZhbGlkIGltYWdlIGZpbGU+Ci14bWxWaWV3SW52YWxpZD08Tm90IGEgdmFsaWQgWE1MIGZpbGU+Ci1odG1sVmlld0ludmFsaWQ9PE5vdCBhIHZhbGlkIEhUTUwgZmlsZT4KLQotIyAtLS0tLS0tLS0tLS0tLS0gRXJyb3JzIC0tLS0tLS0tLS0tLS0tLQotZXJyb3JEaWFsb2dUaXRsZT1FcnJvcgotCi0jIC0tLS0tLS0tLS0tLS0tLSBHZW5lcmFsIFVJIC0tLS0tLS0tLS0tLS0tLQotbW9uaXRvckxpc3Q9VENQL0lQICZNb25pdG9yczoKLWNvbHVtbkxvY2FsPUxvY2FsIFBvcnQKLWNvbHVtblJlbW90ZT1Ib3N0IG5hbWUKLWNvbHVtblR5cGU9VHlwZQotY29sdW1uU3RhdHVzPVN0YXR1cwotY29sdW1uQXV0b1N0YXJ0PUF1dG8tc3RhcnQKLWFkZD0mQWRkLi4uCi1lZGl0PSZFZGl0Li4uCi1yZW1vdmU9JlJlbW92ZQotc3RhcnQ9JlN0YXJ0Ci1zdG9wPVMmdG9wCi1zdGFydGVkPVN0YXJ0ZWQKLXN0b3BwZWQ9U3RvcHBlZAoteWVzPVllcwotbm89Tm8KLQotbmV3TW9uaXRvcj1OZXcgTW9uaXRvcgotZWRpdE1vbml0b3I9RWRpdCBNb25pdG9yCi0KLWxvY2FsUG9ydD0mTG9jYWwgbW9uaXRvcmluZyBwb3J0OgotcmVtb3RlR3JvdXA9TW9uaXRvcgotcmVtb3RlSG9zdD0mSG9zdCBuYW1lOgotcmVtb3RlUG9ydD0mUG9ydDoKLXBhcnNlVHlwZT0mVHlwZToKLWF1dG9TdGFydD0mU3RhcnQgbW9uaXRvciBhdXRvbWF0aWNhbGx5Ci1jb25uZWN0aW9uVGltZW91dD1UJmltZW91dCAoaW4gbWlsbGlzZWNvbmRzKToKLQotcHJlZmVyZW5jZURlc2NyaXB0aW9uPUNvbmZpZ3VyZSBUQ1AvSVAgbW9uaXRvcnMgb24gbG9jYWwgYW5kIHJlbW90ZSBwb3J0cy4KLXByZWZTaG93Vmlldz1TJmhvdyB0aGUgVENQL0lQIE1vbml0b3IgdmlldyB3aGVuIHRoZXJlIGlzIGFjdGl2aXR5Ci0KLWRlZmF1bHRFbmNvZGluZ09wdGlvbj08Tm9uZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4N2IzY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvckNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5Nb25pdG9yQ29yZTsKLS8qKgotICogTW9uaXRvciBjb250ZW50IHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvckNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkvKioKLQkgKiBNb25pdG9yQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vbml0b3JDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBEaXNwb3NlcyBvZiB0aGlzIGNvbnRlbnQgcHJvdmlkZXIuICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIgCi0JICogd2hlbiBpdHMgaW5wdXQgaXMgc2V0IHRvIHRoZSBnaXZlbiBlbGVtZW50LiAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gTW9uaXRvckNvcmUuZ2V0TW9uaXRvcnMoKTsKLQl9Ci0KLQkvKgotCSAqIE5vdGlmaWVzIHRoaXMgY29udGVudCBwcm92aWRlciB0aGF0IHRoZSBnaXZlbiB2aWV3ZXIncyBpbnB1dAotCSAqIGhhcyBiZWVuIHN3aXRjaGVkIHRvIGEgZGlmZmVyZW50IGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGJhODc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFRpYW5jaGFvIExpIChUaWFuY2hhby5MaUBnbWFpbC5jb20pIC0gU3RhcnQgbW9uaXRvcnMgYnkgZGVmYXVsdCAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLklQcm90b2NvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5Nb25pdG9yQ29yZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgSU1vbml0b3JXb3JraW5nQ29weSBtb25pdG9yOwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdDsKLQotCXByaXZhdGUgQnV0dG9uIG9rQnV0dG9uOwotCXByaXZhdGUgU3Bpbm5lciBtb25pdG9yUG9ydDsKLQlwcml2YXRlIExhYmVsIHZhbGlkYXRlTGFiZWw7Ci0KLQlpbnRlcmZhY2UgU3RyaW5nTW9kaWZ5TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoU3RyaW5nIHMpOwotCX0KLQotCWludGVyZmFjZSBCb29sZWFuTW9kaWZ5TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoYm9vbGVhbiBiKTsKLQl9Ci0KLQlpbnRlcmZhY2UgVHlwZU1vZGlmeUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKElQcm90b2NvbEFkYXB0ZXIgdHlwZSk7Ci0JfQotCi0JaW50ZXJmYWNlIEludE1vZGlmeUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKGludCBpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbW9uaXRvciBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgTW9uaXRvckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSU1vbml0b3JXb3JraW5nQ29weSBtb25pdG9yKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQkJaXNFZGl0ID0gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIE1vbml0b3JEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQltb25pdG9yID0gTW9uaXRvckNvcmUuY3JlYXRlTW9uaXRvcigpOwotCQlpc0VkaXQgPSBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlpZiAoaXNFZGl0KQotCQkJc2hlbGwuc2V0VGV4dChNZXNzYWdlcy5lZGl0TW9uaXRvcik7Ci0JCWVsc2UKLQkJCXNoZWxsLnNldFRleHQoTWVzc2FnZXMubmV3TW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVDaGVja0JveChDb21wb3NpdGUgY29tcCwgU3RyaW5nIHR4dCwgYm9vbGVhbiBzZWxlY3RlZCwgZmluYWwgQm9vbGVhbk1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5zZXRUZXh0KHR4dCk7Ci0JCWJ1dHRvbi5zZXRTZWxlY3Rpb24oc2VsZWN0ZWQpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpKTsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgYXJnMCkgewotCQkJCQlsaXN0ZW5lci52YWx1ZUNoYW5nZWQoYnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIGNvbXAsIFN0cmluZyB0eHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KHR4dCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgY29tcCwgU3RyaW5nIHR4dCwgZmluYWwgU3RyaW5nTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29tcCwgU1dULkJPUkRFUik7Ci0JCWlmICh0eHQgIT0gbnVsbCkKLQkJCXRleHQuc2V0VGV4dCh0eHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCWRhdGEud2lkdGhIaW50ID0gMTUwOwotCQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CQotCQkJCQlsaXN0ZW5lci52YWx1ZUNoYW5nZWQodGV4dC5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCX0pOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3Bpbm5lciBjcmVhdGVTcGlubmVyKENvbXBvc2l0ZSBjb21wLCBpbnQgdiwgZmluYWwgSW50TW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZmluYWwgU3Bpbm5lciBzID0gbmV3IFNwaW5uZXIoY29tcCwgU1dULkJPUkRFUik7Ci0JCXMuc2V0TWluaW11bSgwKTsKLQkJcy5zZXRNYXhpbXVtKEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJaWYgKHYgIT0gLTEpCi0JCQlzLnNldFNlbGVjdGlvbih2KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQlkYXRhLndpZHRoSGludCA9IDE1MDsKLQkJcy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCXMuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewkKLQkJCQkJbGlzdGVuZXIudmFsdWVDaGFuZ2VkKHMuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX0pOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tYm8gY3JlYXRlVHlwZUNvbWJvKENvbXBvc2l0ZSBjb21wLCBmaW5hbCBTdHJpbmdbXSB0eXBlcywgU3RyaW5nIHNlbCwgZmluYWwgU3RyaW5nTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZmluYWwgQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oY29tcCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQlpbnQgc2l6ZSA9IHR5cGVzLmxlbmd0aDsKLQkJU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQlpbnQgaW5kZXggPSAtMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWl0ZW1zW2ldID0gdHlwZXNbaV07Ci0JCQlpZiAodHlwZXNbaV0uZXF1YWxzKHNlbCkpCi0JCQkJaW5kZXggPSBpOwotCQl9Ci0JCWNvbWJvLnNldEl0ZW1zKGl0ZW1zKTsKLQkJaWYgKGluZGV4ID49IDApCi0JCQljb21iby5zZWxlY3QoaW5kZXgpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCWRhdGEud2lkdGhIaW50ID0gMTUwOwotCQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CQotCQkJCQlsaXN0ZW5lci52YWx1ZUNoYW5nZWQodHlwZXNbY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV0pOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkoKEdyaWRMYXlvdXQpY29tcG9zaXRlLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gMjsKLQkJCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLlBSRUZfRElBTE9HKTsKLQkJCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMubG9jYWxQb3J0KTsKLQkJbW9uaXRvclBvcnQgPSBjcmVhdGVTcGlubmVyKGNvbXBvc2l0ZSwgbW9uaXRvci5nZXRMb2NhbFBvcnQoKSwgbmV3IEludE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKGludCBpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5zZXRMb2NhbFBvcnQoaSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJCXZhbGlkYXRlRmllbGRzKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZ3JvdXAuc2V0VGV4dChNZXNzYWdlcy5yZW1vdGVHcm91cCk7Ci0JCQotCQljcmVhdGVMYWJlbChncm91cCwgTWVzc2FnZXMucmVtb3RlSG9zdCk7Ci0JCWNyZWF0ZVRleHQoZ3JvdXAsIG1vbml0b3IuZ2V0UmVtb3RlSG9zdCgpLCBuZXcgU3RyaW5nTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoU3RyaW5nIHMpIHsKLQkJCQltb25pdG9yLnNldFJlbW90ZUhvc3Qocyk7Ci0JCQkJdmFsaWRhdGVGaWVsZHMoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQljcmVhdGVMYWJlbChncm91cCwgTWVzc2FnZXMucmVtb3RlUG9ydCk7Ci0JCWNyZWF0ZVNwaW5uZXIoZ3JvdXAsIG1vbml0b3IuZ2V0UmVtb3RlUG9ydCgpLCBuZXcgSW50TW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoaW50IGkpIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLnNldFJlbW90ZVBvcnQoaSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJCXZhbGlkYXRlRmllbGRzKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJY3JlYXRlTGFiZWwoZ3JvdXAsIE1lc3NhZ2VzLnBhcnNlVHlwZSk7Ci0JCWNyZWF0ZVR5cGVDb21ibyhncm91cCwgbmV3IFN0cmluZ1tdIHsiVENQL0lQIiwiSFRUUCJ9LCBtb25pdG9yLmdldFByb3RvY29sKCksIG5ldyBTdHJpbmdNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChTdHJpbmcgcHJvdG9jb2xJZCkgewotCQkJCW1vbml0b3Iuc2V0UHJvdG9jb2wocHJvdG9jb2xJZCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJY3JlYXRlTGFiZWwoZ3JvdXAsIE1lc3NhZ2VzLmNvbm5lY3Rpb25UaW1lb3V0KTsKLQkJY3JlYXRlU3Bpbm5lcihncm91cCwgbW9uaXRvci5nZXRUaW1lb3V0KCksIG5ldyBJbnRNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChpbnQgaSkgewotCQkJCW1vbml0b3Iuc2V0VGltZW91dChpKTsKLQkJCQl2YWxpZGF0ZUZpZWxkcygpOwotCQkJfQotCQl9KTsKLQkJCi0JCWNyZWF0ZUxhYmVsKGdyb3VwLCAiIik7Ci0JCWNyZWF0ZUNoZWNrQm94KGdyb3VwLCBNZXNzYWdlcy5hdXRvU3RhcnQsIG1vbml0b3IuaXNBdXRvU3RhcnQoKSwgbmV3IEJvb2xlYW5Nb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChib29sZWFuIGIpIHsKLQkJCQltb25pdG9yLnNldEF1dG9TdGFydChiKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl2YWxpZGF0ZUxhYmVsID0gY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiIik7Ci0JCXZhbGlkYXRlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb21wb3NpdGUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjb2tQcmVzc2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCUlNb25pdG9yIHNhdmVkTW9uaXRvciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzYXZlZE1vbml0b3IgPSBtb25pdG9yLnNhdmUoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIE1lc3NhZ2VzLmVycm9yRGlhbG9nVGl0bGUsIGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgY2UuZ2V0U3RhdHVzKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChzYXZlZE1vbml0b3IgIT0gbnVsbCAmJiBzYXZlZE1vbml0b3IuaXNBdXRvU3RhcnQoKSkKLQkJCXRyeSB7Ci0JCQkJc2F2ZWRNb25pdG9yLnN0YXJ0KCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIE1lc3NhZ2VzLmVycm9yRGlhbG9nVGl0bGUsIGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgY2UuZ2V0U3RhdHVzKCkpOwotCQkJfQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIGJ1dHRvbkNvbnRyb2wgPSBzdXBlci5jcmVhdGVCdXR0b25CYXIocGFyZW50KTsKLQkJdmFsaWRhdGVGaWVsZHMoKTsKLQkJcmV0dXJuIGJ1dHRvbkNvbnRyb2w7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE9LQnV0dG9uRW5hYmxlZChib29sZWFuIGN1cklzRW5hYmxlZCkgewotCQlpZiAob2tCdXR0b24gPT0gbnVsbCkKLQkJCW9rQnV0dG9uID0gZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotCQkKLQkJaWYgKG9rQnV0dG9uICE9IG51bGwpCi0JCQlva0J1dHRvbi5zZXRFbmFibGVkKGN1cklzRW5hYmxlZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaWVsZHMoKSB7Ci0JCWlmIChtb25pdG9yUG9ydCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlJU3RhdHVzIHN0YXR1cyA9IG1vbml0b3IudmFsaWRhdGUoKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQlpZiAobW9uaXRvci5nZXRSZW1vdGVIb3N0KCkgPT0gbnVsbCB8fCBtb25pdG9yLmdldFJlbW90ZUhvc3QoKS5sZW5ndGgoKSA8IDEpCi0JCQkJdmFsaWRhdGVMYWJlbC5zZXRUZXh0KCIiKTsKLQkJCWVsc2UKLQkJCQl2YWxpZGF0ZUxhYmVsLnNldFRleHQoc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJfSBlbHNlCi0JCQl2YWxpZGF0ZUxhYmVsLnNldFRleHQoIiIpOwotCQkKLQkJc2V0T0tCdXR0b25FbmFibGVkKHJlc3VsdCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JQcmVmZXJlbmNlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvclByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMjc0ODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvclByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBUaWFuY2hhbyBMaSAoVGlhbmNoYW8uTGlAZ21haWwuY29tKSAtIFN0YXJ0IG1vbml0b3JzIGJ5IGRlZmF1bHQgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5Nb25pdG9yQ29yZTsKLS8qKgotICogVGhlIHByZWZlcmVuY2UgcGFnZSB0aGF0IGhvbGRzIG1vbml0b3IgcHJvcGVydGllcy4KLSAqLwotcHVibGljIGNsYXNzIE1vbml0b3JQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRpc3BsYXlCdXR0b247Ci0JCi0JcHJvdGVjdGVkIFRhYmxlIHRhYmxlOwotCXByb3RlY3RlZCBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQkKLQlwcm90ZWN0ZWQgQnV0dG9uIGVkaXQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiByZW1vdmU7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBzdGFydDsKLQlwcm90ZWN0ZWQgQnV0dG9uIHN0b3A7Ci0JCi0JcHJvdGVjdGVkIExpc3Q8T2JqZWN0PiBzZWxlY3Rpb24yOwotCi0JLyoqCi0JICogTW9uaXRvclByZWZlcmVuY2VQYWdlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vbml0b3JQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIHByZWZlcmVuY2Ugb3B0aW9ucy4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoNCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoMyk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5QUkVGKTsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZlcmVuY2VEZXNjcmlwdGlvbik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQkJZGlzcGxheUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlkaXNwbGF5QnV0dG9uLnNldFRleHQoTWVzc2FnZXMucHJlZlNob3dWaWV3KTsKLQkJZGlzcGxheUJ1dHRvbi5zZXRTZWxlY3Rpb24oTW9uaXRvclVJUGx1Z2luLmdldFNob3dPbkFjdGl2aXR5UHJlZmVyZW5jZSgpKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLnZlcnRpY2FsSW5kZW50ID0gODsKLQkJZGlzcGxheUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpc3BsYXlCdXR0b24sIENvbnRleHRJZHMuUFJFRl9TSE9XKTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLm1vbml0b3JMaXN0KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS52ZXJ0aWNhbEluZGVudCA9IDg7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQl0YWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMzUwOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRhYmxlLCBDb250ZXh0SWRzLlBSRUZfTU9OSVRPUlMpOwotCQkKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQkKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJCi0JCVRhYmxlQ29sdW1uIHN0YXR1c0NvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQlzdGF0dXNDb2x1bW4uc2V0VGV4dChNZXNzYWdlcy5jb2x1bW5TdGF0dXMpOwotCQlDb2x1bW5XZWlnaHREYXRhIGNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg2LCA2MCwgdHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7Ci0JCQotCQlUYWJsZUNvbHVtbiByZW1vdGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJcmVtb3RlQ29sdW1uLnNldFRleHQoTWVzc2FnZXMuY29sdW1uUmVtb3RlKTsKLQkJY29sRGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEyLCAxMjAsIHRydWUpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbERhdGEpOwotCQkKLQkJVGFibGVDb2x1bW4gaHR0cENvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQlodHRwQ29sdW1uLnNldFRleHQoTWVzc2FnZXMuY29sdW1uVHlwZSk7Ci0JCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1LCA1MCwgdHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7Ci0JCQotCQlUYWJsZUNvbHVtbiBsb2NhbENvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQlsb2NhbENvbHVtbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbHVtbkxvY2FsKTsKLQkJY29sRGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDYsIDYwLCB0cnVlKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2xEYXRhKTsKLQkJCi0JCVRhYmxlQ29sdW1uIHN0YXJ0T25TdGFydHVwQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCXN0YXJ0T25TdGFydHVwQ29sdW1uLnNldFRleHQoTWVzc2FnZXMuY29sdW1uQXV0b1N0YXJ0KTsKLQkJY29sRGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDcsIDcwLCB0cnVlKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2xEYXRhKTsKLQkJCi0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0JCQotCQl0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgTW9uaXRvckNvbnRlbnRQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTW9uaXRvclRhYmxlTGFiZWxQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoInJvb3QiKTsKLQkJCi0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoMyk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWJ1dHRvbkNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJYnV0dG9uQ29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJQnV0dG9uIGFkZCA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLmFkZCk7Ci0JCWFkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlNb25pdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBNb25pdG9yRGlhbG9nKGdldFNoZWxsKCkpOwotCQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpCi0JCQkJCXJldHVybjsKLQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCi0JCQkJSU1vbml0b3JbXSBtb25pdG9ycyA9IE1vbml0b3JDb3JlLmdldE1vbml0b3JzKCk7Ci0JCQkJT2JqZWN0IG1vbml0b3IgPSBtb25pdG9yc1ttb25pdG9ycy5sZW5ndGggLSAxXTsKLQkJCQl0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obW9uaXRvcikpOwotCQkJfQotCQl9KTsJCQotCQkKLQkJZWRpdCA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLmVkaXQpOwotCQllZGl0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlNb25pdG9yIG1vbml0b3IgPSAoSU1vbml0b3IpIGdldFNlbGVjdGlvbigpLmdldCgwKTsKLQkJCQlJTW9uaXRvcldvcmtpbmdDb3B5IHdjID0gbW9uaXRvci5jcmVhdGVXb3JraW5nQ29weSgpOwotCQkJCQotCQkJCU1vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IE1vbml0b3JEaWFsb2coZ2V0U2hlbGwoKSwgd2MpOwotCQkJCWlmIChkaWFsb2cub3BlbigpICE9IFdpbmRvdy5DQU5DRUwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXRhYmxlVmlld2VyLnJlZnJlc2god2Muc2F2ZSgpKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQotCQlyZW1vdmUgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5yZW1vdmUpOwotCQlyZW1vdmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRTZWxlY3Rpb24oKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJSU1vbml0b3IgbW9uaXRvciA9IChJTW9uaXRvcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQl0cnkgewotCQkJCQkJbW9uaXRvci5kZWxldGUoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQl0YWJsZVZpZXdlci5yZW1vdmUobW9uaXRvcik7Ci0JCQkJCQotCQkJCQlJTW9uaXRvcltdIG1vbml0b3JzID0gTW9uaXRvckNvcmUuZ2V0TW9uaXRvcnMoKTsKLQkJCQkJaWYgKG1vbml0b3JzLmxlbmd0aCA+IDApIHsKLQkJCQkJCU9iamVjdCBtb25pdG9yMiA9IG1vbml0b3JzW21vbml0b3JzLmxlbmd0aCAtIDFdOwotCQkJCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vbml0b3IyKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQotCQlzdGFydCA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLnN0YXJ0KTsKLQkJZGF0YSA9IChHcmlkRGF0YSkgc3RhcnQuZ2V0TGF5b3V0RGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsSW5kZW50ID0gOTsKLQkJc3RhcnQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRTZWxlY3Rpb24oKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJSU1vbml0b3IgbW9uaXRvciA9IChJTW9uaXRvcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQl0cnkgewotCQkJCQkJbW9uaXRvci5zdGFydCgpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBNZXNzYWdlcy5lcnJvckRpYWxvZ1RpdGxlLCBjZS5nZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gY2UpIHsKLQkJCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIE1lc3NhZ2VzLmVycm9yRGlhbG9nVGl0bGUsIGNlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0KLQkJCQkJdGFibGVWaWV3ZXIucmVmcmVzaChtb25pdG9yLCB0cnVlKTsKLQkJCQl9Ci0JCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JCXN0YXJ0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJc3RvcCA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLnN0b3ApOwotCQlzdG9wLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUlNb25pdG9yIG1vbml0b3IgPSAoSU1vbml0b3IpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1vbml0b3Iuc3RvcCgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJCXRhYmxlVmlld2VyLnJlZnJlc2gobW9uaXRvciwgdHJ1ZSk7Ci0JCQkJfQotCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbih0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQlzdG9wLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgcHJlZmVyZW5jZSBwYWdlIHVzaW5nIHRoZSBwYXNzZWQgd29ya2JlbmNoLgotCSAqCi0JICogQHBhcmFtIHdvcmtiZW5jaCB0aGUgY3VycmVudCB3b3JrYmVuY2gKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBzcGVjaWFsIHByb2Nlc3Npbmcgd2hlbiB0aGlzIHBhZ2UncyBEZWZhdWx0cyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgZnJhbWV3b3JrIGhvb2sgbWV0aG9kIGZvciBzdWJjbGFzc2VzIHRvIGRvIHNwZWNpYWwgdGhpbmdzIHdoZW4KLQkgKiB0aGUgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUsIGJ1dCBzaG91bGQgY2FsbCA8Y29kZT5zdXBlci5wZXJmb3JtRGVmYXVsdHM8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWRpc3BsYXlCdXR0b24uc2V0U2VsZWN0aW9uKE1vbml0b3JVSVBsdWdpbi5nZXREZWZhdWx0U2hvd09uQWN0aXZpdHlQcmVmZXJlbmNlKCkpOwotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQkvKiogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJTW9uaXRvclVJUGx1Z2luLnNldFNob3dPbkFjdGl2aXR5UHJlZmVyZW5jZShkaXNwbGF5QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJTW9uaXRvclVJUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWxlY3Rpb24yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbDIpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWwyOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlbC5pdGVyYXRvcigpOwotCQlzZWxlY3Rpb24yID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElNb25pdG9yKQotCQkJCXNlbGVjdGlvbjIuYWRkKG9iaik7Ci0JCX0KLQkJCi0JCWlmICghc2VsZWN0aW9uMi5pc0VtcHR5KCkpIHsKLQkJCXJlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCQkJCi0JCQlib29sZWFuIGFsbFN0b3BwZWQgPSB0cnVlOwotCQkJYm9vbGVhbiBhbGxTdGFydGVkID0gdHJ1ZTsKLQkJCQotCQkJaXRlcmF0b3IgPSBzZWxlY3Rpb24yLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU1vbml0b3IgbW9uaXRvciA9IChJTW9uaXRvcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChtb25pdG9yLmlzUnVubmluZygpKQotCQkJCQlhbGxTdG9wcGVkID0gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlhbGxTdGFydGVkID0gZmFsc2U7Ci0JCQl9Ci0JCQlzdGFydC5zZXRFbmFibGVkKGFsbFN0b3BwZWQpOwotCQkJc3RvcC5zZXRFbmFibGVkKGFsbFN0YXJ0ZWQpOwotCQkJZWRpdC5zZXRFbmFibGVkKHNlbGVjdGlvbjIuc2l6ZSgpID09IDEgJiYgYWxsU3RvcHBlZCk7Ci0JCX0gZWxzZSB7Ci0JCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJc3RhcnQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlzdG9wLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdldENvbnRyb2woKSwgQ29udGV4dElkcy5QUkVGKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvclRhYmxlTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvclRhYmxlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODc1MzI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFRpYW5jaGFvIExpIChUaWFuY2hhby5MaUBnbWFpbC5jb20pIC0gU3RhcnQgbW9uaXRvcnMgYnkgZGVmYXVsdCAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLS8qKgotICogTW9uaXRvciB0YWJsZSBsYWJlbCBwcm92aWRlci4KLSAqLwotcHVibGljIGNsYXNzIE1vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkvKioKLQkgKiBNb25pdG9yVGFibGVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQHNlZSBJVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKE9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQlJTW9uaXRvciBtb25pdG9yID0gKElNb25pdG9yKSBlbGVtZW50OwotCQkJaWYgKG1vbml0b3IuaXNSdW5uaW5nKCkpCi0JCQkJcmV0dXJuIE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZShNb25pdG9yVUlQbHVnaW4uSU1HX01PTklUT1JfT04pOwotCQkJcmV0dXJuIE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZShNb25pdG9yVUlQbHVnaW4uSU1HX01PTklUT1JfT0ZGKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChPYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlJTW9uaXRvciBtb25pdG9yID0gKElNb25pdG9yKSBlbGVtZW50OwotCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJaWYgKG1vbml0b3IuaXNSdW5uaW5nKCkpCi0JCQkJcmV0dXJuIE1lc3NhZ2VzLnN0YXJ0ZWQ7Ci0JCQlyZXR1cm4gTWVzc2FnZXMuc3RvcHBlZDsKLQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKQotCQkJcmV0dXJuIG1vbml0b3IuZ2V0UmVtb3RlSG9zdCgpICsgIjoiICsgbW9uaXRvci5nZXRSZW1vdGVQb3J0KCk7Ci0JCWVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDIpCi0JCQlyZXR1cm4gbW9uaXRvci5nZXRQcm90b2NvbCgpOwotCQllbHNlIGlmIChjb2x1bW5JbmRleCA9PSAzKQotCQkJcmV0dXJuIG1vbml0b3IuZ2V0TG9jYWxQb3J0KCkgKyAiIjsKLQkJZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gNCkgewotCQkJaWYgKG1vbml0b3IuaXNBdXRvU3RhcnQoKSkKLQkJCQlyZXR1cm4gTWVzc2FnZXMueWVzOwotCQkJcmV0dXJuIE1lc3NhZ2VzLm5vOwotCQl9IGVsc2UKLQkJCXJldHVybiAiWCI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBub3ROdWxsKFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ci0JCQotCQlyZXR1cm4gczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShPYmplY3QsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvclVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyOTIyOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvclVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5HWklQSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGVidWcuRGVidWdPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kZWJ1Zy5EZWJ1Z09wdGlvbnNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXcuTW9uaXRvclZpZXc7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0vKioKLSAqIFRoZSBUQ1AvSVAgbW9uaXRvciBVSSBwbHVnaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkiOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBCVUZGRVIgPSBuZXcgYnl0ZVs0MDk2XTsKLQotCXByaXZhdGUgc3RhdGljIE1vbml0b3JVSVBsdWdpbiBzaW5nbGV0b247Ci0KLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yPiBpbWFnZURlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbWFnZURlc2NyaXB0b3I+KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGluZVNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotCXByaXZhdGUgc3RhdGljIFVSTCBJQ09OX0JBU0VfVVJMOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfQ0xDTCA9ICJjbGNsMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0VMQ0wgPSAiZWxjbDE2LyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9ETENMID0gImRsY2wxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfT0JKID0gIm9iajE2LyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9TT1JUX1JFU1BPTlNFX1RJTUUgPSAiSU1HX0VMQ0xfU09SVF9SRVNQT05TRV9USU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9DTEVBUiA9ICJJTUdfRUxDTF9DTEVBUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfSFRUUF9IRUFERVIgPSAiSU1HX0VMQ0xfSFRUUF9IRUFERVIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX1BJTiA9ICJJTUdfRUxDTF9QSU4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DTENMX1NPUlRfUkVTUE9OU0VfVElNRSA9ICJJTUdfQ0xDTF9TT1JUX1JFU1BPTlNFX1RJTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DTENMX0NMRUFSID0gIklNR19DTENMX0NMRUFSIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xDTF9IVFRQX0hFQURFUiA9ICJJTUdfQ0xDTF9IVFRQX0hFQURFUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMQ0xfUElOID0gIklNR19DTENMX1BJTiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfU09SVF9SRVNQT05TRV9USU1FID0gIklNR19ETENMX1NPUlRfUkVTUE9OU0VfVElNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfQ0xFQVIgPSAiSU1HX0RMQ0xfQ0xFQVIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX0hUVFBfSEVBREVSID0gIklNR19ETENMX0hUVFBfSEVBREVSIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9QSU4gPSAiSU1HX0RMQ0xfUElOIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19SRVFVRVNUX1JFU1BPTlNFID0gInJlcXVlc3RSZXNwb25zZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1JFU0VORF9SRVFVRVNUX1JFU1BPTlNFID0gInJlc2VuZFJlcXVlc3RSZXNwb25zZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfSE9TVCA9ICJob3N0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTU9OSVRPUl9PTiA9ICJtb25pdG9yT24iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19NT05JVE9SX09GRiA9ICJtb25pdG9yT2ZmIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9XX1ZJRVdfT05fQUNUSVZJVFkgPSAic2hvdy12aWV3IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElOX1ZJRVcgPSAicGluLXZpZXciOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9XX0hFQURFUiA9ICJzaG93LWhlYWRlciI7Ci0KLQlwcm90ZWN0ZWQgTGlzdDxSZXF1ZXN0PiByZXF1ZXN0cyA9IG5ldyBBcnJheUxpc3Q8UmVxdWVzdD4oKTsKLQotCXByb3RlY3RlZCBJTW9uaXRvckxpc3RlbmVyIG1vbml0b3JMaXN0ZW5lciA9IG5ldyBJTW9uaXRvckxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb25pdG9yQWRkZWQoSU1vbml0b3IgbW9uaXRvcikgewotCQkJbW9uaXRvci5hZGRSZXF1ZXN0TGlzdGVuZXIocmVxdWVzdExpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vbml0b3JDaGFuZ2VkKElNb25pdG9yIG1vbml0b3IpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9uaXRvclJlbW92ZWQoSU1vbml0b3IgbW9uaXRvcikgewotCQkJbW9uaXRvci5yZW1vdmVSZXF1ZXN0TGlzdGVuZXIocmVxdWVzdExpc3RlbmVyKTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSVJlcXVlc3RMaXN0ZW5lciByZXF1ZXN0TGlzdGVuZXIgPSBuZXcgSVJlcXVlc3RMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcmVxdWVzdEFkZGVkKElNb25pdG9yIG1vbml0b3IsIFJlcXVlc3QgcmVxdWVzdCkgewotCQkJYWRkUmVxdWVzdChyZXF1ZXN0KTsKLQkJCQotCQkJaWYgKE1vbml0b3JWaWV3LnZpZXcgIT0gbnVsbCkKLQkJCQlNb25pdG9yVmlldy52aWV3LmRvUmVxdWVzdEFkZGVkKHJlcXVlc3QpOwotCQkJZWxzZSBpZiAoTW9uaXRvclVJUGx1Z2luLmdldFNob3dPbkFjdGl2aXR5UHJlZmVyZW5jZSgpKQotCQkJCU1vbml0b3JWaWV3Lm9wZW4ocmVxdWVzdCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXF1ZXN0Q2hhbmdlZChJTW9uaXRvciBtb25pdG9yLCBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCWlmIChNb25pdG9yVmlldy52aWV3ICE9IG51bGwpCi0JCQkJTW9uaXRvclZpZXcudmlldy5kb1JlcXVlc3RDaGFuZ2VkKHJlcXVlc3QpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIE1vbml0b3JVSVBsdWdpbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBNb25pdG9yVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNpbmdsZXRvbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcHJlLWxvYWRzIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIEltYWdlUmVnaXN0cnkKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2VSZWdpc3RyeSBjcmVhdGVJbWFnZVJlZ2lzdHJ5KCkgewotCQlJbWFnZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gc3VwZXIuY3JlYXRlSW1hZ2VSZWdpc3RyeSgpOwotCQkKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX1JFUVVFU1RfUkVTUE9OU0UsIFVSTF9PQkogKyAidGNwLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfUkVTRU5EX1JFUVVFU1RfUkVTUE9OU0UsIFVSTF9FTENMICsgInJlc2VuZFJlcXVlc3QuZ2lmIik7Ci0JCQotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfSE9TVCwgVVJMX09CSiArICJob3N0LmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfTU9OSVRPUl9PTiwgVVJMX09CSiArICJtb25pdG9yT24uZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19NT05JVE9SX09GRiwgVVJMX09CSiArICJtb25pdG9yT2ZmLmdpZiIpOwotCQkKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0NMQ0xfQ0xFQVIsIFVSTF9DTENMICsgImNsZWFyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfQ0xDTF9TT1JUX1JFU1BPTlNFX1RJTUUsIFVSTF9DTENMICsgInNvcnRSZXNwb25zZVRpbWUuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19DTENMX0hUVFBfSEVBREVSLCBVUkxfQ0xDTCArICJodHRwSGVhZGVyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfQ0xDTF9QSU4sIFVSTF9DTENMICsgInBpbi5naWYiKTsKLQkJCi0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19FTENMX0NMRUFSLCBVUkxfRUxDTCArICJjbGVhci5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0VMQ0xfU09SVF9SRVNQT05TRV9USU1FLCBVUkxfRUxDTCArICJzb3J0UmVzcG9uc2VUaW1lLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfRUxDTF9IVFRQX0hFQURFUiwgVVJMX0VMQ0wgKyAiaHR0cEhlYWRlci5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0VMQ0xfUElOLCBVUkxfRUxDTCArICJwaW4uZ2lmIik7Ci0JCQotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfRExDTF9DTEVBUiwgVVJMX0RMQ0wgKyAiY2xlYXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19ETENMX1NPUlRfUkVTUE9OU0VfVElNRSwgVVJMX0RMQ0wgKyAic29ydFJlc3BvbnNlVGltZS5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0RMQ0xfSFRUUF9IRUFERVIsIFVSTF9ETENMICsgImh0dHBIZWFkZXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19ETENMX1BJTiwgVVJMX0RMQ0wgKyAicGluLmdpZiIpOwotCQkKLQkJcmV0dXJuIHJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEByZXR1cm4gdGhlIGltYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltYWdlIHdpdGggdGhlIGdpdmVuIGtleSBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcmV0dXJuIGFuIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5pbWFnZURlc2NyaXB0b3JzLmdldChrZXkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiB0aGUgcGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBNb25pdG9yVUlQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgYW4gaW1hZ2Ugd2l0aCB0aGUgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHBhcmFtIHBhcnRpYWxVUkwKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJJbWFnZShJbWFnZVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcga2V5LCBTdHJpbmcgcGFydGlhbFVSTCkgewotCQlpZiAoSUNPTl9CQVNFX1VSTCA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGF0aFN1ZmZpeCA9ICJpY29ucy8iOwotCQkJSUNPTl9CQVNFX1VSTCA9IHNpbmdsZXRvbi5nZXRCdW5kbGUoKS5nZXRFbnRyeShwYXRoU3VmZml4KTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaWQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChuZXcgVVJMKElDT05fQkFTRV9VUkwsIHBhcnRpYWxVUkwpKTsKLQkJCXJlZ2lzdHJ5LnB1dChrZXksIGlkKTsKLQkJCWltYWdlRGVzY3JpcHRvcnMucHV0KGtleSwgaWQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciByZWdpc3RlcmluZyBpbWFnZSIsIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0RGVmYXVsdChNb25pdG9yVUlQbHVnaW4uU0hPV19WSUVXX09OX0FDVElWSVRZLCB0cnVlKTsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0RGVmYXVsdChNb25pdG9yVUlQbHVnaW4uUElOX1ZJRVcsIGZhbHNlKTsKLQkJCi0JCU1vbml0b3JDb3JlLmFkZE1vbml0b3JMaXN0ZW5lcihtb25pdG9yTGlzdGVuZXIpOwotCQkKLQkJSU1vbml0b3JbXSBtb25pdG9ycyA9IE1vbml0b3JDb3JlLmdldE1vbml0b3JzKCk7Ci0JCWlmIChtb25pdG9ycyAhPSBudWxsKSB7Ci0JCQlmb3IgKElNb25pdG9yIG1vbml0b3IgOiBtb25pdG9ycykKLQkJCQltb25pdG9yLmFkZFJlcXVlc3RMaXN0ZW5lcihyZXF1ZXN0TGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gcmVnaXN0ZXIgdGhlIGRlYnVnIG9wdGlvbnMgbGlzdGVuZXIKLQkJZmluYWwgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBwcm9wcyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KDQpOwotCQlwcm9wcy5wdXQoRGVidWdPcHRpb25zLkxJU1RFTkVSX1NZTUJPTElDTkFNRSwgUExVR0lOX0lEKTsKLQkJY29udGV4dC5yZWdpc3RlclNlcnZpY2UoRGVidWdPcHRpb25zTGlzdGVuZXIuY2xhc3MuZ2V0TmFtZSgpLCBuZXcgVHJhY2UoKSwgcHJvcHMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJCi0JCUlNb25pdG9yW10gbW9uaXRvcnMgPSBNb25pdG9yQ29yZS5nZXRNb25pdG9ycygpOwotCQlpZiAobW9uaXRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChJTW9uaXRvciBtb25pdG9yIDogbW9uaXRvcnMpCi0JCQkJbW9uaXRvci5yZW1vdmVSZXF1ZXN0TGlzdGVuZXIocmVxdWVzdExpc3RlbmVyKTsKLQkJfQotCQkKLQkJTW9uaXRvckNvcmUucmVtb3ZlTW9uaXRvckxpc3RlbmVyKG1vbml0b3JMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlZmF1bHRTaG93T25BY3Rpdml0eVByZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRCb29sZWFuKFNIT1dfVklFV19PTl9BQ1RJVklUWSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFNob3dPbkFjdGl2aXR5UHJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihTSE9XX1ZJRVdfT05fQUNUSVZJVFkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTaG93T25BY3Rpdml0eVByZWZlcmVuY2UoYm9vbGVhbiBiKSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoU0hPV19WSUVXX09OX0FDVElWSVRZLCBiKTsKLQkJZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UGluVmlld1ByZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oUElOX1ZJRVcpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQaW5WaWV3UHJlZmVyZW5jZShib29sZWFuIGIpIHsKLQkJZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShQSU5fVklFVywgYik7Ci0JCWdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFNob3dIZWFkZXJQcmVmZXJlbmNlKCkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKFNIT1dfSEVBREVSKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2hvd0hlYWRlclByZWZlcmVuY2UoYm9vbGVhbiBiKSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoU0hPV19IRUFERVIsIGIpOwotCQlnZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byB1bnppcCB0aGUgZ2l2ZW4gYnl0ZXMgdXNpbmcgZ3ppcC4gVGhlIHJldHVybmVkIGJ5dGUKLQkgKiBhcnJheSBpcyBlaXRoZXIgdGhlIHVuemlwcGVkIHJlc3VsdHMsIG9yIHRoZSBvcmlnaW5hbCBieXRlIGFycmF5IGlmIHVuemlwcGluZwotCSAqIHdhcyBub3Qgc3VjY2Vzc2Z1bC4gVGhlIGJ5dGUgYXJyYXkgbXVzdCBub3QgYmUgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gYiBhIGJ5dGUgYXJyYXkKLQkgKiBAcmV0dXJuIHRoZSB1bnppcHBlZCBhcnJheSwgb3IgdGhlIG9yaWdpbmFsIGFycmF5IGlmIHVuc3VjY2Vzc2Z1bAotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIGJ5dGVbXSB1bnppcChieXRlW10gYikgewotCQlpZiAoYiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJdHJ5IHsKLQkJCUdaSVBJbnB1dFN0cmVhbSBnaW4gPSBuZXcgR1pJUElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiKSk7Ci0JCQlieXRlW10gdCA9IG5ldyBieXRlWzBdOwotCQkJd2hpbGUgKGdpbi5hdmFpbGFibGUoKSA+IDApIHsKLQkJCQlpbnQgbiA9IGdpbi5yZWFkKEJVRkZFUik7Ci0JCQkJaWYgKG4gPiAwKSB7Ci0JCQkJCWJ5dGVbXSB0ZW1wID0gbmV3IGJ5dGVbdC5sZW5ndGggKyBuXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weSh0LCAwLCB0ZW1wLCAwLCB0Lmxlbmd0aCk7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoQlVGRkVSLCAwLCB0ZW1wLCB0Lmxlbmd0aCwgbik7Ci0JCQkJCXQgPSB0ZW1wOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJDb3VsZCBub3QgdW56aXAgYnl0ZSBhcnJheSIpOwotCQkJfQotCQkJcmV0dXJuIGI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcGFyc2UgdGhlIGdpdmVuIGJ5dGVzIGludG8gU3RyaW5nIGZvcm0uIFRoZSBieXRlcwotCSAqIGFyZSBwYXJzZWQgaW50byBhIGxpbmUgZGVsaW1pdGVkIHN0cmluZy4gVGhlIGJ5dGUgYXJyYXkgbXVzdCBub3QgYmUgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gYiBhIGJ5dGUgYXJyYXkKLQkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgYWZ0ZXIgdGhlIGNvbnZlcnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZShieXRlW10gYikgewotCQlpZiAoYiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIpOwotCQlCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoYmluKSk7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzID0gYnIucmVhZExpbmUoKTsKLQkJCQotCQkJd2hpbGUgKHMgIT0gbnVsbCkgewotCQkJCXNiLmFwcGVuZChzKTsKLQkJCQlzID0gYnIucmVhZExpbmUoKTsKLQkJCQlpZiAocyAhPSBudWxsKQotCQkJCQlzYi5hcHBlbmQobGluZVNlcGFyYXRvcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIHBhcnNpbmcgaW5wdXQiLCBlKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKCFyZXF1ZXN0cy5jb250YWlucyhyZXF1ZXN0KSkKLQkJCXJlcXVlc3RzLmFkZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgY3VycmVudCByZXF1ZXN0cy4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcmVxdWVzdHMKLQkgKi8KLQlwdWJsaWMgUmVxdWVzdFtdIGdldFJlcXVlc3RzKCkgewotCQlSZXF1ZXN0W10gciA9IG5ldyBSZXF1ZXN0W3JlcXVlc3RzLnNpemUoKV07Ci0JCXJlcXVlc3RzLnRvQXJyYXkocik7Ci0JCXJldHVybiByOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhclJlcXVlc3RzKCkgewotCQlyZXF1ZXN0cyA9IG5ldyBBcnJheUxpc3Q8UmVxdWVzdD4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9SZXF1ZXN0QWN0aW9uRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9SZXF1ZXN0QWN0aW9uRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYTkyN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvUmVxdWVzdEFjdGlvbkZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBBbiBhY3Rpb24gZmlsdGVyIGZvciByZXF1ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFJlcXVlc3RBY3Rpb25GaWx0ZXIgaW1wbGVtZW50cyBJQWN0aW9uRmlsdGVyewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfU0VOVCA9ICJyZXF1ZXN0c2VudCI7Ci0KLQkvKioKLQkgKiBAc2VlIElBY3Rpb25GaWx0ZXIjdGVzdEF0dHJpYnV0ZShPYmplY3QsIFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHRlc3RBdHRyaWJ1dGUoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlSZXF1ZXN0IHJlcXVlc3QgPSAoUmVxdWVzdCkgdGFyZ2V0OwotCQlpZiAobmFtZS5lcXVhbHMoUkVRVUVTVF9TRU5UKSkgewotCQkJaWYgKHZhbHVlLmVxdWFscygidHJ1ZSIpKQotCQkJCXJldHVybiByZXF1ZXN0LmdldFJlc3BvbnNlVGltZSgpICE9IC0xOwotCQkJCi0JCQlyZXR1cm4gcmVxdWVzdC5nZXRSZXNwb25zZVRpbWUoKSA9PSAtMTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL1JlcXVlc3RBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvUmVxdWVzdEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjN2Q2ODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvUmVxdWVzdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyOwotLyoqCi0gKiBBZGFwdGVyIGZhY3RvcnkgdG8gYWRhcHQgUmVxdWVzdHMgdG8gSUFjdGlvbkZpbHRlci4KLSAqLwotcHVibGljIGNsYXNzIFJlcXVlc3RBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0JcHJpdmF0ZSBSZXF1ZXN0QWN0aW9uRmlsdGVyIHJlcUFjdGlvbkZpbHRlciA9IG51bGw7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRlclR5cGUgPT0gSUFjdGlvbkZpbHRlci5jbGFzcykgewotCQkJaWYgKHJlcUFjdGlvbkZpbHRlciA9PSBudWxsKSB7Ci0JCQkJcmVxQWN0aW9uRmlsdGVyID0gbmV3IFJlcXVlc3RBY3Rpb25GaWx0ZXIoKTsKLQkJCX0KLQkJCXJldHVybiByZXFBY3Rpb25GaWx0ZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyTGlzdCgpCi0JICovCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXSB7IElBY3Rpb25GaWx0ZXIuY2xhc3MgfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzYyMmIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL1NXVFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLS8qKgotICogU1dUIFV0aWxpdHkgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBGb250TWV0cmljcyBmb250TWV0cmljczsKLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0aWFsaXplRGlhbG9nVW5pdHMoQ29udHJvbCB0ZXN0Q29udHJvbCkgewotCQkvLyBDb21wdXRlIGFuZCBzdG9yZSBhIGZvbnQgbWV0cmljCi0JCUdDIGdjID0gbmV3IEdDKHRlc3RDb250cm9sKTsKLQkJZ2Muc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQlmb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgd2lkdGggaGludCBmb3IgYSBidXR0b24gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRCdXR0b25XaWR0aEhpbnQoQnV0dG9uIGJ1dHRvbikgewotCQlpbnQgd2lkdGhIaW50ID0gRGlhbG9nLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7Ci0JCXJldHVybiBNYXRoLm1heCh3aWR0aEhpbnQsIGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLngpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgYnV0dG9uIHdpdGggdGhlIHN0YW5kYXJkIHNpemUuCi0JICogCi0JICogQHBhcmFtIGNvbXAgdGhlIGNvbXBvbmVudCB0byBhZGQgdGhlIGJ1dHRvbiB0bwotCSAqIEBwYXJhbSBsYWJlbCB0aGUgYnV0dG9uIGxhYmVsCi0JICogQHJldHVybiBhIGJ1dHRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgY29tcCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dChsYWJlbCk7Ci0JCWlmIChmb250TWV0cmljcyA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKGNvbXApOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEud2lkdGhIaW50ID0gZ2V0QnV0dG9uV2lkdGhIaW50KGIpOwotCQliLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBiOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVDaGVja2JveChDb21wb3NpdGUgY29tcCwgU3RyaW5nIHR4dCwgYm9vbGVhbiBpc1NlbGVjdGVkKXsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQodHh0KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJYnV0dG9uLnNldFNlbGVjdGlvbihpc1NlbGVjdGVkKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29tcCwgU3RyaW5nIHR4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQodHh0KTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9TdGFydHVwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9TdGFydHVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZjdlMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvU3RhcnR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JU3RhcnR1cDsKLS8qKgotICogU3RhcnR1cCBob29rLgotICovCi1wdWJsaWMgY2xhc3MgU3RhcnR1cCBpbXBsZW1lbnRzIElTdGFydHVwIHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLklTdGFydHVwI3N0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0JCS8vIGRvIG5vdGhpbmcgLSBwbHVnaW4gbG9hZGluZyBpcyBlbm91Z2gKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5MTk0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRlYnVnLkRlYnVnT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGVidWcuRGVidWdPcHRpb25zTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yUGx1Z2luOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFjZSBpbXBsZW1lbnRzIERlYnVnT3B0aW9uc0xpc3RlbmVyIHsKLQotCS8vIHRyYWNpbmcgZW5hYmxlbWVudCBmbGFncwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBDT05GSUcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gV0FSTklORyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBTRVZFUkUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gRklORVNUID0gZmFsc2U7Ci0KLQkvLyB0cmFjaW5nIGxldmVscy4gT25lIG1vc3QgZXhpc3QgZm9yIGVhY2ggZGVidWcgb3B0aW9uCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSSU5HX0NPTkZJRyA9ICIvY29uZmlnIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUUklOR19GSU5FU1QgPSAiL2ZpbmVzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFJJTkdfV0FSTklORyA9ICIvd2FybmluZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFJJTkdfU0VWRVJFID0gIi9zZXZlcmUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IuIFRoaXMgc2hvdWxkIG5ldmVyIGJlIGV4cGxpY2l0bHkgY2FsbGVkIGJ5IGNsaWVudHMgYW5kIGlzIHVzZWQgdG8gcmVnaXN0ZXIgdGhpcyBjbGFzcyB3aXRoIHRoZQotCSAqIHtAbGluayBEZWJ1Z09wdGlvbnN9IHNlcnZpY2UuCi0JICovCi0JcHVibGljIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUKLQkgKiBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGVidWcuRGVidWdPcHRpb25zTGlzdGVuZXIjb3B0aW9uc0NoYW5nZWQob3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRlYnVnLkRlYnVnT3B0aW9ucykKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcHRpb25zQ2hhbmdlZChEZWJ1Z09wdGlvbnMgb3B0aW9ucykgewotCQlUcmFjZS5DT05GSUcgPSBvcHRpb25zLmdldEJvb2xlYW5PcHRpb24oTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQgKyBUcmFjZS5TVFJJTkdfQ09ORklHLCBmYWxzZSk7Ci0JCVRyYWNlLldBUk5JTkcgPSBvcHRpb25zLmdldEJvb2xlYW5PcHRpb24oTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQgKyBUcmFjZS5TVFJJTkdfV0FSTklORywgZmFsc2UpOwotCQlUcmFjZS5TRVZFUkUgPSBvcHRpb25zLmdldEJvb2xlYW5PcHRpb24oTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQgKyBUcmFjZS5TVFJJTkdfU0VWRVJFLCBmYWxzZSk7Ci0JCVRyYWNlLkZJTkVTVCA9IG9wdGlvbnMuZ2V0Qm9vbGVhbk9wdGlvbihNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCArIFRyYWNlLlNUUklOR19GSU5FU1QsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIFRoZSB0cmFjaW5nIGxldmVsLgotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBUaGUgbWVzc2FnZSB0byB0cmFjZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShmaW5hbCBTdHJpbmcgbGV2ZWwsIGZpbmFsIFN0cmluZyBzKSB7Ci0JCXRyYWNlKGxldmVsLCBzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgVGhlIHRyYWNpbmcgbGV2ZWwuCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIHRyYWNlCi0JICogQHBhcmFtIHQKLQkgKiAgICAgICAgICAgIEEge0BsaW5rIFRocm93YWJsZX0gdG8gdHJhY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoZmluYWwgU3RyaW5nIGxldmVsLCBmaW5hbCBTdHJpbmcgcywgZmluYWwgVGhyb3dhYmxlIHQpIHsKLQkJaWYgKFRyYWNlLlNUUklOR19TRVZFUkUuZXF1YWxzKGxldmVsKSkgewotCQkJTW9uaXRvclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCwgcywgdCkpOwotCQl9Ci0JCWlmIChNb25pdG9yVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIgIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIiB0aHJlYWQ9WyIKLQkJCQkJKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKyAiXSAiICsgbGV2ZWwgKyAiICIgKyBzKTsKLQkJCWlmICh0ICE9IG51bGwpIHsKLQkJCQl0LnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9Nb25pdG9yU3RhY2tMYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9Nb25pdG9yU3RhY2tMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYzYjExMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9jdXN0b20vTW9uaXRvclN0YWNrTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLmN1c3RvbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0vKioKLSAqIFRoaXMgTGF5b3V0IHN0YWNrcyBhbGwgdGhlIGNvbnRyb2xzIG9uZSBvbiB0b3Agb2YgdGhlIG90aGVyIGFuZCByZXNpemVzIGFsbCBjb250cm9scwotICogdG8gaGF2ZSB0aGUgc2FtZSBzaXplIGFuZCBsb2NhdGlvbi4KLSAqIFRoZSBjb250cm9sIHNwZWNpZmllZCBpbiB0b3BDb250cm9sIGlzIHZpc2libGUgYW5kIGFsbCBvdGhlciBjb250cm9scyBhcmUgbm90IHZpc2libGUuCi0gKiBVc2VycyBtdXN0IHNldCB0aGUgdG9wQ29udHJvbCB2YWx1ZSB0byBmbGlwIGJldHdlZW4gdGhlIHZpc2libGUgaXRlbXMgYW5kIHRoZW4gY2FsbCAKLSAqIGxheW91dCgpIG9uIHRoZSBjb21wb3NpdGUgd2hpY2ggaGFzIHRoZSBNb25pdG9yU3RhY2tMYXlvdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yU3RhY2tMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgewotIAkvKioKLSAJICogdG9wQ29udHJvbCB0aGUgQ29udHJvbCB0aGF0IGlzIGRpc3BsYXllZCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLSAJICogQWxsIG90aGVyIGNvbnRyb2xzIHRoYXQgYXJlIGNoaWxkcmVuIG9mIHRoZSBwYXJlbnQgY29tcG9zaXRlIHdpbGwgbm90IGJlIHZpc2libGUuCi0gCSAqLwotIAlwdWJsaWMgQ29udHJvbCB0b3BDb250cm9sOwotCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJQ29udHJvbCBjaGlsZHJlbltdID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCWludCBtYXhXaWR0aCA9IDA7Ci0JCWludCBtYXhIZWlnaHQgPSAwOwotCQlmb3IgKENvbnRyb2wgY2hpbGQgOiBjaGlsZHJlbikgewotCQkJaWYgKGNoaWxkID09IHRvcENvbnRyb2wpIHsKLQkJCQlQb2ludCBzaXplID0gY2hpbGQuY29tcHV0ZVNpemUod0hpbnQsIGhIaW50LCBmbHVzaENhY2hlKTsKLQkJCQltYXhXaWR0aCA9IE1hdGgubWF4KHNpemUueCwgbWF4V2lkdGgpOwotCQkJCW1heEhlaWdodCA9IE1hdGgubWF4KHNpemUueSwgbWF4SGVpZ2h0KTsKLQkJCX0KLQkJfQotCQlpbnQgd2lkdGggPSBtYXhXaWR0aDsKLQkJaW50IGhlaWdodCA9IG1heEhlaWdodDsKLQkJaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUKQotCQkJd2lkdGggPSB3SGludDsKLQkJaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKQotCQkJaGVpZ2h0ID0gaEhpbnQ7Ci0JCXJldHVybiBuZXcgUG9pbnQod2lkdGgsIGhlaWdodCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hDYWNoZShDb250cm9sIGNvbnRyb2wpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlDb250cm9sIGNoaWxkcmVuW10gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOwotCQlmb3IgKENvbnRyb2wgY2hpbGQgOiBjaGlsZHJlbikgewotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCQlSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUocmVjdC54KzIsIHJlY3QueSwgcmVjdC53aWR0aC0yLCByZWN0LmhlaWdodCk7Ci0JCQkJY2hpbGQuc2V0Qm91bmRzKHIpOwotCQkJfSBlbHNlCi0JCQkJY2hpbGQuc2V0Qm91bmRzKHJlY3QpOwotCQkJY2hpbGQuc2V0VmlzaWJsZShjaGlsZCA9PSB0b3BDb250cm9sKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiTW9uaXRvclN0YWNrTGF5b3V0IjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvY3VzdG9tL1Nhc2hGb3JtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9jdXN0b20vU2FzaEZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0NTEyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9jdXN0b20vU2FzaEZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuY3VzdG9tOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLS8qKgotICogVGhlIFNhc2hGb3JtIGlzIGEgY29tcG9zaXRlIGNvbnRyb2wgdGhhdCBsYXlzIG91dCBpdHMgY2hpbGRyZW4gaW4gYQotICogcm93IG9yIGNvbHVtbiBhcnJhbmdlbWVudCAoYXMgc3BlY2lmaWVkIGJ5IHRoZSBvcmllbnRhdGlvbikgYW5kIHBsYWNlcwotICogYSBTYXNoIGJldHdlZW4gZWFjaCBjaGlsZC4gT25lIGNoaWxkIG1heSBiZSBtYXhpbWl6ZWQgdG8gb2NjdXB5IHRoZQotICogZW50aXJlIHNpemUgb2YgdGhlIFNhc2hGb3JtLiAgVGhlIHJlbGF0aXZlIHNpemVzIG9mIHRoZSBjaGlsZHJlbiBtYXkKLSAqIGJlIHNwZWNpZmllZCB1c2luZyB3ZWlnaHRzLgotICogPHA+Ci0gKiA8ZGw+Ci0gKiA8ZHQ+PGI+U3R5bGVzOjwvYj48L2R0PgotICogPGRkPkhPUklaT05UQUwsIFZFUlRJQ0FMLCBTTU9PVEg8L2RkPgotICogPC9kbD4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFNhc2hGb3JtIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwdWJsaWMgaW50IFNBU0hfV0lEVEggPSAzOwotCi0JaW50IHNhc2hTdHlsZTsKLQlTYXNoW10gc2FzaGVzID0gbmV3IFNhc2hbMF07Ci0JLy8gUmVtZW1iZXIgYmFja2dyb3VuZCBhbmQgZm9yZWdyb3VuZAotCS8vIGNvbG9ycyB0byBkZXRlcm1pbmUgd2hldGhlciB0byBzZXQKLQkvLyBzYXNoZXMgdG8gdGhlIGRlZmF1bHQgY29sb3IgKG51bGwpIG9yCi0JLy8gYSBzcGVjaWZpYyBjb2xvcgotCUNvbG9yIGJhY2tncm91bmQgPSBudWxsOwotCUNvbG9yIGZvcmVncm91bmQgPSBudWxsOwotCUNvbnRyb2xbXSBjb250cm9scyA9IG5ldyBDb250cm9sWzBdOwotCUNvbnRyb2wgbWF4Q29udHJvbCA9IG51bGw7Ci0JTGlzdGVuZXIgc2FzaExpc3RlbmVyOwotCXN0YXRpYyBmaW5hbCBpbnQgRFJBR19NSU5JTVVNID0gMjA7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVTYXNoID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzaXplOyAgCi0KLS8qKgotICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGdpdmVuIGl0cyBwYXJlbnQKLSAqIGFuZCBhIHN0eWxlIHZhbHVlIGRlc2NyaWJpbmcgaXRzIGJlaGF2aW9yIGFuZCBhcHBlYXJhbmNlLgotICogPHA+Ci0gKiBUaGUgc3R5bGUgdmFsdWUgaXMgZWl0aGVyIG9uZSBvZiB0aGUgc3R5bGUgY29uc3RhbnRzIGRlZmluZWQgaW4KLSAqIGNsYXNzIDxjb2RlPlNXVDwvY29kZT4gd2hpY2ggaXMgYXBwbGljYWJsZSB0byBpbnN0YW5jZXMgb2YgdGhpcwotICogY2xhc3MsIG9yIG11c3QgYmUgYnVpbHQgYnkgPGVtPmJpdHdpc2UgT1I8L2VtPidpbmcgdG9nZXRoZXIgCi0gKiAodGhhdCBpcywgdXNpbmcgdGhlIDxjb2RlPmludDwvY29kZT4gInwiIG9wZXJhdG9yKSB0d28gb3IgbW9yZQotICogb2YgdGhvc2UgPGNvZGU+U1dUPC9jb2RlPiBzdHlsZSBjb25zdGFudHMuIFRoZSBjbGFzcyBkZXNjcmlwdGlvbgotICogbGlzdHMgdGhlIHN0eWxlIGNvbnN0YW50cyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBjbGFzcy4KLSAqIFN0eWxlIGJpdHMgYXJlIGFsc28gaW5oZXJpdGVkIGZyb20gc3VwZXJjbGFzc2VzLgotICogPC9wPgotICoKLSAqIEBwYXJhbSBwYXJlbnQgYSB3aWRnZXQgd2hpY2ggd2lsbCBiZSB0aGUgcGFyZW50IG9mIHRoZSBuZXcgaW5zdGFuY2UgKGNhbm5vdCBiZSBudWxsKQotICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBvZiB3aWRnZXQgdG8gY29uc3RydWN0Ci0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgcGFyZW50IGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHBhcmVudDwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgU1dUI0hPUklaT05UQUwKLSAqIEBzZWUgU1dUI1ZFUlRJQ0FMCi0gKiBAc2VlICNnZXRTdHlsZSgpCi0gKi8KLXB1YmxpYyBTYXNoRm9ybShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQlzdXBlcihwYXJlbnQsIGNoZWNrU3R5bGUyKHN0eWxlKSk7Ci0Jc3VwZXIuc2V0TGF5b3V0KG5ldyBTYXNoRm9ybUxheW91dCgpKTsKLQlzYXNoU3R5bGUgPSAoKHN0eWxlICYgU1dULlZFUlRJQ0FMKSAhPSAwKSA/IFNXVC5IT1JJWk9OVEFMIDogU1dULlZFUlRJQ0FMOwotCWlmICgoc3R5bGUgJiBTV1QuQk9SREVSKSAhPSAwKSBzYXNoU3R5bGUgfD0gU1dULkJPUkRFUjsKLQlpZiAoKHN0eWxlICYgU1dULlNNT09USCkgIT0gMCkgc2FzaFN0eWxlIHw9IFNXVC5TTU9PVEg7Ci0Jc2FzaExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlvbkRyYWdTYXNoKGUpOwotCQl9Ci0JfTsKLX0KLXN0YXRpYyBpbnQgY2hlY2tTdHlsZTIoaW50IHN0eWxlKSB7Ci0JaW50IG1hc2sgPSBTV1QuQk9SREVSIHwgU1dULkxFRlRfVE9fUklHSFQgfCBTV1QuUklHSFRfVE9fTEVGVDsKLQlyZXR1cm4gc3R5bGUgJiBtYXNrOwotfQotLyoqCi0gKiBSZXR1cm5zIFNXVC5IT1JJWk9OVEFMIGlmIHRoZSBjb250cm9scyBpbiB0aGUgU2FzaEZvcm0gYXJlIGxhaWQgb3V0IHNpZGUgYnkgc2lkZQotICogb3IgU1dULlZFUlRJQ0FMICAgaWYgdGhlIGNvbnRyb2xzIGluIHRoZSBTYXNoRm9ybSBhcmUgbGFpZCBvdXQgdG9wIHRvIGJvdHRvbS4KLSAqIAotICogQHJldHVybiBTV1QuSE9SSVpPTlRBTCBvciBTV1QuVkVSVElDQUwKLSAqLwotcHVibGljIGludCBnZXRPcmllbnRhdGlvbigpIHsKLQkvL2NoZWNrV2lkZ2V0KCk7Ci0JcmV0dXJuIChzYXNoU3R5bGUgJiBTV1QuVkVSVElDQUwpICE9IDAgPyBTV1QuSE9SSVpPTlRBTCA6IFNXVC5WRVJUSUNBTDsKLX0KLXB1YmxpYyBpbnQgZ2V0U3R5bGUoKSB7Ci0JaW50IHN0eWxlID0gc3VwZXIuZ2V0U3R5bGUoKTsKLQlzdHlsZSB8PSBnZXRPcmllbnRhdGlvbigpID09IFNXVC5WRVJUSUNBTCA/IFNXVC5WRVJUSUNBTCA6IFNXVC5IT1JJWk9OVEFMOwotCWlmICgoc2FzaFN0eWxlICYgU1dULlNNT09USCkgIT0gMCkgc3R5bGUgfD0gU1dULlNNT09USDsKLQlyZXR1cm4gc3R5bGU7Ci19Ci0vKioKLSAqIEFuc3dlciB0aGUgY29udHJvbCB0aGF0IGN1cnJlbnRseSBpcyBtYXhpbWl6ZWQgaW4gdGhlIFNhc2hGb3JtLiAgCi0gKiBUaGlzIHZhbHVlIG1heSBiZSBudWxsLgotICogCi0gKiBAcmV0dXJuIHRoZSBjb250cm9sIHRoYXQgY3VycmVudGx5IGlzIG1heGltaXplZCBvciBudWxsCi0gKi8KLXB1YmxpYyBDb250cm9sIGdldE1heGltaXplZENvbnRyb2woKXsKLQkvL2NoZWNrV2lkZ2V0KCk7Ci0JcmV0dXJuIHRoaXMubWF4Q29udHJvbDsKLX0KLS8qKgotICogQW5zd2VyIHRoZSByZWxhdGl2ZSB3ZWlnaHQgb2YgZWFjaCBjaGlsZCBpbiB0aGUgU2FzaEZvcm0uICBUaGUgd2VpZ2h0IHJlcHJlc2VudHMgdGhlCi0gKiBwZXJjZW50IG9mIHRoZSB0b3RhbCB3aWR0aCAoaWYgU2FzaEZvcm0gaGFzIEhvcml6b250YWwgb3JpZW50YXRpb24pIG9yIAotICogdG90YWwgaGVpZ2h0IChpZiBTYXNoRm9ybSBoYXMgVmVydGljYWwgb3JpZW50YXRpb24pIGVhY2ggY29udHJvbCBvY2N1cGllcy4KLSAqIFRoZSB3ZWlnaHRzIGFyZSByZXR1cm5lZCBpbiBvcmRlciBvZiB0aGUgY3JlYXRpb24gb2YgdGhlIHdpZGdldHMgKHdlaWdodFswXQotICogY29ycmVzcG9uZHMgdG8gdGhlIHdlaWdodCBvZiB0aGUgZmlyc3QgY2hpbGQgY3JlYXRlZCkuCi0gKiAKLSAqIEByZXR1cm4gdGhlIHJlbGF0aXZlIHdlaWdodCBvZiBlYWNoIGNoaWxkCi0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotCi1wdWJsaWMgaW50W10gZ2V0V2VpZ2h0cygpIHsKLQljaGVja1dpZGdldCgpOwotCUNvbnRyb2xbXSBjQXJyYXkgPSBnZXRDb250cm9scyhmYWxzZSk7Ci0JaW50W10gcmF0aW9zID0gbmV3IGludFtjQXJyYXkubGVuZ3RoXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNBcnJheS5sZW5ndGg7IGkrKykgewotCQlPYmplY3QgZGF0YSA9IGNBcnJheVtpXS5nZXRMYXlvdXREYXRhKCk7Ci0JCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YSBpbnN0YW5jZW9mIFNhc2hGb3JtRGF0YSkgewotCQkJcmF0aW9zW2ldID0gKGludCkoKChTYXNoRm9ybURhdGEpZGF0YSkud2VpZ2h0ICogMTAwMCA+PiAxNik7Ci0JCX0gZWxzZSB7Ci0JCQlyYXRpb3NbaV0gPSAyMDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJhdGlvczsKLX0KLUNvbnRyb2xbXSBnZXRDb250cm9scyhib29sZWFuIG9ubHlWaXNpYmxlKSB7Ci0JQ29udHJvbFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQlDb250cm9sW10gcmVzdWx0ID0gbmV3IENvbnRyb2xbMF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQlpZiAoY2hpbGRyZW5baV0gaW5zdGFuY2VvZiBTYXNoKSBjb250aW51ZTsKLQkJaWYgKG9ubHlWaXNpYmxlICYmICFjaGlsZHJlbltpXS5nZXRWaXNpYmxlKCkpIGNvbnRpbnVlOwotCi0JCUNvbnRyb2xbXSBuZXdSZXN1bHQgPSBuZXcgQ29udHJvbFtyZXN1bHQubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkocmVzdWx0LCAwLCBuZXdSZXN1bHQsIDAsIHJlc3VsdC5sZW5ndGgpOwotCQluZXdSZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBjaGlsZHJlbltpXTsKLQkJcmVzdWx0ID0gbmV3UmVzdWx0OwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotdm9pZCBvbkRyYWdTYXNoKEV2ZW50IGV2ZW50KSB7Ci0JaWYgKCFlbmFibGVTYXNoKQotCQlyZXR1cm47Ci0JCi0JU2FzaCBzYXNoID0gKFNhc2gpZXZlbnQud2lkZ2V0OwotCWludCBzYXNoSW5kZXggPSAtMTsKLQlmb3IgKGludCBpPSAwOyBpIDwgc2FzaGVzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChzYXNoZXNbaV0gPT0gc2FzaCkgewotCQkJc2FzaEluZGV4ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChzYXNoSW5kZXggPT0gLTEpIHJldHVybjsKLQkKLQlDb250cm9sIGMxID0gY29udHJvbHNbc2FzaEluZGV4XTsKLQlDb250cm9sIGMyID0gY29udHJvbHNbc2FzaEluZGV4ICsgMV07Ci0JUmVjdGFuZ2xlIGIxID0gYzEuZ2V0Qm91bmRzKCk7Ci0JUmVjdGFuZ2xlIGIyID0gYzIuZ2V0Qm91bmRzKCk7Ci0JCi0JUmVjdGFuZ2xlIHNhc2hCb3VuZHMgPSBzYXNoLmdldEJvdW5kcygpOwotCVJlY3RhbmdsZSBhcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotCWJvb2xlYW4gY29ycmVjdGlvbiA9IGZhbHNlOwotCWlmIChnZXRPcmllbnRhdGlvbigpID09IFNXVC5IT1JJWk9OVEFMKSB7Ci0JCWNvcnJlY3Rpb24gPSBiMS53aWR0aCA8IERSQUdfTUlOSU1VTSB8fCBiMi53aWR0aCA8IERSQUdfTUlOSU1VTTsKLQkJaW50IHRvdGFsV2lkdGggPSBiMi54ICsgYjIud2lkdGggLSBiMS54OyAKLQkJaW50IHNoaWZ0ID0gZXZlbnQueCAtIHNhc2hCb3VuZHMueDsKLQkJYjEud2lkdGggKz0gc2hpZnQ7Ci0JCWIyLnggKz0gc2hpZnQ7Ci0JCWIyLndpZHRoIC09IHNoaWZ0OwotCQlpZiAoYjEud2lkdGggPCBEUkFHX01JTklNVU0pIHsKLQkJCWIxLndpZHRoID0gRFJBR19NSU5JTVVNOwotCQkJYjIueCA9IGIxLnggKyBiMS53aWR0aCArIHNhc2hCb3VuZHMud2lkdGg7Ci0JCQliMi53aWR0aCA9IHRvdGFsV2lkdGggLSBiMi54OwotCQkJZXZlbnQueCA9IGIxLnggKyBiMS53aWR0aDsKLQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJfQotCQlpZiAoYjIud2lkdGggPCBEUkFHX01JTklNVU0pIHsKLQkJCWIxLndpZHRoID0gdG90YWxXaWR0aCAtIERSQUdfTUlOSU1VTSAtIHNhc2hCb3VuZHMud2lkdGg7Ci0JCQliMi54ID0gYjEueCArIGIxLndpZHRoICsgc2FzaEJvdW5kcy53aWR0aDsKLQkJCWIyLndpZHRoID0gRFJBR19NSU5JTVVNOwotCQkJZXZlbnQueCA9IGIxLnggKyBiMS53aWR0aDsKLQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJfQotCQlPYmplY3QgZGF0YTEgPSBjMS5nZXRMYXlvdXREYXRhKCk7Ci0JCWlmIChkYXRhMSA9PSBudWxsIHx8ICEoZGF0YTEgaW5zdGFuY2VvZiBTYXNoRm9ybURhdGEpKSB7Ci0JCQlkYXRhMSA9IG5ldyBTYXNoRm9ybURhdGEoKTsKLQkJCWMxLnNldExheW91dERhdGEoZGF0YTEpOwotCQl9Ci0JCU9iamVjdCBkYXRhMiA9IGMyLmdldExheW91dERhdGEoKTsKLQkJaWYgKGRhdGEyID09IG51bGwgfHwgIShkYXRhMiBpbnN0YW5jZW9mIFNhc2hGb3JtRGF0YSkpIHsKLQkJCWRhdGEyID0gbmV3IFNhc2hGb3JtRGF0YSgpOwotCQkJYzIuc2V0TGF5b3V0RGF0YShkYXRhMik7Ci0JCX0KLQkJKChTYXNoRm9ybURhdGEpZGF0YTEpLndlaWdodCA9ICgoKGxvbmcpYjEud2lkdGggPDwgMTYpICsgYXJlYS53aWR0aCAtIDEpIC8gYXJlYS53aWR0aDsKLQkJKChTYXNoRm9ybURhdGEpZGF0YTIpLndlaWdodCA9ICgoKGxvbmcpYjIud2lkdGggPDwgMTYpICsgYXJlYS53aWR0aCAtIDEpIC8gYXJlYS53aWR0aDsKLQl9IGVsc2UgewotCQljb3JyZWN0aW9uID0gYjEuaGVpZ2h0IDwgRFJBR19NSU5JTVVNIHx8IGIyLmhlaWdodCA8IERSQUdfTUlOSU1VTTsKLQkJaW50IHRvdGFsSGVpZ2h0ID0gYjIueSArIGIyLmhlaWdodCAtIGIxLnk7Ci0JCWludCBzaGlmdCA9IGV2ZW50LnkgLSBzYXNoQm91bmRzLnk7Ci0JCWIxLmhlaWdodCArPSBzaGlmdDsKLQkJYjIueSArPSBzaGlmdDsKLQkJYjIuaGVpZ2h0IC09IHNoaWZ0OwotCQlpZiAoYjEuaGVpZ2h0IDwgRFJBR19NSU5JTVVNKSB7Ci0JCQliMS5oZWlnaHQgPSBEUkFHX01JTklNVU07Ci0JCQliMi55ID0gYjEueSArIGIxLmhlaWdodCArIHNhc2hCb3VuZHMuaGVpZ2h0OwotCQkJYjIuaGVpZ2h0ID0gdG90YWxIZWlnaHQgLSBiMi55OwotCQkJZXZlbnQueSA9IGIxLnkgKyBiMS5oZWlnaHQ7Ci0JCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCX0KLQkJaWYgKGIyLmhlaWdodCA8IERSQUdfTUlOSU1VTSkgewotCQkJYjEuaGVpZ2h0ID0gdG90YWxIZWlnaHQgLSBEUkFHX01JTklNVU0gLSBzYXNoQm91bmRzLmhlaWdodDsKLQkJCWIyLnkgPSBiMS55ICsgYjEuaGVpZ2h0ICsgc2FzaEJvdW5kcy5oZWlnaHQ7Ci0JCQliMi5oZWlnaHQgPSBEUkFHX01JTklNVU07Ci0JCQlldmVudC55ID0gYjEueSArIGIxLmhlaWdodDsKLQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJfQotCQlPYmplY3QgZGF0YTEgPSBjMS5nZXRMYXlvdXREYXRhKCk7Ci0JCWlmIChkYXRhMSA9PSBudWxsIHx8ICEoZGF0YTEgaW5zdGFuY2VvZiBTYXNoRm9ybURhdGEpKSB7Ci0JCQlkYXRhMSA9IG5ldyBTYXNoRm9ybURhdGEoKTsKLQkJCWMxLnNldExheW91dERhdGEoZGF0YTEpOwotCQl9Ci0JCU9iamVjdCBkYXRhMiA9IGMyLmdldExheW91dERhdGEoKTsKLQkJaWYgKGRhdGEyID09IG51bGwgfHwgIShkYXRhMiBpbnN0YW5jZW9mIFNhc2hGb3JtRGF0YSkpIHsKLQkJCWRhdGEyID0gbmV3IFNhc2hGb3JtRGF0YSgpOwotCQkJYzIuc2V0TGF5b3V0RGF0YShkYXRhMik7Ci0JCX0KLQkJLy8oKFNhc2hGb3JtRGF0YSlkYXRhMSkud2VpZ2h0ID0gKCgobG9uZyliMS5oZWlnaHQgPDwgMTYpICsgYXJlYS5oZWlnaHQgLSAxKSAvIGFyZWEuaGVpZ2h0OwotCQkvLygoU2FzaEZvcm1EYXRhKWRhdGEyKS53ZWlnaHQgPSAoKChsb25nKWIyLmhlaWdodCA8PCAxNikgKyBhcmVhLmhlaWdodCAtIDEpIC8gYXJlYS5oZWlnaHQ7Ci0JCSgoU2FzaEZvcm1EYXRhKWRhdGExKS53ZWlnaHQgPSAoKDIwMCA8PCAxNikgKyA5OTkpIC8gMTAwMCAqIGIxLmhlaWdodCAvIGIyLmhlaWdodDsKLQkJKChTYXNoRm9ybURhdGEpZGF0YTIpLndlaWdodCA9ICgoMjAwIDw8IDE2KSArIDk5OSkgLyAxMDAwOwotCX0KLQlpZiAoY29ycmVjdGlvbiB8fCAoZXZlbnQuZG9pdCAmJiBldmVudC5kZXRhaWwgIT0gU1dULkRSQUcpKSB7Ci0JCWMxLnNldEJvdW5kcyhiMSk7Ci0JCXNhc2guc2V0Qm91bmRzKGV2ZW50LngsIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQpOwotCQljMi5zZXRCb3VuZHMoYjIpOwotCX0KLX0KLS8qKgotICogSWYgb3JpZW50YXRpb24gaXMgU1dULkhPUklaT05UQUwsIGxheSB0aGUgY29udHJvbHMgaW4gdGhlIFNhc2hGb3JtIAotICogb3V0IHNpZGUgYnkgc2lkZS4gIElmIG9yaWVudGF0aW9uIGlzIFNXVC5WRVJUSUNBTCwgbGF5IHRoZSAKLSAqIGNvbnRyb2xzIGluIHRoZSBTYXNoRm9ybSBvdXQgdG9wIHRvIGJvdHRvbS4KLSAqIAotICogQHBhcmFtIG9yaWVudGF0aW9uIFNXVC5IT1JJWk9OVEFMIG9yIFNXVC5WRVJUSUNBTAotICogCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIHZhbHVlIG9mIG9yaWVudGF0aW9uIGlzIG5vdCBTV1QuSE9SSVpPTlRBTCBvciBTV1QuVkVSVElDQUwKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldE9yaWVudGF0aW9uKGludCBvcmllbnRhdGlvbikgewotCWNoZWNrV2lkZ2V0KCk7Ci0JaWYgKGdldE9yaWVudGF0aW9uKCkgPT0gb3JpZW50YXRpb24pIHJldHVybjsKLQlpZiAob3JpZW50YXRpb24gIT0gU1dULkhPUklaT05UQUwgJiYgb3JpZW50YXRpb24gIT0gU1dULlZFUlRJQ0FMKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JfQotCXNhc2hTdHlsZSAmPSB+KFNXVC5IT1JJWk9OVEFMIHwgU1dULlZFUlRJQ0FMKTsKLQlzYXNoU3R5bGUgfD0gb3JpZW50YXRpb24gPT0gU1dULlZFUlRJQ0FMID8gU1dULkhPUklaT05UQUwgOiBTV1QuVkVSVElDQUw7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzYXNoZXMubGVuZ3RoOyBpKyspIHsKLQkJc2FzaGVzW2ldLmRpc3Bvc2UoKTsKLQkJc2FzaGVzW2ldID0gbmV3IFNhc2godGhpcywgc2FzaFN0eWxlKTsKLQkJc2FzaGVzW2ldLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0JCXNhc2hlc1tpXS5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmQpOwotCQlzYXNoZXNbaV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgc2FzaExpc3RlbmVyKTsKLQl9Ci0JbGF5b3V0KGZhbHNlKTsKLX0KLXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQgKENvbG9yIGNvbG9yKSB7Ci0Jc3VwZXIuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JYmFja2dyb3VuZCA9IGNvbG9yOwotCWZvciAoaW50IGkgPSAwOyBpIDwgc2FzaGVzLmxlbmd0aDsgaSsrKSB7Ci0JCXNhc2hlc1tpXS5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotCX0KLX0KLXB1YmxpYyB2b2lkIHNldEZvcmVncm91bmQgKENvbG9yIGNvbG9yKSB7Ci0Jc3VwZXIuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JZm9yZWdyb3VuZCA9IGNvbG9yOwotCWZvciAoaW50IGkgPSAwOyBpIDwgc2FzaGVzLmxlbmd0aDsgaSsrKSB7Ci0JCXNhc2hlc1tpXS5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmQpOwotCX0KLX0KLS8qKgotICogU2V0cyB0aGUgbGF5b3V0IHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjZWl2ZXIgdG8gYmUKLSAqIHRoZSBhcmd1bWVudCB3aGljaCBtYXkgYmUgbnVsbC4KLSAqIDxwPgotICogTm90ZTogTm8gTGF5b3V0IGNhbiBiZSBzZXQgb24gdGhpcyBDb250cm9sIGJlY2F1c2UgaXQgYWxyZWFkeQotICogbWFuYWdlcyB0aGUgc2l6ZSBhbmQgcG9zaXRpb24gb2YgaXRzIGNoaWxkcmVuLgotICogPC9wPgotICoKLSAqIEBwYXJhbSBsYXlvdXQgdGhlIHJlY2VpdmVyJ3MgbmV3IGxheW91dCBvciBudWxsCi0gKgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRMYXlvdXQgKExheW91dCBsYXlvdXQpIHsKLQljaGVja1dpZGdldCgpOwotCXJldHVybjsKLX0KLS8qKgotICogU3BlY2lmeSB0aGUgY29udHJvbCB0aGF0IHNob3VsZCB0YWtlIHVwIHRoZSBlbnRpcmUgY2xpZW50IGFyZWEgb2YgdGhlIFNhc2hGb3JtLiAgCi0gKiBJZiBvbmUgY29udHJvbCBoYXMgYmVlbiBtYXhpbWl6ZWQsIGFuZCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhIGRpZmZlcmVudCBjb250cm9sLCAKLSAqIHRoZSBwcmV2aW91cyBjb250cm9sIHdpbGwgYmUgbWluaW1pemVkIGFuZCB0aGUgbmV3IGNvbnRyb2wgd2lsbCBiZSBtYXhpbWl6ZWQuCi0gKiBJZiB0aGUgdmFsdWUgb2YgY29udHJvbCBpcyBudWxsLCB0aGUgU2FzaEZvcm0gd2lsbCBtaW5pbWl6ZSBhbGwgY29udHJvbHMgYW5kIHJldHVybiB0bwotICogdGhlIGRlZmF1bHQgbGF5b3V0IHdoZXJlIGFsbCBjb250cm9scyBhcmUgbGFpZCBvdXQgc2VwYXJhdGVkIGJ5IHNhc2hlcy4KLSAqIAotICogQHBhcmFtIGNvbnRyb2wgdGhlIGNvbnRyb2wgdG8gYmUgbWF4aW1pemVkIG9yIG51bGwKLSAqIAotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRNYXhpbWl6ZWRDb250cm9sKENvbnRyb2wgY29udHJvbCl7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAoY29udHJvbCA9PSBudWxsKSB7Ci0JCWlmIChtYXhDb250cm9sICE9IG51bGwpIHsKLQkJCXRoaXMubWF4Q29udHJvbCA9IG51bGw7Ci0JCQlsYXlvdXQoZmFsc2UpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IHNhc2hlcy5sZW5ndGg7IGkrKyl7Ci0JCQkJc2FzaGVzW2ldLnNldFZpc2libGUodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQkKLQlmb3IgKGludCBpPSAwOyBpIDwgc2FzaGVzLmxlbmd0aDsgaSsrKXsKLQkJc2FzaGVzW2ldLnNldFZpc2libGUoZmFsc2UpOwotCX0KLQltYXhDb250cm9sID0gY29udHJvbDsKLQlsYXlvdXQoZmFsc2UpOwotfQotCi0vKioKLSAqIFNwZWNpZnkgdGhlIHJlbGF0aXZlIHdlaWdodCBvZiBlYWNoIGNoaWxkIGluIHRoZSBTYXNoRm9ybS4gIFRoaXMgd2lsbCBkZXRlcm1pbmUKLSAqIHdoYXQgcGVyY2VudCBvZiB0aGUgdG90YWwgd2lkdGggKGlmIFNhc2hGb3JtIGhhcyBIb3Jpem9udGFsIG9yaWVudGF0aW9uKSBvciAKLSAqIHRvdGFsIGhlaWdodCAoaWYgU2FzaEZvcm0gaGFzIFZlcnRpY2FsIG9yaWVudGF0aW9uKSBlYWNoIGNvbnRyb2wgd2lsbCBvY2N1cHkuCi0gKiBUaGUgd2VpZ2h0cyBtdXN0IGJlIHBvc2l0aXZlIHZhbHVlcyBhbmQgdGhlcmUgbXVzdCBiZSBhbiBlbnRyeSBmb3IgZWFjaAotICogbm9uLXNhc2ggY2hpbGQgb2YgdGhlIFNhc2hGb3JtLgotICogCi0gKiBAcGFyYW0gd2VpZ2h0cyB0aGUgcmVsYXRpdmUgd2VpZ2h0IG9mIGVhY2ggY2hpbGQKLSAqIAotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHRoZSB3ZWlnaHRzIHZhbHVlIGlzIG51bGwgb3Igb2YgaW5jb3JyZWN0IGxlbmd0aCAobXVzdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuKTwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRXZWlnaHRzKGludFtdIHdlaWdodHMpIHsKLQljaGVja1dpZGdldCgpOwotCUNvbnRyb2xbXSBjQXJyYXkgPSBnZXRDb250cm9scyhmYWxzZSk7Ci0JaWYgKHdlaWdodHMgPT0gbnVsbCB8fCB3ZWlnaHRzLmxlbmd0aCAhPSBjQXJyYXkubGVuZ3RoKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JfQotCQotCWlmICh3ZWlnaHRzID09IG51bGwpCi0JCXJldHVybjsKLQkKLQlpbnQgdG90YWwgPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgd2VpZ2h0cy5sZW5ndGg7IGkrKykgewotCQlpZiAod2VpZ2h0c1tpXSA8IDApIHsKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JCX0KLQkJdG90YWwgKz0gd2VpZ2h0c1tpXTsKLQl9Ci0JaWYgKHRvdGFsID09IDApIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJT2JqZWN0IGRhdGEgPSBjQXJyYXlbaV0uZ2V0TGF5b3V0RGF0YSgpOwotCQlpZiAoZGF0YSA9PSBudWxsIHx8ICEoZGF0YSBpbnN0YW5jZW9mIFNhc2hGb3JtRGF0YSkpIHsKLQkJCWRhdGEgPSBuZXcgU2FzaEZvcm1EYXRhKCk7Ci0JCQljQXJyYXlbaV0uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJfQotCQkoKFNhc2hGb3JtRGF0YSlkYXRhKS53ZWlnaHQgPSAoKChsb25nKXdlaWdodHNbaV0gPDwgMTYpICsgdG90YWwgLSAxKSAvIHRvdGFsOwotCX0KLQotCWxheW91dChmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFNpbXBsZUxheW91dChib29sZWFuIGIpIHsKLQlDb250cm9sW10gY0FycmF5ID0gZ2V0Q29udHJvbHMoZmFsc2UpOwotCWlmIChjQXJyYXkgPT0gbnVsbCB8fCBjQXJyYXkubGVuZ3RoICE9IDIpCi0JCXJldHVybjsKLQllbmFibGVTYXNoID0gYjsKLQlTYXNoRm9ybUxheW91dCBsYXlvdXQgPSAoU2FzaEZvcm1MYXlvdXQpIGdldExheW91dCgpOwotCWxheW91dC5zaW1wbGUgPSAhZW5hYmxlU2FzaDsKLQkKLQlpZiAoZW5hYmxlU2FzaCkKLQkJcmVzaXplID0gdHJ1ZTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9jdXN0b20vU2FzaEZvcm1EYXRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9jdXN0b20vU2FzaEZvcm1EYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YmEyMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvY3VzdG9tL1Nhc2hGb3JtRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLmN1c3RvbTsKLQotY2xhc3MgU2FzaEZvcm1EYXRhIHsKLQotCWxvbmcgd2VpZ2h0OwotCi1TdHJpbmcgZ2V0TmFtZSAoKSB7Ci0JU3RyaW5nIHN0cmluZyA9IGdldENsYXNzICgpLmdldE5hbWUgKCk7Ci0JaW50IGluZGV4ID0gc3RyaW5nLmxhc3RJbmRleE9mICgnLicpOwotCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuIHN0cmluZzsKLQlyZXR1cm4gc3RyaW5nLnN1YnN0cmluZyAoaW5kZXggKyAxLCBzdHJpbmcubGVuZ3RoICgpKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZQotICogZGVzY3JpcHRpb24gb2YgdGhlIHJlY2VpdmVyLgotICoKLSAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGV2ZW50Ci0gKi8KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCkgewotCXJldHVybiBnZXROYW1lKCkrIiB7d2VpZ2h0PSIrd2VpZ2h0KyJ9IjsgLy8kTk9OLU5MUy0yJAotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvY3VzdG9tL1Nhc2hGb3JtTGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9jdXN0b20vU2FzaEZvcm1MYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc1MDMyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9jdXN0b20vU2FzaEZvcm1MYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuY3VzdG9tOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBsYXlvdXQgZm9yIFNhc2hGb3JtCi0gKiAKLSAqIEBzZWUgU2FzaEZvcm0KLSAqLwotY2xhc3MgU2FzaEZvcm1MYXlvdXQgZXh0ZW5kcyBMYXlvdXQgewotCXByb3RlY3RlZCBib29sZWFuIHNpbXBsZTsKLQotcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQlTYXNoRm9ybSBzYXNoRm9ybSA9IChTYXNoRm9ybSljb21wb3NpdGU7Ci0JQ29udHJvbFtdIGNBcnJheSA9IHNhc2hGb3JtLmdldENvbnRyb2xzKHRydWUpOwotCWludCB3aWR0aCA9IDA7Ci0JaW50IGhlaWdodCA9IDA7Ci0JaWYgKGNBcnJheS5sZW5ndGggPT0gMCkgewotCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpIHdpZHRoID0gd0hpbnQ7Ci0JCWlmIChoSGludCAhPSBTV1QuREVGQVVMVCkgaGVpZ2h0ID0gaEhpbnQ7Ci0JCXJldHVybiBuZXcgUG9pbnQod2lkdGgsIGhlaWdodCk7Ci0JfQotCS8vIGRldGVybWluZSBjb250cm9sIHNpemVzCi0JYm9vbGVhbiB2ZXJ0aWNhbCA9IHNhc2hGb3JtLmdldE9yaWVudGF0aW9uKCkgPT0gU1dULlZFUlRJQ0FMOwotCWludCBtYXhJbmRleCA9IDA7Ci0JaW50IG1heFZhbHVlID0gMDsKLQlQb2ludFtdIHNpemVzID0gbmV3IFBvaW50W2NBcnJheS5sZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCWlmICh2ZXJ0aWNhbCkgewotCQkJc2l6ZXNbaV0gPSBjQXJyYXlbaV0uY29tcHV0ZVNpemUod0hpbnQsIFNXVC5ERUZBVUxULCBmbHVzaENhY2hlKTsKLQkJCWlmIChzaXplc1tpXS55ID4gbWF4VmFsdWUpIHsKLQkJCQltYXhJbmRleCA9IGk7Ci0JCQkJbWF4VmFsdWUgPSBzaXplc1tpXS55OwotCQkJfQotCQkJd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgc2l6ZXNbaV0ueCk7Ci0JCX0gZWxzZSB7Ci0JCQlzaXplc1tpXSA9IGNBcnJheVtpXS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgaEhpbnQsIGZsdXNoQ2FjaGUpOwotCQkJaWYgKHNpemVzW2ldLnggPiBtYXhWYWx1ZSkgewotCQkJCW1heEluZGV4ID0gaTsKLQkJCQltYXhWYWx1ZSA9IHNpemVzW2ldLng7Ci0JCQl9Ci0JCQloZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIHNpemVzW2ldLnkpOwotCQl9Ci0JfQotCS8vIGdldCB0aGUgcmF0aW9zCi0JbG9uZ1tdIHJhdGlvcyA9IG5ldyBsb25nW2NBcnJheS5sZW5ndGhdOwotCWxvbmcgdG90YWwgPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCU9iamVjdCBkYXRhID0gY0FycmF5W2ldLmdldExheW91dERhdGEoKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhIGluc3RhbmNlb2YgU2FzaEZvcm1EYXRhKSB7Ci0JCQlyYXRpb3NbaV0gPSAoKFNhc2hGb3JtRGF0YSlkYXRhKS53ZWlnaHQ7Ci0JCX0gZWxzZSB7Ci0JCQlkYXRhID0gbmV3IFNhc2hGb3JtRGF0YSgpOwotCQkJY0FycmF5W2ldLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkoKFNhc2hGb3JtRGF0YSlkYXRhKS53ZWlnaHQgPSByYXRpb3NbaV0gPSAoKDIwMCA8PCAxNikgKyA5OTkpIC8gMTAwMDsKLQkJCQotCQl9Ci0JCXRvdGFsICs9IHJhdGlvc1tpXTsKLQl9Ci0JaWYgKHJhdGlvc1ttYXhJbmRleF0gPiAwKSB7Ci0JCWludCBzYXNod2lkdGggPSBzYXNoRm9ybS5zYXNoZXMubGVuZ3RoID4gMCA/IHNhc2hGb3JtLlNBU0hfV0lEVEggKyBzYXNoRm9ybS5zYXNoZXMgWzBdLmdldEJvcmRlcldpZHRoKCkgKiAyIDogc2FzaEZvcm0uU0FTSF9XSURUSDsKLQkJaWYgKHZlcnRpY2FsKSB7Ci0JCQloZWlnaHQgKz0gKGludCkodG90YWwgKiBtYXhWYWx1ZSAvIHJhdGlvc1ttYXhJbmRleF0pICsgKGNBcnJheS5sZW5ndGggLSAxKSAqIHNhc2h3aWR0aDsKLQkJfSBlbHNlIHsKLQkJCXdpZHRoICs9IChpbnQpKHRvdGFsICogbWF4VmFsdWUgLyByYXRpb3NbbWF4SW5kZXhdKSArIChjQXJyYXkubGVuZ3RoIC0gMSkgKiBzYXNod2lkdGg7Ci0JCX0KLQl9Ci0Jd2lkdGggKz0gc2FzaEZvcm0uZ2V0Qm9yZGVyV2lkdGgoKSoyOwotCWhlaWdodCArPSBzYXNoRm9ybS5nZXRCb3JkZXJXaWR0aCgpKjI7Ci0JaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUKSB3aWR0aCA9IHdIaW50OwotCWlmIChoSGludCAhPSBTV1QuREVGQVVMVCkgaGVpZ2h0ID0gaEhpbnQ7Ci0JcmV0dXJuIG5ldyBQb2ludCh3aWR0aCwgaGVpZ2h0KTsKLX0KLQotcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hDYWNoZShDb250cm9sIGNvbnRyb2wpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCVNhc2hGb3JtIHNhc2hGb3JtID0gKFNhc2hGb3JtKWNvbXBvc2l0ZTsKLQlSZWN0YW5nbGUgYXJlYSA9IHNhc2hGb3JtLmdldENsaWVudEFyZWEoKTsKLQlpZiAoYXJlYS53aWR0aCA8PSAxIHx8IGFyZWEuaGVpZ2h0IDw9IDEpIHJldHVybjsKLQkKLQlDb250cm9sW10gbmV3Q29udHJvbHMgPSBzYXNoRm9ybS5nZXRDb250cm9scyh0cnVlKTsKLQlpZiAoc2FzaEZvcm0uY29udHJvbHMubGVuZ3RoID09IDAgJiYgbmV3Q29udHJvbHMubGVuZ3RoID09IDApCi0JCXJldHVybjsKLQlzYXNoRm9ybS5jb250cm9scyA9IG5ld0NvbnRyb2xzOwotCQotCUNvbnRyb2xbXSBjb250cm9scyA9IHNhc2hGb3JtLmNvbnRyb2xzOwotCQotCWlmIChzYXNoRm9ybS5tYXhDb250cm9sICE9IG51bGwgJiYgIXNhc2hGb3JtLm1heENvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKyl7Ci0JCQlpZiAoY29udHJvbHNbaV0gIT0gc2FzaEZvcm0ubWF4Q29udHJvbCkgewotCQkJCWNvbnRyb2xzW2ldLnNldEJvdW5kcygtMjAwLCAtMjAwLCAwLCAwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29udHJvbHNbaV0uc2V0Qm91bmRzKGFyZWEpOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JCi0JLy8gc2ltcGxlIGxheW91dAotCWlmIChzaW1wbGUpIHsKLQkJLy8gaGlkZSBzYXNoZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzYXNoRm9ybS5zYXNoZXMubGVuZ3RoOyBpKyspIHsKLQkJCXNhc2hGb3JtLnNhc2hlc1tpXS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXNhc2hGb3JtLnNhc2hlc1tpXS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCQkKLQkJUG9pbnQgcCA9IGNvbnRyb2xzWzBdLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSk7Ci0JCWNvbnRyb2xzWzBdLnNldEJvdW5kcygwLCAwLCBhcmVhLndpZHRoLCBwLnkpOwotCQljb250cm9sc1sxXS5zZXRCb3VuZHMoMCwgcC55ICsgMiwgYXJlYS53aWR0aCwgYXJlYS5oZWlnaHQgLSBwLnkgLSAyKTsKLQkJCi0JCXJldHVybjsKLQl9Ci0JCi0JLy8ga2VlcCBqdXN0IHRoZSByaWdodCBudW1iZXIgb2Ygc2FzaGVzCi0JaWYgKHNhc2hGb3JtLnNhc2hlcy5sZW5ndGggPCBjb250cm9scy5sZW5ndGggLSAxKSB7Ci0JCVNhc2hbXSBuZXdTYXNoZXMgPSBuZXcgU2FzaFtjb250cm9scy5sZW5ndGggLSAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShzYXNoRm9ybS5zYXNoZXMsIDAsIG5ld1Nhc2hlcywgMCwgc2FzaEZvcm0uc2FzaGVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSBzYXNoRm9ybS5zYXNoZXMubGVuZ3RoOyBpIDwgbmV3U2FzaGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQluZXdTYXNoZXNbaV0gPSBuZXcgU2FzaChzYXNoRm9ybSwgc2FzaEZvcm0uc2FzaFN0eWxlKTsKLQkJCW5ld1Nhc2hlc1tpXS5zZXRCYWNrZ3JvdW5kKHNhc2hGb3JtLmJhY2tncm91bmQpOwotCQkJbmV3U2FzaGVzW2ldLnNldEZvcmVncm91bmQoc2FzaEZvcm0uZm9yZWdyb3VuZCk7Ci0JCQluZXdTYXNoZXNbaV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgc2FzaEZvcm0uc2FzaExpc3RlbmVyKTsKLQkJfQotCQlzYXNoRm9ybS5zYXNoZXMgPSBuZXdTYXNoZXM7Ci0JfQotCWlmIChzYXNoRm9ybS5zYXNoZXMubGVuZ3RoID4gY29udHJvbHMubGVuZ3RoIC0gMSkgewotCQlpZiAoY29udHJvbHMubGVuZ3RoID09IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2FzaEZvcm0uc2FzaGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2FzaEZvcm0uc2FzaGVzW2ldLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXNhc2hGb3JtLnNhc2hlcyA9IG5ldyBTYXNoWzBdOwotCQl9IGVsc2UgewotCQkJU2FzaFtdIG5ld1Nhc2hlcyA9IG5ldyBTYXNoW2NvbnRyb2xzLmxlbmd0aCAtIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShzYXNoRm9ybS5zYXNoZXMsIDAsIG5ld1Nhc2hlcywgMCwgbmV3U2FzaGVzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gY29udHJvbHMubGVuZ3RoIC0gMTsgaSA8IHNhc2hGb3JtLnNhc2hlcy5sZW5ndGg7IGkrKykgewotCQkJCXNhc2hGb3JtLnNhc2hlc1tpXS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlzYXNoRm9ybS5zYXNoZXMgPSBuZXdTYXNoZXM7Ci0JCX0KLQl9Ci0JaWYgKGNvbnRyb2xzLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JU2FzaFtdIHNhc2hlcyA9IHNhc2hGb3JtLnNhc2hlczsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IHNhc2hGb3JtLnNhc2hlcy5sZW5ndGg7IGkrKykgewotCQlzYXNoZXNbaV0uc2V0RW5hYmxlZCh0cnVlKTsKLQkJc2FzaGVzW2ldLnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCQotCWlmIChzYXNoRm9ybS5yZXNpemUpIHsKLQkJQ29udHJvbCBjMSA9IGNvbnRyb2xzWzBdOwotCQlDb250cm9sIGMyID0gY29udHJvbHNbMV07Ci0JCQotCQlpbnQgaDEgPSBhcmVhLmhlaWdodCAvIDM7Ci0JCWludCBoMiA9IGFyZWEuaGVpZ2h0IC0gaDEgLSBzYXNoZXNbMF0uZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCQkKLQkJT2JqZWN0IGRhdGExID0gYzEuZ2V0TGF5b3V0RGF0YSgpOwotCQlpZiAoZGF0YTEgPT0gbnVsbCB8fCAhKGRhdGExIGluc3RhbmNlb2YgU2FzaEZvcm1EYXRhKSkgewotCQkJZGF0YTEgPSBuZXcgU2FzaEZvcm1EYXRhKCk7Ci0JCQljMS5zZXRMYXlvdXREYXRhKGRhdGExKTsKLQkJfQotCQlPYmplY3QgZGF0YTIgPSBjMi5nZXRMYXlvdXREYXRhKCk7Ci0JCWlmIChkYXRhMiA9PSBudWxsIHx8ICEoZGF0YTIgaW5zdGFuY2VvZiBTYXNoRm9ybURhdGEpKSB7Ci0JCQlkYXRhMiA9IG5ldyBTYXNoRm9ybURhdGEoKTsKLQkJCWMyLnNldExheW91dERhdGEoZGF0YTIpOwotCQl9Ci0JCSgoU2FzaEZvcm1EYXRhKWRhdGExKS53ZWlnaHQgPSAoKDIwMCA8PCAxNikgKyA5OTkpIC8gMTAwMCAqIGgxIC8gaDI7Ci0JCSgoU2FzaEZvcm1EYXRhKWRhdGEyKS53ZWlnaHQgPSAoKDIwMCA8PCAxNikgKyA5OTkpIC8gMTAwMDsKLQkJc2FzaEZvcm0ucmVzaXplID0gZmFsc2U7Ci0JfQotCQotCS8vIGdldCB0aGUgcmF0aW9zCi0JbG9uZ1tdIHJhdGlvcyA9IG5ldyBsb25nW2NvbnRyb2xzLmxlbmd0aF07Ci0JbG9uZyB0b3RhbCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKykgewotCQlPYmplY3QgZGF0YSA9IGNvbnRyb2xzW2ldLmdldExheW91dERhdGEoKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhIGluc3RhbmNlb2YgU2FzaEZvcm1EYXRhKSB7Ci0JCQlyYXRpb3NbaV0gPSAoKFNhc2hGb3JtRGF0YSlkYXRhKS53ZWlnaHQ7Ci0JCX0gZWxzZSB7Ci0JCQlkYXRhID0gbmV3IFNhc2hGb3JtRGF0YSgpOwotCQkJY29udHJvbHNbaV0uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCSgoU2FzaEZvcm1EYXRhKWRhdGEpLndlaWdodCA9IHJhdGlvc1tpXSA9ICgoMjAwIDw8IDE2KSArIDk5OSkgLyAxMDAwOwotCQl9Ci0JCXRvdGFsICs9IHJhdGlvc1tpXTsKLQl9Ci0JCi0JaW50IHNhc2h3aWR0aCA9IHNhc2hlcy5sZW5ndGggPiAwID8gc2FzaEZvcm0uU0FTSF9XSURUSCArIHNhc2hlcyBbMF0uZ2V0Qm9yZGVyV2lkdGgoKSAqIDIgOiBzYXNoRm9ybS5TQVNIX1dJRFRIOwotCWlmIChzYXNoRm9ybS5nZXRPcmllbnRhdGlvbigpID09IFNXVC5IT1JJWk9OVEFMKSB7Ci0JCWludCB3aWR0aCA9IChpbnQpKHJhdGlvc1swXSAqIChhcmVhLndpZHRoIC0gc2FzaGVzLmxlbmd0aCAqIHNhc2h3aWR0aCkgLyB0b3RhbCk7Ci0JCWludCB4ID0gYXJlYS54OwotCQljb250cm9sc1swXS5zZXRCb3VuZHMoeCwgYXJlYS55LCB3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQl4ICs9IHdpZHRoOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGNvbnRyb2xzLmxlbmd0aCAtIDE7IGkrKykgewotCQkJc2FzaGVzW2kgLSAxXS5zZXRCb3VuZHMoeCwgYXJlYS55LCBzYXNod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCXggKz0gc2FzaHdpZHRoOwotCQkJd2lkdGggPSAoaW50KShyYXRpb3NbaV0gKiAoYXJlYS53aWR0aCAtIHNhc2hlcy5sZW5ndGggKiBzYXNod2lkdGgpIC8gdG90YWwpOwotCQkJY29udHJvbHNbaV0uc2V0Qm91bmRzKHgsIGFyZWEueSwgd2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCXggKz0gd2lkdGg7Ci0JCX0KLQkJaWYgKGNvbnRyb2xzLmxlbmd0aCA+IDEpIHsKLQkJCXNhc2hlc1tzYXNoZXMubGVuZ3RoIC0gMV0uc2V0Qm91bmRzKHgsIGFyZWEueSwgc2FzaHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQl4ICs9IHNhc2h3aWR0aDsKLQkJCXdpZHRoID0gYXJlYS53aWR0aCAtIHg7Ci0JCQljb250cm9sc1tjb250cm9scy5sZW5ndGggLSAxXS5zZXRCb3VuZHMoeCwgYXJlYS55LCB3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaW50IGhlaWdodCA9IChpbnQpKHJhdGlvc1swXSAqIChhcmVhLmhlaWdodCAtIHNhc2hlcy5sZW5ndGggKiBzYXNod2lkdGgpIC8gdG90YWwpOwotCQlpbnQgeSA9IGFyZWEueTsKLQkJY29udHJvbHNbMF0uc2V0Qm91bmRzKGFyZWEueCwgeSwgYXJlYS53aWR0aCwgaGVpZ2h0KTsKLQkJeSArPSBoZWlnaHQ7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgY29udHJvbHMubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQlzYXNoZXNbaSAtIDFdLnNldEJvdW5kcyhhcmVhLngsIHksIGFyZWEud2lkdGgsIHNhc2h3aWR0aCk7Ci0JCQl5ICs9IHNhc2h3aWR0aDsKLQkJCWhlaWdodCA9IChpbnQpKHJhdGlvc1tpXSAqIChhcmVhLmhlaWdodCAtIHNhc2hlcy5sZW5ndGggKiBzYXNod2lkdGgpIC8gdG90YWwpOwotCQkJY29udHJvbHNbaV0uc2V0Qm91bmRzKGFyZWEueCwgeSwgYXJlYS53aWR0aCwgaGVpZ2h0KTsKLQkJCXkgKz0gaGVpZ2h0OwotCQl9Ci0JCWlmIChjb250cm9scy5sZW5ndGggPiAxKSB7Ci0JCQlzYXNoZXNbc2FzaGVzLmxlbmd0aCAtIDFdLnNldEJvdW5kcyhhcmVhLngsIHksIGFyZWEud2lkdGgsIHNhc2h3aWR0aCk7Ci0JCQl5ICs9IHNhc2h3aWR0aDsKLQkJCWhlaWdodCA9IGFyZWEuaGVpZ2h0IC0geTsKLQkJCWNvbnRyb2xzW2NvbnRyb2xzLmxlbmd0aCAtIDFdLnNldEJvdW5kcyhhcmVhLngsIHksIGFyZWEud2lkdGgsIGhlaWdodCk7Ci0JCX0KLQl9Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQ29udGVudFZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQ29udGVudFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDRjMGY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL0NvbnRlbnRWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLS8qKgotICogRWRpdGFibGUgdmlld2VyIGZvciBkaXNwbGF5aW5nIGFuZCBlZGl0aW5nIHJlcXVlc3RzIGFuZCByZXNwb25zZXMuCi0gKiA8cD4KLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+Y29udGVudFZpZXdlcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIFRoZSBzdWJjbGFzcyBtdXN0IGhhdmUgYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvciwgd2hpY2ggd2lsbCBiZSB1c2VkCi0gKiBhdXRvbWF0aWNhbGx5IHRvIGluc3RhbnRpYXRlIHRoZSB2aWV3ZXIgd2hlbiByZXF1aXJlZC4KLSAqIE9uY2UgaW5zdGFudGlhdGVkLCB7QGxpbmsgI2luaXQoQ29tcG9zaXRlKX0gaXMgY2FsbGVkIHRvIGNyZWF0ZQotICogdGhlIHZpZXdlcidzIGNvbnRyb2xzLiBUaGVuIHtAbGluayAjc2V0Q29udGVudChieXRlW10pfSBpcyBjYWxsZWQsCi0gKiBvbmUgb3IgbW9yZSB0aW1lcywgdG8gY2F1c2UgdGhlIHZpZXdlciB0byBkaXNwbGF5IHBhcnRpY3VsYXIKLSAqIGNvbnRlbnQuIEZpbmFsbHksIHdoZW4gdGhlIHZpZXdlciBpcyBubyBsb25nZXIgbmVlZGVkLCB7QGxpbmsgI2Rpc3Bvc2UoKX0KLSAqIGlzIGNhbGxlZCB0byBmcmVlIHVwIGFueSByZXNvdXJjZXMgdGllZCB1cCBieSB0aGUgdmlld2VyLgotICogPC9wPgotICogPHA+Ci0gKiBbaXNzdWU6IEl0J3MgdW5jbGVhciBob3cgdGhlc2UgY29udGVudCB2aWV3ZXJzIGFyZSB1c2VkLgotICogSXMgaXQganVzdCB0aGF0IHRoZSBVSSBwcm92aWRlcyBhIGxpc3Qgb2YgYXZhaWxhYmxlCi0gKiB2aWV3cyBmb3IgdGhlIHVzZXIgdG8gbWFrZSBhIG1hbnVhbCBzZWxlY3Rpb24gZnJvbSwgcmVnYXJkbGVzcwotICogb2YgdGhlIGFjdHVhbCBjb250ZW50IG9mIHRoZSBtZXNzYWdlIHRyYWZmaWM/XQotICogPC9wPgotICogW2lzc3VlOiBDUyAtIElmIGEgQ29udGVudFZpZXdlciBpcyBlZGl0YWJsZSwgZG9lcyB0aGF0IG1lYW4gd2UgY2FuIGVkaXQgdGhlIAotICogYnl0ZXMgb2YgdGhlIG1lc3NhZ2UgYW5kIHJlc2VuZCBpdCBhY3Jvc3MgdGhlIHdpcmU/ICBIb3cgaXMgYW4gZWRpdGFibGUgQ29udGVudFZpZXdlcgotICogaGFuZGxlZCBkaWZmZXJlbnRseSBieSB0aGUgZnJhbWV3b3JrPyBQZXJoYXBzIGFuIGV4YW1wbGUgb2Ygd2hhdCBhbiBlZGl0ZWFibGUgdmlld2VyIHdvdWxkIGRvLiBdCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZW50Vmlld2VyIHsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRlbnQgdmlld2VyIGluc3RhbmNlLgotCSAqLwotCXByb3RlY3RlZCBDb250ZW50Vmlld2VyKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJvbHMgZm9yIHRoaXMgdmlld2VyIGFzIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBjb21wb3NpdGUuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgaW5pdChDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnRlbnQgdGhhdCB0aGUgdmlld2VyIHNob3VsZCBkaXNwbGF5LgotCSAqIFRoZSBwYXJhbWV0ZXIgbWF5IGJlIG51bGwgaWYgbm8gY29udGVudCBzaG91bGQgYmUgZGlzcGxheWVkLgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBTaW5jZSB0aGlzIGlzIGZvciBkaXNwbGF5aW5nIHJlcXVlc3QtcmVwb25zZSBtZXNzYWdlcywKLQkgKiB3aHkgbm90IHBhc3MgYW4gUmVxdWVzdD8gVGhlIHByb2JsZW0gYXMgaXQgc3RhbmRzIG5vdyBpcyB0aGF0Ci0JICogaXQgaXMgdW5jbGVhciBmcm9tIHNwZWNzIGhvdyBjb250ZW50IHZpZXdlcnMgcmVsYXRlIHRvIGFueXRoaW5nCi0JICogZWxzZSBoYXZpbmcgdG8gZG8gd2l0aCB0aGUgbW9uaXRvci5dCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBiIHRoZSBjb250ZW50IHRvIGRpc3BsYXksIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogZGlzcGxheSBub3RoaW5nCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q29udGVudChieXRlW10gYik7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNvbnRlbnQgZnJvbSB0aGUgdmlld2VyLiBUaGlzIGlzIHVzdWFsbHkgb25seSBpbnRlcmVzdGluZyBpZiB0aGUKLQkgKiBjb250ZW50IGhhcyBjaGFuZ2VkLgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZyBhbmQKLQkgKiByZXR1cm5zIG51bGwuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50IGZyb20gdGhlIHZpZXdlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0Q29udGVudCgpOwotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhpcyB2aWV3ZXIgYW5kIGFueSB1bmRlcmx5aW5nIHJlc291cmNlcyBzdWNoIGFzIGEgY29tcG9zaXRlLgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSB1c2VyIHN3aXRjaGVzIHRvIHVzZSBhbm90aGVyCi0JICogdmlld2VyIG9yIHRoZSBtb25pdG9yIHZpZXcgaXMgY2xvc2VkLiBUaGUgcGFyZW50IGNvbXBvc2l0ZSBzaG91bGQgbm90Ci0JICogYmUgZGlzcG9zZWQgc2luY2UgaXQgbWF5IGJlIHVzZWQgdG8gZGlzcGxheSBhbm90aGVyIHZpZXdlci4gCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgc3BlY2lhbGl6ZWQgY2xlYW51cC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFNldCB3aGV0aGVyIHRoZSBjdXJyZW50IHZpZXdlciBpcyBlZGl0YWJsZSwgdGhhdCBpcywgdGhlIHVzZXIgaXMgYWJsZSB0bwotCSAqIGVkaXQgdGhlIGNvbnRlbnQuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFsbG93cyBpbnN0YW5jZXMKLQkgKiB0byBiZSBtYWRlIGVkaXRhYmxlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdGFibGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdHJ1ZSB0aGUgY29udGVudCBjYW4gYmUgZWRpdGVkLAotCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHZpZXdlciBpcyBlZGl0YWJsZSwgdGhhdCBpcywgdGhlIHVzZXIgaXMgYWJsZSB0bwotCSAqIGVkaXQgdGhlIGNvbnRlbnQuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFsbG93cyBpbnN0YW5jZXMKLQkgKiB0byBiZSBtYWRlIGVkaXRhYmxlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRydWUgdGhlIGNvbnRlbnQgY2FuIGJlIGVkaXRlZCwKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEVkaXRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGVuY29kaW5nIG9mIHRoZSB2aWV3ZXIgZm9yIHZpZXdzIHRoYXQgZW5jb2RlIGNvbnRlbnQuICAKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWxsb3dzIGluc3RhbmNlcwotCSAqIHRvIHNldCB0aGUgZW5jb2RpbmcuCi0JICogPC9wPgotCSAqIEBwYXJhbSBzdHIgYW4gYXJyYXkgb2YgZW5jb2RpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmdzKFN0cmluZ1tdIHN0cil7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9Nb25pdG9yVUlDb3JlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9Nb25pdG9yVUlDb3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZWE0NGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTW9uaXRvclVJQ29yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luOwotLyoqCi0gKiBNYWluIGNsYXNzIGZvciBhY2Nlc3MgdG8gdGhlIG1vbml0b3IgVUkuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxsIGZ1bmN0aW9uYWxpdHkgdGhyb3VnaCBzdGF0aWMgbWVtYmVycy4gSXQgaXMgbm90IGludGVuZGVkCi0gKiB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1vbml0b3JVSUNvcmUgewotCS8qKgotCSAqIENhbm5vdCBjcmVhdGUgTW9uaXRvclVJQ29yZSAtIHVzZSBzdGF0aWMgbWV0aG9kcy4KLQkgKi8KLQlwcml2YXRlIE1vbml0b3JVSUNvcmUoKSB7Ci0JCS8vIGNhbid0IGNyZWF0ZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHJlcXVlc3RzIGN1cnJlbnRseSBiZWluZyBkaXNwbGF5ZWQgaW4gdGhlIFRDUC9JUAotCSAqIG1vbml0b3Igdmlldy4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcmVxdWVzdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlcXVlc3RbXSBnZXRSZXF1ZXN0cygpIHsKLQkJcmV0dXJuIE1vbml0b3JVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFJlcXVlc3RzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjhiNmMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+VENQL0lQIG1vbml0b3IgVUk8L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5UaGUgQ29udGVudFZpZXdlciBjbGFzcyBpcyBwcm92aWRlZCB0bwotaW1wbGVtZW50IHRoZSB2aWV3ZXJzIGV4dGVuc2lvbiBwb2ludCB0aGF0IGFsbG93cyBleHRlcm5hbCBwbHVnaW5zIHRvIHByb3ZpZGUKLWEgdmlldyBmb3Igdmlld2luZyByZXF1ZXN0IGFuZCByZXNwb25zZSBkYXRhIGNvbnRlbnQgaW4gdGhlIG1vbml0b3Igdmlldy4KLTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNDFhMjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci08aGVhZD4KLQk8IS0tICBFc2NhcGUgdG8gdGhlIHJvb3Qgb2YgeW91ciBzb3VyY2UgZm9sZGVyICAtLT4KLQk8bWV0YQotCQluYW1lPSJyb290IgotCQljb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0JPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxhYnN0cmFjdD5UQ1AvSVAgbW9uaXRvciBVSTwvYWJzdHJhY3Q+Ci0KLTxwPlRoZSBDb250ZW50Vmlld2VyIGNsYXNzIGlzIHByb3ZpZGVkIHRvCi1pbXBsZW1lbnQgdGhlIHZpZXdlcnMgZXh0ZW5zaW9uIHBvaW50IHRoYXQgYWxsb3dzIGV4dGVybmFsIHBsdWdpbnMgdG8gcHJvdmlkZQotYSB2aWV3IGZvciB2aWV3aW5nIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGRhdGEgY29udGVudCBpbiB0aGUgbW9uaXRvciB2aWV3LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9GaWx0ZXJBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvRmlsdGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNGQ4M2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9GaWx0ZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JQ29udGVudEZpbHRlcjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBWaWV3ZXJNYW5hZ2VyIHZtOwotCXByb3RlY3RlZCBJQ29udGVudEZpbHRlciBmaWx0ZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlZDsKLQotCXB1YmxpYyBGaWx0ZXJBY3Rpb24oVmlld2VyTWFuYWdlciB2bSwgSUNvbnRlbnRGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN1cGVyKGZpbHRlci5nZXROYW1lKCksIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKLQkJdGhpcy52bSA9IHZtOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoIWlzQ2hlY2tlZCgpKQotCQkJdm0ucmVtb3ZlRmlsdGVyKGZpbHRlcik7Ci0JCWVsc2UKLQkJCXZtLmFkZEZpbHRlcihmaWx0ZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L01vZGlmeU1lc3NhZ2VBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvTW9kaWZ5TWVzc2FnZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWYwZjU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvTW9kaWZ5TWVzc2FnZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuUmVzZW5kSFRUUFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBNb2RpZnkgdGhlIHNlbGVjdGVkIG1lc3NhZ2UuIENyZWF0ZXMgYSBuZXcgcmVzZW5kcmVxdWVzdCBhbmQgYWRkcyBpdAotICogdG8gdGhlIHRyZWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZnlNZXNzYWdlQWN0aW9uIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZXsKLQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7Ci0JCQkJUmVxdWVzdCByZXEgPSAoUmVxdWVzdCkgZWxlbWVudDsKLQkJCQlSZXNlbmRIVFRQUmVxdWVzdCBuZXdSZXEgPSBNb25pdG9yTWFuYWdlci5jcmVhdGVSZXNlbmRSZXF1ZXN0KHJlcSk7Ci0JCQkJTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRSZXNlbmRSZXF1ZXN0KHJlcSwgbmV3UmVxKTsKLQkJCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSBNb25pdG9yVmlldy52aWV3LnRyZWVWaWV3ZXI7Ci0JCQkJdHJlZVZpZXdlci5hZGQocmVxLCBuZXdSZXEpOwotCQkJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ld1JlcSksIGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24yKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uMjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9Nb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9Nb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDVlYjIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvTW9uaXRvclRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuUmVzZW5kSFRUUFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLk1vbml0b3JVSVBsdWdpbjsKLS8qKgotICogQ29udGVudCBwcm92aWRlciBmb3IgdGhlIG1vbml0b3Igc2VydmVyIHZpZXcuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gInJvb3QiOwotCi0JLyoqCi0JICogUHJveHlUcmVlQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vbml0b3JUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgY29udGVudCBwcm92aWRlci4KLQkgKiA8cD4KLQkgKiBbSXNzdWU6IFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHRha2UgYSBWaWV3ZXIsCi0JICogcmVuYW1lZCBhbmQgcmVwdXJwb3NlZCB0byBkaXNjb25uZWN0IGEgY29udGVudCBwcm92aWRlciBmcm9tCi0JICogYSB2aWV3ZXIuIFRoaXMgaXMgb3ZlciBhbmQgYWJvdmUgd2hhdCBpbnB1dENoYW5nZWQgZG9lcywKLQkgKiB3aGljaCBpcyBkaXNjb25uZWN0aW5nIGEgY29udGVudCBwcm92aWRlciBmcm9tIHRoZSB2aWV3ZXIncwotCSAqIGlucHV0IChidXQgbm90IHRoZSB2aWV3ZXIgaXRzZWxmKS4KLQkgKiBdCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBtZXRob2QgYW5kIAotCSAqIDxjb2RlPklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzPC9jb2RlPiBpcwotCSAqIHRoYXQgPGNvZGU+Z2V0RWxlbWVudHM8L2NvZGU+IGlzIGNhbGxlZCB0byBvYnRhaW4gdGhlIAotCSAqIHRyZWUgdmlld2VyJ3Mgcm9vdCBlbGVtZW50cywgd2hlcmVhcyA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gaXMgdXNlZAotCSAqIHRvIG9idGFpbiB0aGUgY2hpbGRyZW4gb2YgYSBnaXZlbiBub2RlIGluIHRoZSB0cmVlCi0JICogKGluY2x1ZGluZyBhIHJvb3QpLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbSXNzdWU6IERvbid0IGtub3cgd2hhdCBhYm92ZSBpcyB0cnlpbmcgdG8gc2F5LgotCSAqICBTZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHMuCi0JICogXQotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBjaGlsZCBlbGVtZW50cyAKLQkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5PYmplY3Q8L2NvZGU+KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikgZWxlbWVudDsKLQkJCUxpc3Q8UmVxdWVzdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8UmVxdWVzdD4oKTsKLQkJCVJlcXVlc3RbXSByZXF1ZXN0cyA9IE1vbml0b3JVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFJlcXVlc3RzKCk7Ci0JCQlpZiAocmVxdWVzdHMgIT0gbnVsbCkgewotCQkJCWZvciAoUmVxdWVzdCByZXEgOiByZXF1ZXN0cykgewotCQkJCQlpZiAoKHJlcS5nZXRMb2NhbFBvcnQoKSA9PSBpbi5pbnRWYWx1ZSgpKQotCQkJCQkJCSYmICEocmVxIGluc3RhbmNlb2YgUmVzZW5kSFRUUFJlcXVlc3QpKQotCQkJCQkJbGlzdC5hZGQocmVxKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlcXVlc3QpIHsKLQkJCVJlcXVlc3QgcmVxID0gKFJlcXVlc3QpIGVsZW1lbnQ7Ci0JCQlSZXNlbmRIVFRQUmVxdWVzdFtdIHJyID0gTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRSZXNlbmRSZXF1ZXN0cyhyZXEpOwotCQkJTGlzdDxSZXF1ZXN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxSZXF1ZXN0PigpOwotCQkJaWYgKHJyICE9IG51bGwpIHsKLQkJCQlmb3IgKFJlc2VuZEhUVFBSZXF1ZXN0IHIgOiBycikKLQkJCQkJbGlzdC5hZGQocik7Ci0JCQl9Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGVsZW1lbnRzIGJlbG9uZ2luZyB0byB0aGUKLQkgKiBnaXZlbiBlbGVtZW50LiBUaGVzZSBlbGVtZW50cyBjYW4gYmUgcHJlc2VudGVkIGFzIHJvd3MgaW4gYSB0YWJsZSwKLQkgKiBpdGVtcyBpbiBhIGxpc3QsIGV0Yy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKFJPT1QuZXF1YWxzKGVsZW1lbnQpKSB7Ci0JCQlMaXN0PEludGVnZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0JCQlSZXF1ZXN0W10gcmVxdWVzdHMgPSBNb25pdG9yVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRSZXF1ZXN0cygpOwotCQkJaWYgKHJlcXVlc3RzICE9IG51bGwpIHsKLQkJCQlmb3IgKFJlcXVlc3QgcmVxIDogIHJlcXVlc3RzKSB7Ci0JCQkJCUludGVnZXIgaW4gPSBuZXcgSW50ZWdlcihyZXEuZ2V0TG9jYWxQb3J0KCkpOwotCQkJCQlpZiAoIWxpc3QuY29udGFpbnMoaW4pKQotCQkJCQkJbGlzdC5hZGQoaW4pOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiAKLQkgKiBpbmRpY2F0aW5nIHRoYXQgdGhlIHBhcmVudCBjYW4ndCBiZSBjb21wdXRlZC4gCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbnRlZ2VyKQotCQkJCXJldHVybiBST09UOwotCQkJUmVxdWVzdCBjYWxsID0gKFJlcXVlc3QpIGVsZW1lbnQ7Ci0JCQlpZiAoY2FsbCBpbnN0YW5jZW9mIFJlc2VuZEhUVFBSZXF1ZXN0KSB7Ci0JCQkJUmVzZW5kSFRUUFJlcXVlc3QgY2FsbFJlc2VuZCA9IChSZXNlbmRIVFRQUmVxdWVzdCkgY2FsbDsKLQkJCQlSZXF1ZXN0IHBhcmVudCA9IGNhbGxSZXNlbmQuZ2V0T3JpZ2luYWxSZXF1ZXN0KCk7Ci0JCQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGNhbGwuZ2V0TG9jYWxQb3J0KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBlbGVtZW50IGhhcyBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEludGVnZXIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZXF1ZXN0KQotCQkJcmV0dXJuIE1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UmVzZW5kUmVxdWVzdHMoKFJlcXVlc3QpIGVsZW1lbnQpLmxlbmd0aCA+IDA7IAotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogTm90aWZpZXMgdGhpcyBjb250ZW50IHByb3ZpZGVyIHRoYXQgdGhlIGdpdmVuIHZpZXdlcidzIGlucHV0Ci0JICogaGFzIGJlZW4gc3dpdGNoZWQgdG8gYSBkaWZmZXJlbnQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L01vbml0b3JWaWV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L01vbml0b3JWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZmQyOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9Nb25pdG9yVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3OwotCi1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuSUNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cC5SZXNlbmRIVFRQUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklSZXF1ZXN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLio7Ci0vKioKLSAqIFZpZXcgb2YgVENQL0lQIGFjdGl2aXR5LgotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvclZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JcHJvdGVjdGVkIFRyZWUgdHJlZTsKLQlwcm90ZWN0ZWQgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCXByb3RlY3RlZCBNb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0KLQlwcm90ZWN0ZWQgSVJlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgVmlld2VyTWFuYWdlciB2bTsKLQlwcm90ZWN0ZWQgTGlzdCByZXF1ZXN0Vmlld2VyczsKLQlwcm90ZWN0ZWQgTGlzdCByZXNwb25zZVZpZXdlcnM7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfSUQgPSAib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudmlldyI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9WSUVXRVIgPSAib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy5ieXRlIjsKLQotCXByb3RlY3RlZCBJQWN0aW9uIGh0dHBIZWFkZXJBY3Rpb247Ci0JcHJvdGVjdGVkIElBY3Rpb24gcHJlZmVyZW5jZUFjdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIE1vbml0b3JWaWV3IHZpZXc7Ci0JCi0JcHJvdGVjdGVkIFJlcXVlc3QgY3VycmVudFJlcXVlc3QgPSBudWxsOwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24gPSBudWxsOwotCi0JLyoqCi0JICogTW9uaXRvclZpZXcgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9uaXRvclZpZXcoKSB7Ci0JCXN1cGVyKCk7Ci0JCXZpZXcgPSB0aGlzOwotCQkKLQkJLy8gdHJ5IHNwZWNpZmllZCBmb3JtYXQsIGFuZCBmYWxsIGJhY2sgdG8gc3RhbmRhcmQgZm9ybWF0Ci0JCXRyeSB7Ci0JCQlmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChNZXNzYWdlcy52aWV3RGF0ZUZvcm1hdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiaDptbS5zLlMgYSIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZG9SZXF1ZXN0QWRkZWQoZmluYWwgUmVxdWVzdCBycikgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghKHJyIGluc3RhbmNlb2YgUmVzZW5kSFRUUFJlcXVlc3QpKSB7Ci0JCQkJICB0cmVlVmlld2VyLnJlZnJlc2goTW9uaXRvclRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7Ci0JCQkJICBpZiAoIU1vbml0b3JVSVBsdWdpbi5nZXRQaW5WaWV3UHJlZmVyZW5jZSgpKQotCQkJCQkgIHRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHJyKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1JlcXVlc3RDaGFuZ2VkKGZpbmFsIFJlcXVlc3QgcnIpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAodHJlZVZpZXdlciA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCQotCQkJCXRyZWVWaWV3ZXIucmVmcmVzaChycik7Ci0JCQkJaWYgKCFzZWwuaXNFbXB0eSgpKQotCQkJCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWwpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgdmlldy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhcigpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihudWxsKTsKLQkJCQl0cmVlVmlld2VyLnNldElucHV0KE1vbml0b3JUcmVlQ29udGVudFByb3ZpZGVyLlJPT1QpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VsZWN0aW9uKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAodHJlZVZpZXdlciAhPSBudWxsKQotCQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocmVxdWVzdCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNhc2hGb3JtIHNhc2hGcGFyZW50ID0gbmV3IFNhc2hGb3JtKHBhcmVudCwgU1dULlZFUlRJQ0FMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDQ7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA0OwotCQlzYXNoRnBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2FzaEZwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2FzaEZwYXJlbnQsIENvbnRleHRJZHMuVklFVyk7Ci0JCQotCQkvLyBjcmVhdGUgdHJlZSBwYW5lbAotCQlDb21wb3NpdGUgdHJlZVBhbmVsID0gbmV3IENvbXBvc2l0ZShzYXNoRnBhcmVudCwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQl0cmVlUGFuZWwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMTEwOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdHJlZVBhbmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JCXRyZWUgPSBuZXcgVHJlZSh0cmVlUGFuZWwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkvL2RhdGEud2lkdGhIaW50ID0gMTIwOwotCQl0cmVlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IE1vbml0b3JUcmVlQ29udGVudFByb3ZpZGVyKCk7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoTW9uaXRvclRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0cmVlLCBDb250ZXh0SWRzLlZJRVdfVFJFRSk7Ci0JCi0JCUNvbXBvc2l0ZSBkZXRhaWxzUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHRyZWVQYW5lbCwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlkZXRhaWxzUGFuZWwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMjAwOwotCQlkZXRhaWxzUGFuZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkZXRhaWxzUGFuZWwsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3VGltZSwgIiIpKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJZmluYWwgTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKGRldGFpbHNQYW5lbCwgU1dULk5PTkUpOwotCQlsYWJlbDIuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVzcG9uc2VUaW1lLCAiIikpOwotCQlsYWJlbDIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCQotCQlmaW5hbCBMYWJlbCBsYWJlbDMgPSBuZXcgTGFiZWwoZGV0YWlsc1BhbmVsLCBTV1QuTk9ORSk7Ci0JCWxhYmVsMy5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdUeXBlLCAiIikpOwotCQlsYWJlbDMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCQotCQkvLyBjcmVhdGUgY2VudGVyIGFuZCByaWdodCBwYW5lbHMKLQkJU2FzaEZvcm0gc2FzaEZjaGlsZCA9IG5ldyBTYXNoRm9ybShzYXNoRnBhcmVudCwgU1dULkhPUklaT05UQUwpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDI7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA0OwotCQlzYXNoRmNoaWxkLnNldExheW91dChsYXlvdXQpOwotCQlzYXNoRnBhcmVudC5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7IDMwLCA3MCB9KTsKLQkJCi0JCS8vIHJlcXVlc3QgcGFuZWwKLQkJQ29tcG9zaXRlIHJlcXVlc3QgPSBuZXcgQ29tcG9zaXRlKHNhc2hGY2hpbGQsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDM7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlyZXF1ZXN0LnNldExheW91dChsYXlvdXQpOwotCQlyZXF1ZXN0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkKLQkJQ29tcG9zaXRlIHJlcXVlc3RIZWFkZXIgPSBuZXcgQ29tcG9zaXRlKHJlcXVlc3QsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMjsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlyZXF1ZXN0SGVhZGVyLnNldExheW91dChsYXlvdXQpOwotCQlyZXF1ZXN0SGVhZGVyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlmaW5hbCBMYWJlbCByZXF1ZXN0TGFiZWwgPSBuZXcgTGFiZWwocmVxdWVzdEhlYWRlciwgU1dULk5PTkUpOwotCQlyZXF1ZXN0TGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVxdWVzdCwgIiIpKTsKLQkJcmVxdWVzdExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJZmluYWwgQ29tYm8gcmVxdWVzdFZpZXdlckNvbWJvID0gbmV3IENvbWJvKHJlcXVlc3RIZWFkZXIsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWRhdGEudmVydGljYWxTcGFuID0gMjsKLQkJcmVxdWVzdFZpZXdlckNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlmaW5hbCBMYWJlbCByZXF1ZXN0U2l6ZUxhYmVsID0gbmV3IExhYmVsKHJlcXVlc3RIZWFkZXIsIFNXVC5OT05FKTsKLQkJcmVxdWVzdFNpemVMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdTaXplLCAiIikpOwotCQlyZXF1ZXN0U2l6ZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJLy8gcmVzcG9uc2UgcGFuZWwKLQkJQ29tcG9zaXRlIHJlc3BvbnNlID0gbmV3IENvbXBvc2l0ZShzYXNoRmNoaWxkLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAzOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcmVzcG9uc2Uuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXJlc3BvbnNlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUNvbXBvc2l0ZSByZXNwb25zZUhlYWRlciA9IG5ldyBDb21wb3NpdGUocmVzcG9uc2UsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMjsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlyZXNwb25zZUhlYWRlci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcmVzcG9uc2VIZWFkZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWZpbmFsIExhYmVsIHJlc3BvbnNlTGFiZWwgPSBuZXcgTGFiZWwocmVzcG9uc2VIZWFkZXIsIFNXVC5OT05FKTsKLQkJcmVzcG9uc2VMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdSZXNwb25zZSwgIiIpKTsKLQkJcmVzcG9uc2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCWZpbmFsIENvbWJvIHJlc3BvbnNlVmlld2VyQ29tYm8gPSBuZXcgQ29tYm8ocmVzcG9uc2VIZWFkZXIsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWRhdGEudmVydGljYWxTcGFuID0gMjsKLQkJcmVzcG9uc2VWaWV3ZXJDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJZmluYWwgTGFiZWwgcmVzcG9uc2VTaXplTGFiZWwgPSBuZXcgTGFiZWwocmVzcG9uc2VIZWFkZXIsIFNXVC5OT05FKTsKLQkJcmVzcG9uc2VTaXplTGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3U2l6ZSwgIiIpKTsKLQkJcmVzcG9uc2VTaXplTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQotCQkvLyB2aWV3ZXIgbWFuYWdlcgotCQl2bSA9IG5ldyBWaWV3ZXJNYW5hZ2VyKHJlcXVlc3QsIHJlc3BvbnNlKTsKLQkJcmVxdWVzdFZpZXdlcnMgPSB2bS5nZXRSZXF1ZXN0Vmlld2VycygpOwotCQlyZXNwb25zZVZpZXdlcnMgPSB2bS5nZXRSZXNwb25zZVZpZXdlcnMoKTsKLQkJCi0JCS8vIHNldCB1cCB0aGUgdmlld2VyIGNvbWJvIGJveGVzCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVxdWVzdFZpZXdlcnMuaXRlcmF0b3IoKTsKLQkJaW50IGN0ciA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlyZXF1ZXN0Vmlld2VyQ29tYm8uYWRkKHZpZXdlci5nZXRMYWJlbCgpLCBjdHIpOwotCQkJaWYgKHZpZXdlci5nZXRJZCgpLmVxdWFscyhERUZBVUxUX1ZJRVdFUikpIHsKLQkJCQlyZXF1ZXN0Vmlld2VyQ29tYm8uc2VsZWN0KGN0cik7IAotCQkJCXZtLnNldFJlcXVlc3RWaWV3ZXIodmlld2VyKTsKLQkJCX0KLQkJCWN0cisrOwotCQl9Ci0JCXJlcXVlc3RWaWV3ZXJDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVmlld2VyIHZpZXdlciA9IChWaWV3ZXIpIHJlcXVlc3RWaWV3ZXJzLmdldChyZXF1ZXN0Vmlld2VyQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJaWYgKGN1cnJlbnRSZXF1ZXN0ICE9IG51bGwgJiYgdmlld2VyICE9IG51bGwpCi0JCQkJCWN1cnJlbnRSZXF1ZXN0LnNldFByb3BlcnR5KCJyZXF1ZXN0LXZpZXdlciIsIHZpZXdlci5nZXRJZCgpKTsKLQkJCQl2bS5zZXRSZXF1ZXN0Vmlld2VyKHZpZXdlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0pOwotCQlyZXF1ZXN0SGVhZGVyLmxheW91dCh0cnVlKTsKLQkJCi0JCWl0ZXJhdG9yID0gcmVzcG9uc2VWaWV3ZXJzLml0ZXJhdG9yKCk7Ci0JCWN0ciA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlyZXNwb25zZVZpZXdlckNvbWJvLmFkZCh2aWV3ZXIuZ2V0TGFiZWwoKSwgY3RyKTsKLQkJCWlmICh2aWV3ZXIuZ2V0SWQoKS5lcXVhbHMoREVGQVVMVF9WSUVXRVIpKSB7Ci0JCQkJcmVzcG9uc2VWaWV3ZXJDb21iby5zZWxlY3QoY3RyKTsgCi0JCQkJdm0uc2V0UmVzcG9uc2VWaWV3ZXIodmlld2VyKTsKLQkJCX0KLQkJCWN0cisrOwotCQl9Ci0JCXJlc3BvbnNlVmlld2VyQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSByZXNwb25zZVZpZXdlcnMuZ2V0KHJlc3BvbnNlVmlld2VyQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJaWYgKGN1cnJlbnRSZXF1ZXN0ICE9IG51bGwgJiYgdmlld2VyICE9IG51bGwpCi0JCQkJCWN1cnJlbnRSZXF1ZXN0LnNldFByb3BlcnR5KCJyZXNwb25zZS12aWV3ZXIiLCB2aWV3ZXIuZ2V0SWQoKSk7Ci0JCQkJdm0uc2V0UmVzcG9uc2VWaWV3ZXIodmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfSk7Ci0JCXJlc3BvbnNlSGVhZGVyLmxheW91dCh0cnVlKTsKLQotCQkvLyBzZWxlY3Rpb24gbGlzdGVuZXIKLQkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCQljdXJyZW50UmVxdWVzdCA9IG51bGw7Ci0JCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQkJY3VycmVudFNlbGVjdGlvbiA9IHNlbDsKLQkJCQkJT2JqZWN0IG9iaiA9IHNlbC5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJlcXVlc3QpCi0JCQkJCQljdXJyZW50UmVxdWVzdCA9IChSZXF1ZXN0KSBvYmo7Ci0JCQkJfQotCQotCQkJCWlmIChjdXJyZW50UmVxdWVzdCAhPSBudWxsKSB7Ci0JCQkJCWxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1RpbWUsIGZvcm1hdC5mb3JtYXQoY3VycmVudFJlcXVlc3QuZ2V0RGF0ZSgpKSkpOwotCQotCQkJCQlpZiAoY3VycmVudFJlcXVlc3QuZ2V0UmVzcG9uc2VUaW1lKCkgPT0gLTEpCi0JCQkJCQlsYWJlbDIuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVzcG9uc2VUaW1lLCAiIikpOwotCQkJCQllbHNlIHsKLQkJCQkJCVN0cmluZyB0aW1lID0gTkxTLmJpbmQoTWVzc2FnZXMudmlld1Jlc3BvbnNlVGltZUZvcm1hdCwgY3VycmVudFJlcXVlc3QuZ2V0UmVzcG9uc2VUaW1lKCkgKyAiIik7Ci0JCQkJCQlsYWJlbDIuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVzcG9uc2VUaW1lLCB0aW1lKSk7Ci0JCQkJCX0KLQkJCQkJbGFiZWwzLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1R5cGUsIGN1cnJlbnRSZXF1ZXN0LmdldFByb3RvY29sKCkpKTsKLQkKLQkJCQkJLy8gcmVxdWVzdCBpbmZvcm1hdGlvbgotCQkJCQlyZXF1ZXN0TGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVxdWVzdCwgImxvY2FsaG9zdDoiICsgY3VycmVudFJlcXVlc3QuZ2V0TG9jYWxQb3J0KCkpKTsKLQkJCQkJcmVxdWVzdFNpemVMYWJlbC5zZXRUZXh0KGdldFNpemVTdHJpbmcoY3VycmVudFJlcXVlc3QuZ2V0UmVxdWVzdChSZXF1ZXN0LkNPTlRFTlQpLCBjdXJyZW50UmVxdWVzdC5nZXRSZXF1ZXN0KFJlcXVlc3QuQUxMKSkpOwotCQotCQkJCQkvLyByZXNwb25zZSBpbmZvcm1hdGlvbgotCQkJCQlyZXNwb25zZUxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1Jlc3BvbnNlLCBjdXJyZW50UmVxdWVzdC5nZXRSZW1vdGVIb3N0KCkgKyAiOiIgKyBjdXJyZW50UmVxdWVzdC5nZXRSZW1vdGVQb3J0KCkpKTsKLQkJCQkJcmVzcG9uc2VTaXplTGFiZWwuc2V0VGV4dChnZXRTaXplU3RyaW5nKGN1cnJlbnRSZXF1ZXN0LmdldFJlc3BvbnNlKFJlcXVlc3QuQ09OVEVOVCksIGN1cnJlbnRSZXF1ZXN0LmdldFJlc3BvbnNlKFJlcXVlc3QuQUxMKSkpOwotCQkJCQkKLQkJCQkJdm0uc2V0UmVxdWVzdChjdXJyZW50UmVxdWVzdCk7Ci0JCQkJCQotCQkJCQlWaWV3ZXIgdmlld2VyID0gdm0uZmluZFZpZXdlcigoU3RyaW5nKSBjdXJyZW50UmVxdWVzdC5nZXRQcm9wZXJ0eSgicmVxdWVzdC12aWV3ZXIiKSk7Ci0JCQkJCWlmICh2aWV3ZXIgPT0gbnVsbCkKLQkJCQkJCXZpZXdlciA9IHZtLmZpbmRWaWV3ZXIoREVGQVVMVF9WSUVXRVIpOwotCQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJCXZtLnNldFJlcXVlc3RWaWV3ZXIodmlld2VyKTsKLQkJCQkJCXJlcXVlc3RWaWV3ZXJDb21iby5zZWxlY3QocmVxdWVzdFZpZXdlcnMuaW5kZXhPZih2aWV3ZXIpKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJdmlld2VyID0gdm0uZmluZFZpZXdlcigoU3RyaW5nKSBjdXJyZW50UmVxdWVzdC5nZXRQcm9wZXJ0eSgicmVzcG9uc2Utdmlld2VyIikpOwotCQkJCQlpZiAodmlld2VyID09IG51bGwgJiYgY3VycmVudFJlcXVlc3QuZ2V0TmFtZSgpICE9IG51bGwpCi0JCQkJCQl2aWV3ZXIgPSB2bS5nZXREZWZhdWx0Vmlld2VyKGN1cnJlbnRSZXF1ZXN0LmdldE5hbWUoKSk7Ci0JCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQkJdm0uc2V0UmVzcG9uc2VWaWV3ZXIodmlld2VyKTsKLQkJCQkJCXJlc3BvbnNlVmlld2VyQ29tYm8uc2VsZWN0KHJlc3BvbnNlVmlld2Vycy5pbmRleE9mKHZpZXdlcikpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3VGltZSwgIiIpKTsKLQkJCQkJbGFiZWwyLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1Jlc3BvbnNlVGltZSwgIiIpKTsKLQkJCQkJcmVxdWVzdExhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1JlcXVlc3QsICIiKSk7Ci0JCQkJCXJlcXVlc3RTaXplTGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3U2l6ZSwgIiIpKTsKLQkJCQkJcmVzcG9uc2VMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdSZXNwb25zZSwgIiIpKTsKLQkJCQkJcmVzcG9uc2VTaXplTGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3U2l6ZSwgIiIpKTsKLQkJCQkJdm0uc2V0UmVxdWVzdChjdXJyZW50UmVxdWVzdCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJdHJlZVZpZXdlci5leHBhbmRUb0xldmVsKDIpOwotCQkKLQkJLy8gY3JlYXRlIGEgbWVudSBtYW5hZ2VyIGZvciBhIGNvbnRleHQgbWVudQotCQlNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigpOwotCQltZW51TWFuYWdlci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudSkgewotCQkJCW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQkJCW1lbnUuYWRkKHByZWZlcmVuY2VBY3Rpb24pOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgdGhlIG1lbnUKLQkJTWVudSBtZW51ID0gbWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUodHJlZVZpZXdlci5nZXRDb250cm9sKCkpOwotCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotCQkKLQkJLy8gcmVnaXN0ZXIgdGhlIG1lbnUgd2l0aCB0aGUgcGxhdGZvcm0KLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUobWVudU1hbmFnZXIsIHRyZWVWaWV3ZXIpOwotICAgICAgICAKLQkJaW5pdGlhbGl6ZUFjdGlvbnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTaXplU3RyaW5nKGJ5dGVbXSBhLCBieXRlW10gYikgewotCQlTdHJpbmcgYWEgPSAiMCI7Ci0JCVN0cmluZyBiYiA9ICIwIjsKLQkJaWYgKGEgIT0gbnVsbCkKLQkJCWFhID0gYS5sZW5ndGggKyAiIjsKLQkJaWYgKGIgIT0gbnVsbCkKLQkJCWJiID0gYi5sZW5ndGggKyAiIjsKLQkJU3RyaW5nIHNpemUgPSBOTFMuYmluZChNZXNzYWdlcy52aWV3U2l6ZUZvcm1hdCwgbmV3IE9iamVjdFtdIHsgYWEsIGJifSk7Ci0JCXJldHVybiBOTFMuYmluZChNZXNzYWdlcy52aWV3U2l6ZSwgc2l6ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQl0cmVlVmlld2VyID0gbnVsbDsKLQkJdmlldyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgdG9vbC1iYXIgYW5kIG1lbnUgYWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQWN0aW9ucygpIHsKLQkJZmluYWwgSUFjdGlvbiBwaW5BY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWJvb2xlYW4gcGluID0gTW9uaXRvclVJUGx1Z2luLmdldFBpblZpZXdQcmVmZXJlbmNlKCk7Ci0JCQkJCQlNb25pdG9yVUlQbHVnaW4uc2V0UGluVmlld1ByZWZlcmVuY2UoIXBpbik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfTsKLQkJcGluQWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOwotCQlwaW5BY3Rpb24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uUGluKTsKLQkJcGluQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5JTUdfRUxDTF9QSU4pKTsKLQkJcGluQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLklNR19DTENMX1BJTikpOwotCQlwaW5BY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uSU1HX0RMQ0xfUElOKSk7Ci0JCQotCQkKLQkJZmluYWwgSUFjdGlvbiBzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmICh0cmVlVmlld2VyLmdldENvbXBhcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQkJCQkJc2V0Q2hlY2tlZCh0cnVlKTsKLQkJCQkJCQl0cmVlVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFJlcXVlc3RDb21wYXJhdG9yKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlzZXRDaGVja2VkKGZhbHNlKTsKLQkJCQkJCQl0cmVlVmlld2VyLnNldENvbXBhcmF0b3IobnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfTsKLQkJc29ydEJ5UmVzcG9uc2VUaW1lQWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOwotCQlzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uU29ydEJ5UmVzcG9uc2VUaW1lKTsKLQkJc29ydEJ5UmVzcG9uc2VUaW1lQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5JTUdfRUxDTF9TT1JUX1JFU1BPTlNFX1RJTUUpKTsKLQkJc29ydEJ5UmVzcG9uc2VUaW1lQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLklNR19DTENMX1NPUlRfUkVTUE9OU0VfVElNRSkpOwotCQlzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uSU1HX0RMQ0xfU09SVF9SRVNQT05TRV9USU1FKSk7Ci0JCi0JCUlBY3Rpb24gY2xlYXJBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCU1vbml0b3JVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmNsZWFyUmVxdWVzdHMoKTsKLQkJCQljbGVhcigpOwotCQkJfQotCQl9OwotCQljbGVhckFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25DbGVhclRvb2xUaXApOwotCQljbGVhckFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uSU1HX0VMQ0xfQ0xFQVIpKTsKLQkJY2xlYXJBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uSU1HX0NMQ0xfQ0xFQVIpKTsKLQkJY2xlYXJBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uSU1HX0RMQ0xfQ0xFQVIpKTsKLQotCQlodHRwSGVhZGVyQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlib29sZWFuIGIgPSB2bS5nZXREaXNwbGF5SGVhZGVySW5mbygpOwotCQkJCQkJdm0uc2V0RGlzcGxheUhlYWRlckluZm8oIWIpOwotCQkJCQkJc2V0Q2hlY2tlZCghYik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfTsKLQkJaHR0cEhlYWRlckFjdGlvbi5zZXRDaGVja2VkKHZtLmdldERpc3BsYXlIZWFkZXJJbmZvKCkpOwotCQlodHRwSGVhZGVyQWN0aW9uLnNldFRleHQoTWVzc2FnZXMuYWN0aW9uU2hvd0hlYWRlcik7Ci0KLQkJcHJlZmVyZW5jZUFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2hvd1ByZWZlcmVuY2VQYWdlKCk7Ci0JCQl9Ci0JCX07Ci0JCXByZWZlcmVuY2VBY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25Qcm9wZXJ0aWVzKTsKLQkJCi0JCQotCQlJVG9vbEJhck1hbmFnZXIgdGJtID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJdGJtLmFkZChzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24pOwotCQl0Ym0uYWRkKGNsZWFyQWN0aW9uKTsKLQkJdGJtLmFkZChwaW5BY3Rpb24pOwotCQkKLQkJSUNvbnRlbnRGaWx0ZXJbXSBmaWx0ZXJzID0gTW9uaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldENvbnRlbnRGaWx0ZXJzKCk7Ci0JCUlNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldE1lbnVNYW5hZ2VyKCk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChodHRwSGVhZGVyQWN0aW9uKTsKLQkJZm9yIChJQ29udGVudEZpbHRlciBjZiA6IGZpbHRlcnMpIHsKLQkJCUZpbHRlckFjdGlvbiBhY3Rpb24gPSBuZXcgRmlsdGVyQWN0aW9uKHZtLCBjZik7Ci0JCQltZW51TWFuYWdlci5hZGQoYWN0aW9uKTsKLQkJfQotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbWVudU1hbmFnZXIuYWRkKHByZWZlcmVuY2VBY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3dQcmVmZXJlbmNlUGFnZSgpIHsKLQkJUHJlZmVyZW5jZU1hbmFnZXIgbWFuYWdlciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKTsKLQkJSVByZWZlcmVuY2VOb2RlIG5vZGUgPSBtYW5hZ2VyLmZpbmQoIm9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnUHJlZmVyZW5jZVBhZ2UiKS5maW5kU3ViTm9kZSgib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IucHJlZmVyZW5jZVBhZ2UiKTsKLQkJUHJlZmVyZW5jZU1hbmFnZXIgbWFuYWdlcjIgPSBuZXcgUHJlZmVyZW5jZU1hbmFnZXIoKTsKLQkJbWFuYWdlcjIuYWRkVG9Sb290KG5vZGUpOwotCQkKLQkJZmluYWwgUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSwgbWFuYWdlcjIpOwotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bXSB7IGZhbHNlIH07Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spCi0JCQkJCXJlc3VsdFswXSA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gcmVzdWx0WzBdOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYSByZXF1ZXN0LgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW4oZmluYWwgUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBNb25pdG9yVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKTsKLQkJCQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJCQotCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCi0JCQkJCUlWaWV3UGFydCB2aWV3MiA9IHBhZ2UuZmluZFZpZXcoVklFV19JRCk7Ci0JCQkJCQotCQkJCQlpZiAodmlldzIgIT0gbnVsbCkKLQkJCQkJCXBhZ2UuYnJpbmdUb1RvcCh2aWV3Mik7Ci0JCQkJCWVsc2UKLQkJCQkJCXBhZ2Uuc2hvd1ZpZXcoVklFV19JRCk7Ci0JCQkJCQotCQkJCQlpZiAodmlldyAhPSBudWxsICYmICFNb25pdG9yVUlQbHVnaW4uZ2V0UGluVmlld1ByZWZlcmVuY2UoKSkKLQkJCQkJCXZpZXcuc2V0U2VsZWN0aW9uKHJlcXVlc3QpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIG9wZW5pbmcgVENQL0lQIHZpZXciLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWlmICh0cmVlICE9IG51bGwpCi0JCQl0cmVlLnNldEZvY3VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9SZXF1ZXN0Q29tcGFyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9SZXF1ZXN0Q29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjdiNjhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvUmVxdWVzdENvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0Q29tcGFyYXRvciBleHRlbmRzIFZpZXdlckNvbXBhcmF0b3IgewotCS8qCi0JICogQHNlZSBWaWV3ZXJTb3J0ZXIjY29tcGFyZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJaWYgKG8xIGluc3RhbmNlb2YgUmVxdWVzdCAmJiBvMiBpbnN0YW5jZW9mIFJlcXVlc3QpIHsKLQkJCVJlcXVlc3QgcjEgPSAoUmVxdWVzdCkgbzE7Ci0JCQlSZXF1ZXN0IHIyID0gKFJlcXVlc3QpIG8yOwotCQkJaWYgKHIxLmdldFJlc3BvbnNlVGltZSgpIDwgcjIuZ2V0UmVzcG9uc2VUaW1lKCkpCi0JCQkJcmV0dXJuIC0xOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBvMSwgbzIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1Jlc2VuZE1lc3NhZ2VBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvUmVzZW5kTWVzc2FnZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGYwNGRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvUmVzZW5kTWVzc2FnZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuUmVzZW5kSFRUUFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBSZXNlbmRzIHRoZSBzZWxlY3RlZCByZXF1ZXN0IGFuZCBhZGRzIHRoZSByZXN1bHQgdG8gdGhlIHJlcXVlc3QvcmVzcG9uc2UgdHJlZS4KLSAqLwotcHVibGljIGNsYXNzIFJlc2VuZE1lc3NhZ2VBY3Rpb24gaW1wbGVtZW50cyBJVmlld0FjdGlvbkRlbGVnYXRlewotCXByb3RlY3RlZCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7Ci0JCQkJUmVxdWVzdCByZXEgPSAoUmVxdWVzdCkgZWxlbWVudDsKLQkJCQlSZXNlbmRIVFRQUmVxdWVzdCBuZXdSZXEgPSBNb25pdG9yTWFuYWdlci5jcmVhdGVSZXNlbmRSZXF1ZXN0KHJlcSk7Ci0JCQkJTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRSZXNlbmRSZXF1ZXN0KHJlcSwgbmV3UmVxKTsKLQkJCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSBNb25pdG9yVmlldy52aWV3LnRyZWVWaWV3ZXI7Ci0JCQkJdHJlZVZpZXdlci5hZGQocmVxLCBuZXdSZXEpOwotCQkJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ld1JlcSksIGZhbHNlKTsKLQkJCQluZXdSZXEuc2VuZFJlcXVlc3QoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24yKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uMjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9TZW5kTW9kaWZpZWRNZXNzYWdlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1NlbmRNb2RpZmllZE1lc3NhZ2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwYjQzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1NlbmRNb2RpZmllZE1lc3NhZ2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwLlJlc2VuZEhUVFBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnMuSGVhZGVyVmlld2VyOwotLyoqCi0gKiBTZW5kIGEgbW9kaWZpZWQgbWVzc2FnZS4KLSAqLwotcHVibGljIGNsYXNzIFNlbmRNb2RpZmllZE1lc3NhZ2VBY3Rpb24gaW1wbGVtZW50cyBJVmlld0FjdGlvbkRlbGVnYXRlewotCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gbnVsbDsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIFJlc2VuZEhUVFBSZXF1ZXN0KSB7Ci0JCQkJUmVzZW5kSFRUUFJlcXVlc3QgcmVxID0gKFJlc2VuZEhUVFBSZXF1ZXN0KSBlbGVtZW50OwotCQkJCUNvbnRlbnRWaWV3ZXIgY3VyVmlld2VyID0gTW9uaXRvclZpZXcudmlldy52bS5nZXRDdXJyZW50UmVxdWVzdFZpZXdlcigpOwotCQkJCUhlYWRlclZpZXdlciBjdXJIZWFkZXJWaWV3ZXIgPSBNb25pdG9yVmlldy52aWV3LnZtLmdldEN1cnJlbnRSZXF1ZXN0SGVhZGVyVmlld2VyKCk7Ci0JCQkJcmVxLnNldFJlcXVlc3QoY3VyVmlld2VyLmdldENvbnRlbnQoKSwgUmVxdWVzdC5DT05URU5UKTsKLQkJCQkKLQkJCQlpZiAoY3VySGVhZGVyVmlld2VyICE9IG51bGwpCi0JCQkJCXJlcS5zZXRSZXF1ZXN0KGN1ckhlYWRlclZpZXdlci5nZXRDb250ZW50KCksIFJlcXVlc3QuVFJBTlNQT1JUKTsKLQotCQkJCXJlcS5zZW5kUmVxdWVzdCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbjIpIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb24yOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1RyZWVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1RyZWVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YzFkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9UcmVlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cC5SZXNlbmRIVFRQUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luOwotLyoqCi0gKiBBIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgbW9uaXRvciBzZXJ2ZXIgdmlldy4KLSAqLwotcHVibGljIGNsYXNzIFRyZWVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIFRyZWVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFRyZWVMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoaXMgbGFiZWwgcHJvdmlkZXIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiBEaXNwb3NlcyBvZiB0aGlzIGxhYmVsIHByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGZvciB0aGUgbGFiZWwgb2YgdGhlIGdpdmVuIGVsZW1lbnQgZm9yIHVzZQotCSAqIGluIHRoZSBnaXZlbiB2aWV3ZXIuCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVxdWVzdCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZXNlbmRIVFRQUmVxdWVzdCkgewotCQkJCWlmICghKChSZXNlbmRIVFRQUmVxdWVzdCkgZWxlbWVudCkuaGFzQmVlblNlbnQoKSkKLQkJCQkJcmV0dXJuIE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZShNb25pdG9yVUlQbHVnaW4uSU1HX1JFU0VORF9SRVFVRVNUX1JFU1BPTlNFKTsKLQkJCX0KLQkJCXJldHVybiBNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2UoTW9uaXRvclVJUGx1Z2luLklNR19SRVFVRVNUX1JFU1BPTlNFKTsKLQkJfQotCQlyZXR1cm4gTW9uaXRvclVJUGx1Z2luLmdldEltYWdlKE1vbml0b3JVSVBsdWdpbi5JTUdfSE9TVCk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwgb2YgdGhlIGdpdmVuIGVsZW1lbnQgZm9yIHVzZQotCSAqIGluIHRoZSBnaXZlbiB2aWV3ZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVxdWVzdCkgewotCQkJUmVxdWVzdCBjYWxsID0gKFJlcXVlc3QpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gY2FsbC5nZXROYW1lKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikgZWxlbWVudDsKLQkJCXJldHVybiAibG9jYWxob3N0OiIgKyBpbi5pbnRWYWx1ZSgpOwotCQl9IGVsc2UKLQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxhYmVsIHdvdWxkIGJlIGFmZmVjdGVkIAotCSAqIGJ5IGEgY2hhbmdlIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIHRvIHRoaXMgbGFiZWwgcHJvdmlkZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1ZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQ4MjNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRWaWV3ZXI7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVmlld2VyIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGVuY29kaW5ncyA9IG51bGw7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGNvbnRlbnQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHVibGljIFZpZXdlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlTdHJpbmcgbGFiZWwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibGFiZWwiKTsKLQkJaWYgKGxhYmVsID09IG51bGwpCi0JCQlyZXR1cm4gIm4vYSI7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RW5jb2RpbmdzKCl7Ci0JCS8vIENhY2hlIHRoZSBlbmNvZGluZwotCQlpZiAoZW5jb2RpbmdzID09IG51bGwpewotCQkJU3RyaW5nIGVuY29kaW5nU3RyaW5nID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImVuY29kaW5ncyIpOwotCQkJCi0JCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgImVuY29kaW5nU3RyaW5nIGZyb20gZXh0ZW5zaW9uIHBvaW50IDogIiArIGVuY29kaW5nU3RyaW5nKTsKLQkJCX0KLQkJCQotCQkJaWYgKGVuY29kaW5nU3RyaW5nICE9IG51bGwpewotCQkJCWVuY29kaW5ncyA9IGVuY29kaW5nU3RyaW5nLnNwbGl0KCIsIik7Ci0JCQkJaW50IHNpemU9IGVuY29kaW5ncy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaT0wO2k8c2l6ZTtpKyspewotCQkJCQkvLyBDbGVhbiB1cCBpbnB1dAotCQkJCQllbmNvZGluZ3NbaV0gPSBlbmNvZGluZ3NbaV0udHJpbSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIkdldCBlbmNvZGluZ3MgOiAiICsgZW5jb2RpbmdzKTsKLQkJfQkJCi0JCXJldHVybiBlbmNvZGluZ3M7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgdmlld2VyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZpZXdlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgY291bGRuJ3QgYmUgbG9hZGVkCi0JICovCi0JcHVibGljIENvbnRlbnRWaWV3ZXIgY3JlYXRlVmlld2VyKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChDb250ZW50Vmlld2VyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZihUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSB2aWV3ZXIiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVxdWVzdFZpZXdlcigpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIikudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJyZXF1ZXN0IikgPj0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc3BvbnNlVmlld2VyKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoInJlc3BvbnNlIikgPj0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkNvbnRlbnRWaWV3ZXJbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9WaWV3ZXJNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1ZpZXdlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkNzZiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1ZpZXdlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuUmVzZW5kSFRUUFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLk1vbml0b3JVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzLkJ5dGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2Vycy5IZWFkZXJWaWV3ZXI7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVmlld2VyTWFuYWdlciB7Ci0JcHJpdmF0ZSBib29sZWFuIGRpc3BsYXlIZWFkZXJJbmY7Ci0KLQlwcm90ZWN0ZWQgQ29udGVudFZpZXdlciByZXFWaWV3ZXI7Ci0JcHJvdGVjdGVkIENvbnRlbnRWaWV3ZXIgcmVzcFZpZXdlcjsKLQlwcm90ZWN0ZWQgVmlld2VyIHJlcXVlc3RWaWV3ZXI7Ci0JcHJvdGVjdGVkIFZpZXdlciByZXNwb25zZVZpZXdlcjsKLQotCXByb3RlY3RlZCBIZWFkZXJWaWV3ZXIgcmVxSGVhZGVyOwotCXByb3RlY3RlZCBIZWFkZXJWaWV3ZXIgcmVzcEhlYWRlcjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgcmVxQ29tcDsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHJlc3BDb21wOwotCi0JcHJvdGVjdGVkIExpc3Q8Vmlld2VyPiB2aWV3ZXJzOwotCi0JcHJvdGVjdGVkIFJlcXVlc3QgcmVxdWVzdDsKLQotCXByb3RlY3RlZCBTYXNoRm9ybSByZXFTYXNoOwotCXByb3RlY3RlZCBTYXNoRm9ybSByZXNwU2FzaDsKLQotCXByb3RlY3RlZCBMaXN0PElDb250ZW50RmlsdGVyPiBmaWx0ZXJzID0gbmV3IEFycmF5TGlzdDxJQ29udGVudEZpbHRlcj4oKTsKLQotCXB1YmxpYyBWaWV3ZXJNYW5hZ2VyKENvbXBvc2l0ZSByZXFQYXJlbnQsIENvbXBvc2l0ZSByZXNwUGFyZW50KSB7Ci0JCXJlcVNhc2ggPSBuZXcgU2FzaEZvcm0ocmVxUGFyZW50LCBTV1QuVkVSVElDQUwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXJlcVNhc2guc2V0TGF5b3V0KGxheW91dCk7Ci0JCXJlcVNhc2guc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQlyZXNwU2FzaCA9IG5ldyBTYXNoRm9ybShyZXNwUGFyZW50LCBTV1QuVkVSVElDQUwpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlyZXNwU2FzaC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcmVzcFNhc2guc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQlyZXFDb21wID0gcmVxU2FzaDsKLQkJcmVzcENvbXAgPSByZXNwU2FzaDsKLQkJCi0JCXJlcUhlYWRlciA9IG5ldyBIZWFkZXJWaWV3ZXIocmVxU2FzaCwgSGVhZGVyVmlld2VyLlJFUVVFU1RfSEVBREVSKTsKLQkJcmVzcEhlYWRlciA9IG5ldyBIZWFkZXJWaWV3ZXIocmVzcFNhc2gsIEhlYWRlclZpZXdlci5SRVNQT05TRV9IRUFERVIpOwotCQlyZXFWaWV3ZXIgPSBuZXcgQnl0ZVZpZXdlcigpOwotCQlyZXFWaWV3ZXIuaW5pdChyZXFTYXNoKTsKLQkJcmVzcFZpZXdlciA9IG5ldyBCeXRlVmlld2VyKCk7Ci0JCXJlc3BWaWV3ZXIuaW5pdChyZXNwU2FzaCk7Ci0JCQotCQlyZXFTYXNoLnNldFdlaWdodHMobmV3IGludFtdIHsgMTAsIDkwIH0pOwotCQlyZXNwU2FzaC5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7IDEwLCA5MCB9KTsKLQkJCi0JCXNldERpc3BsYXlIZWFkZXJJbmZvKE1vbml0b3JVSVBsdWdpbi5nZXRTaG93SGVhZGVyUHJlZmVyZW5jZSgpKTsKLQkJbG9hZEF2YWlsYWJsZVZpZXdlcnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmlld2VyIGdldERlZmF1bHRWaWV3ZXIoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJU3RyaW5nIG5hbWUyID0gbmFtZS50b0xvd2VyQ2FzZSgpOyAKLQkJaWYgKG5hbWUyLmVuZHNXaXRoKCIueG1sIikpCi0JCQlyZXR1cm4gZmluZFZpZXdlcigib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy54bWwiKTsKLQkJZWxzZSBpZiAobmFtZTIuZW5kc1dpdGgoIi5odG1sIikpCi0JCQlyZXR1cm4gZmluZFZpZXdlcigib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy5icm93c2VyIik7Ci0JCWVsc2UgaWYgKG5hbWUyLmVuZHNXaXRoKCIuZ2lmIikgfHwgbmFtZTIuZW5kc1dpdGgoIi5qcGciKSB8fAotCQkJCW5hbWUyLmVuZHNXaXRoKCIuanBlZyIpIHx8IG5hbWUyLmVuZHNXaXRoKCIucG5nIikpCi0JCQlyZXR1cm4gZmluZFZpZXdlcigib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy5pbWFnZSIpOwotCQllbHNlCi0JCQlyZXR1cm4gZmluZFZpZXdlcigib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy5ieXRlIik7Ci0JfQotCi0JcHJvdGVjdGVkIFZpZXdlciBmaW5kVmlld2VyKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB2aWV3ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaWQuZXF1YWxzKHZpZXdlci5nZXRJZCgpKSkKLQkJCQlyZXR1cm4gdmlld2VyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkQXZhaWxhYmxlVmlld2VycygpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCwgInZpZXdlcnMiKTsKLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCXZpZXdlcnMgPSBuZXcgQXJyYXlMaXN0PFZpZXdlcj4oc2l6ZSk7Ci0JCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlIDogY2YpCi0JCQl2aWV3ZXJzLmFkZChuZXcgVmlld2VyKGNlKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuaW50ZXJuYWwudmlldy5JVmlld2VyTWFuYWdlciNzZXREaXNwbGF5SGVhZGVySW5mbyhib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlIZWFkZXJJbmZvKGJvb2xlYW4gYikgewotCQlkaXNwbGF5SGVhZGVySW5mID0gYjsKLQkJcmVxSGVhZGVyLnNldERpc3BsYXlIZWFkZXIoYik7Ci0JCXJlc3BIZWFkZXIuc2V0RGlzcGxheUhlYWRlcihiKTsKLQkJcmVxU2FzaC5zZXRTaW1wbGVMYXlvdXQoYik7Ci0JCXJlc3BTYXNoLnNldFNpbXBsZUxheW91dChiKTsKLQkJcmVxU2FzaC5sYXlvdXQodHJ1ZSk7Ci0JCXJlc3BTYXNoLmxheW91dCh0cnVlKTsKLQkJCi0JCU1vbml0b3JVSVBsdWdpbi5zZXRTaG93SGVhZGVyUHJlZmVyZW5jZShiKTsKLQkJaWYgKGIpIHsKLQkJCXJlcUhlYWRlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIFJlc2VuZEhUVFBSZXF1ZXN0ICYmIHJlcXVlc3QuZ2V0UmVzcG9uc2UoUmVxdWVzdC5UUkFOU1BPUlQpID09IG51bGwpIHsKLQkJCQlyZXFIZWFkZXIuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI2dldERpc3BsYXlIZWFkZXJJbmZvKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXREaXNwbGF5SGVhZGVySW5mbygpIHsKLQkJcmV0dXJuIGRpc3BsYXlIZWFkZXJJbmY7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVxdWVzdChSZXF1ZXN0IHJyKSB7Ci0JCS8vIG1haW50YWluIHRoZSBzdGF0ZSBvZiB0aGUgcmVxdWVzdCBhbmQgcmVxdWVzdCBoZWFkZXIgaWYgdGhleSd2ZSBiZWVuIG1vZGlmaWVkLgotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIFJlc2VuZEhUVFBSZXF1ZXN0ICYmIHJlcXVlc3QuZ2V0UmVzcG9uc2UoUmVxdWVzdC5BTEwpID09IG51bGwpIHsKLQkJCVJlc2VuZEhUVFBSZXF1ZXN0IHJlc1JlcXVlc3QgPSAoUmVzZW5kSFRUUFJlcXVlc3QpIHJlcXVlc3Q7Ci0JCQkvL0VkaXRhYmxlQ29udGVudFZpZXdlciBlZGl0Vmlld2VyID0gKENvbnRlbnRWaWV3ZXIpIHJlcVZpZXdlcjsKLQkJCWJ5dGVbXSBjb250ZW50ID0gcmVxVmlld2VyLmdldENvbnRlbnQoKTsKLQkJCWJ5dGVbXSBiID0gcmVzUmVxdWVzdC5nZXRSZXF1ZXN0KFJlcXVlc3QuQ09OVEVOVCk7Ci0JCQlpZiAoY29udGVudCAhPSBudWxsICYmIGIgIT0gbnVsbCAmJiAhTW9uaXRvclVJUGx1Z2luLnBhcnNlKGIpLmVxdWFscyhNb25pdG9yVUlQbHVnaW4ucGFyc2UoY29udGVudCkpKSB7Ci0JCQkJcmVzUmVxdWVzdC5zZXRSZXF1ZXN0KGNvbnRlbnQsIFJlcXVlc3QuQ09OVEVOVCk7Ci0JCQl9Ci0JCQlieXRlW10gaGVhZGVyID0gcmVxSGVhZGVyLmdldENvbnRlbnQoKTsKLQkJCWIgPSByZXNSZXF1ZXN0LmdldFJlcXVlc3QoUmVxdWVzdC5UUkFOU1BPUlQpOwotCQkJaWYgKGhlYWRlciAhPSBudWxsICYmIGIgIT0gbnVsbCAmJiAhTW9uaXRvclVJUGx1Z2luLnBhcnNlKGIpLmVxdWFscyhNb25pdG9yVUlQbHVnaW4ucGFyc2UoaGVhZGVyKSkpIHsKLQkJCQlyZXNSZXF1ZXN0LnNldFJlcXVlc3QoaGVhZGVyLCBSZXF1ZXN0LlRSQU5TUE9SVCk7Ci0JCQl9Ci0JCX0KLQkJcmVxSGVhZGVyLnNldFJlcXVlc3RSZXNwb25zZShycik7Ci0JCXJlc3BIZWFkZXIuc2V0UmVxdWVzdFJlc3BvbnNlKHJyKTsKLQkJYnl0ZVtdIGIgPSBudWxsOwotCQlpZiAocnIgIT0gbnVsbCkKLQkJCWIgPSBmaWx0ZXIocnIuZ2V0UmVxdWVzdChSZXF1ZXN0LkNPTlRFTlQpKTsKLQkJcmVxVmlld2VyLnNldENvbnRlbnQoYik7Ci0JCWIgPSBudWxsOwotCQlpZiAocnIgIT0gbnVsbCkKLQkJCWIgPSBmaWx0ZXIocnIuZ2V0UmVzcG9uc2UoUmVxdWVzdC5DT05URU5UKSk7Ci0JCXJlc3BWaWV3ZXIuc2V0Q29udGVudChiKTsKLQkJcmVxdWVzdCA9IHJyOwotCQkKLQkJLy8gc2V0IHRoZSBlZGl0b3IgdG8gZWRpdGFibGUgaWYgdGhlIHJlcXVlc3QgaGFzbid0IGJlZW4gc2VudCBhbmQgdGhlCi0JCS8vIGVkaXRvciBjYW4gYmUgc2V0IGFzIGVkaXRhYmxlCi0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVzZW5kSFRUUFJlcXVlc3QgJiYgcmVxdWVzdC5nZXRSZXNwb25zZShSZXF1ZXN0LkFMTCkgPT0gbnVsbCkgewotCQkJaWYgKGRpc3BsYXlIZWFkZXJJbmYpCi0JCQkJcmVxSGVhZGVyLnNldEVkaXRhYmxlKHRydWUpOwotCQkJCi0JCQlyZXFWaWV3ZXIuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZGlzcGxheUhlYWRlckluZikKLQkJCQlyZXFIZWFkZXIuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJCi0JCQlyZXFWaWV3ZXIuc2V0RWRpdGFibGUoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRmlsdGVyKElDb250ZW50RmlsdGVyIGZpbHRlcikgewotCQlmaWx0ZXJzLmFkZChmaWx0ZXIpOwotCQlzZXRSZXF1ZXN0KHJlcXVlc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUZpbHRlcihJQ29udGVudEZpbHRlciBmaWx0ZXIpIHsKLQkJZmlsdGVycy5yZW1vdmUoZmlsdGVyKTsKLQkJc2V0UmVxdWVzdChyZXF1ZXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGZpbHRlcihieXRlW10gYikgewotCQlpZiAoYiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmlsdGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJQ29udGVudEZpbHRlciBmaWx0ZXIgPSAoSUNvbnRlbnRGaWx0ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXRyeSB7Ci0JCQkJYiA9IGZpbHRlci5maWx0ZXIocmVxdWVzdCwgZmFsc2UsIGIpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZihUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIHdoaWxlIGZpbHRlcmluZyB3aXRoICIgKyBmaWx0ZXIuZ2V0SWQoKSwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBiOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnRjcGlwLm1vbml0b3IuaW50ZXJuYWwudmlldy5JVmlld2VyTWFuYWdlciNnZXRSZXF1ZXN0Vmlld2VycygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVxdWVzdFZpZXdlcnMoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdmlld2Vycy5pdGVyYXRvcigpOwotCQlMaXN0PFZpZXdlcj4gdGVtcCA9IG5ldyBBcnJheUxpc3Q8Vmlld2VyPigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlWaWV3ZXIgdmlld2VyID0gKFZpZXdlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHZpZXdlci5pc1JlcXVlc3RWaWV3ZXIoKSkKLQkJCQl0ZW1wLmFkZCh2aWV3ZXIpOwotCQl9Ci0JCXJldHVybiB0ZW1wOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnRjcGlwLm1vbml0b3IuaW50ZXJuYWwudmlldy5JVmlld2VyTWFuYWdlciNnZXRSZXNwb25zZVZpZXdlcnMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc3BvbnNlVmlld2VycygpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB2aWV3ZXJzLml0ZXJhdG9yKCk7Ci0JCUxpc3Q8Vmlld2VyPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxWaWV3ZXI+KCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAodmlld2VyLmlzUmVzcG9uc2VWaWV3ZXIoKSkKLQkJCQl0ZW1wLmFkZCh2aWV3ZXIpOwotCQl9Ci0JCXJldHVybiB0ZW1wOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnRjcGlwLm1vbml0b3IuaW50ZXJuYWwudmlldy5JVmlld2VyTWFuYWdlciNzZXRSZXF1ZXN0Vmlld2VyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVxdWVzdFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiB2aWV3ZXIuZXF1YWxzKHJlcXVlc3RWaWV3ZXIpKQotCQkJcmV0dXJuOwotCQkKLQkJLy8gY2FsbCBzZXQgcmVxdWVzdCB0byBzYXZlIGFuZCByZXNldCB0aGUgcmVxdWVzdAotCQlzZXRSZXF1ZXN0KHJlcXVlc3QpOwotCQlyZXFWaWV3ZXIuZGlzcG9zZSgpOwotCQkKLQkJcmVxdWVzdFZpZXdlciA9IHZpZXdlcjsKLQkJaWYgKHZpZXdlciAhPSBudWxsKXsKLQkJCXJlcVZpZXdlciA9IHZpZXdlci5jcmVhdGVWaWV3ZXIoKTsKLQkJCXJlcVZpZXdlci5zZXRFbmNvZGluZ3Modmlld2VyLmdldEVuY29kaW5ncygpKTsKLQkJfQotCQllbHNlCi0JCQlyZXFWaWV3ZXIgPSBudWxsOwotCQlpZiAocmVxVmlld2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlyZXFWaWV3ZXIuaW5pdChyZXFDb21wKTsKLQkJLy9yZXFWaWV3ZXIuc2V0UmVxdWVzdFJlc3BvbnNlKHJyKTsKLQkJYnl0ZVtdIGIgPSBudWxsOwotCQlpZiAocmVxdWVzdCAhPSBudWxsKSB7Ci0JCQliID0gZmlsdGVyKHJlcXVlc3QuZ2V0UmVxdWVzdChSZXF1ZXN0LkNPTlRFTlQpKTsKLQkJCS8vIHNldCB0aGUgZWRpdG9yIHRvIGVkaXRhYmxlIGlmIHRoZSByZXF1ZXN0IGhhc24ndCBiZWVuIHNlbnQgYW5kIHRoZQotCQkJLy8gZWRpdG9yIGNhbiBiZSBzZXQgYXMgZWRpdGFibGUKLQkJCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVzZW5kSFRUUFJlcXVlc3QgJiYgcmVxdWVzdC5nZXRSZXNwb25zZShSZXF1ZXN0LlRSQU5TUE9SVCkgPT0gbnVsbCkgewotCQkJCXJlcVZpZXdlci5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVxVmlld2VyLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCX0KLQkJfQotCQlyZXFWaWV3ZXIuc2V0Q29udGVudChiKTsKLQkJcmVxQ29tcC5sYXlvdXQodHJ1ZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGNwaXAubW9uaXRvci5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI3NldFJlc3BvbnNlVmlld2VyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzcG9uc2VWaWV3ZXIoVmlld2VyIHZpZXdlcikgewotCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyLmVxdWFscyhyZXNwb25zZVZpZXdlcikpCi0JCQlyZXR1cm47Ci0JCXJlc3BWaWV3ZXIuZGlzcG9zZSgpOwotCQkKLQkJcmVzcG9uc2VWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWlmICh2aWV3ZXIgIT0gbnVsbCl7Ci0JCQlyZXNwVmlld2VyID0gdmlld2VyLmNyZWF0ZVZpZXdlcigpOwotCQkJcmVzcFZpZXdlci5zZXRFbmNvZGluZ3Modmlld2VyLmdldEVuY29kaW5ncygpKTsKLQkJfQotCQllbHNlCi0JCQlyZXNwVmlld2VyID0gbnVsbDsKLQkJaWYgKHJlc3BWaWV3ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCXJlc3BWaWV3ZXIuaW5pdChyZXNwQ29tcCk7Ci0JCS8vcmVzcFZpZXdlci5zZXRSZXF1ZXN0UmVzcG9uc2UocnIpOwotCQlieXRlW10gYiA9IG51bGw7Ci0JCWlmIChyZXF1ZXN0ICE9IG51bGwpCi0JCQliID0gZmlsdGVyKHJlcXVlc3QuZ2V0UmVzcG9uc2UoUmVxdWVzdC5DT05URU5UKSk7Ci0JCXJlc3BWaWV3ZXIuc2V0Q29udGVudChiKTsKLQkJcmVzcENvbXAubGF5b3V0KHRydWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXcuSVZpZXdlck1hbmFnZXIjZ2V0Q3VycmVudFJlcXVlc3RWaWV3ZXIoKQotCSAqLwotCXB1YmxpYyBDb250ZW50Vmlld2VyIGdldEN1cnJlbnRSZXF1ZXN0Vmlld2VyKCkgewotCQlyZXR1cm4gcmVxVmlld2VyOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXcuSVZpZXdlck1hbmFnZXIjZ2V0Q3VycmVudFJlcXVlc3RIZWFkZXJWaWV3ZXIoKQotCSAqLwotCXB1YmxpYyBIZWFkZXJWaWV3ZXIgZ2V0Q3VycmVudFJlcXVlc3RIZWFkZXJWaWV3ZXIoKSB7Ci0JCXJldHVybiByZXFIZWFkZXI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvQnJvd3NlclZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9Ccm93c2VyVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViN2EzNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9Ccm93c2VyVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRWaWV3ZXI7Ci0vKioKLSAqIEEgYnJvd3NlciB2aWV3ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBCcm93c2VyVmlld2VyIGV4dGVuZHMgQ29udGVudFZpZXdlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIENSID0gJ1xyJzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgTEYgPSAnXG4nOwotCi0JcHJvdGVjdGVkIEJyb3dzZXIgYnJvd3NlcjsKLQotCXByb3RlY3RlZCBieXRlW10gY29udGVudDsKLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBDb250ZW50Vmlld2VyI2luaXQoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlicm93c2VyID0gbmV3IEJyb3dzZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIuYWRkTGlzdGVuZXIoU1dULk1lbnVEZXRlY3QsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNzZXRDb250ZW50KGJ5dGVbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KGJ5dGVbXSBiKSB7Ci0JCWNvbnRlbnQgPSBiOwotCQlpZiAoYiA9PSBudWxsIHx8IGIubGVuZ3RoID09IDApIHsKLQkJCWJyb3dzZXIuc2V0VGV4dChNZXNzYWdlcy5odG1sVmlld0ludmFsaWQpOwotCQl9IGVsc2UgewotCQkJYiA9IE1vbml0b3JVSVBsdWdpbi51bnppcChiKTsKLQkJCQotCQkJaW50IHRyaW1Gcm9udCA9IDA7Ci0JCQlpbnQgdHJpbUJhY2sgPSAwOwotCQkJaW50IGxlbiA9IGIubGVuZ3RoIC0gMTsKLQkJCXdoaWxlICh0cmltRnJvbnQgPCBiLmxlbmd0aCAmJiAoYlt0cmltRnJvbnRdID09IENSIHx8IGJbdHJpbUZyb250XSA9PSBMRikpCi0JCQkJdHJpbUZyb250Kys7Ci0JCQl3aGlsZSAodHJpbUJhY2sgPCBiLmxlbmd0aCAmJiBiLmxlbmd0aCA+IDAgJiYgKGJbbGVuIC0gdHJpbUJhY2tdID09IENSIHx8IGJbbGVuIC0gdHJpbUJhY2tdID09IExGKSkKLQkJCQl0cmltQmFjaysrOwotCQkJCi0JCQlpZiAodHJpbUZyb250ICsgdHJpbUJhY2sgPiAwKSB7Ci0JCQkJaWYgKHRyaW1Gcm9udCArIHRyaW1CYWNrID4gYi5sZW5ndGgpIHsKLQkJCQkJYiA9IG5ldyBieXRlWzBdOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJ5dGVbXSB0ZW1wID0gYjsKLQkJCQkJYiA9IG5ldyBieXRlW3RlbXAubGVuZ3RoIC0gdHJpbUJhY2sgLSB0cmltRnJvbnRdOwotCQkJCQlmb3IgKGludCBpID0gdHJpbUZyb250OyBpIDwgdGVtcC5sZW5ndGggLSB0cmltQmFjazsgaSsrKSB7Ci0JCQkJCQliW2kgLSB0cmltRnJvbnRdID0gdGVtcFtpXTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWJyb3dzZXIuc2V0VGV4dChuZXcgU3RyaW5nKGIpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgQ29udGVudFZpZXdlciNnZXRDb250ZW50KCkKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBDb250ZW50Vmlld2VyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWJyb3dzZXIuZGlzcG9zZSgpOwotCQlicm93c2VyID0gbnVsbDsKLQkJY29udGVudCA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9CeXRlVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0J5dGVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2MWNjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0J5dGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLkNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRWaWV3ZXI7Ci0vKioKLSAqIEEgYmFzaWMgYnl0ZSB2aWV3ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBCeXRlVmlld2VyIGV4dGVuZHMgQ29udGVudFZpZXdlciB7Ci0JcHJvdGVjdGVkIFRleHQgdGV4dDsKLQlwcm90ZWN0ZWQgTGFiZWwgZW5jb2RpbmdMYWJlbDsKLQlwcm90ZWN0ZWQgQ29tYm8gZW5jb2RpbmdDb21ibzsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ5dGVWaWV3ZXJCb2R5Q29tcG9zaXRlOwotCXByb3RlY3RlZCBTdHJpbmcgZW5jb2RpbmdUeXBlID0gbnVsbDsKLQkKLQkvLyBDYWNoZSB0aGUgY29udGVudCBpbiBvcmRlciB0byBlbmNvZGUgdGhlIGNvbnRlbnQgd2hlbiB0aGUgdXNlciBjaGFuZ2VzCi0JLy8gdGhlIGNvbnRlbnQKLQlwcm90ZWN0ZWQgYnl0ZVtdIGNvbnRlbnRBcnJheTsKLQkKLQkvLyBjb3BpZWQgZnJvbSBNb25pdG9yVUkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGluZVNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZW5jb2RpbmdzID0gbnVsbDsKLQkKLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNpbml0KENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KENvbXBvc2l0ZSBwYXJlbnQpIHsJCQotCQlieXRlVmlld2VyQm9keUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIAotCQkJCXwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCAKLQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkKLQkJYnl0ZVZpZXdlckJvZHlDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsJCQotCQlieXRlVmlld2VyQm9keUNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCWVuY29kaW5nTGFiZWwgPSBuZXcgTGFiZWwoYnl0ZVZpZXdlckJvZHlDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQkKLQkJZW5jb2RpbmdMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdFbmNvZGluZywiIikpOwotCQllbmNvZGluZ0NvbWJvID0gbmV3IENvbWJvKGJ5dGVWaWV3ZXJCb2R5Q29tcG9zaXRlLCBTV1QuUklHSFQpOwotCQkKLQkJLy8gQWRkIHRoZSBkZWZhdWx0IG9wdGlvbgotCQllbmNvZGluZ0NvbWJvLmFkZChOTFMuYmluZChNZXNzYWdlcy5kZWZhdWx0RW5jb2RpbmdPcHRpb24sIiIpKTsKLQkJLy8gU2VsZWN0IHRoZSBkZWZhdWx0IG9wdGlvbgotCQllbmNvZGluZ0NvbWJvLnNlbGVjdCgwKTsKLQkJCi0JCWlmIChlbmNvZGluZ3MgIT0gbnVsbCl7Ci0JCQlpbnQgc2l6ZSA9IGVuY29kaW5ncy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpPTA7aTxzaXplO2krKyl7Ci0JCQkJZW5jb2RpbmdDb21iby5hZGQoZW5jb2RpbmdzW2ldKTsKLQkJCX0KLQkJfQotCQkKLQkJZW5jb2RpbmdDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgbWUpIHsKLQkJCQllbmNvZGluZ1R5cGUgPSBlbmNvZGluZ0NvbWJvLmdldFRleHQoKTsJCQkJCi0JCQkJaWYgKGNvbnRlbnRBcnJheSAhPSBudWxsKXsKLQkJCQkJc2V0Q29udGVudChjb250ZW50QXJyYXkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9KTsKLQkJCi0JCXRleHQgPSBuZXcgVGV4dChieXRlVmlld2VyQm9keUNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBieXRlVmlld2VyQm9keUNvbXBvc2l0ZS5nZXREaXNwbGF5KCk7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGV4dC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkpOwotCQl0ZXh0LnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKSk7Ci0JCXRleHQuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRUZXh0Rm9udCgpKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0ZXh0LCBDb250ZXh0SWRzLlZJRVdfUkVTUE9OU0UpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBDb250ZW50Vmlld2VyI3NldEVkaXRhYmxlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSkgewotCQl0ZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNnZXRDb250ZW50KCkKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldENvbnRlbnQoKSB7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IGJ5dGVbMF07Ci0JCQotCQlTdHJpbmcgY29udGVudCA9IHRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJaWYgKGNvbnRlbnQuZXF1YWxzKCIiKSkKLQkJCXJldHVybiBuZXcgYnl0ZVswXTsKLQkJCi0JCS8vIE5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlcmUgaXMgYSBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGNvbnRlbnQKLQkJLy8gZ2V0Qnl0ZXMoKSByZW1vdmVzIHRoZSBuZXdsaW5lCi0JCWJ5dGVbXSB0d29OZXdsaW5lcyA9IG5ldyBieXRlW10geyAnXDAxNScsICdcMDEyJyB9OwotCQlieXRlW10gY29udGVudEJ5dGVzID0gY29udGVudC5nZXRCeXRlcygpOwotCQlieXRlW10gcmV0Qnl0ZXMgPSBuZXcgYnl0ZVtjb250ZW50Qnl0ZXMubGVuZ3RoICsgMl07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY29udGVudEJ5dGVzLCAwLCByZXRCeXRlcywgMCwgY29udGVudEJ5dGVzLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkodHdvTmV3bGluZXMsIDAsIHJldEJ5dGVzLCBjb250ZW50Qnl0ZXMubGVuZ3RoLCAyKTsKLQkJcmV0dXJuIHJldEJ5dGVzOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBDb250ZW50Vmlld2VyI3NldENvbnRlbnQoYnl0ZVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoYnl0ZVtdIGIpIHsKLQkJU3RyaW5nIG91dCA9ICIiOwotCQlpZiAoYiAhPSBudWxsKSB7Ci0JCQljb250ZW50QXJyYXkgPSBiOwotCQkJYiA9IE1vbml0b3JVSVBsdWdpbi51bnppcChiKTsKLQkJCW91dCA9IHBhcnNlRW5jb2RlZChiKTsKLQkJfQotCQkKLQkJaW50IGxzID0gbGluZVNlcGFyYXRvci5sZW5ndGgoKTsKLQkJaWYgKG91dC5sZW5ndGgoKSA+IGxzKSB7Ci0JCQl3aGlsZSAob3V0LnN1YnN0cmluZygwLCBscykuaW5kZXhPZihsaW5lU2VwYXJhdG9yKSA+PSAwKQotCQkJCW91dCA9IG91dC5zdWJzdHJpbmcobHMsIG91dC5sZW5ndGgoKSk7IAotCQl9Ci0JCQotCQl0ZXh0LnNldFRleHQob3V0KTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHBhcnNlIHRoZSBnaXZlbiBieXRlcyBpbnRvIFN0cmluZyBmb3JtLiBUaGUgYnl0ZXMKLQkgKiBhcmUgcGFyc2VkIGludG8gYSBsaW5lIGRlbGltaXRlZCBzdHJpbmcuIFRoZSBieXRlIGFycmF5IG11c3Qgbm90IGJlIG51bGwuCi0JICogCi0JICogQHBhcmFtIGIgYSBieXRlIGFycmF5Ci0JICogQHJldHVybiB0aGUgc3RyaW5nIGFmdGVyIHRoZSBjb252ZXJzaW9uCi0JICovCi0JcHVibGljIFN0cmluZyBwYXJzZUVuY29kZWQoYnl0ZVtdIGIpIHsKLQkJaWYgKGIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGJpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiKTsKLQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBudWxsOwotCQlpZiAoZW5jb2RpbmdUeXBlICE9IG51bGwpewotCQkJdHJ5IHsKLQkJCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoYmluLGVuY29kaW5nVHlwZSkpOwotCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAKLQkJCQkJCQkiQW4gdW5zdXBwb3J0ZWQgZW5jb2RpbmcgZXhjZXB0aW9uIHdoZW4gdXNpbmcgZW5jb2RpbmdUeXBlPSIKLQkJCQkJCQkrIGVuY29kaW5nVHlwZSwgZSk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIElmIGl0IGlzIHVuc3VwcG9ydGVkLCB1c2UgZGVmYXVsdC4gTm8gcHJvbXB0IGlzIGdpdmVuIHRvIHRoZSB1c2VyCi0JCQkJYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGJpbikpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGJpbikpOwotCQl9Ci0JCQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcyA9IGJyLnJlYWRMaW5lKCk7Ci0JCQkKLQkJCXdoaWxlIChzICE9IG51bGwpIHsKLQkJCQlzYi5hcHBlbmQocyk7Ci0JCQkJcyA9IGJyLnJlYWRMaW5lKCk7Ci0JCQkJaWYgKHMgIT0gbnVsbCkKLQkJCQkJc2IuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBwYXJzaW5nIGlucHV0IiwgZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0JCi0JCi0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJdGV4dCA9IG51bGw7Ci0JCQotCQllbmNvZGluZ0NvbWJvLmRpc3Bvc2UoKTsKLQkJZW5jb2RpbmdDb21ibyA9IG51bGw7Ci0JCQotCQllbmNvZGluZ0xhYmVsLmRpc3Bvc2UoKTsKLQkJZW5jb2RpbmdMYWJlbCA9IG51bGw7Ci0JCQotCQlieXRlVmlld2VyQm9keUNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCWJ5dGVWaWV3ZXJCb2R5Q29tcG9zaXRlID0gbnVsbDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIFNldHMgdGhlIGVuY29kaW5ncyB0byBzaG93IGluIHRoZSBlbmNvZGluZ3MgY29tYm8gYm94Ci0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmdzKFN0cmluZ1tdIHN0cil7Ci0JCXRoaXMuZW5jb2RpbmdzID0gc3RyOwotCX0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0hlYWRlclZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9IZWFkZXJWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM0ZjRjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0hlYWRlclZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLkNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLmN1c3RvbS5Nb25pdG9yU3RhY2tMYXlvdXQ7Ci0vKioKLSAqIEFuIHRyYW5zcG9ydCAoaGVhZGVyKSB2aWV3ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWFkZXJWaWV3ZXIgewotCXByb3RlY3RlZCBib29sZWFuIGRpc3BsYXlIZWFkZXI7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGhlYWRlckNvbXA7Ci0JcHJvdGVjdGVkIE1vbml0b3JTdGFja0xheW91dCBsYXlvdXQ7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgaGVhZGVyTGFiZWw7Ci0JcHJvdGVjdGVkIFRleHQgaGVhZGVyVGV4dDsKLQlwcm90ZWN0ZWQgUmVxdWVzdCBycjsKLQlwcm90ZWN0ZWQgYnl0ZSBtc2c7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoaWRkZW47Ci0KLQkvKioKLQkgKiBSZXF1ZXN0IGhlYWRlciBjb25zdGFudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGUgUkVRVUVTVF9IRUFERVIgPSAwOwotCQotCS8qKgotCSAqIFJlc3BvbnNlIGhlYWRlciBjb25zdGFudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGUgUkVTUE9OU0VfSEVBREVSID0gMTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBoZWFkZXIgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqLwotCXB1YmxpYyBIZWFkZXJWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgYnl0ZSBtZXNzYWdlKSB7Ci0JCWRpc3BsYXlIZWFkZXIgPSB0cnVlOwotCQloaWRkZW4gPSBmYWxzZTsKLQkJCi0JCWhlYWRlckNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgTW9uaXRvclN0YWNrTGF5b3V0KCk7Ci0JCWhlYWRlckNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQloZWFkZXJUZXh0ID0gbmV3IFRleHQoaGVhZGVyQ29tcCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBoZWFkZXJDb21wLmdldERpc3BsYXkoKTsKLQkJaGVhZGVyVGV4dC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkpOwotCQloZWFkZXJUZXh0LnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKSk7Ci0JCWhlYWRlclRleHQuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRUZXh0Rm9udCgpKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChoZWFkZXJUZXh0LCBDb250ZXh0SWRzLlZJRVdfUkVTUE9OU0UpOwotCQkKLQkJaGVhZGVyTGFiZWwgPSBuZXcgTGFiZWwoaGVhZGVyQ29tcCwgU1dULk5PTkUpOwotCQkKLQkJbGF5b3V0LnRvcENvbnRyb2wgPSBoZWFkZXJUZXh0OwotCQkKLQkJcnIgPSBudWxsOwotCQltc2cgPSBtZXNzYWdlOwotCi0JCXNldERpc3BsYXlIZWFkZXIoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmVxdWVzdFJlc3BvbnNlKFJlcXVlc3QgcmVxdWVzdCkgewotCQlyciA9IHJlcXVlc3Q7Ci0JCWlmICghaGlkZGVuKQotCQkJZ2V0VmlldygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheUhlYWRlcihib29sZWFuIGIpIHsKLQkJaWYgKGRpc3BsYXlIZWFkZXIgIT0gYikgewotCQkJZGlzcGxheUhlYWRlciA9IGI7Ci0JCQkKLQkJCWlmIChkaXNwbGF5SGVhZGVyKQotCQkJCWxheW91dC50b3BDb250cm9sID0gaGVhZGVyVGV4dDsKLQkJCWVsc2UKLQkJCQlsYXlvdXQudG9wQ29udHJvbCA9IGhlYWRlckxhYmVsOwotCQkJCi0JCQloZWFkZXJDb21wLmxheW91dCh0cnVlKTsKLQkJCWdldFZpZXcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRWaWV3KCkgewotCQlTdHJpbmcgb3V0ID0gIiI7Ci0JCWlmIChyciAhPSBudWxsKSB7Ci0JCQlpZiAobXNnID09IFJFUVVFU1RfSEVBREVSKSB7Ci0JCQkJYnl0ZVtdIGIgPSByci5nZXRSZXF1ZXN0KFJlcXVlc3QuVFJBTlNQT1JUKTsKLQkJCQlpZiAoYiAhPSBudWxsKQotCQkJCQlvdXQgPSBNb25pdG9yVUlQbHVnaW4ucGFyc2UoYik7Ci0JCQl9IGVsc2UgaWYgKG1zZyA9PSBSRVNQT05TRV9IRUFERVIpIHsKLQkJCQlieXRlW10gYiA9IHJyLmdldFJlc3BvbnNlKFJlcXVlc3QuVFJBTlNQT1JUKTsKLQkJCQlpZiAoYiAhPSBudWxsKQotCQkJCQlvdXQgPSBNb25pdG9yVUlQbHVnaW4ucGFyc2UoYik7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChkaXNwbGF5SGVhZGVyKQotCQkJaGVhZGVyVGV4dC5zZXRUZXh0KG91dCk7Ci0JCWVsc2UgewotCQkJU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0JCQlpbnQgaW5kZXggPSBvdXQuaW5kZXhPZihsaW5lU2VwYXJhdG9yKTsKLQkJCWlmIChpbmRleCA+IDApCi0JCQkJaGVhZGVyTGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy5oZWFkZXJMYWJlbCwgb3V0LnN1YnN0cmluZygwLCBpbmRleCkpKTsKLQkJCWVsc2UgCi0JCQkJaGVhZGVyTGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy5oZWFkZXJMYWJlbCwgb3V0KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIHRoZSBoZWFkZXIuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaGVhZGVyQ29tcC5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgdGhlIGhlYWRlciBjYW4gYmUgZWRpdGVkLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0YWJsZSBJZiB0cnVlIHRoZSBoZWFkZXIgY2FuIGJlIGVkaXRlZCwgb3RoZXJ3aXNlIHRoZSBoZWFkZXIgY2Fubm90IGJlIGVkaXRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWhlYWRlclRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY29udGVudCBmcm9tIHRoZSBoZWFkZXIuCi0JICogCi0JICogQHJldHVybiBUaGUgY29udGVudCBmcm9tIHRoZSBoZWFkZXIuCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRDb250ZW50KCkgewotCQlpZiAoaGVhZGVyVGV4dCA9PSBudWxsIHx8IGhlYWRlclRleHQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlTdHJpbmcgaGVhZGVyID0gaGVhZGVyVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCQkvLyBOZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBmb2xsb3dpbmcgNCBieXRlcyBlbmQgdGhlIGhlYWRlci4gVGhlIGdldEJ5dGVzKCkKLQkJLy8gbWV0aG9kIHJlbW92ZXMgc3BhY2VzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KLQkJYnl0ZVtdIHR3b05ld2xpbmVzID0gbmV3IGJ5dGVbXSB7ICdcMDE1JywgJ1wwMTInLCAnXDAxNScsICdcMDEyJyB9OwotCQlieXRlW10gaGVhZGVyQnl0ZXMgPSBoZWFkZXIuZ2V0Qnl0ZXMoKTsKLQkJYnl0ZVtdIHJldEJ5dGVzID0gbmV3IGJ5dGVbaGVhZGVyQnl0ZXMubGVuZ3RoICsgNF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoaGVhZGVyQnl0ZXMsIDAsIHJldEJ5dGVzLCAwLCBoZWFkZXJCeXRlcy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHR3b05ld2xpbmVzLCAwLCByZXRCeXRlcywgaGVhZGVyQnl0ZXMubGVuZ3RoLCA0KTsKLQkJcmV0dXJuIHJldEJ5dGVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0ltYWdlVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0ltYWdlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZDRkYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9JbWFnZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRWaWV3ZXI7Ci0vKioKLSAqIEFuIGltYWdlIHZpZXdlci4KLSAqLwotcHVibGljIGNsYXNzIEltYWdlVmlld2VyIGV4dGVuZHMgQ29udGVudFZpZXdlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIENSID0gJ1xyJzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgTEYgPSAnXG4nOwotCi0JcHJvdGVjdGVkIFNjcm9sbGVkQ29tcG9zaXRlIHNjcm9sbDsKLQlwcm90ZWN0ZWQgTGFiZWwgbWVzc2FnZUxhYmVsOwotCi0JcHJvdGVjdGVkIGJ5dGVbXSBjb250ZW50OwotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjaW5pdChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXNjcm9sbCA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCW1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChzY3JvbGwsIFNXVC5OT05FKTsKLQkJbWVzc2FnZUxhYmVsLnNldFRleHQoTWVzc2FnZXMuaW1hZ2VWaWV3SW52YWxpZCk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQltZXNzYWdlTGFiZWwuc2V0U2l6ZShtZXNzYWdlTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0JCXNjcm9sbC5zZXRDb250ZW50KG1lc3NhZ2VMYWJlbCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjc2V0Q29udGVudChieXRlW10pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChieXRlW10gYikgewotCQljb250ZW50ID0gYjsKLQkJaWYgKGIgPT0gbnVsbCB8fCBiLmxlbmd0aCA9PSAwKSB7Ci0JCQltZXNzYWdlTGFiZWwuc2V0SW1hZ2UobnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQliID0gTW9uaXRvclVJUGx1Z2luLnVuemlwKGIpOwotCQkJCi0JCQlpbnQgdHJpbUZyb250ID0gMDsKLQkJCWludCB0cmltQmFjayA9IDA7Ci0JCQlpbnQgbGVuID0gYi5sZW5ndGggLSAxOwotCQkJd2hpbGUgKHRyaW1Gcm9udCA8IGIubGVuZ3RoICYmIGJbdHJpbUZyb250XSA9PSBDUiB8fCBiW3RyaW1Gcm9udF0gPT0gTEYpCi0JCQkJdHJpbUZyb250Kys7Ci0JCQl3aGlsZSAodHJpbUJhY2sgPCBiLmxlbmd0aCAmJiBiW2xlbiAtIHRyaW1CYWNrXSA9PSBDUiB8fCBiW2xlbiAtIHRyaW1CYWNrXSA9PSBMRikKLQkJCQl0cmltQmFjaysrOwotCQkJCi0JCQlpZiAodHJpbUZyb250ICsgdHJpbUJhY2sgPiAwKSB7Ci0JCQkJaWYgKHRyaW1Gcm9udCArIHRyaW1CYWNrID4gYi5sZW5ndGgpIHsKLQkJCQkJYiA9IG5ldyBieXRlWzBdOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJ5dGVbXSB0ZW1wID0gYjsKLQkJCQkJYiA9IG5ldyBieXRlW3RlbXAubGVuZ3RoIC0gdHJpbUJhY2sgLSB0cmltRnJvbnRdOwotCQkJCQlmb3IgKGludCBpID0gdHJpbUZyb250OyBpIDwgdGVtcC5sZW5ndGggLSB0cmltQmFjazsgaSsrKSB7Ci0JCQkJCQliW2kgLSB0cmltRnJvbnRdID0gdGVtcFtpXTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJdHJ5IHsKLQkJCQlJbWFnZURhdGEgaW1nRCA9IG5ldyBJbWFnZURhdGEobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIpKTsKLQkJCQlJbWFnZSBpbWcgPSBuZXcgSW1hZ2UobnVsbCwgaW1nRCk7Ci0JCQkJbWVzc2FnZUxhYmVsLnNldEltYWdlKGltZyk7Ci0JCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJbWVzc2FnZUxhYmVsLnNldEltYWdlKG51bGwpOwotCQkJCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmltYWdlVmlld0ludmFsaWQpOwotCQkJfQotCQl9Ci0JCQotCQltZXNzYWdlTGFiZWwuc2V0U2l6ZShtZXNzYWdlTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb250ZW50Vmlld2VyI2dldENvbnRlbnQoKQotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc2Nyb2xsLmRpc3Bvc2UoKTsKLQkJc2Nyb2xsID0gbnVsbDsKLQkJbWVzc2FnZUxhYmVsID0gbnVsbDsKLQkJY29udGVudCA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9YTUxWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvWE1MVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMTdmZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9YTUxWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIDIwMDUtMTEtMjUgQXJ0aHVyIFJ5bWFuLCByeW1hbkBjYS5pYm0uY29tCi0gKiAgICAgLSBmaXhlZCBidWcgMTE4MTAyOiBzZXQgeG1sVGFnTWlzc2luZyBjb3JyZWN0bHkgZWFjaCB0aW1lIHNldENvbnRlbnQoKSBpcyBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzOwotIAotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLkNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRWaWV3ZXI7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci0vKioKLSAqIFhNTCBWaWV3ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWaWV3ZXIgZXh0ZW5kcyBDb250ZW50Vmlld2VyIHsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHZpZXdlckNvbXA7Ci0JcHJvdGVjdGVkIFN0YWNrTGF5b3V0IGxheW91dDsKLQlwcm90ZWN0ZWQgVGV4dCBtZXNzYWdlVGV4dDsKLQlwcm90ZWN0ZWQgTGFiZWwgbWVzc2FnZUxhYmVsOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4geG1sVGFnTWlzc2luZyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIHNldEVuY29kaW5nID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbWlzc2luZ0VuY29kaW5nID0gZmFsc2U7Ci0JcHJvdGVjdGVkIFN0cmluZyBvcmlnaW5hbEVuY29kaW5nOwotCi0JcHJvdGVjdGVkIGJ5dGVbXSBjb250ZW50OwotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjc2V0Q29udGVudChieXRlW10pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChieXRlW10gYikgewotCQljb250ZW50ID0gYjsKLQkJU3RyaW5nIG91dCA9ICIiOwkKLQkJaWYgKGIgIT0gbnVsbCkgewotCQkJYiA9IE1vbml0b3JVSVBsdWdpbi51bnppcChiKTsKLQkJCW91dCA9IE1vbml0b3JVSVBsdWdpbi5wYXJzZShiKTsKLQkJfQotCQkKLQkJU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0JCWludCBscyA9IGxpbmVTZXBhcmF0b3IubGVuZ3RoKCk7Ci0JCWlmIChvdXQubGVuZ3RoKCkgPiBscykgewotCQkJd2hpbGUgKG91dC5zdWJzdHJpbmcoMCwgbHMpLmluZGV4T2YobGluZVNlcGFyYXRvcikgPj0gMCkKLQkJCW91dCA9IG91dC5zdWJzdHJpbmcobHMsIG91dC5sZW5ndGgoKSk7Ci0JCX0KLQkJCi0JCVN0cmluZyBvdXRfdGVtcCA9IG91dC50b0xvd2VyQ2FzZSgpOwotCQl4bWxUYWdNaXNzaW5nID0gIW91dF90ZW1wLnN0YXJ0c1dpdGgoIjw/eG1sIik7Ci0JCQotCQlpZiAob3V0Lmxlbmd0aCgpID4gMCkgewotCQkJU3RyaW5nIGZpbmFsTXNnID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJYnl0ZVtdIGIxID0gY3JlYXRlRG9jdW1lbnQob3V0KTsKLQkJCQlmaW5hbE1zZyA9IG5ldyBTdHJpbmcoYjEpLnRyaW0oKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gY2FzZTogZXJyb3IgcGFyc2luZwotCQkJCW1lc3NhZ2VUZXh0LnNldFZpc2libGUoZmFsc2UpOwotCQkJCWxheW91dC50b3BDb250cm9sID0gbWVzc2FnZUxhYmVsOwotCQkJCW1lc3NhZ2VMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnhtbFZpZXdJbnZhbGlkKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoeG1sVGFnTWlzc2luZyAmJiAoZmluYWxNc2cudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiPz4iKQotCQkJCQkJCXx8IGZpbmFsTXNnLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIiBzdGFuZGFsb25lPVwibm9cIj8+IikgCi0JCQkJCQkJfHwgZmluYWxNc2cudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiIHN0YW5kYWxvbmU9XCJ5ZXNcIj8+IikpKSB7Ci0JCQkJaW50IHggPSBmaW5hbE1zZy5pbmRleE9mKCI+IikgKyAxOwotCQkJCS8vcmVtb3ZlIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0JCQkJU3RyaW5nIE1zZyA9IGZpbmFsTXNnLnN1YnN0cmluZyh4KTsKLQkJCQkvL3JlbW92ZSBzdGFydGluZyBuZXdsaW5lcwotCQkJCXdoaWxlIChNc2cuc3Vic3RyaW5nKDAsIGxzKS5pbmRleE9mKGxpbmVTZXBhcmF0b3IpID49IDApewotCQkJCQlNc2cgPSBNc2cuc3Vic3RyaW5nKGxzLCBNc2cubGVuZ3RoKCkpOwotCQkJCX0KLQkJCQlmaW5hbE1zZyA9IE1zZzsKLQkJCQkKLQkJCQltZXNzYWdlVGV4dC5zZXRUZXh0KGZpbmFsTXNnKTsKLQkJCX0gZWxzZSBpZiAoc2V0RW5jb2RpbmcpIHsKLQkJCQkvLyBjaGFuZ2UgYmFjayB0byBvcmlnaW5hbCBlbmNvZGluZwotCQkJCWludCBiZWdpbiA9IGZpbmFsTXNnLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigidXRmLTgiKTsgLy8gbG9jYXRpb24gb2Ygb3BlbmluZyAiCi0JCQkJaWYgKGJlZ2luID49IDApIHsKLQkJCQkJaW50IGxhc3QgPSBiZWdpbiArIDU7ICAvLyBsb2NhdGlvbiBvZiBjbG9zaW5nICIKLQkJCQkJU3RyaW5nIGZpcnN0X2hhbGYgPSBmaW5hbE1zZy5zdWJzdHJpbmcoMCxiZWdpbik7Ci0JCQkJCVN0cmluZyBzZWNvbmRfaGFsZiA9IGZpbmFsTXNnLnN1YnN0cmluZyhsYXN0KTsKLQkJCQkJZmluYWxNc2cgPSBmaXJzdF9oYWxmICsgb3JpZ2luYWxFbmNvZGluZyArIHNlY29uZF9oYWxmOwotCQkJCX0KLQkJCQkKLQkJCQltZXNzYWdlVGV4dC5zZXRUZXh0KGZpbmFsTXNnKTsKLQkJCX0gZWxzZSBpZiAobWlzc2luZ0VuY29kaW5nKSB7Ci0JCQkJLy8gcmVtb3ZlIGVuY29kaW5nIGNvbXBsZXRlbHkKLQkJCQlpbnQgYmVnaW4gPSBmaW5hbE1zZy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVuY29kaW5nPVwidXRmLThcIiIpOyAvL2xvY2F0aW9uIG9mIG9wZW5pbmcgIgotCQkJCWludCBsYXN0ID0gYmVnaW4gKyAxNjsgIC8vbG9jYXRpb24gb2YgY2xvc2luZyAiCi0JCQkJU3RyaW5nIGZpcnN0X2hhbGYgPSBmaW5hbE1zZy5zdWJzdHJpbmcoMCxiZWdpbik7Ci0JCQkJU3RyaW5nIHNlY29uZF9oYWxmID0gZmluYWxNc2cuc3Vic3RyaW5nKGxhc3QpOwotCQkJCWZpbmFsTXNnID0gZmlyc3RfaGFsZiArIHNlY29uZF9oYWxmOwotCQkJCQotCQkJCW1lc3NhZ2VUZXh0LnNldFRleHQoZmluYWxNc2cpOwkKLQkJCX0gZWxzZQotCQkJCW1lc3NhZ2VUZXh0LnNldFRleHQoZmluYWxNc2cpOwotCQl9IGVsc2UKLQkJCW1lc3NhZ2VUZXh0LnNldFRleHQob3V0KTsKLQkJCi0JCW1lc3NhZ2VMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJbGF5b3V0LnRvcENvbnRyb2wgPSBtZXNzYWdlVGV4dDsKLQkJbWVzc2FnZVRleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjZ2V0Q29udGVudCgpCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNpbml0KENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdmlld2VyQ29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBTdGFja0xheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJdmlld2VyQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCW1lc3NhZ2VUZXh0ID0gbmV3IFRleHQodmlld2VyQ29tcCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlEaXNwbGF5IGRpc3BsYXkgPSB2aWV3ZXJDb21wLmdldERpc3BsYXkoKTsKLQkJbWVzc2FnZVRleHQuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpKTsKLQkJbWVzc2FnZVRleHQuc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpKTsKLQkJbWVzc2FnZVRleHQuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRUZXh0Rm9udCgpKTsKLQkJbWVzc2FnZVRleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChtZXNzYWdlVGV4dCwgQ29udGV4dElkcy5WSUVXX1JFU1BPTlNFKTsKLQkJCi0JCW1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbCh2aWV3ZXJDb21wLCBTV1QuTk9ORSk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCi0JCWxheW91dC50b3BDb250cm9sID0gbWVzc2FnZVRleHQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEAjY3JlYXRlRG9jdW1lbnQoU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBieXRlW10gY3JlYXRlRG9jdW1lbnQoU3RyaW5nIHN0cikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsJCi0JCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQl0cnkgewotCQkJCWZhY3Rvcnkuc2V0QXR0cmlidXRlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvYWxsb3ctamF2YS1lbmNvZGluZ3MiLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJZmFjdG9yeS5zZXRBdHRyaWJ1dGUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9jb250aW51ZS1hZnRlci1mYXRhbC1lcnJvciIsIG5ldyBCb29sZWFuKHRydWUpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQlEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCQotCQkJaWYgKHhtbFRhZ01pc3NpbmcpIHsKLQkJCQlzdHIgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IiArIHN0cjsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIHN0cl90ZW1wID0gc3RyLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCi0JCQkJLy8gaWYgZW5jb2RpbmcgcHJlc2VudCwgdGhlbiBzYXZlIG9yaWdpbmFsIGVuY29kaW5nIGFuZCBjaGFuZ2UgdG8gVVRGLTgKLQkJCQlpbnQgaW5kID0gc3RyX3RlbXAuaW5kZXhPZigiZW5jb2Rpbmc9Iik7Ci0JCQkJaWYgKGluZCA+PSAwKSB7Ci0JCQkJCVN0cmluZyB0ZW1wMSA9IHN0ci5zdWJzdHJpbmcoaW5kKTsKLQkJCQkJaW50IGJlZ2luSW5kZXggPSB0ZW1wMS5pbmRleE9mKCJcIiIpICsgMTsKLQkJCQkJU3RyaW5nIHRlbXAyID0gdGVtcDEuc3Vic3RyaW5nKGJlZ2luSW5kZXgpOwotCQkJCQlpbnQgZW5kSW5kZXggPSB0ZW1wMi5pbmRleE9mKCJcIiIpOwotCQkJCQlvcmlnaW5hbEVuY29kaW5nID0gdGVtcDIuc3Vic3RyaW5nKDAsIGVuZEluZGV4KTsKLQkJCQkJaWYgKCEidXRmLTgiLmVxdWFscyhvcmlnaW5hbEVuY29kaW5nKSkKLQkJCQkJCXNldEVuY29kaW5nID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKGluZCA8IDApIHsgLy9pZiBubyBlbmNvZGluZyBhdCBhbGwsdGhlbiBubyBjaGFuZ2VzIHRvIGJlIG1hZGUKLQkJCQkJc2V0RW5jb2RpbmcgPSBmYWxzZTsKLQkJCQkJbWlzc2luZ0VuY29kaW5nID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlieXRlW10gcGFyc2VBcnJheSA9IHN0ci5nZXRCeXRlcygpOwotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwYXJzZUFycmF5KSkpOwotCQkJcmV0dXJuIGdldENvbnRlbnRzKGRvY3VtZW50KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiSW52YWxpZCBYTUwiKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBieXRlW10gZ2V0Q29udGVudHMoRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG91dCk7Ci0JCVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvY3VtZW50KTsKLQkJdHJ5IHsKLQkJCVRyYW5zZm9ybWVyRmFjdG9yeSB0ZiA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJdHJ5IHsKLQkJCQl0Zi5zZXRBdHRyaWJ1dGUoImluZGVudC1udW1iZXIiLCBuZXcgSW50ZWdlcigyKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJLy8gaWdub3JlIC0gZmFpbHMgb24gSkRLIDEuNAotCQkJfQotCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0Zi5uZXdUcmFuc2Zvcm1lcigpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5TVEFOREFMT05FLCAibm8iKTsgLy8kTk9OLU5MUy0xJAotCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IChJT0V4Y2VwdGlvbikgKG5ldyBJT0V4Y2VwdGlvbigpLmluaXRDYXVzZShlKSk7Ci0JCX0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IChJT0V4Y2VwdGlvbikgKG5ldyBJT0V4Y2VwdGlvbigpLmluaXRDYXVzZShlKSk7Ci0JCX0KLQkJcmV0dXJuIG91dC50b0J5dGVBcnJheSgpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBDb250ZW50Vmlld2VyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXZpZXdlckNvbXAuZGlzcG9zZSgpOwotCQl2aWV3ZXJDb21wID0gbnVsbDsKLQkJY29udGVudCA9IG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTQ4NTc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1UQ1AvSVAgTW9uaXRvcgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLWV4dGVuc2lvblBvaW50Vmlld2Vycz1WaWV3ZXJzCi0KLXZpZXdUaXRsZT1UQ1AvSVAgTW9uaXRvcgotYWN0aW9uUmVzZW5kPVJlc2VuZCByZXF1ZXN0Ci1hY3Rpb25Nb2RpZnk9TW9kaWZ5IHJlcXVlc3QKLWFjdGlvbk1vZGlmeVJlc2VuZD1TZW5kIE1vZGlmaWVkIFJlcXVlc3QKLQotYnl0ZVZpZXc9Qnl0ZQotaW1hZ2VWaWV3PUltYWdlCi14bWxWaWV3PVhNTAotYnJvd3NlclZpZXc9V2ViIEJyb3dzZXIKLQotcHJlZmVyZW5jZVRpdGxlPVRDUC9JUCBNb25pdG9yCi1wcmVmZXJlbmNlS2V5d29yZHM9ZGVidWcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmODU0NzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0KLTxleHRlbnNpb24tcG9pbnQgbmFtZT0iJWV4dGVuc2lvblBvaW50Vmlld2VycyIgaWQ9InZpZXdlcnMiIHNjaGVtYT0ic2NoZW1hL3ZpZXdlcnMuZXhzZCIvPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsU3RhcnR1cCI+Ci0gIDxzdGFydHVwCi0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5TdGFydHVwIi8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPiAKLSAgPHZpZXcKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudmlldyIKLSAgICBuYW1lPSIldmlld1RpdGxlIgotICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aSIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldy5Nb25pdG9yVmlldyIKLSAgICBpY29uPSJpY29ucy9jdmlldzE2L21vbml0b3JWaWV3LmdpZiI+Ci0gIDwvdmlldz4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICA8cGFnZQotICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5wcmVmZXJlbmNlUGFnZSIKLSAgICBuYW1lPSIlcHJlZmVyZW5jZVRpdGxlIgotICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1ByZWZlcmVuY2VQYWdlIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yUHJlZmVyZW5jZVBhZ2UiPgotICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnByZWZlcmVuY2VLZXl3b3JkcyIvPgotICA8L3BhZ2U+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkua2V5d29yZHMiPgotICA8a2V5d29yZAotICAgIGxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzIgotICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5wcmVmZXJlbmNlS2V5d29yZHMiLz4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS52aWV3ZXJzIj4KLSAgPHZpZXdlcgotICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3ZXJzLmJ5dGUiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnMuQnl0ZVZpZXdlciIKLSAgICB0eXBlPSJyZXF1ZXN0cmVzcG9uc2UiCi0gICAgZW5jb2RpbmdzPSJVVEYtOCxVVEYtMTYsQVNDSUksQ3AxMjUwLENwMTI1MSxDcDEyNTIsQ3AxMjUzLENwMTI1NCxDcDEyNTcsSVNPODg1OV8xLElTTzg4NTlfMixJU084ODU5XzQsSVNPODg1OV81LElTTzg4NTlfNyxJU084ODU5XzksSVNPODg1OV8xMyxJU084ODU5XzE1LEtPSThfUixVbmljb2RlQmlnVW5tYXJrZWQsVW5pY29kZUxpdHRsZVVubWFya2VkLFVuaWNvZGVCaWcsVW5pY29kZUxpdHRsZSIKLSAgICBsYWJlbD0iJWJ5dGVWaWV3Ii8+Ci0gIDx2aWV3ZXIKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy5pbWFnZSIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2Vycy5JbWFnZVZpZXdlciIKLSAgICB0eXBlPSJyZXF1ZXN0cmVzcG9uc2UiCi0gICAgbGFiZWw9IiVpbWFnZVZpZXciLz4KLSAgPHZpZXdlcgotICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3ZXJzLnhtbCIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2Vycy5YTUxWaWV3ZXIiCi0gICAgdHlwZT0icmVxdWVzdHJlc3BvbnNlIgotICAgIGxhYmVsPSIleG1sVmlldyIvPgotICA8dmlld2VyCi0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnZpZXdlcnMuYnJvd3NlciIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2Vycy5Ccm93c2VyVmlld2VyIgotICAgIHR5cGU9InJlcXVlc3RyZXNwb25zZSIKLSAgICBsYWJlbD0iJWJyb3dzZXJWaWV3Ii8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLSAgPGZhY3RvcnkKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuUmVxdWVzdEFkYXB0ZXJGYWN0b3J5IgotICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdCI+Ci0gICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UudWkuSUFjdGlvbkZpbHRlciIvPgotICA8L2ZhY3Rvcnk+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3QiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLm1vZGlmeWFjdGlvbiI+Ci0gICAgICAgPGZpbHRlciBuYW1lPSJyZXF1ZXN0c2VudCIgdmFsdWU9InRydWUiLz4KLSAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb25SZXNlbmQiCi0gICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldy5SZXNlbmRNZXNzYWdlQWN0aW9uIgotICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXcuUmVzZW5kTWVzc2FnZUFjdGlvbiIKLSAgICAgICAgICAgICBpY29uPSJpY29ucy9lbGNsMTYvcmVzZW5kUmVxdWVzdC5naWYiPgotICAgICAgIDwvYWN0aW9uPgotICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbk1vZGlmeSIKLSAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3Lk1vZGlmeU1lc3NhZ2VBY3Rpb24iCi0gICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldy5Nb2RpZnlNZXNzYWdlQWN0aW9uIgotICAgICAgICAgICAgIGljb249Imljb25zL2V0b29sMTYvZWRpdFJlcXVlc3QuZ2lmIj4KLSAgICAgICA8L2FjdGlvbj4KLSAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdCIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuc2VuZG1vZGlmeWFjdGlvbiI+Ci0gICAgICAgPGZpbHRlciBuYW1lPSJyZXF1ZXN0c2VudCIgdmFsdWU9ImZhbHNlIi8+ICAgIAotICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbk1vZGlmeVJlc2VuZCIKLSAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3LlNlbmRNb2RpZmllZE1lc3NhZ2VBY3Rpb24iCi0gICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldy5TZW5kTW9kaWZpZWRNZXNzYWdlQWN0aW9uIgotICAgICAgICAgICAgIGljb249Imljb25zL2VsY2wxNi9yZXNlbmRSZXF1ZXN0LmdpZiI+Ci0gICAgICAgPC9hY3Rpb24+Ci0gICAgPC9vYmplY3RDb250cmlidXRpb24+Ci08L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9zY2hlbWEvdmlld2Vycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9zY2hlbWEvdmlld2Vycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmI0YzFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvc2NoZW1hL3ZpZXdlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpIiBpZD0idmlld2VycyIgbmFtZT0iQ29udGVudCBWaWV3ZXJzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBhIHZpZXdlciBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIGNvbnRlbnQuIChlLmcuIGEgdmlld2VyIGZvciBhIHBhcnRpY3VsYXIgaW1hZ2UgZm9ybWF0KQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlld2VyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJ2aWV3ZXIiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyJmx0Oy9zYW1wJmd0Oy4gVmlld2VycyBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGUgY29udGVudCB2aWV3ZXINCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBbaXNzdWU6IHdoYXQgaXMgdGhpcyB1c2VkIGZvcj9dDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVuY29kaW5ncyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIGNvbnRlbnQgdmlld2VyIGV4dGVuc2lvbiBwb2ludDoNCi0NCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24gDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkudmlld2VycyZxdW90OyZndDsNCi0gICAgICAmbHQ7dmlld2VyDQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUuYnl0ZXZpZXdlciZxdW90Ow0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkJ5dGVDb250ZW50Vmlld2VyJnF1b3Q7DQotICAgICAgICAgICAgdHlwZT0mcXVvdDtyZXF1ZXN0cmVzcG9uc2UmcXVvdDsNCi0gICAgICAgICAgICBsYWJlbD0mcXVvdDslYnl0ZVZpZXcmcXVvdDsvJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBhYnN0cmFjdCBjbGFzcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyJmx0Oy9jb2RlJmd0Oy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjFkYWYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNlcnZlcmNvcmUvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ2ODE0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXNlcnZlcmNvcmUuamFyCi1vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmVfMy4wLjAuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2JiMWYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSBwbHVnaW4KLQotIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nCi1vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvZGVidWc9dHJ1ZQotCi0jIFRyYWNpbmcgb3B0aW9ucwotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL2NvbmZpZz1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL2luZm89ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS93YXJuaW5nPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2V2ZXJlPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvZmluZXN0PWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvZmluZXI9ZmFsc2UKLQotIyBUcmFja2luZyBvZiBzZXJ2ZXIgcmVzb3VyY2VzCi1vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvcmVzb3VyY2VzPWZhbHNlCi0KLSMgTG9hZGluZyBvZiBleHRlbnNpb24gcG9pbnRzCi1vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvZXh0ZW5zaW9uX3BvaW50PWZhbHNlCi0KLSMgU2VydmVyIGxpc3RlbmVycwotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL2xpc3RlbmVycz1mYWxzZQotCi0jIHJ1bnRpbWUgdGFyZ2V0cwotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3J1bnRpbWVfdGFyZ2V0PWZhbHNlCi0KLSMgUGVyZm9ybWFuY2Ugb2YgbG9hZGluZyBhbmQgY2FsbGluZyBkZWxlZ2F0ZXMKLW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9wZXJmb3JtYW5jZT1mYWxzZQotCi0jIFB1Ymxpc2hpbmcKLW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9wdWJsaXNoaW5nPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU5M2YxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc0J1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc05hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGJlNDMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBOb3YgMTAgMTc6MTE6MzUgSFNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWZmM2YzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLSNUdWUgTWFyIDA5IDE2OjIwOjMyIEVTVCAyMDEwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlY3JlYXRlTW9kaWZpZWRDbGFzc0ZpbGVJbk91dHB1dEZvbGRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoLCoudGVzdHN1aXRlLCouZGVwbG95LCoubG9jYXRpb24sKi5leGVjdXRpb24sKi5kYXRhcG9vbCwqLmFydGlmYWN0LCouaHRtbCwqLnN2Zwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9d2FybmluZwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLWluc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzdlM2M3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jVHVlIE1hciAwOSAxNjoyMDozNSBFU1QgMjAxMAotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5leGNlcHRpb24ubmFtZT1lCi1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9NAotb3JnLmVjbGlwc2UuamR0LnVpLnN0YXRpY29uZGVtYW5kdGhyZXNob2xkPTQKLW9yZy5lY2xpcHNlLmpkdC51aS5vdmVycmlkZWFubm90YXRpb249dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPWphdmE7amF2YXg7b3JnO2NvbTsKLW9yZy5lY2xpcHNlLmpkdC51aS5nZXR0ZXJzZXR0ZXIudXNlLmlzPXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkua2V5d29yZHRoaXM9ZmFsc2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGE2MGU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jU2F0IEFwciAyMiAxODozNjoxNCBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0yCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUwOGRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4zMDQucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5mYWNldHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlMzJiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gc2NoZW1hLwotc291cmNlLi4gPSBzZXJ2ZXJjb3JlLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRjNTY1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9U2VydmVyIENvcmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi1leHRlbnNpb25Qb2ludFNlcnZlclN0YXJ0dXA9U2VydmVyIFN0YXJ0dXAKLWV4dGVuc2lvblBvaW50TW9kdWxlVHlwZXM9TW9kdWxlIFR5cGVzCi1leHRlbnNpb25Qb2ludFJ1bnRpbWVUeXBlcz1SdW50aW1lIFR5cGVzCi1leHRlbnNpb25Qb2ludFJ1bnRpbWVNb2R1bGVUeXBlPVJ1bnRpbWUgTW9kdWxlIFR5cGVzCi1leHRlbnNpb25Qb2ludFJ1bnRpbWVUYXJnZXRIYW5kbGVycz1SdW50aW1lIFRhcmdldCBIYW5kbGVycwotZXh0ZW5zaW9uUG9pbnRSdW50aW1lTG9jYXRvcnM9UnVudGltZSBMb2NhdG9ycwotZXh0ZW5zaW9uUG9pbnRTZXJ2ZXJUeXBlcz1TZXJ2ZXIgVHlwZXMKLWV4dGVuc2lvblBvaW50U2VydmVyTG9jYXRvcnM9U2VydmVyIExvY2F0b3JzCi1leHRlbnNpb25Qb2ludE1vZHVsZUZhY3Rvcmllcz1Nb2R1bGUgRmFjdG9yaWVzCi1leHRlbnNpb25Qb2ludE1vZHVsZUFydGlmYWN0QWRhcHRlcnM9TW9kdWxlIEFydGlmYWN0IEFkYXB0ZXJzCi1leHRlbnNpb25Qb2ludExhdW5jaGFibGVBZGFwdGVycz1MYXVuY2hhYmxlIEFkYXB0ZXJzCi1leHRlbnNpb25Qb2ludENsaWVudHM9Q2xpZW50cwotZXh0ZW5zaW9uUG9pbnRQdWJsaXNoVGFza3M9UHVibGlzaCBUYXNrcwotZXh0ZW5zaW9uUG9pbnRQdWJsaXNoZXJzPVB1Ymxpc2hlcnMKLWV4dGVuc2lvblBvaW50UHVibGlzaENvbnRyb2xsZXI9UHVibGlzaCBDb250cm9sbGVyCi1leHRlbnNpb25Qb2ludFNlcnZlck1vbml0b3JzPVNlcnZlciBNb25pdG9ycwotZXh0ZW5zaW9uUG9pbnRJbnN0YWxsYWJsZVNlcnZlcnM9SW5zdGFsbGFibGUgU2VydmVycwotZXh0ZW5zaW9uUG9pbnRJbnN0YWxsYWJsZVJ1bnRpbWVzPUluc3RhbGxhYmxlIFJ1bnRpbWVzCi1leHRlbnNpb25Qb2ludFNhdmVFZGl0b3JQcm9tcHRlcj1TYXZlIEVkaXRvciBQcm9tcHRlcgotCi1leHRlbnNpb25Qb2ludFJ1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVycz1SdW50aW1lIEZhY2V0IENvbXBvbmVudCBQcm92aWRlcnMKLQotbW9kdWxlVHlwZVVua25vd249VW5rbm93biBtb2R1bGUKLW1vZHVsZVR5cGVTdGF0aWNXZWJOYW1lPVN0YXRpYyBXZWIgcHJvamVjdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YjI2YzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9Im1vZHVsZVR5cGVzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRNb2R1bGVUeXBlcyIgc2NoZW1hPSJzY2hlbWEvbW9kdWxlVHlwZXMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJydW50aW1lVHlwZXMiIG5hbWU9IiVleHRlbnNpb25Qb2ludFJ1bnRpbWVUeXBlcyIgc2NoZW1hPSJzY2hlbWEvcnVudGltZVR5cGVzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0icnVudGltZVRhcmdldEhhbmRsZXJzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRSdW50aW1lVGFyZ2V0SGFuZGxlcnMiIHNjaGVtYT0ic2NoZW1hL3J1bnRpbWVUYXJnZXRIYW5kbGVycy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9InJ1bnRpbWVMb2NhdG9ycyIgbmFtZT0iJWV4dGVuc2lvblBvaW50UnVudGltZUxvY2F0b3JzIiBzY2hlbWE9InNjaGVtYS9ydW50aW1lTG9jYXRvcnMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzZXJ2ZXJUeXBlcyIgbmFtZT0iJWV4dGVuc2lvblBvaW50U2VydmVyVHlwZXMiIHNjaGVtYT0ic2NoZW1hL3NlcnZlclR5cGVzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2VydmVyTG9jYXRvcnMiIG5hbWU9IiVleHRlbnNpb25Qb2ludFNlcnZlckxvY2F0b3JzIiBzY2hlbWE9InNjaGVtYS9zZXJ2ZXJMb2NhdG9ycy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9Im1vZHVsZUZhY3RvcmllcyIgbmFtZT0iJWV4dGVuc2lvblBvaW50TW9kdWxlRmFjdG9yaWVzIiBzY2hlbWE9InNjaGVtYS9tb2R1bGVGYWN0b3JpZXMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRNb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIiBzY2hlbWE9InNjaGVtYS9tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibGF1bmNoYWJsZUFkYXB0ZXJzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRMYXVuY2hhYmxlQWRhcHRlcnMiIHNjaGVtYT0ic2NoZW1hL2xhdW5jaGFibGVBZGFwdGVycy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNsaWVudHMiIG5hbWU9IiVleHRlbnNpb25Qb2ludENsaWVudHMiIHNjaGVtYT0ic2NoZW1hL2NsaWVudHMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJwdWJsaXNoVGFza3MiIG5hbWU9IiVleHRlbnNpb25Qb2ludFB1Ymxpc2hUYXNrcyIgc2NoZW1hPSJzY2hlbWEvcHVibGlzaFRhc2tzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0icHVibGlzaGVycyIgbmFtZT0iJWV4dGVuc2lvblBvaW50UHVibGlzaGVycyIgc2NoZW1hPSJzY2hlbWEvcHVibGlzaGVycy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9InB1Ymxpc2hDb250cm9sbGVyIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRQdWJsaXNoQ29udHJvbGxlciIgc2NoZW1hPSJzY2hlbWEvcHVibGlzaENvbnRyb2xsZXIuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJpbnRlcm5hbFNlcnZlck1vbml0b3JzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRTZXJ2ZXJNb25pdG9ycyIgc2NoZW1hPSJzY2hlbWEvc2VydmVyTW9uaXRvcnMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJpbnRlcm5hbFN0YXJ0dXAiIG5hbWU9IiVleHRlbnNpb25Qb2ludFNlcnZlclN0YXJ0dXAiIHNjaGVtYT0ic2NoZW1hL3N0YXJ0dXAuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJpbnN0YWxsYWJsZVJ1bnRpbWVzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRJbnN0YWxsYWJsZVJ1bnRpbWVzIiBzY2hlbWE9InNjaGVtYS9pbnN0YWxsYWJsZVJ1bnRpbWVzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0icnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRSdW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlcnMiIHNjaGVtYT0ic2NoZW1hL3J1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVycy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9InJ1bnRpbWVNb2R1bGVUeXBlIiBuYW1lPSIlcnVudGltZU1vZHVsZVR5cGUiIHNjaGVtYT0ic2NoZW1hL3J1bnRpbWVNb2R1bGVUeXBlLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2F2ZUVkaXRvclByb21wdGVyIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRTYXZlRWRpdG9yUHJvbXB0ZXIiIHNjaGVtYT0ic2NoZW1hL3NhdmVFZGl0b3JQcm9tcHRlci5leHNkIi8+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZVR5cGVzIj4KLSAgICA8bW9kdWxlVHlwZQotICAgICAgIGlkPSIqIgotICAgICAgIG5hbWU9IiVtb2R1bGVUeXBlVW5rbm93biIvPgotICAgIDxtb2R1bGVUeXBlCi0gICAgICAgaWQ9IndzdC53ZWIiCi0gICAgICAgbmFtZT0iJW1vZHVsZVR5cGVTdGF0aWNXZWJOYW1lIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVCcmlkZ2VzIj4KLSAgICA8YnJpZGdlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmRlZmF1bHQiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLmZhY2V0cy5SdW50aW1lQnJpZGdlIi8+Ci0gIDwvZXh0ZW5zaW9uPgotICA8ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICA8bW9kaWZpZXIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQcmVmZXJlbmNlTW9kaWZ5TGlzdGVuZXIiPgotICAgICA8L21vZGlmaWVyPgotICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL2NsaWVudHMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9jbGllbnRzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZWFkZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL2NsaWVudHMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwaW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJjbGllbnRzIiBuYW1lPSJDbGllbnRzIi8+DQotICAgICAgPC9hcHBpbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIGxhdW5jaCBhIGNsaWVudCBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIHJlc291cmNlIHRoYXQgaXMgYmVpbmcgcnVuIG9uIGEgc2VydmVyLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249InNjaGVtYTovL29yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvc2NoZW1hL2V4cHJlc3Npb25MYW5ndWFnZS5leHNkIi8+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2xpZW50IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJjbGllbnQiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4NCi0gICAgICAgICA8L2FwcGluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbmFibGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZCAmbHQ7c2FtcCZndDtDbGllbnREZWxlZ2F0ZSZsdDsvc2FtcCZndDsuDQotQ2xpZWludCBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgdG8gbGF1bmNoLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwaW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkNsaWVudERlbGVnYXRlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBpbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBjbGllbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcGluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGNsaWVudA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwaW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBpbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhdW5jaGFibGUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGxhdW5jaGFibGUgb2JqZWN0IHRoYXQgdGhpcyBjbGllbnQgc3VwcG9ydHMNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJpb3JpdHkiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgcHJpb3JpdHkgYXRycmlidXRlIHdoaWNoIHNwZWNpZmllcyBhIHJlbGF0aXZlIG9yZGVyaW5nIG9mIGFydGlmYWN0IGFkYXB0ZXJzLiBBZGFwdGVycyB3aXRoIGEgaGlnaGVyIG51bWJlciBhcmUgYWx3YXlzIHVzZWQgZmlyc3QuIFRvIG92ZXJyaWRlIGFub3RoZXIgYWRhcHRlciwgc2ltcGx5IHByb3ZpZGUgYSBoaWdoZXIgcHJpb3JpdHkgdmFsdWUgdGhhdCB0aGUgb3RoZXIgYWRhcHRlci4gVGhlIHByaW9yaXR5IGlzIDAgaWYgbm8gcHJpb3JpdHkgaXMgc3BlY2lmaWVkDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwaW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcGluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkNsaWVudERlbGVnYXRlJmx0Oy9jb2RlJmd0OyBhbmQgY29udGFpbnMgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwaW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBpbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcGluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwaW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBjbGllbnQgZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbiANCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuY2xpZW50cyZxdW90OyZndDsNCi0gICAgICAmbHQ7Y2xpZW50DQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUuY2xpZW50cyZxdW90Ow0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7JWNsaWVudE5hbWUmcXVvdDsNCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDslY2xpZW50RGVzY3JpcHRpb24mcXVvdDsNCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlQ2xpZW50JnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLQ0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBpbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9pbnN0YWxsYWJsZVJ1bnRpbWVzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvaW5zdGFsbGFibGVSdW50aW1lcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDVjM2I3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9pbnN0YWxsYWJsZVJ1bnRpbWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9Imluc3RhbGxhYmxlUnVudGltZXMiIG5hbWU9Ikluc3RhbGxhYmxlIFJ1bnRpbWVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEBkZXByZWNhdGVkIChzaW5jZSAzLjMpIAotVGhlIHN1cHBvcnQgZm9yIEluc3RhbGxhYmxlUnVudGltZSBoYXMgYmVlbiBtb3ZlZCB0byBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmRpc2NvdmVyeQotYW5kIGlzIG5vdyBzdXBwb3J0ZWQgdGhyb3VnaCB0aGUgcDIgcmVwb3NpdG9yeSBsb29rdXAgQVBJcwotCi1UaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGluc3RhbGwgbmV3IHJ1bnRpbWVzIChpLmUuIHNlcnZlciBpbnN0YWxsYXRpb25zKSBmcm9tIGEgcmVtb3RlIHNlcnZlci4KLQotTmV3IHVzZXJzIHNob3VsZCB1c2UgdGhlICZhcG9zO3J1bnRpbWUmYXBvczsgZWxlbWVudCAod2hpY2ggYWxsb3dzIHlvdSB0byBwb2ludCB0byBhbnkgemlwIGZpbGUgb24gYW55IHNlcnZlcikgYW5kIG5vdCB0aGUgb3JpZ2luYWwgJmFwb3M7aW5zdGFsbGFibGVSdW50aW1lJmFwb3M7IGVsZW1lbnQgKHdoaWNoIHJlcXVpcmVzIGEgcmVtb3RlIHVwZGF0ZSBtYW5hZ2VyIHNpdGUpLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgZGVwcmVjYXRlZD0idHJ1ZSIgcmVwbGFjZW1lbnQ9IiIgLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQGRlcHJlY2F0ZWQgKHNpbmNlIDMuMykgCi1UaGUgc3VwcG9ydCBmb3IgSW5zdGFsbGFibGVSdW50aW1lIGhhcyBiZWVuIG1vdmVkIHRvIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZGlzY292ZXJ5Ci1hbmQgaXMgbm93IHN1cHBvcnRlZCB0aHJvdWdoIHRoZSBwMiByZXBvc2l0b3J5IGxvb2t1cCBBUElzCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Imluc3RhbGxhYmxlUnVudGltZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydW50aW1lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iaW5zdGFsbGFibGVSdW50aW1lIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIgZGVwcmVjYXRlZD0idHJ1ZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmZWF0dXJlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBmZWF0dXJlIGNvbnRhaW5pbmcgdGhlIHJ1bnRpbWUgYnVuZGxlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmVhdHVyZVZlcnNpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHZlcnNpb24gb2YgdGhlIGZlYXR1cmUgY29udGFpbmluZyB0aGUgcnVudGltZSBidW5kbGUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmZWF0dXJlU2l0ZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgZmVhdHVyZSAodXBkYXRlIG1hbmFnZXIpIHNpdGUgVVJMCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYnVuZGxlSWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBidW5kbGUgaW4gd2hpY2ggdGhlIHJ1bnRpbWUgemlwIGlzIGluCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBkZXByZWNhdGVkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYnVuZGxlVmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgb3B0aW9uYWwgdmVyc2lvbiBvZiB0aGUgYnVuZGxlIGluIHdoaWNoIHRoZSBydW50aW1lIHppcCBpcyBpbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgZGVwcmVjYXRlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhdGgiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgaWYgYnVuZGxlSWQgaXMgc3BlY2lmaWVkIHRoZW4gcmVwcmVzZW50cyB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcnVudGltZSB6aXAgaW5zaWRlIHRoZSBidW5kbGUsIG90aGVyd2lzZSBpdCBhc3N1bWVzIGEgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcnVudGltZSBhcmNoaXZlIGluc2lkZSB0aGUgZmVhdHVyZSBkaXJlY3RvcnkKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGRlcHJlY2F0ZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icnVudGltZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iaWQiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXJjaGl2ZVVybCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIFVSTCB0byB0aGUgcnVudGltZSBhcmNoaXZlIGRvd25sb2FkCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXJjaGl2ZVBhdGgiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgcGF0aCB3aXRoaW4gdGhlIGFyY2hpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHJ1bnRpbWUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhcmNoaXZlU2l6ZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbnRpY2lwYXRlZCBzaXplIG9mIHRoZSBhcmNoaXZlIGluIGJ5dGVzIGZvciBwcm9ncmVzcyBtb25pdG9yIHVzZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGVDb3VudCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbnRpY2lwYXRlZCBudW1iZXIgb2YgZmlsZXMgaW4gdGhlIGFyY2hpdmUgZm9yIHByb2dyZXNzIG1vbml0b3IgdXNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGljZW5zZVVybCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIFVSTCB0byB0aGUgcnVudGltZSBsaWNlbnNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uLiBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG9wZXJhdGluZyBzeXN0ZW0gZGVzaWduYXRvcnMgZGVmaW5lZCBieSBFY2xpcHNlIChzZWUgSmF2YWRvYyBmb3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtKS4gSW5kaWNhdGVzIHRoaXMgaW5zdGFsbGFibGUgcnVudGltZSBzaG91bGQgb25seSBiZSB1c2VkIG9uIG9uZSBvZiB0aGUgc3BlY2lmaWVkIE9TIHN5c3RlbXMuIElmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBmZWF0dXJlIGNhbiBiZSBpbnN0YWxsZWQgb24gYWxsIHN5c3RlbXMgKHBvcnRhYmxlIGltcGxlbWVudGF0aW9uKQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGluc3RhbGxhYmxlIHJ1bnRpbWUgZXh0ZW5zaW9uIHBvaW50OgotCi0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiAKLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnN0YWxsYWJsZVJ1bnRpbWVzJnF1b3Q7Jmd0OwotICAgICAgJmx0O2luc3RhbGxhYmxlUnVudGltZQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLm15cnVudGltZS5pZCZxdW90OwotICAgICAgICAgICAgZmVhdHVyZVZlcnNpb249JnF1b3Q7MS4wLjAmcXVvdDsKLSAgICAgICAgICAgIGZlYXR1cmVJZD0mcXVvdDtjb20ubXlmZWF0dXJlJnF1b3Q7Ci0gICAgICAgICAgICBmZWF0dXJlU2l0ZT0mcXVvdDt4eXomcXVvdDsKLSAgICAgICAgICAgIGJ1bmRsZUlkPSZxdW90O2NvbS5pYm0ubXlidW5kbGUmcXVvdDsKLSAgICAgICAgICAgIHBhdGg9JnF1b3Q7L3ppcHMvbXlSdW50aW1lLnppcCZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotCi1UaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgdXNpbmcgdGhlIGluc3RhbGxhYmxlIHJ1bnRpbWUgZXh0ZW5zaW9uIHBvaW50IGJ1dCBoYXZpbmcgdGhlIHJ1bnRpbWUgYXJjaGl2ZSBhcyBhIGRhdGEgYXJjaGl2ZSBpbiB0aGUgZmVhdHVyZS4KLQotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW5zdGFsbGFibGVSdW50aW1lcyZxdW90OyZndDsKLSAgICAgICZsdDtpbnN0YWxsYWJsZVJ1bnRpbWUKLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5teXJ1bnRpbWUuaWQmcXVvdDsKLSAgICAgICAgICAgIGZlYXR1cmVWZXJzaW9uPSZxdW90OzEuMC4wJnF1b3Q7Ci0gICAgICAgICAgICBmZWF0dXJlSWQ9JnF1b3Q7Y29tLm15ZmVhdHVyZSZxdW90OwotICAgICAgICAgICAgZmVhdHVyZVNpdGU9JnF1b3Q7eHl6JnF1b3Q7Ci0gICAgICAgICAgICBwYXRoPSZxdW90O215UnVudGltZS0xLjAuemlwJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0KLUluIHRoZSBmZWF0dXJlIG1hbmlmZXN0IGFuZCBkYXRhIGVudHJ5IHNob3VsZCBiZSBlbnRlcmVkIGZvciB0aGUgcnVudGltZSBhcmNoaXZlIGFzIHdlbGwgYXMgYW4gaW5zdGFsbGhhbmRsZXIuIFRoZSBkZWZhdWx0IGluc3RhbGwgaGFuZGxlciBjYW4gYmUgdXNlZCB3aGljaCB3aWxsIGluc3RhbGwgdGhlIGRhdGEgYXJjaGl2ZSBpbnNpZGUgdGhlIGZlYXR1cmUuCi0KLSZsdDtkYXRhCi0gICAgaWQ9JnF1b3Q7bXlSdW50aW1lLTEuMC56aXAmcXVvdDsKLSAgICBkb3dubG9hZC1zaXplPSZxdW90OzAmcXVvdDsKLSAgICBpbnN0YWxsLXNpemU9JnF1b3Q7MCZxdW90Oy8mZ3Q7Ci0KLSZsdDtpbnN0YWxsLWhhbmRsZXIgaGFuZGxlcj0mcXVvdDtvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5EZWZhdWx0SW5zdGFsbEhhbmRsZXImcXVvdDsvJmd0OwotCi1JZiB0aGUgcnVudGltZSBhcmNoaXZlIGlzIG5vdCBwYWNrYWdlZCB3aXRoaW4gdGhlIGZlYXR1cmUsIHRoZW4geW91IG5lZWQgdG8gbWFwIHRoZSBhcmNoaXZlIHBhdGggdG8gYSByZWxhdGl2ZSBvciBhYnNvbHV0ZSB1cmwgdG8gdGhlIHNpdGUueG1sCi0KLSZsdDthcmNoaXZlIHBhdGg9JnF1b3Q7ZmVhdHVyZXMvY29tLm15ZmVhdHVyZV8xLjAuMC9teVJ1bnRpbWUtMS4wLnppcCZxdW90OyB1cmw9JnF1b3Q7Li4vLi4vMS4wL215UnVudGltZS0xLjAuemlwJnF1b3Q7LyZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpaW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBAZGVwcmVjYXRlZCAoc2luY2UgMy4zKSAKLVRoZSBzdXBwb3J0IGZvciBJbnN0YWxsYWJsZVJ1bnRpbWUgaGFzIGJlZW4gbW92ZWQgdG8gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5kaXNjb3ZlcnkKLWFuZCBpcyBub3cgc3VwcG9ydGVkIHRocm91Z2ggdGhlIHAyIHJlcG9zaXRvcnkgbG9va3VwIEFQSXMKLQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbGF1bmNoYWJsZUFkYXB0ZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbGF1bmNoYWJsZUFkYXB0ZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MzQzYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL2xhdW5jaGFibGVBZGFwdGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9ImxhdW5jaGFibGVBZGFwdGVycyIgbmFtZT0iTGF1bmNoYWJsZSBBZGFwdGVycyIvPg0KLSAgICAgIDwvYXBwaW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyBhIHdheSBmb3IgYSBzZXJ2ZXIgdG8gc3VwcG9ydCB0aGUgUnVuIG9uIFNlcnZlciBzY2VuYXJpby4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImxhdW5jaGFibGVBZGFwdGVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJsYXVuY2hhYmxlQWRhcHRlciI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcGluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iaWQiLz4NCi0gICAgICAgICA8L2FwcGluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4NCi1MYXVuY2hhYmxlIGFkYXB0ZXIgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aWxsIGRlbGVnYXRlIHRvIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwaW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkxhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcGluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZUlkcyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHNlcnZlciB0eXBlIGlkcy4gTWF5IGluY2x1ZGUgd2lsZGNhcmRzICgqKSBhdCB0aGUgZW5kIG9mIGFuIGlkDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByaW9yaXR5IiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIHByaW9yaXR5IGF0cnJpYnV0ZSB3aGljaCBzcGVjaWZpZXMgYSByZWxhdGl2ZSBvcmRlcmluZyBvZiBsYXVuY2hhYmxlIGFkYXB0ZXJzLiBBZGFwdGVycyB3aXRoIGEgaGlnaGVyIG51bWJlciBhcmUgYWx3YXlzIHVzZWQgZmlyc3QuIFRvIG92ZXJyaWRlIGFub3RoZXIgYWRhcHRlciwgc2ltcGx5IHByb3ZpZGUgYSBoaWdoZXIgcHJpb3JpdHkgdmFsdWUgdGhhdCB0aGUgb3RoZXIgYWRhcHRlci4gVGhlIHByaW9yaXR5IGlzIDAgaWYgbm8gcHJpb3JpdHkgaXMgc3BlY2lmaWVkDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwaW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBpbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcGluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwaW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBsYXVuY2hhYmxlIGFkYXB0ZXIgZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbiANCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubGF1bmNoYWJsZUFkYXB0ZXJzJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtsYXVuY2hhYmxlQWRhcHRlcg0KLSAgICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUubGF1bmNoYWJsZUFkYXB0ZXImcXVvdDsNCi0gICAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlJnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwaW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSZsdDsvY29kZSZndDsgYW5kIGNvbnRhaW5zIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotDQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcGluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcGluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL21vZHVsZUFydGlmYWN0QWRhcHRlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MjdhNmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL21vZHVsZUFydGlmYWN0QWRhcHRlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwaW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJtb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIiBuYW1lPSJNb2R1bGUgQXJ0aWZhY3QgQWRhcHRlcnMiLz4NCi0gICAgICA8L2FwcGluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ic2NoZW1hOi8vb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy9zY2hlbWEvZXhwcmVzc2lvbkxhbmd1YWdlLmV4c2QiLz4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4NCi0gICAgICAgICA8L2FwcGluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtb2R1bGVBcnRpZmFjdEFkYXB0ZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im1vZHVsZUFydGlmYWN0QWRhcHRlciI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcGluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iaWQiLz4NCi0gICAgICAgICA8L2FwcGluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbmFibGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcGluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmlvcml0eSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBwcmlvcml0eSBhdHJyaWJ1dGUgd2hpY2ggc3BlY2lmaWVzIGEgcmVsYXRpdmUgb3JkZXJpbmcgb2YgYXJ0aWZhY3QgYWRhcHRlcnMuIEFkYXB0ZXJzIHdpdGggYSBoaWdoZXIgbnVtYmVyIGFyZSBhbHdheXMgdXNlZCBmaXJzdC4gVG8gb3ZlcnJpZGUgYW5vdGhlciBhZGFwdGVyLCBzaW1wbHkgcHJvdmlkZSBhIGhpZ2hlciBwcmlvcml0eSB2YWx1ZSB0aGF0IHRoZSBvdGhlciBhZGFwdGVyLiBUaGUgcHJpb3JpdHkgaXMgMCBpZiBubyBwcmlvcml0eSBpcyBzcGVjaWZpZWQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcGluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwaW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBpbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIG1vZHVsZSBvYmplY3QgYWRhcHRlciBleHRlbnNpb24gcG9pbnQ6DQotDQotJmx0O3ByZSZndDsNCi0NCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwaW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7IGFuZCBjb250YWlucyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBpbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9tb2R1bGVGYWN0b3JpZXMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9tb2R1bGVGYWN0b3JpZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAxMDc3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbW9kdWxlRmFjdG9yaWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiBpZD0ibW9kdWxlRmFjdG9yaWVzIiBuYW1lPSJNb2R1bGUgRmFjdG9yaWVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBhIGZhY3RvcnkgZm9yIG1vZHVsZXMgdGhhdCBjYW4gYmUgdXNlZCBieSBzZXJ2ZXJzLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ic2NoZW1hOi8vb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy9zY2hlbWEvZXhwcmVzc2lvbkxhbmd1YWdlLmV4c2QiLz4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtb2R1bGVGYWN0b3J5IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJtb2R1bGVGYWN0b3J5Ij4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1vZHVsZVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVuYWJsZW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtNb2R1bGVGYWN0b3J5RGVsZWdhdGUmbHQ7L3NhbXAmZ3Q7Lg0KLU1vZHVsZSBmYWN0b3J5IGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2lsbCBkZWxlZ2F0ZSB0byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9qZWN0cyIgdHlwZT0iYm9vbGVhbiI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgdHJ1ZSBpZiB0aGlzIGZhY3RvcnkgbWF5IHJldHVybiBwcm9qZWN0cyB3aXRoaW4gdGhlIHdvcmtzcGFjZSwgYW5kIGZhbHNlIG90aGVyd2lzZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcmRlciIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBpbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSBvcmRlciB0aGF0IHRoZSBtb2R1bGUgZmFjdG9yeSBpcyBwcm9jZXNzZWQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im1vZHVsZVR5cGUiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGVzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbW9kdWxlIHR5cGUgaWRzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb25zIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbW9kdWxlIHZlcnNpb25zDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSZsdDsvY29kZSZndDsgYW5kIGNvbnRhaW5zIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgbW9kdWxlIGZhY3RvcnkgZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kdWxlRmFjdG9yaWVzJnF1b3Q7Jmd0Ow0KLSAgICZsdDttb2R1bGVGYWN0b3J5DQotICAgICAgcHJvamVjdHM9JnF1b3Q7dHJ1ZSZxdW90Ow0KLSAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLk15V2ViRmFjdG9yeSZxdW90Ow0KLSAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLndzdC5zdGF0aWMud2ViJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDttb2R1bGVUeXBlDQotICAgICAgICAgdmVyc2lvbnM9JnF1b3Q7MS4wJnF1b3Q7DQotICAgICAgICAgdHlwZXM9JnF1b3Q7d3N0LndlYiZxdW90OyZndDsNCi0gICAgICAmbHQ7L21vZHVsZVR5cGUmZ3Q7DQotICAgJmx0Oy9tb2R1bGVGYWN0b3J5Jmd0Ow0KLSZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL21vZHVsZVR5cGVzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbW9kdWxlVHlwZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkyODM0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbW9kdWxlVHlwZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiBpZD0ibW9kdWxlVHlwZXMiIG5hbWU9Ik1vZHVsZSBUeXBlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHByb3ZpZGUgYSBuZXcgbW9kdWxlIHR5cGUuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtb2R1bGVUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJtb2R1bGVUeXBlIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZHVsZSB0eXBlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIG1vZHVsZSB0eXBlIGV4dGVuc2lvbiBwb2ludDoNCi0NCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24gDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZVR5cGVzJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDttb2R1bGVUeXBlDQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUmcXVvdDsNCi0gICAgICAgICAgICBuYW1lPSZxdW90OyVtb2R1bGVUeXBlTmFtZSZxdW90Ow0KLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSZxdW90OyVtb2R1bGVUeXBlRGVzY3JpcHRpb24mcXVvdDsvJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9wdWJsaXNoQ29udHJvbGxlci5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3B1Ymxpc2hDb250cm9sbGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZjZkZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3B1Ymxpc2hDb250cm9sbGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9InB1Ymxpc2hDb250cm9sbGVyIiBuYW1lPSJQdWJsaXNoIENvbnRyb2xsZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBoYXZlIGdyYW51YWwgY29udHJvbCBvZiB0aGUgcHVibGlzaCBhY3Rpb24gb2YgYSBzZXJ2ZXIuIAotCi0mbHQ7YiZndDtQcm92aXNpb25hbCBBUEk6Jmx0Oy9iJmd0OwotVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InB1Ymxpc2hDb250cm9sbGVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHVibGlzaENvbnRyb2xsZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlSWRzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc2VydmVyIHR5cGUgaWRzIHRoYXQgdGhpcyB0YXNrIG1heSBhcHBseSB0by4gVXNlZCBmb3IgbWVtb3J5ICZhbXA7IHBlcmZvcm1hbmNlIHJlYXNvbnMKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGlzIFB1Ymxpc2hDb250cm9sbGVyCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgUHVibGlzaENvbnRyb2xsZXIKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5QdWJsaXNoQ29udHJvbGxlckRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4KLVB1Ymxpc2hDb250cm9sbGVyIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2lsbCBkZWxlZ2F0ZSB0byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5QdWJsaXNoQ29udHJvbGxlckRlbGVnYXRlOiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9yZGVyIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIGludGVnZXIgdGhhdCBzcGVjaWZpZXMgdGhlIG9yZGVyIHRoYXQgdGhlIHB1Ymxpc2hlciBpcyBwcm9jZXNzZWQuIGlmIHRoZSB2YWx1ZSBpcyBsZXNzIHRoYW4gMCBpdCB3aWxsIGJlIHByb2Nlc3NlZCBiZWZvcmUgY2FsbGluZyB0aGUgc2VydmVyIGJlaGF2aW91ciBkZWxlZ2F0ZSZhcG9zO3MgcHVibGlzaGluZyBtZXRob2RzLCBhbmQgbWF5IG1vZGlmeSB0aGUgd29ya3NwYWNlLiBpZiB0aGUgdmFsdWUgaXMgbW9yZSB0aGFuIDAsIGl0IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBzZXJ2ZXIgYmVoYXZpb3VyIGRlbGVnYXRlJmFwb3M7cyBwdWJsaXNoaW5nIG1ldGhvZHMgYW5kIG1heSBub3QgbW9kaWZ5IHRoZSB3b3Jrc3BhY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMy4yCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIFB1Ymxpc2hDb250cm9sbGVyIGV4dGVuc2lvbiBwb2ludDoKLQotJmx0O3ByZSZndDsKLQotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hDb250cm9sbGVyJmx0Oy9jb2RlJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcHVibGlzaFRhc2tzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcHVibGlzaFRhc2tzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDkxY2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3B1Ymxpc2hUYXNrcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiBpZD0icHVibGlzaFRhc2tzIiBuYW1lPSJQdWJsaXNoIFRhc2tzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBhIHRhc2sgdGhhdCBpcyBydW4gd2hpbGUgcHVibGlzaGluZyB0byBhIHNlcnZlci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHVibGlzaFRhc2siIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwdWJsaXNoVGFzayI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUHVibGlzaFRhc2tEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuCi1QdWJsaXNoIHRhc2sgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aWxsIGRlbGVnYXRlIHRvIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hUYXNrRGVsZWdhdGUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlSWRzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc2VydmVyIHR5cGUgaWRzIHRoYXQgdGhpcyB0YXNrIG1heSBhcHBseSB0by4gVXNlZCBmb3IgbWVtb3J5ICZhbXA7IHBlcmZvcm1hbmNlIHJlYXNvbnMKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHB1Ymxpc2ggdGFzayBleHRlbnNpb24gcG9pbnQ6Ci0KLSZsdDtwcmUmZ3Q7Ci0KLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hUYXNrRGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9wdWJsaXNoZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcHVibGlzaGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2M4NmQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9wdWJsaXNoZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9InB1Ymxpc2hlcnMiIG5hbWU9IlB1Ymxpc2hlcnMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBwcm92aWRlIGEgdGFzayB0aGF0IGlzIHJ1biB3aGlsZSBwdWJsaXNoaW5nIHRvIGEgc2VydmVyLgotCi0mbHQ7YiZndDtQcm92aXNpb25hbCBBUEk6Jmx0Oy9iJmd0OwotVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHVibGlzaGVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHVibGlzaGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZUlkcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHNlcnZlciB0eXBlIGlkcyB0aGF0IHRoaXMgdGFzayBtYXkgYXBwbHkgdG8uIFVzZWQgZm9yIG1lbW9yeSAmYW1wOyBwZXJmb3JtYW5jZSByZWFzb25zCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBwdWJsaXNoZXIKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHVibGlzaGVyCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUHVibGlzaGVyRGVsZWdhdGUmbHQ7L3NhbXAmZ3Q7LgotUHVibGlzaCBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUHVibGlzaGVyRGVsZWdhdGU6Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3JkZXIiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gaW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUgb3JkZXIgdGhhdCB0aGUgcHVibGlzaGVyIGlzIHByb2Nlc3NlZC4gaWYgdGhlIHZhbHVlIGlzIGxlc3MgdGhhbiAwIGl0IHdpbGwgYmUgcHJvY2Vzc2VkIGJlZm9yZSBjYWxsaW5nIHRoZSBzZXJ2ZXIgYmVoYXZpb3VyIGRlbGVnYXRlJmFwb3M7cyBwdWJsaXNoaW5nIG1ldGhvZHMsIGFuZCBtYXkgbW9kaWZ5IHRoZSB3b3Jrc3BhY2UuIGlmIHRoZSB2YWx1ZSBpcyBtb3JlIHRoYW4gMCwgaXQgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHNlcnZlciBiZWhhdmlvdXIgZGVsZWdhdGUmYXBvcztzIHB1Ymxpc2hpbmcgbWV0aG9kcyBhbmQgbWF5IG5vdCBtb2RpZnkgdGhlIHdvcmtzcGFjZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAzLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgcHVibGlzaGVyIGV4dGVuc2lvbiBwb2ludDoKLQotJmx0O3ByZSZndDsKLQotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5QdWJsaXNoZXJEZWxlZ2F0ZSZsdDsvY29kZSZndDsuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1ZDRlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJydW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlcnMiIG5hbWU9IlJ1bnRpbWUgRmFjZXQgQ29tcG9uZW50IFByb3ZpZGVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgZXhwZXJpbWVudGFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgZG93bnN0cmVhbSBjb21wb25lbnRzLgotVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBwcm92aWRlIG5ldyBydW50aW1lIGNvbXBvbmVudHMgdG8gYW4gZXhpc3RpbmcgZmFjZXQgcnVudGltZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVudGltZUNvbXBvbmVudFByb3ZpZGVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icnVudGltZUNvbXBvbmVudFByb3ZpZGVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bnRpbWVUeXBlSWRzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcnVudGltZSB0eXBlIGlkcyB0aGF0IHRoaXMgcHJvdmlkZXIgbWF5IHN1cHBvcnQuIFVzZWQgZm9yIG1lbW9yeSAmYW1wOyBwZXJmb3JtYW5jZSByZWFzb25zCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O3NhbXAmZ3Q7UnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUmbHQ7L3NhbXAmZ3Q7LgotUnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aWxsIGRlbGVnYXRlIHRvIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDIuMC4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHJ1bnRpbWUgY29tcG9uZW50IHByb3ZpZGVyIGV4dGVuc2lvbiBwb2ludDoKLQotJmx0O3ByZSZndDsKLSAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJzJnF1b3Q7Jmd0OwotICAgICAmbHQ7cnVudGltZUNvbXBvbmVudFByb3ZpZGVyCi0gICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWVDb21wb25lbnRQcm92aWRlciZxdW90OwotICAgICAgICBydW50aW1lVHlwZUlkcz0mcXVvdDtjb20uZXhhbXBsZS5ydW50aW1lLCBjb20uZXhhbXBsZTIuKiZxdW90OwotICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlUnVudGltZUNvbXBvbmVudFByb3ZpZGVyJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O2ImZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlJ1bnRpbWVGYWNldENsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUmbHQ7L2ImZ3Q7IGFuZCBjb250YWlucyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZUxvY2F0b3JzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZUxvY2F0b3JzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYWQxN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVMb2NhdG9ycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJydW50aW1lTG9jYXRvcnMiIG5hbWU9IlJ1bnRpbWUgTG9jYXRvcnMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBsb2NhdGUgbmV3IHJ1bnRpbWVzIG9uIHRoZSBsb2NhbCBtYWNoaW5lLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVudGltZUxvY2F0b3IiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InJ1bnRpbWVMb2NhdG9yIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtzYW1wJmd0O1J1bnRpbWVMb2NhdG9yRGVsZWdhdGUmbHQ7L3NhbXAmZ3Q7Lg0KLVJ1bnRpbWUgbG9jYXRvciBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZUxvY2F0b3JEZWxlZ2F0ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlSWRzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcnVudGltZSB0eXBlIGlkcy4gTWF5IGluY2x1ZGUgd2lsZGNhcmRzICgqKSBhdCB0aGUgZW5kIG9mIGFuIGlkDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBydW50aW1lIGxvY2F0b3IgZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbiANCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucnVudGltZUxvY2F0b3JzJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtydW50aW1lTG9jYXRvcg0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLmxvY2F0b3ImcXVvdDsNCi0gICAgICAgICAgICBuYW1lPSZxdW90OyVydW50aW1lTG9jYXRvck5hbWUmcXVvdDsNCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDslcnVudGltZUxvY2F0b3JEZXNjcmlwdGlvbiZxdW90Ow0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVSdW50aW1lTG9jYXRvciZxdW90Oy8mZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVMb2NhdG9yRGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7IGFuZCBjb250YWlucyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZU1vZHVsZVR5cGUuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lTW9kdWxlVHlwZS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTdhYzlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lTW9kdWxlVHlwZS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJydW50aW1lTW9kdWxlVHlwZSIgbmFtZT0iUnVudGltZSBNb2R1bGUgdHlwZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHByb3ZpZGUgYSBzdXBwb3J0ZWQgTW9kdWxlVHlwZSBmb3IgYSBSdW50aW1lCi0KLSZsdDtiJmd0O1Byb3Zpc2lvbmFsIEFQSTombHQ7L2ImZ3Q7Ci1UaGlzIGNsYXNzL2ludGVyZmFjZS9leHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1bnRpbWVNb2R1bGVUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJ1bnRpbWVNb2R1bGVUeXBlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibW9kdWxlVHlwZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icnVudGltZVR5cGVzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcnVudGltZVR5cGVzIHRoYXQgc3VwcG9ydHMgdGhpcyBtb2R1bGUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibW9kdWxlVHlwZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGVzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIG1vZHVsZSB0eXBlcyB0aGF0IHRoaXMgcnVudGltZSBzdXBwb3J0cwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb25zIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIG1vZHVsZSB2ZXJzaW9ucyB0aGF0IHRoaXMgcnVudGltZSBzdXBwb3J0cwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAzLjIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlpbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZVRhcmdldEhhbmRsZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZVRhcmdldEhhbmRsZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OGZhODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVUYXJnZXRIYW5kbGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJydW50aW1lVHlwZXMiIG5hbWU9IlJ1bnRpbWUgVHlwZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBwcm92aWRlIGEgbmV3IHJ1bnRpbWUgdGFyZ2V0IGhhbmRsZXIuIFJ1bnRpbWUgdGFyZ2V0IGhhbmRsZXJzIGFyZSBjYWxsZWQgd2hlbmV2ZXIgYSBydW50aW1lIHRhcmdldCBpcyBhZGRlZCBvciByZW1vdmVkIGZyb20gYSBwcm9qZWN0LiBUaGV5IGNhbiBiZSB1c2VkIHRvIHN3aXRjaCBKYXZhIGNsYXNzcGF0aHMsIHNldHVwIGRlZmF1bHQgcmVzb3VyY2VzLCBldGMuDQotDQotVGhpcyBleHRlbnNpb24gcG9pbnQgYXMgd2VsbCBhcyB0aGUgY2xhc3NlcyByZXF1aXJlZCB0byBpbXBsZW1lbnQgaXQgYXJlIGRlcHJlY2F0ZWQgZHVlIHRvIHRoZSBhZGRpdGlvbiBvZiBmYWNldHMgaW4gV1RQIDEuMC4gSWYgeW91IHdlcmUgdXNpbmcgdGhpcyBleHRlbnNpb24gcG9pbnQgZm9yIGNsYXNzcGF0aCB0aGVuIHlvdSBjYW4gdXNlIHRoZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyBleHRlbnNpb24gcG9pbnQgaW5zdGVhZC4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1bnRpbWVUYXJnZXRIYW5kbGVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJydW50aW1lVGFyZ2V0SGFuZGxlciI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIgZGVwcmVjYXRlZD0idHJ1ZSIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bnRpbWVUeXBlSWRzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcnVudGltZSB0eXBlIGlkcyB0aGF0IHRoaXMgaGFuZGxlciBtYXkgc3VwcG9ydC4gVXNlZCBmb3IgbWVtb3J5ICZhbXA7IHBlcmZvcm1hbmNlIHJlYXNvbnMNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O3NhbXAmZ3Q7UnVudGltZVRhcmdldEhhbmRsZXJEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuDQotUnVudGltZSB0YXJnZXQgaGFuZGxlciBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZVRhcmdldEhhbmRsZXJEZWxlZ2F0ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcmRlciIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBpbnRlZ2VyIG9yZGVyIHVzZWQgdG8gc29ydCBoYW5kbGVycyByZWxhdGl2ZSB0byBlYWNoIG90aGVyDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBydW50aW1lIHRhcmdldCBoYW5kbGVyIGV4dGVuc2lvbiBwb2ludDoNCi0NCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24gDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVUYXJnZXRIYW5kbGVycyZxdW90OyZndDsNCi0gICAgICAmbHQ7cnVudGltZVRhcmdldEhhbmRsZXINCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZS5ydW50aW1lVGFyZ2V0SGFuZGxlciZxdW90Ow0KLSAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWRzPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWUsIGNvbS5leGFtcGxlMi4qJnF1b3Q7DQotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuRXhhbXBsZVJ1bnRpbWVUYXJnZXRIYW5kbGVyJnF1b3Q7LyZndDsNCi0gICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVUYXJnZXRIYW5kbGVyRGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7IGFuZCBjb250YWlucyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZVR5cGVzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZVR5cGVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZGQ1OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVUeXBlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9InJ1bnRpbWVUeXBlcyIgbmFtZT0iUnVudGltZSBUeXBlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHByb3ZpZGUgYSBuZXcgcnVudGltZSB0eXBlLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVudGltZVR5cGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InJ1bnRpbWVUeXBlIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1vZHVsZVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBydW50aW1lIHR5cGUNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcnVudGltZSB0eXBlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVuZG9yIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIHZlbmRvciBuYW1lDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgdmVyc2lvbiBudW1iZXINCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVuZG9ySWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gaWQgdXNlZCB0byBpZGVudGlmeSB0aGUgdmVuZG9yDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtzYW1wJmd0O1J1bnRpbWVEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuDQotUnVudGltZSBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuIERlbGVnYXRlcyBtdXN0IGFsc28gaGF2ZSBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lRGVsZWdhdGUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjZXRSdW50aW1lQ29tcG9uZW50IiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWNldFJ1bnRpbWVWZXJzaW9uIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ibW9kdWxlVHlwZSI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZXMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB0aGUgbW9kdWxlIHR5cGVzIHRoYXQgdGhpcyBydW50aW1lIHN1cHBvcnRzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb25zIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIG1vZHVsZSB2ZXJzaW9ucyB0aGF0IHRoaXMgcnVudGltZSBzdXBwb3J0cw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgcnVudGltZSB0eXBlIGV4dGVuc2lvbiBwb2ludDoNCi0NCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24gDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlcyZxdW90OyZndDsNCi0gICAgICAmbHQ7cnVudGltZVR5cGUNCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZS5ydW50aW1lJnF1b3Q7DQotICAgICAgICAgICAgbmFtZT0mcXVvdDslcnVudGltZVR5cGVOYW1lJnF1b3Q7DQotICAgICAgICAgICAgZGVzY3JpcHRpb249JnF1b3Q7JXJ1bnRpbWVUeXBlRGVzY3JpcHRpb24mcXVvdDsNCi0gICAgICAgICAgICB2ZW5kb3I9JnF1b3Q7JXJ1bnRpbWVUeXBlVmVuZG9yJnF1b3Q7DQotICAgICAgICAgICAgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsNCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlUnVudGltZURlbGVnYXRlJnF1b3Q7Jmd0Ow0KLSAgICAgICAgICZsdDttb2R1bGVUeXBlDQotICAgICAgICAgICAgICAgdHlwZXM9JnF1b3Q7ajJlZS53ZWImcXVvdDsNCi0gICAgICAgICAgICAgICB2ZXJzaW9ucz0mcXVvdDsxLjIsIDEuMywgMS40JnF1b3Q7LyZndDsNCi0gICAgICAmbHQ7L3J1bnRpbWVUeXBlJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lRGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7IGFuZCBjb250YWlucyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9zYXZlRWRpdG9yUHJvbXB0ZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9zYXZlRWRpdG9yUHJvbXB0ZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVhZmJiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvc2F2ZUVkaXRvclByb21wdGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9InNhdmVFZGl0b3JQcm9tcHRlciIgbmFtZT0iJXNhdmVFZGl0b3JQcm9tcHRlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGlzIGFuIGludGVybmFsIGV4dGVuc2lvbiBwb2ludCB0aGF0IHNob3VsZCBvbmx5IGJlIGFkb3B0ZWQgYnkgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLiBJdCBpcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBjb250cm9sIHRvIHRoZSBVSSBhbmQgc2F2ZSBhbGwgdGhlIGVkaXRvcnMgYXJlIG9wZW4gYmVmb3JlIGNvbnRpbnVpbmcKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNhdmVFZGl0b3JQcm9tcHRlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzYXZlRWRpdG9yUHJvbXB0ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TYXZlRWRpdG9yUHJvbXB0ZXI6Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlpbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvc2VydmVyTG9jYXRvcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9zZXJ2ZXJMb2NhdG9ycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmRiMWNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9zZXJ2ZXJMb2NhdG9ycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiBpZD0ic2VydmVyTG9jYXRvcnMiIG5hbWU9IlNlcnZlciBMb2NhdG9ycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGxvY2F0ZSBuZXcgc2VydmVycyBvbiB0aGUgbG9jYWwgb3IgcmVtb3RlIG1hY2hpbmVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZXJ2ZXJMb2NhdG9yIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic2VydmVyTG9jYXRvciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtTZXJ2ZXJMb2NhdG9yRGVsZWdhdGUmbHQ7L3NhbXAmZ3Q7LgotU2VydmVyIGxvY2F0b3IgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aWxsIGRlbGVnYXRlIHRvIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN1cHBvcnRzUmVtb3RlSG9zdHMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdHJ1ZSBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIHJlbW90ZSBzZXJ2ZXIgc3VwcG9ydCwgYW5kIGZhbHNlIGlmIG9ubHkgbG9jYWwgc2VydmVycyBhcmUgc3VwcG9ydGVkCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZUlkcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHNlcnZlciB0eXBlIGlkcy4gTWF5IGluY2x1ZGUgd2lsZGNhcmRzICgqKSBhdCB0aGUgZW5kIG9mIGFuIGlkCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBzZXJ2ZXIgbG9jYXRvciBleHRlbnNpb24gcG9pbnQ6Ci0KLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIAotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnNlcnZlckxvY2F0b3JzJnF1b3Q7Jmd0OwotICAgICAgJmx0O3NlcnZlckxvY2F0b3IKLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLmxvY2F0b3ImcXVvdDsKLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7JXNlcnZlckxvY2F0b3JOYW1lJnF1b3Q7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDslc2VydmVyTG9jYXRvckRlc2NyaXB0aW9uJnF1b3Q7Ci0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlU2VydmVyTG9jYXRvciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgJmx0O2ImZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlNlcnZlckxvY2F0b3JEZWxlZ2F0ZSZsdDsvYiZndDsuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvc2VydmVyTW9uaXRvcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9zZXJ2ZXJNb25pdG9ycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjkzMGFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9zZXJ2ZXJNb25pdG9ycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJpbnRlcm5hbFNlcnZlck1vbml0b3IiIG5hbWU9IlNlcnZlciBNb25pdG9yIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBhIG5ldyBtb25pdG9yIGZvciBzZXJ2ZXJzLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibW9uaXRvciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ibW9uaXRvciI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgbW9uaXRvcg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoaXMgbW9uaXRvcg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJNb25pdG9yRGVsZWdhdGUmbHQ7L3NhbXAmZ3Q7DQotDQotVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJNb25pdG9yRGVsZWdhdGUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHNlcnZlciBtb25pdG9yIGV4dGVuc2lvbiBwb2ludDoNCi0NCi0mbHQ7cHJlJmd0Ow0KLQ0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlck1vbml0b3JEZWxlZ2F0ZSZsdDsvY29kZSZndDsuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3NlcnZlclR5cGVzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvc2VydmVyVHlwZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJmZjY1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvc2VydmVyVHlwZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiBpZD0ic2VydmVyVHlwZXMiIG5hbWU9IlNlcnZlciBUeXBlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgYSBuZXcgc2VydmVyIHR5cGUuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZXJ2ZXJUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJzZXJ2ZXJUeXBlIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzZXJ2ZXIgdHlwZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGlzIHNlcnZlciB0eXBlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcyBzZXJ2ZXIgdHlwZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuDQotU2VydmVyIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2lsbCBkZWxlZ2F0ZSB0byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4gRGVsZWdhdGVzIG11c3QgYWxzbyBoYXZlIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyRGVsZWdhdGUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYmVoYXZpb3VyQ2xhc3MiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckJlaGF2aW91ckRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4NCi1TZXJ2ZXIgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aWxsIGRlbGVnYXRlIHRvIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLiBEZWxlZ2F0ZXMgbXVzdCBhbHNvIGhhdmUgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3INCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJoYXNDb25maWd1cmF0aW9uIiB0eXBlPSJib29sZWFuIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICB0cnVlIGlmIHRoaXMgc2VydmVyIGhhcyBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlcw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJydW50aW1lVHlwZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRoZSBydW50aW1lIHR5cGUgaWQgdGhhdCB0aGlzIHNlcnZlciB0eXBlIGNvcnJlc3BvbmRzIHRvDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhdW5jaENvbmZpZ0lkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBpZCBmb3IgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIHRoYXQgaXMgYWJsZSB0byBzdGFydCB0aGlzIHNlcnZlcg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdXBwb3J0c1JlbW90ZUhvc3RzIiB0eXBlPSJib29sZWFuIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICB0cnVlIGlmIHRoaXMgc2VydmVyIHR5cGUgY2FuIHdvcmsgd2l0aCByZW1vdGUgaG9zdCBuYW1lcywgZmFsc2UgaWYgdGhpcyBzZXJ2ZXIgdHlwZSBjYW4gb25seSB3b3JrIG9uIGxvY2FsaG9zdC4gaWYgdW5zcGVjaWZpZWQsIGZhbHNlIGlzIGFzc3VtZWQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icnVudGltZSIgdHlwZT0iYm9vbGVhbiI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgdHJ1ZSBpZiB0aGlzIHNlcnZlciByZXF1aXJlcyBhIHJ1bnRpbWUsIGFuZCBmYWxzZSBvdGhlcndpc2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGF1bmNoTW9kZXMiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB0aGUgbGF1bmNoIG1vZGVzIHRoYXQgdGhpcyBzZXJ2ZXIgc3VwcG9ydHMNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbFN0YXRlIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRoZSBpbnRpYWwgc3RhdGUgb2YgdGhlIHNlcnZlciwgZWl0aGVyICZxdW90O3N0YXJ0ZWQmcXVvdDssIG9yICZxdW90O3N0b3BwZWQmcXVvdDsuIGlmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBzZXJ2ZXIgc3RhdGUgd2lsbCBiZSAmcXVvdDt1bmtub3duJnF1b3Q7DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN0YXJ0VGltZW91dCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICB0aGUgdGltZW91dCB2YWx1ZSAoaW4gbXMpIHRoYXQgdGhlIHRvb2wgd2lsbCB3YWl0IGZvciB0aGUgc2VydmVyIHRvIGJlIHN0YXJ0ZWQuIFRoZSBkZWZhdWx0IGlzIDIgbWludXRlcw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdG9wVGltZW91dCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICB0aGUgdGltZW91dCB2YWx1ZSAoaW4gbXMpIHRoYXQgdGhlIHRvb2wgd2lsbCB3YWl0IGZvciB0aGUgc2VydmVyIHRvIGJlIHN0b3BwZWQuIFRoZSBkZWZhdWx0IGlzIDIgbWludXRlcw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdGFydEJlZm9yZVB1Ymxpc2giIHR5cGU9ImJvb2xlYW4iPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdmFsdWUgJnF1b3Q7dHJ1ZSZxdW90OyBvciAmcXVvdDtmYWxzZSZxdW90OyB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIHNlcnZlciBuZWVkcyB0byBiZSBzdGFydGVkIGZvciBwdWJsaXNoaW5nIHRvIG9jY3VyLiBJZiAmcXVvdDt0cnVlJnF1b3Q7LCB0aGUgc2VydmVyIHdpbGwgYmUgc3RhcnRlZCBvbiBldmVyeSBjYWxsIHRvIHB1Ymxpc2goKSBiZWZvcmUgZXhlY3V0aW5nIHRoZSBwdWJsaXNoIGNvZGUNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHNlcnZlciB0eXBlIGV4dGVuc2lvbiBwb2ludDoNCi0NCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24gDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnNlcnZlclR5cGVzJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtzZXJ2ZXJUeXBlDQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUuc2VydmVyVHlwZSZxdW90Ow0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7JXNlcnZlclR5cGVOYW1lJnF1b3Q7DQotICAgICAgICAgICAgZGVzY3JpcHRpb249JnF1b3Q7JXNlcnZlclR5cGVEZXNjcmlwdGlvbiZxdW90Ow0KLSAgICAgICAgICAgIHN1cHBvcnRzUmVtb3RlSG9zdHM9JnF1b3Q7dHJ1ZSZxdW90Ow0KLSAgICAgICAgICAgIHJ1bnRpbWU9JnF1b3Q7dHJ1ZSZxdW90Ow0KLSAgICAgICAgICAgIGluaXRpYWxTdGF0ZT0mcXVvdDtzdG9wcGVkJnF1b3Q7DQotICAgICAgICAgICAgaGFzQ29uZmlndXJhdGlvbj0mcXVvdDt0cnVlJnF1b3Q7DQotICAgICAgICAgICAgbGF1bmNoQ29uZmlnSWQ9JnF1b3Q7Y29tLmV4YW1wbGUubGF1bmNoQ29uZmlndXJhdGlvblR5cGUmcXVvdDsNCi0gICAgICAgICAgICBydW50aW1lVHlwZUlkPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWUmcXVvdDsNCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlU2VydmVyRGVsZWdhdGUmcXVvdDsNCi0gICAgICAgICAgICBiZWhhdmlvdXJDbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUmcXVvdDsvJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBhYnN0cmFjdCBjbGFzcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyRGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7IGFuZCBoYXMgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuDQotDQotVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtiZWhhdmlvdXJDbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIGFic3RyYWN0IGNsYXNzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSZsdDsvY29kZSZndDsgYW5kIGhhcyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvc3RhcnR1cC5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3N0YXJ0dXAuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmViNjlmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvc3RhcnR1cC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJpbnRlcm5hbFN0YXJ0dXAiIG5hbWU9IlN0YXJ0dXAiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXMgYSB3YXkgdG8gaW52b2tlIGNvZGUgZHVyaW5nIHRoZSBzZXJ2ZXIgY29yZSBwbHVnaW4gc3RhcnR1cC4gVXNlIHNwYXJpbmdseS4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InN0YXJ0dXAiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InN0YXJ0dXAiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSVN0YXJ0dXAmbHQ7L3NhbXAmZ3Q7Lg0KLQ0KLVRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSVN0YXJ0dXAiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHN0YXJ0dXAgZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbiANCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuc3RhcnR1cCZxdW90OyZndDsNCi0gICAgICAmbHQ7c3RhcnR1cA0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLnN0YXJ0dXAmcXVvdDsNCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlU3RhcnR1cCZxdW90Oy8mZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklTdGFydHVwJmx0Oy9jb2RlJmd0OyBhbmQgY29udGFpbnMgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSU1vZHVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSU1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjUxZTg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIEEgbW9kdWxlIGlzIGEgdW5pdCBvZiAiY29udGVudCIgdGhhdCBjYW4gYmUgcHVibGlzaGVkIHRvIGEKLSAqIHNlcnZlci4KLSAqIDxwPgotICogQWxsIG1vZHVsZXMgaGF2ZSBhIG1vZHVsZSB0eXBlLCB3aGljaCBpcyBmaXhlZCBmb3IgdGhlCi0gKiBsaWZldGltZSBvZiB0aGUgbW9kdWxlLiBUaGUgc2V0IG9mIG1vZHVsZSB0eXBlcyAob3IKLSAqICJraW5kcyIpIGlzIG9wZW4tZW5kZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEFsbCBtb2R1bGVzIGFyZSBjcmVhdGVkIGJ5IG1vZHVsZSBmYWN0b3JpZXMgdXNpbmcgdGhlIG1vZHVsZUZhY3RvcmllcwotICogZXh0ZW5zaW9uIHBvaW50LgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgY29udGVudCBvZiBhIG1vZHVsZSBpcyBhIGNvbGxlY3Rpb24gb2YgZmlsZSBhbmQgZm9sZGVyCi0gKiByZXNvdXJjZXMgaW4gdGhlIHdvcmtzcGFjZS4KLSAqIDwvcD4KLSAqIDxwPgotICogSW4gcHJpbmNpcGxlLCBhIG1vZHVsZSBleGlzdHMgaW5kZXBlbmRlbnQgb2YgYW55Ci0gKiBwYXJ0aWN1bGFyIHNlcnZlci4gVGhlIHNhbWUgbW9kdWxlIGluc3RhbmNlIGNhbiBiZSBhc3NvY2lhdGVkCi0gKiB3aXRoIG11bHRpcGxlIHNlcnZlciBpbnN0YW5jZXMgYXQgdGhlIHNhbWUgdGltZS4gVGhhdCBpcwotICogd2h5IHlvdSBjYW5ub3QgYXNrIHRoZSBtb2R1bGUgd2hpY2ggc2VydmVyIGl0J3MgYXNzb2NpYXRlZAotICogd2l0aC4KLSAqIDwvcD4KLSAqIDxwPgotICogQSBtb2R1bGUgaXMgZXF1YWwgdG8gYW5vdGhlciBtb2R1bGUgd2hlbmV2ZXIgdGhlIHR3byBpZHMgYXJlIGVxdWFsIGFuZCB0aGUKLSAqIChvcHRpb25hbCkgcHJvamVjdCBhdHRyaWJ1dGUgaXMgZXF1YWwuCi0gKiA8L3A+Ci0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKiAKLSAqIEBub2ltcGxlbWVudAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGUgZXh0ZW5kcyBJQWRhcHRhYmxlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIG1vZHVsZS4KLQkgKiBFYWNoIG1vZHVsZSBoYXMgYSBkaXN0aW5jdCBpZCwgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGlzCi0JICogbW9kdWxlIGZyb20gYWxsIG90aGVyIG1vZHVsZXMgaW4gdGhlIHdvcmtzcGFjZSAoYW5kCi0JICogd2l0aGluIGEgc2VydmVyKS4gSWRzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkKLQkgKiBhcyBrZXlzOyB0aGV5IGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgc2hvd24gdG8gZW5kIHVzZXJzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIG5hbWUgZm9yIHRoaXMgbW9kdWxlLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIG5hbWUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBtb2R1bGUuCi0JICogCi0JICogQHJldHVybiB0aGUgbW9kdWxlIHR5cGUKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVR5cGUgZ2V0TW9kdWxlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya2JlbmNoIHByb2plY3QgdGhhdCB0aGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4sCi0JICogb3IgbnVsbCBpZiB0aGUgbW9kdWxlIGlzIG91dHNpZGUgb2YgdGhlIHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcHJvamVjdAotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb2R1bGUgaXMgYW4gZXh0ZXJuYWwgKG5vbi13b3Jrc3BhY2UpIG1vZHVsZSwKLQkgKiBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vZHVsZSBpcyBhbiBleHRlcm5hbCBtb2R1bGUsCi0JICogICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vZHVsZSBleGlzdHMgKGUuZy4gaXMgaW4gdGhlIHdvcmtzcGFjZSkKLQkgKiBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZSAoZS5nLiBpZiB0aGUgbW9kdWxlIGhhcyBiZWVuIGRlbGV0ZWQpLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vZHVsZSBleGlzdHMsCi0JICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAc2luY2UgMS4xCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIG9iamVjdCB3aGljaCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MKLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiBubyBzdWNoIG9iamVjdCBjYW4gYmUgZm91bmQsIG9yIGlmIHRoZSBkZWxlZ2F0ZSBpcyBub3QKLQkgKiBsb2FkZWQuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgd2lsbCBub3QgY2hlY2sgdGhlIGRlbGVnYXRlIGNsYXNzZXMgZm9yIGFkYXB0aW5nCi0JICogdW5sZXNzIHRoZXkgYXJlIGFscmVhZHkgbG9hZGVkLiBObyBwbHVnaW4gbG9hZGluZyB3aWxsIG9jY3VyCi0JICogd2hlbiBjYWxsaW5nIHRoaXMgbWV0aG9kLiBJdCBpcyBzdWl0YWJsZSBmb3IgcG9wdXAgbWVudXMgYW5kCi0JICogb3RoZXIgVUkgYXJ0aWZhY3RzIHdoZXJlIHBlcmZvcm1hbmNlIGlzIGEgY29uY2Vybi4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gYWRhcHRlciB0aGUgYWRhcHRlciBjbGFzcyB0byBsb29rIHVwCi0JICogQHJldHVybiBhIG9iamVjdCBjYXN0YWJsZSB0byB0aGUgZ2l2ZW4gY2xhc3MsIAotCSAqICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgb2JqZWN0IGRvZXMgbm90Ci0JICogICAgaGF2ZSBhbiBhZGFwdGVyIGZvciB0aGUgZ2l2ZW4gY2xhc3MKLQkgKiBAc2VlIElBZGFwdGFibGUjZ2V0QWRhcHRlcihDbGFzcykKLQkgKiBAc2VlICNsb2FkQWRhcHRlcihDbGFzcywgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIG9iamVjdCB3aGljaCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MKLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gb25seSBpZgotCSAqIG5vIHN1Y2ggb2JqZWN0IGNhbiBiZSBmb3VuZCBhZnRlciBsb2FkaW5nIGFuZCBpbml0aWFsaXppbmcKLQkgKiBkZWxlZ2F0ZXMuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgd2lsbCBmb3JjZSBhIGxvYWQgYW5kIGluaXRpYWxpemF0aW9uIG9mIGFsbCBkZWxlZ2F0ZQotCSAqIGNsYXNzZXMgYW5kIGNoZWNrIHRoZW0gZm9yIGFkYXB0aW5nLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhZGFwdGVyIHRoZSBhZGFwdGVyIGNsYXNzIHRvIGxvb2sgdXAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIG9iamVjdCBjYXN0YWJsZSB0byB0aGUgZ2l2ZW4gY2xhc3MsIAotCSAqICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgb2JqZWN0IGRvZXMgbm90Ci0JICogICAgaGF2ZSBhbiBhZGFwdGVyIGZvciB0aGUgZ2l2ZW4gY2xhc3MKLQkgKiBAc2VlICNnZXRBZGFwdGVyKENsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgbG9hZEFkYXB0ZXIoQ2xhc3MgYWRhcHRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JTW9kdWxlQXJ0aWZhY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lNb2R1bGVBcnRpZmFjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzkxMzk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lNb2R1bGVBcnRpZmFjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0vKioKLSAqIEEgbW9kdWxlIGFydGlmYWN0IGlzIGEgcmVzb3VyY2Ugd2l0aGluIGEgbW9kdWxlLCB3aGljaCBjYW4gYmUgbGF1bmNoZWQKLSAqIG9uIHRoZSBzZXJ2ZXIuIEV4YW1wbGVzIG9mIG1vZHVsZSBhcnRpZmFjdHMgYXJlIHNlcnZsZXRzLCBIVE1MIHBhZ2VzLAotICogb3IgRUpCIGJlYW5zLgotICogPHA+Ci0gKiBPYmplY3RzIHRoYXQgcHJvdmlkZSBhbiBhZGFwdGVyIG9mIHRoaXMgdHlwZSB3aWxsIGJlIGNvbnNpZGVyZWQgYnkgdGhlCi0gKiBjb250ZXh0dWFsIFJ1biBvbiBTZXJ2ZXIgbGF1bmNoIHN1cHBvcnQuIAotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVBcnRpZmFjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIHRoYXQgdGhpcyBhcnRpZmFjdCBpcyBhIHBhcnQgb2YuCi0JICogCi0JICogQHJldHVybiB0aGUgbW9kdWxlIHRoYXQgdGhpcyBhcnRpZmFjdCBpcyBjb250YWluZWQgaW4KLQkgKi8KLQlwdWJsaWMgSU1vZHVsZSBnZXRNb2R1bGUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JTW9kdWxlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSU1vZHVsZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4MDBiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JTW9kdWxlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0vKioKLSAqIFJlcHJlc2VudHMgdGhlIHR5cGUgb2YgYSBtb2R1bGUuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZHVsZVR5cGUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSB0eXBlIGlkLgotCSAqIDxwPgotCSAqIFRoZSBtb2R1bGUgdHlwZSBpZCBpcyBhICIuIiBzZXBhcmF0ZWQgc3RyaW5nIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoZQotCSAqIHR5cGUgb2YgbW9kdWxlLiBMaWtlIGEgamF2YSBwYWNrYWdlIG5hbWUsIGl0IHNob3VsZCBzY29wZSB0aGUgdHlwZSBmcm9tCi0JICogbW9zdCBnZW5lcmFsIHRvIHNwZWNpZmljLiBGb3IgaW5zdGFuY2UsICJqc3Qud2ViIi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgbW9kdWxlIHR5cGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIG1vZHVsZSB0eXBlLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIG5hbWUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBtb2R1bGUgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmVyc2lvbiAoc3BlY2lmaWNhdGlvbiBsZXZlbCkgb2YgdGhpcyBtb2R1bGUgdHlwZSwKLQkgKiBlLmcuICIxLjAiIG9yICIxLjMuMmEiLgotCSAqIDxwPgotCSAqIFRoZSB2ZXJzaW9uIHdpbGwgbm9ybWFsbHkgYmUgYSBzZXJpZXMgb2YgbnVtYmVycyBzZXBhcmF0ZWQgYnkKLQkgKiAiLiIsIGJ1dCBpdCBjb3VsZCBiZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIG1vZHVsZS4KLQkgKiBGb3IgbW9kdWxlIHR5cGVzIHdoZXJlIGEgdmVyc2lvbiBkb2VzIG5vdCBtYWtlIHNlbnNlIChlLmcuCi0JICogYSBzdGF0aWMgV2ViIG1vZHVsZSksIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzcGVjaWZpY2F0aW9uIHZlcnNpb24gb2YgdGhpcyBtb2R1bGUgdHlwZSwgb3IKLQkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyB2ZXJzaW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lQcm9qZWN0UHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVByb2plY3RQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZGJlZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVByb2plY3RQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaG9sZHMgaW5mb3JtYXRpb24gb24gdGhlIHByb3BlcnRpZXMgb2YgYSBnaXZlbiBwcm9qZWN0LgotICoKLSAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLjwvcD4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIAotICogQGRlcHJlY2F0ZWQgUHJvamVjdCBmYWNldCBzdXBwb3J0IHNob3VsZCBub3cgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoaXMgQVBJLiBAc2VlCi0gKiAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QjZ2V0UnVudGltZSgpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2plY3RQcm9wZXJ0aWVzIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJ1bnRpbWUgdGFyZ2V0IGZvciB0aGlzIHByb2plY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBydW50aW1lIHRhcmdldCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByb2plY3QgaGFzCi0JICogICAgbm8gcnVudGltZSB0YXJnZXQKLQkgKiBAZGVwcmVjYXRlZCBQcm9qZWN0IGZhY2V0IHN1cHBvcnQgc2hvdWxkIG5vdyBiZSB1c2VkIGluc3RlYWQgb2YgdGhpcyBBUEkuIEBzZWUKLQkgKiAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QjZ2V0UnVudGltZSgpCi0JICovCi0JcHVibGljIElSdW50aW1lIGdldFJ1bnRpbWVUYXJnZXQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUHVibGlzaExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUHVibGlzaExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNTE0ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVB1Ymxpc2hMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotLyoqCi0gKiBBIHB1Ymxpc2ggbGlzdGVuZXIgaXMgdXNlZCB0byBsaXN0ZW4gZm9yIHB1Ymxpc2hpbmcgZXZlbnRzIGZyb20gYSBzZXJ2ZXIuCi0gKiBUaGUgZXZlbnRzIGFyZSB0eXBpY2FsbHkgcmVjZWl2ZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKLSAqIAotICogcHVibGlzaFN0YXJ0ZWQoKSAtIFRoZSBwdWJsaXNoIG9wZXJhdGlvbiBpcyBzdGFydGluZwotICogICBwdWJsaXNoTW9kdWxlU3RhcnRlZCgpIC0gVGhpcyBzZWN0aW9uIGlzIGZpcmVkIGZvciBlYWNoIG1vZHVsZSBpbiB0aGUgc2VydmVyCi0gKiAgIHB1Ymxpc2hNb2R1bGVGaW5pc2hlZCgpIC0gVGhpcyBtb2R1bGUgaXMgZmluaXNoZWQgcHVibGlzaGluZwotICogICBwdWJsaXNoTW9kdWxlU3RhcnRlZCgpIC0gVGhlIG5leHQgbW9kdWxlIGlzIHB1Ymxpc2hpbmcKLSAqICAgLi4uCi0gKiBwdWJsaXNoRmluaXNoZWQoKSAtIFRoZSBwdWJsaXNoIG9wZXJhdGlvbiBpcyBmaW5pc2hlZAotICogPHA+Ci0gKiBQdWJsaXNoIGxpc3RlbmVycyBhcmUgYWRkZWQgdG8gYSBzZXJ2ZXIgdmlhIElTZXJ2ZXIuYWRkUHVibGlzaExpc3RlbmVyKCkuCi0gKiA8L3A+Ci0gKiBAc2VlIElTZXJ2ZXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHVibGlzaExpc3RlbmVyIHsKLQkvKioKLQkgKiBGaXJlZCB0byBub3RpZnkgdGhhdCBwdWJsaXNoaW5nIGhhcyBiZWd1bi4KLQkgKgotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlciB0aGF0IHB1Ymxpc2hpbmcgc3RhcnRlZCBvbgotCSAqLwotCXB1YmxpYyB2b2lkIHB1Ymxpc2hTdGFydGVkKElTZXJ2ZXIgc2VydmVyKTsKLQotCS8qKgotCSAqIFB1Ymxpc2hpbmcgaGFzIGZpbmlzaGVkLiBSZXR1cm5zIHRoZSBvdmVyYWxsIHN0YXR1cy4KLQkgKgotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlciB0aGF0IHB1Ymxpc2hpbmcgZmluaXNoZWQgb24KLQkgKiBAcGFyYW0gc3RhdHVzIGluZGljYXRpbmcgd2hhdCAoaWYgYW55dGhpbmcpIHdlbnQgd3JvbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdWJsaXNoRmluaXNoZWQoSVNlcnZlciBzZXJ2ZXIsIElTdGF0dXMgc3RhdHVzKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE4N2M4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0vKioKLSAqIFJlcHJlc2VudHMgYSBydW50aW1lIGluc3RhbmNlLiBFdmVyeSBydW50aW1lIGlzIGFuIGluc3RhbmNlIG9mIGEKLSAqIHBhcnRpY3VsYXIsIGZpeGVkIHJ1bnRpbWUgdHlwZS4KLSAqIDxwPgotICogU2VydmVycyBoYXZlIGEgcnVudGltZS4gVGhlIHNlcnZlciBydW50aW1lIGNvcnJlc3BvbmRzIHRvIHRoZQotICogaW5zdGFsbGVkIGNvZGUgYmFzZSBmb3IgdGhlIHNlcnZlci4gVGhlIG1haW4gcm9sZSBwbGF5ZWQgYnkgdGhlIHNlcnZlcgotICogcnVudGltZSBpcyBpbiBpZGVudGlmeWluZyBjb2RlIGxpYnJhcmllcyB0byBjb21waWxlIG9yIGJ1aWxkIGFnYWluc3QuCi0gKiBJbiB0aGUgY2FzZSBvZiBsb2NhbCBzZXJ2ZXJzLCB0aGUgc2VydmVyIHJ1bnRpbWUgbWF5IHBsYXkgYSBzZWNvbmRhcnkgcm9sZQotICogb2YgYmVpbmcgdXNlZCB0byBsYXVuY2ggdGhlIHNlcnZlciBmb3IgdGVzdGluZy4gSGF2aW5nIHRoZSBzZXJ2ZXIgcnVudGltZXMKLSAqIGlkZW50aWZpZWQgYXMgYW4gZW50aXR5IHNlcGFyYXRlIGZyb20gdGhlIHNlcnZlciBpdHNlbGYgZmFjaWxpdGF0ZXMgc2hhcmluZwotICogc2VydmVyIHJ1bnRpbWVzIGJldHdlZW4gc2V2ZXJhbCBzZXJ2ZXJzLgotICogPC9wPgotICogPHA+Ci0gKiBJUnVudGltZSBpbXBsZW1lbnRzIElBZGFwdGFibGUgdG8gYWxsb3cgdXNlcnMgdG8gb2J0YWluIGEgcnVudGltZS10eXBlLXNwZWNpZmljCi0gKiBjbGFzcy4gQnkgY2FzdGluZyB0aGUgcnVudGltZSBleHRlbnNpb24gdG8gdGhlIHR5cGUgcHJlc2NyaWJlZCBpbiB0aGUgQVBJCi0gKiBkb2N1bWVudGF0aW9uIGZvciB0aGF0IHBhcnRpY3VsYXIgcnVudGltZSB0eXBlLCB0aGUgY2xpZW50IGNhbiBhY2Nlc3MKLSAqIHJ1bnRpbWUtdHlwZS1zcGVjaWZpYyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLiBnZXRBZGFwdGVyKCkgbWF5IGludm9sdmUgcGx1Z2luCi0gKiBsb2FkaW5nLCBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSBwb3B1cCBtZW51cywgZXRjLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgc2VydmVyIGZyYW1ld29yayBtYWludGFpbnMgYSBnbG9iYWwgbGlzdCBvZiBhbGwga25vd24gcnVudGltZSBpbnN0YW5jZXMKLSAqICh7QGxpbmsgU2VydmVyQ29yZSNnZXRSdW50aW1lcygpfSkuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEFsbCBydW50aW1lcyBoYXZlIGEgdW5pcXVlIGlkLiBUd28gcnVudGltZXMgKG9yIG1vcmUgbGlrZWx5IGEgcnVudGltZSBhbmQgaXQncwotICogd29ya2luZyBjb3B5KSB3aXRoIHRoZSBzYW1lIGlkIGFyZSBlcXVhbCwgYW5kIHR3byBydW50aW1lcyB3aXRoIGRpZmZlcmVudCBpZHMKLSAqIGFyZSBuZXZlciBlcXVhbC4KLSAqIDwvcD4KLSAqIDxwPgotICogVHdvIHJ1bnRpbWVzIGFyZSBpZGVudGljYWwgaWYgYW5kIG9ubHkgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGlkLgotICogPC9wPgotICogPHA+VGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuPC9wPgotICogCi0gKiBAc2VlIElSdW50aW1lV29ya2luZ0NvcHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUnVudGltZSBleHRlbmRzIElBZGFwdGFibGUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIG5hbWUgZm9yIHRoaXMgcnVudGltZS4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhpcyBuYW1lIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgcnVudGltZSBpbnN0YW5jZS4KLQkgKiBFYWNoIHJ1bnRpbWUgKG9mIGEgZ2l2ZW4gdHlwZSkgaGFzIGEgZGlzdGluY3QgaWQsIGZpeGVkIGZvcgotCSAqIGl0cyBsaWZldGltZS4gSWRzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkgYXMga2V5czsKLQkgKiB0aGV5IGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgc2hvd24gdG8gZW5kIHVzZXJzLgotCSAqIDxwPgotCSAqIEZvciB0aGUgaWQgb2YgdGhlIHJ1bnRpbWUgdHlwZSwgdXNlIHtAbGluayBJUnVudGltZVR5cGUjZ2V0SWQoKX0KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgcnVudGltZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIHBlcnNpc3RlbnQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBydW50aW1lLgotCSAqIAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW55IGVycm9yIHJlY2VpdmVkIHdoaWxlIGRlbGV0aW5nIHRoZSBydW50aW1lCi0JICogICAgb3IgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGEgd29ya2luZyBjb3B5Ci0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBydW50aW1lIGlzIG1hcmtlZCByZWFkIG9ubHkuCi0JICogV2hlbiBhIHJ1bnRpbWUgaXMgcmVhZCBvbmx5LCB3b3JraW5nIGNvcGllcyBjYW4gYmUgY3JlYXRlZCBidXQKLQkgKiB0aGV5IGNhbm5vdCBiZSBzYXZlZC4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBydW50aW1lIGlzIG1hcmtlZCBhcyByZWFkIG9ubHksCi0JICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIHdvcmtpbmcgY29weS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcnVudGltZSBpcyBhIHdvcmtpbmcgY29weQotCSAqICAgIChjYW4gYmUgY2FzdCB0byBJUnVudGltZVdvcmtpbmdDb3B5KSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV29ya2luZ0NvcHkoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIG9iamVjdCB3aGljaCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MKLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiBubyBzdWNoIG9iamVjdCBjYW4gYmUgZm91bmQsIG9yIGlmIHRoZSBkZWxlZ2F0ZSBpcyBub3QKLQkgKiBsb2FkZWQuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgd2lsbCBub3QgY2hlY2sgdGhlIGRlbGVnYXRlIGNsYXNzZXMgZm9yIGFkYXB0aW5nCi0JICogdW5sZXNzIHRoZXkgYXJlIGFscmVhZHkgbG9hZGVkLiBObyBwbHVnaW4gbG9hZGluZyB3aWxsIG9jY3VyCi0JICogd2hlbiBjYWxsaW5nIHRoaXMgbWV0aG9kLiBJdCBpcyBzdWl0YWJsZSBmb3IgcG9wdXAgbWVudXMgYW5kCi0JICogb3RoZXIgVUkgYXJ0aWZhY3RzIHdoZXJlIHBlcmZvcm1hbmNlIGlzIGEgY29uY2Vybi4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gYWRhcHRlciB0aGUgYWRhcHRlciBjbGFzcyB0byBsb29rIHVwCi0JICogQHJldHVybiBhIG9iamVjdCBjYXN0YWJsZSB0byB0aGUgZ2l2ZW4gY2xhc3MsIAotCSAqICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgb2JqZWN0IGRvZXMgbm90Ci0JICogICAgaGF2ZSBhbiBhZGFwdGVyIGZvciB0aGUgZ2l2ZW4gY2xhc3MKLQkgKiBAc2VlIElBZGFwdGFibGUjZ2V0QWRhcHRlcihDbGFzcykKLQkgKiBAc2VlICNsb2FkQWRhcHRlcihDbGFzcywgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcik7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IG9ubHkgaWYKLQkgKiBubyBzdWNoIG9iamVjdCBjYW4gYmUgZm91bmQgYWZ0ZXIgbG9hZGluZyBhbmQgaW5pdGlhbGl6aW5nCi0JICogZGVsZWdhdGVzLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgZm9yY2UgYSBsb2FkIGFuZCBpbml0aWFsaXphdGlvbiBvZiBhbGwgZGVsZWdhdGUKLQkgKiBjbGFzc2VzIGFuZCBjaGVjayB0aGVtIGZvciBhZGFwdGluZy4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gYWRhcHRlciB0aGUgYWRhcHRlciBjbGFzcyB0byBsb29rIHVwCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBvYmplY3QgY2FzdGFibGUgdG8gdGhlIGdpdmVuIGNsYXNzLCAKLQkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG9iamVjdCBkb2VzIG5vdAotCSAqICAgIGhhdmUgYW4gYWRhcHRlciBmb3IgdGhlIGdpdmVuIGNsYXNzCi0JICogQHNlZSAjZ2V0QWRhcHRlcihDbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGxvYWRBZGFwdGVyKENsYXNzIGFkYXB0ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgcnVudGltZSBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBydW50aW1lIHR5cGUKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVUeXBlIGdldFJ1bnRpbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgcnVudGltZSB3b3JraW5nIGNvcHkgZm9yIG1vZGlmeWluZyB0aGlzIHJ1bnRpbWUgaW5zdGFuY2UuCi0JICogSWYgdGhpcyBpbnN0YW5jZSBpcyBhbHJlYWR5IGEgd29ya2luZyBjb3B5LCBpdCBpcyByZXR1cm5lZC4KLQkgKiBJZiB0aGlzIGluc3RhbmNlIGlzIG5vdCBhIHdvcmtpbmcgY29weSwgYSBuZXcgcnVudGltZSB3b3JraW5nIGNvcHkKLQkgKiBpcyBjcmVhdGVkIHdpdGggdGhlIHNhbWUgaWQgYW5kIGF0dHJpYnV0ZXMuCi0JICogQ2xpZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIHNhdmluZyBvciByZWxlYXNpbmcgdGhlIHdvcmtpbmcgY29weSB3aGVuCi0JICogdGhleSBhcmUgZG9uZSB3aXRoIGl0LgotCSAqIDxwPgotCSAqIFRoZSBydW50aW1lIHdvcmtpbmcgY29weSBpcyByZWxhdGVkIHRvIHRoaXMgcnVudGltZSBpbnN0YW5jZQotCSAqIGluIHRoZSBmb2xsb3dpbmcgd2F5czoKLQkgKiA8cHJlPgotCSAqIHRoaXMuZ2V0V29ya2luZ0NvcHkoKS5nZXRJZCgpID09IHRoaXMuZ2V0SWQoKQotCSAqIHRoaXMuZ2V0V29ya2luZ0NvcHkoKS5nZXRPcmlnaW5hbCgpID09IHRoaXMKLQkgKiA8L3ByZT4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBJUnVudGltZVdvcmtpbmdDb3B5IGV4dGVuZHMgSVJ1bnRpbWUuIAotCSAqIFJ1bnRpbWUuZ2V0V29ya2luZ0NvcHkoKSBjcmVhdGUgYSBuZXcgd29ya2luZyBjb3B5OwotCSAqIFJ1bnRpbWVXb3JraW5nQ29weS5nZXRXb3JraW5nQ29weSgpIHJldHVybnMgdGhpcy4KLQkgKiBUaGlzIG1heSBiZSBjb252ZW5pZW50IGluIGNvZGUgdGhhdCBpcyBpZ25vcmFudCBvZgotCSAqIHdoZXRoZXIgdGhleSBhcmUgZGVhbGluZyB3aXRoIGEgd29ya2luZyBjb3B5IG9yIG5vdC4KLQkgKiBIb3dldmVyLCBpdCBpcyBoYXJkIGZvciBjbGllbnRzIHRvIG1hbmFnZSB3b3JraW5nIGNvcGllcwotCSAqIHdpdGggdGhpcyBkZXNpZ24uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgd29ya2luZyBjb3B5Ci0JICovCi0JcHVibGljIElSdW50aW1lV29ya2luZ0NvcHkgY3JlYXRlV29ya2luZ0NvcHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIHRvIHRoZSByb290IG9mIHRoZSBydW50aW1lLAotCSAqIHR5cGljYWxseSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGlzIHJ1bnRpbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0TG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHJ1bnRpbWUgaXMgYSBzdHViICh1c2VkIGZvciBjb21waWxhdGlvbiBvbmx5KQotCSAqIG9yIGEgZnVsbCBydW50aW1lLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBydW50aW1lIGlzIGEgc3R1YiwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3R1YigpOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoaXMgcnVudGltZSBpbnN0YW5jZS4gVGhpcyBtZXRob2QgcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgcnVudGltZQotCSAqIGlzIHBvaW50aW5nIHRvIGEgbnVsbCBvciBpbnZhbGlkIGxvY2F0aW9uIChlLmcuIG5vdCBwb2ludGluZyB0byB0aGUgY29ycmVjdAotCSAqIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkpLCBvciBpZiB0aGUgcnVudGltZS10eXBlLXNwZWNpZmljIHByb3BlcnRpZXMgYXJlIG1pc3NpbmcKLQkgKiBvciBpbnZhbGlkLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBvbiB0aGUgd29ya2luZyBjb3B5IHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIGJlIHZhbGlkYXRlZCBhdAotCSAqIGFueSB0aW1lLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhpcwotCSAqICAgcnVudGltZSBpcyB2YWxpZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMKLQkgKiAgIHdyb25nIHdpdGggaXQKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwNjdjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLS8qKgotICogTGlzdGVuZXIgaW50ZXJmYWNlIGZvciBjaGFuZ2VzIHRvIHJ1bnRpbWVzLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBmaXJlZCB3aGVuZXZlciBhIHJ1bnRpbWUgaXMgYWRkZWQsIG1vZGlmaWVkLCBvciByZW1vdmVkLgotICogQWxsIGV2ZW50cyBhcmUgZmlyZWQgcG9zdC1jaGFuZ2UsIHNvIHRoYXQgYWxsIHNlcnZlciB0b29scyBBUEkgY2FsbGVkIGFzIGEKLSAqIHJlc3VsdCBvZiB0aGUgZXZlbnQgd2lsbCByZXR1cm4gdGhlIHVwZGF0ZWQgcmVzdWx0cy4gKGZvciBleGFtcGxlLCBvbgotICogcnVudGltZUFkZGVkIHRoZSBuZXcgc2VydmVyIHdpbGwgYmUgaW4gdGhlIGdsb2JhbCBsaXN0IG9mIHJ1bnRpbWVzCi0gKiAoe0BsaW5rIFNlcnZlckNvcmUjZ2V0UnVudGltZXMoKX0pLCBhbmQgb24gcnVudGltZVJlbW92ZWQgdGhlIHJ1bnRpbWUgd2lsbAotICogbm90IGJlIGluIHRoZSBsaXN0LgotICogPC9wPgotICogCi0gKiBAc2VlIFNlcnZlckNvcmUKLSAqIEBzZWUgSVJ1bnRpbWUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyIHsKLQkvKioKLQkgKiBBIG5ldyBydW50aW1lIGhhcyBiZWVuIGNyZWF0ZWQuCi0JICoKLQkgKiBAcGFyYW0gcnVudGltZSB0aGUgbmV3IHJ1bnRpbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW50aW1lQWRkZWQoSVJ1bnRpbWUgcnVudGltZSk7Ci0KLQkvKioKLQkgKiBBbiBleGlzdGluZyBydW50aW1lIGhhcyBiZWVuIHVwZGF0ZWQgb3IgbW9kaWZpZWQuCi0JICoKLQkgKiBAcGFyYW0gcnVudGltZSB0aGUgbW9kaWZpZWQgcnVudGltZQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bnRpbWVDaGFuZ2VkKElSdW50aW1lIHJ1bnRpbWUpOwotCi0JLyoqCi0JICogQSBleGlzdGluZyBydW50aW1lIGhhcyBiZWVuIHJlbW92ZWQuCi0JICoKLQkgKiBAcGFyYW0gcnVudGltZSB0aGUgcmVtb3ZlZCBydW50aW1lCi0JICovCi0JcHVibGljIHZvaWQgcnVudGltZVJlbW92ZWQoSVJ1bnRpbWUgcnVudGltZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVJ1bnRpbWVUYXJnZXRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUnVudGltZVRhcmdldEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE3MTJmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUnVudGltZVRhcmdldEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0vKioKLSAqIEEgcnVudGltZSB0YXJnZXQgaGFuZGxlciBpcyB1c2VkIHRvIGFwcGx5IHNvbWUgcHJvcGVydGllcyB0byBhIHByb2plY3QKLSAqIHRoaXMgaXMgYmVpbmcgdGFyZ2V0ZWQgdG8gYSBnaXZlbiBydW50aW1lLiBGb3IgaW5zdGFuY2UsIHRoZSBoYW5kbGVyCi0gKiBtaWdodCB1cGRhdGUgdGhlIGNsYXNzcGF0aCBvZiBhIEphdmEgcHJvamVjdCB0byBpbmNsdWRlIHRoZSBydW50aW1lJ3MKLSAqIGNsYXNzZXMsIGFkZCB2YWxpZGF0aW9uIGZvciB0aGUgZ2l2ZW4gcnVudGltZSwgb3IgcmVzdHJpY3QgdGhlIHR5cGUgb2YKLSAqIHJlc291cmNlcyB0aGF0IGNhbiBiZSBjcmVhdGVkLgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBkZXByZWNhdGVkIHVzZSBwcm9qZWN0IGZhY2V0cyBpbnN0ZWFkIG9mIHJ1bnRpbWUgdGFyZ2V0cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lVGFyZ2V0SGFuZGxlciBleHRlbmRzIElBZGFwdGFibGUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgcnVudGltZSB0YXJnZXQgaGFuZGxlci4KLQkgKiBFYWNoIGtub3duIHJ1bnRpbWUgdGFyZ2V0IGhhbmRsZXIgaGFzIGEgZGlzdGluY3QgaWQuIAotCSAqIElkcyBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbnRlcm5hbGx5IGFzIGtleXM7IHRoZXkgYXJlIG5vdAotCSAqIGludGVuZGVkIHRvIGJlIHNob3duIHRvIGVuZCB1c2Vycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBydW50aW1lIHRhcmdldCBoYW5kbGVyIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHJ1bnRpbWUgdGFyZ2V0IGhhbmRsZXIgc3VwcG9ydHMKLQkgKiAoY2FuIHdvcmsgd2l0aCkgdGhlIGdpdmVuIHJ1bnRpbWUuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWVUeXBlIGEgcnVudGltZSB0eXBlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaGFuZGxlciBjYW4gYWNjZXB0IHRoZSBnaXZlbiBydW50aW1lIHR5cGUsCi0JICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1J1bnRpbWVUeXBlKElSdW50aW1lVHlwZSBydW50aW1lVHlwZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVJ1bnRpbWVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUnVudGltZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY2YWJlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUnVudGltZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIFJlcHJlc2VudHMgYSAoc2VydmVyKSBydW50aW1lIHR5cGUgZnJvbSB3aGljaCBydW50aW1lIGluc3RhbmNlcyBjYW4gYmUKLSAqIGNyZWF0ZWQuCi0gKiA8cD4KLSAqIFRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsgc3VwcG9ydHMKLSAqIGFuIG9wZW4tZW5kZWQgc2V0IG9mIHJ1bnRpbWUgdHlwZXMsIHdoaWNoIGFyZSBjb250cmlidXRlZCB2aWEKLSAqIHRoZSA8Y29kZT5ydW50aW1lVHlwZXM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludCBpbiB0aGUgc2VydmVyIGNvcmUKLSAqIHBsdWctaW4uIFJ1bnRpbWUgdHlwZSBvYmplY3RzIGNhcnJ5IG5vIHN0YXRlIChhbGwgaW5mb3JtYXRpb24gaXMKLSAqIHJlYWQtb25seSBhbmQgaXMgc3VwcGxpZWQgYnkgdGhlIHNlcnZlciBydW50aW1lIHR5cGUgZGVjbGFyYXRpb24pLgotICogVGhlIGdsb2JhbCBsaXN0IG9mIGtub3duIHJ1bnRpbWUgdHlwZXMgaXMgYXZhaWxhYmxlIHZpYQotICoge0BsaW5rIFNlcnZlckNvcmUjZ2V0UnVudGltZVR5cGVzKCl9LgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIDxwPgotICogW2lzc3VlOiBXaGF0IHZhbHVlIGRvIHJ1bnRpbWVzIGFkZD8KLSAqIEl0J3MgbWFpbiByb2xlIGlzIGZvciBzZXR0aW5nIHVwIHRoZSBKYXZhIGJ1aWxkIGNsYXNzcGF0aAotICogZm9yIHByb2plY3RzIGhvbGRpbmcgbW9kdWxlcyB0aGF0IG11c3QgYmUgSmF2YSBjb21waWxlZC4KLSAqIElmIHRoZSBub3Rpb24gb2YgbW9kdWxlIGlzIHRvIHRyYW5zY2VuZCB0aGUgdmFnYXJpZXMgb2YgcGFydGljdWxhcgotICogdHlwZXMgb2Ygc2VydmVyLCBhbmQsIGluZGVlZCwgYmUgcHVibGlzaGVkIHRvIG11bHRpcGxlIHNlcnZlcnMKLSAqIHNpbXVsdGFuZW91c2x5LCB0aGVuIG1hdHRlcnMgb2YgYnVpbGQgY2xhc3NwYXRoIGhhZCBiZXR0ZXIgbm90Ci0gKiBiZSB0aWVkIHRvIHRoZSBwYXJ0aWN1bGFyIHNlcnZlcnMgaW52b2x2ZWQuXQotICogPC9wPgotICogPHA+Ci0gKiBUd28gcnVudGltZSB0eXBlcyBhcmUgaWRlbnRpY2FsIGlmIGFuZCBvbmx5IGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBpZC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lVHlwZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBydW50aW1lIHR5cGUuCi0JICogRWFjaCBrbm93biBzZXJ2ZXIgcnVudGltZSB0eXBlIGhhcyBhIGRpc3RpbmN0IGlkLiAKLQkgKiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOyB0aGV5IGFyZSBub3QKLQkgKiBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgcnVudGltZSB0eXBlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBydW50aW1lIHR5cGUuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgbmFtZSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIHJ1bnRpbWUgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgcnVudGltZSB0eXBlLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIGRlc2NyaXB0aW9uIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIGRlc2NyaXB0aW9uIGZvciB0aGlzIHJ1bnRpbWUgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSB2ZW5kb3IgbmFtZSBmb3IgdGhpcyBydW50aW1lIHR5cGUuIElmIHRoZQotCSAqIHJ1bnRpbWUgdHlwZSBkaWQgbm90IHNwZWNpZmljIGEgdmVuZG9yLCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgZGVzY3JpcHRpb24gaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgdmVuZG9yIG5hbWUgZm9yIHRoaXMgcnVudGltZSB0eXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZW5kb3IoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSB2ZXJzaW9uIG5hbWUgZm9yIHRoaXMgcnVudGltZSB0eXBlLiBJZiB0aGUKLQkgKiBydW50aW1lIHR5cGUgZGlkIG5vdCBzcGVjaWZpYyBhIHZlbmRvciwgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIGRlc2NyaXB0aW9uIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIHZlcnNpb24gbmFtZSBmb3IgdGhpcyBydW50aW1lIHR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgbW9kdWxlIHR5cGVzIHRoYXQgdGhpcyBydW50aW1lIHR5cGUgY2FuIHN1cHBvcnQuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgbW9kdWxlIHR5cGVzIHtAbGluayBJTW9kdWxlVHlwZX0KLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVR5cGVbXSBnZXRNb2R1bGVUeXBlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcnVudGltZSB0eXBlIGNhbiBiZSBpbnN0YW50aWF0ZWQuCi0JICogPHA+Ci0JICogW2lzc3VlOiBJdCdzIHVuY2xlYXIgd2hhdCB0aGlzIG1ldGhvZCBpcyBmb3IuCi0JICogVGhlIGltcGxlbWVudGF0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZSAiY2xhc3MiCi0JICogYW5kICJ3b3JraW5nQ29weUNsYXNzIiBhdHRyaWJ1dGVzIChib3RoIG9wdGlvbmFsKSB3ZXJlIHNwZWNpZmllZC4KLQkgKiBXaGF0IHdvdWxkIGJlIHRoZSBwb2ludCBvZiBhIHJ1bnRpbWUgdHlwZSB0aGF0IGRpZG4ndAotCSAqIGhhdmUgYm90aCBvZiB0aGVzZSBhdHRyaWJ1dGVzIGFuZCBjb3VsZCBub3QgYmUgImNyZWF0ZWQiP10KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHR5cGUgb2YgcnVudGltZSBjYW4gYmUKLQkgKiAgICBpbnN0YW50aWF0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgY2Fubm90Ci0JICogQHNlZSAjY3JlYXRlUnVudGltZShTdHJpbmcsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQ3JlYXRlKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgd29ya2luZyBjb3B5IGluc3RhbmNlIG9mIHRoaXMgcnVudGltZSB0eXBlLgotCSAqIEFmdGVyIHNldHRpbmcgdmFyaW91cyBwcm9wZXJ0aWVzIG9mIHRoZSB3b3JraW5nIGNvcHksCi0JICogdGhlIGNsaWVudCBzaG91bGQgY2FsbCB7QGxpbmsgSVJ1bnRpbWVXb3JraW5nQ29weSNzYXZlKGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpfQotCSAqIHRvIGJyaW5nIHRoZSBydW50aW1lIGluc3RhbmNlIGludG8gZXhpc3RlbmNlLgotCSAqIDxwPgotCSAqIERlZmF1bHQgdmFsdWVzIGFyZSBzZXQgYnkgY2FsbGluZyB0aGUgaW5zdGFuY2UncyBkZWxlZ2F0ZS4KLQkgKiBDbGllbnRzIHNob3VsZCBhc3N1bWUgdGhhdCB0aGUgbG9jYXRpb24gYW5kIG90aGVyIHByb3BlcnRpZXMgYXJlCi0JICogbm90IHNldCBhbmQgbXVzdCBiZSBleHBsaWNpdGx5IHNldCBieSB0aGUgY2xpZW50LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGlkIHRvIGFzc2lnbiB0byB0aGUgcnVudGltZSBpbnN0YW5jZTsgdGhlIGRlZmF1bHQgbmFtZSBpcwotCSAqICAgIHVzZWQgaWYgaWQgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gZW1wdHkgc3RyaW5nCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBuZXcgcnVudGltZSB3b3JraW5nIGNvcHkgd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGlzIHJ1bnRpbWUKLQkgKiAgICBvciBzZXR0aW5nIGl0J3MgZGVmYXVsdCB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVXb3JraW5nQ29weSBjcmVhdGVSdW50aW1lKFN0cmluZyBpZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lV29ya2luZ0NvcHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lV29ya2luZ0NvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZmNTY3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUnVudGltZVdvcmtpbmdDb3B5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotLyoqCi0gKiBBIHdvcmtpbmcgY29weSBydW50aW1lIG9iamVjdCB1c2VkIGZvciBmb3JtdWxhdGluZyBjaGFuZ2VzCi0gKiB0byBhIHJ1bnRpbWUgaW5zdGFuY2UgKHtAbGluayBJUnVudGltZX0pLiBDaGFuZ2VzIG1hZGUgb24gYQotICogd29ya2luZyBjb3B5IGRvIG5vdCBvY2N1ciAoYW5kIGFyZSBub3QgcGVyc2lzdGVkKSB1bnRpbCBhCi0gKiBzYXZlKCkgaXMgcGVyZm9ybWVkLgotICogPHA+Ci0gKiBJZiB0aGUgY2xpZW50IG9mIHRoaXMgd29ya2luZyBjb3B5IGNhbGxzIGxvYWRBZGFwdGVyKCksIGEgbmV3IGluc3RhbmNlIG9mCi0gKiB0aGUgZGVsZWdhdGUgKFJ1bnRpbWVEZWxlZ2F0ZSkgd2lsbCBiZSBjcmVhdGVkIHRvIGhlbHAgdGhpcyB3b3JraW5nIGNvcHkuCi0gKiBUaGlzIGRlbGVnYXRlIGluc3RhbmNlIHdpbGwgYmUgdXNlZCBhcyBsb25nIGFzIHRoaXMgd29ya2luZyBjb3B5IGV4aXN0cy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgSVJ1bnRpbWUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUnVudGltZVdvcmtpbmdDb3B5IGV4dGVuZHMgSVJ1bnRpbWUgewotCS8qKgotCSAqIFN0YXR1cyBjb2RlICh2YWx1ZSAxKSByZXR1cm5lZCBmcm9tIHRoZSBzYXZlKCkgbWV0aG9kIHdoZW4gdGhlIHNhdmUKLQkgKiBmYWlsZWQgd2l0aCBmb3JjZSBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGJlY2F1c2UgdGhlIHJ1bnRpbWUgaGFzCi0JICogYmVlbiBtb2RpZmllZCBhbmQgc2F2ZWQgc2luY2UgdGhpcyB3b3JraW5nIGNvcHkgd2FzIGNyZWF0ZWQuCi0JICogCi0JICogQHNlZSAjc2F2ZShib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNBVkVfQ09ORkxJQ1QgPSAxOwotCQotCS8qKgotCSAqIFByb3BlcnR5IGNoYW5nZSBuYW1lICh2YWx1ZSAibmFtZSIpIHVzZWQgd2hlbiB0aGUgbmFtZSBvZiB0aGUgcnVudGltZQotCSAqIGNoYW5nZXMuCi0JICogCi0JICogQHNlZSAjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqIEBzZWUgI3JlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FID0gIm5hbWUiOwotCQotCS8qKgotCSAqIFByb3BlcnR5IGNoYW5nZSBuYW1lICh2YWx1ZSAibG9jYXRpb24iKSB1c2VkIHdoZW4gdGhlIGxvY2F0aW9uIG9mIHRoZQotCSAqIHJ1bnRpbWUgY2hhbmdlcy4KLQkgKiAKLQkgKiBAc2VlICNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICogQHNlZSAjcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0xPQ0FUSU9OID0gImxvY2F0aW9uIjsKLQotCS8qKgotCSAqIFNldHMgdGhlIGRpc3BsYXlhYmxlIG5hbWUgZm9yIHRoaXMgcnVudGltZS4KLQkgKiA8cD4KLQkgKiBUaGUgbmFtZSBzaG91bGQgYmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbmFtZSBhIGRpc3BsYXlhYmxlIG5hbWUKLQkgKiBAc2VlIElSdW50aW1lI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCQotCS8qKgotCSAqIFNldHMgb3IgdW5zZXRzIHdoZXRoZXIgdGhpcyBydW50aW1lIGlzIG1hcmtlZCBhcyByZWFkIG9ubHkuCi0JICogV2hlbiBhIHJ1bnRpbWUgaXMgcmVhZCBvbmx5LCB3b3JraW5nIGNvcGllcyBjYW4gYmUgY3JlYXRlZCBidXQKLQkgKiB0aGV5IGNhbm5vdCBiZSBzYXZlZC4KLQkgKgotCSAqIEBwYXJhbSByZWFkT25seSA8Y29kZT50cnVlPC9jb2RlPiB0byBzZXQgdGhpcyBydW50aW1lIHRvIGJlIG1hcmtlZAotCSAqICAgIHJlYWQgb25seSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiB0byB1bnNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpOwotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHdvcmtpbmcgY29weSBoYXMgdW5zYXZlZCBjaGFuZ2VzLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB3b3JraW5nIGNvcHkgaGFzIHVuc2F2ZWQKLQkgKiAgICBjaGFuZ2VzLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKTsKLQotCS8qKgotCSAqIEFkZHMgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBydW50aW1lLgotCSAqIDxwPgotCSAqIE9uY2UgcmVnaXN0ZXJlZCwgYSBsaXN0ZW5lciBzdGFydHMgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbiBvZiAKLQkgKiBwcm9wZXJ0eSBjaGFuZ2VzIHRvIHRoaXMgcnVudGltZS4gVGhlIGxpc3RlbmVyIGNvbnRpbnVlcyB0byByZWNlaXZlCi0JICogbm90aWZpY2F0aW9ucyB1bnRpbCBpdCBpcyByZW1vdmVkLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIKLQkgKiBAc2VlICNyZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGlzIHJ1bnRpbWUuCi0JICogSGFzIG5vIGVmZmVjdCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIKLQkgKiBAc2VlICNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgaW5zdGFuY2UgdGhhdCB0aGlzIHdvcmtpbmcgY29weSBpcwotCSAqIGFzc29jaWF0ZWQgd2l0aC4KLQkgKiA8cD4KLQkgKiBGb3IgYSBydW50aW1lIHdvcmtpbmcgY29weSBjcmVhdGVkIGJ5IGEgY2FsbCB0bwotCSAqIHtAbGluayBJUnVudGltZSNjcmVhdGVXb3JraW5nQ29weSgpfSwKLQkgKiA8Y29kZT50aGlzLmdldE9yaWdpbmFsKCk8L2NvZGU+IHJldHVybnMgdGhlIG9yaWdpbmFsCi0JICogcnVudGltZSBvYmplY3QuIEZvciBhIHJ1bnRpbWUgd29ya2luZyBjb3B5IGp1c3QgY3JlYXRlZCBieQotCSAqIGEgY2FsbCB0byB7QGxpbmsgSVJ1bnRpbWVUeXBlI2NyZWF0ZVJ1bnRpbWUoU3RyaW5nLCBJUHJvZ3Jlc3NNb25pdG9yKX0sCi0JICogPGNvZGU+dGhpcy5nZXRPcmlnaW5hbCgpPC9jb2RlPiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhc3NvY2lhdGVkIHJ1bnRpbWUgaW5zdGFuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWUgZ2V0T3JpZ2luYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGFic29sdXRlIHBhdGggaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIHRvIHRoZSByb290IG9mIHRoZSBydW50aW1lLAotCSAqIHR5cGljYWxseSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4gCi0JICogCi0JICogQHBhcmFtIHBhdGggdGhlIGxvY2F0aW9uIG9mIHRoaXMgcnVudGltZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBzZWUgSVJ1bnRpbWUjZ2V0TG9jYXRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKElQYXRoIHBhdGgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcnVudGltZSBpcyBhIHN0dWIgKHVzZWQgZm9yIGNvbXBpbGF0aW9uIG9ubHkpCi0JICogb3IgYSBmdWxsIHJ1bnRpbWUuCi0JICogCi0JICogQHBhcmFtIHN0dWIgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBydW50aW1lIGlzIGEgc3R1YiwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0dWIoYm9vbGVhbiBzdHViKTsKLQotCS8qKgotCSAqIENvbW1pdHMgdGhlIGNoYW5nZXMgbWFkZSBpbiB0aGlzIHdvcmtpbmcgY29weS4gSWYgdGhlcmUgaXMKLQkgKiBubyBleHRhbnQgcnVudGltZSBpbnN0YW5jZSB3aXRoIGEgbWF0Y2hpbmcgaWQgYW5kIHJ1bnRpbWUKLQkgKiB0eXBlLCB0aGlzIHdpbGwgY3JlYXRlIGEgcnVudGltZSBpbnN0YW5jZSB3aXRoIGF0dHJpYnV0ZXMKLQkgKiB0YWtlbiBmcm9tIHRoaXMgd29ya2luZyBjb3B5LCBhbmQgcmV0dXJuIHRoYXQgb2JqZWN0LgotCSAqIDxwPgotCSAqIElmIHRoZXJlIGFuIGV4aXN0aW5nIHJ1bnRpbWUgaW5zdGFuY2Ugd2l0aCBhIG1hdGNoaW5nIGlkIGFuZAotCSAqIHJ1bnRpbWUgdHlwZSwgdGhpcyB3aWxsIGNoYW5nZSB0aGUgcnVudGltZSBpbnN0YW5jZSBhY2NvcmRpbmdseS4KLQkgKiBUaGUgcmV0dXJuZWQgcnVudGltZSB3aWxsIGJlIHRoZSBzYW1lIHJ1bnRpbWUgdGhpcyBpcyByZXR1cm5lZAotCSAqIGZyb20gZ2V0T3JpZ2luYWwoKSwgYWZ0ZXIgdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIGFwcGxpZWQuCi0JICogT3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIG5ld2x5IGNyZWF0ZWQgcnVudGltZS4KLQkgKiA8L3A+Ci0JICogUnVudGltZXMgY2FuIGJlIHNhdmVkIGV2ZW4gd2hlbiB0aGV5IGhhdmUgaW52YWxpZCBwcm9wZXJ0aWVzLiBJdAotCSAqIGlzIHRoZSBjbGllbnRzIHJlc3BvbnNpYmlsaXR5IHRvIGNhbGwgdmFsaWRhdGUoKSBvciBjaGVjayB0aGUKLQkgKiBwcm9wZXJ0aWVzIGJlZm9yZSBzYXZpbmcuCi0JICogCi0JICogQHBhcmFtIGZvcmNlIDxjb2RlPnRydWU8L2NvZGU+IHRvIGZvcmNlIHRoZSBzYXZlLCBvciA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICBvdGhlcndpc2UKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIG5ldyBydW50aW1lIGluc3RhbmNlCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBzYXZlIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQKLQkgKiBAc2VlICNTQVZFX0NPTkZMSUNUCi0JICovCi0JcHVibGljIElSdW50aW1lIHNhdmUoYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZjlhYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLS8qKgotICogUmVwcmVzZW50cyBhIHNlcnZlciBpbnN0YW5jZS4gRXZlcnkgc2VydmVyIGlzIGFuIGluc3RhbmNlIG9mIGEKLSAqIHBhcnRpY3VsYXIsIGZpeGVkIHNlcnZlciB0eXBlLgotICogPHA+Ci0gKiBOb3Qgc3VycHJpc2luZ2x5LCB0aGUgbm90aW9uIG9mIDxiPnNlcnZlcjwvYj4gaXMgY2VudHJhbCBpbiB0aGUgd2ViIHRvb2xzCi0gKiBzZXJ2ZXIgaW5mcmFzdHJ1Y3R1cmUuIEluIHRoaXMgY29udGV4dCwgdW5kZXJzdGFuZCB0aGF0IGEgc2VydmVyIGlzCi0gKiBhIHdlYiBzZXJ2ZXIgb2Ygc29tZSBpbGsuIEl0IGNvdWxkIGJlIGEgc2ltcGxlIHdlYiBzZXJ2ZXIgbGFja2luZyBKYXZhCi0gKiBzdXBwb3J0LCBvciBhbiBKMkVFIGJhc2VkIHNlcnZlciwgb3IgcGVyaGFwcyBldmVuIHNvbWUga2luZCBvZiBkYXRhYmFzZQotICogc2VydmVyLiBBIG1vcmUgZXhhY3QgZGVmaW5pdGlvbiBpcyBub3QgcmVxdWlyZWQgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIEFQSS4KLSAqIEZyb20gYSB0b29sLWNlbnRyaWMgcG9pbnQgb2YgdmlldywgYSBzZXJ2ZXIKLSAqIGlzIHNvbWV0aGluZyB0aGF0IHRoZSBkZXZlbG9wZXIgaXMgd3JpdGluZyAiY29udGVudCIgZm9yLgotICogVGhlIHVuaXQgb2YgY29udGVudCBpcyB0ZXJtZWQgYSBtb2R1bGUuCi0gKiBJbiBhIHNlbnNlLCB0aGUgc2VydmVyIGV4aXN0cywgYnV0IGxhY2tzIHVzZWZ1bCBjb250ZW50LiBUaGUKLSAqIGRldmVsb3BtZW50IHRhc2sgaXMgdG8gcHJvdmlkZSB0aGF0IGNvbnRlbnQuIFRoZSBjb250ZW50IGNhbiBpbmNsdWRlCi0gKiBhbnl0aGluZyBmcm9tIHNpbXBsZSwgc3RhdGljIEhUTUwgd2ViIHBhZ2VzIHRvIGNvbXBsZXgsIGhpZ2hseSBkeW5hbWljCi0gKiB3ZWIgYXBwbGljYXRpb25zLgotICogSW4gdGhlIGNvdXJzZSBvZiB3cml0aW5nIGFuZCBkZWJ1Z2dpbmcgdGhpcyBjb250ZW50LAotICogdGhlIGRldmVsb3BlciB3aWxsIHdhbnQgdG8gdGVzdCB0aGVpciBjb250ZW50IG9uIGEgd2ViIHNlcnZlciwgdG8gc2VlIGhvdyBpdAotICogZ2V0cyBzZXJ2ZWQgdXAuIEZvciB0aGlzIHRoZXkgd2lsbCBuZWVkIHRvIGxhdW5jaCBhIHNlcnZlciBwcm9jZXNzIHJ1bm5pbmcgb24KLSAqIHNvbWUgaG9zdCBtYWNoaW5lIChvZnRlbiB0aGUgbG9jYWwgaG9zdCBvbiB3aGljaCB0aGUgSURFIGlzIHJ1bm5pbmcpLCBvcgotICogYXR0YWNoIHRvIGEgc2VydmVyIHRoYXQncyBhbHJlYWR5IHJ1bm5pbmcgb24gYSByZW1vdGUgKG9yIGxvY2FsKSBob3N0LiAKLSAqIFRoZSBuZXdseSBkZXZlbG9wZWQgY29udGVudCBzaXR0aW5nIGluIHRoZSBkZXZlbG9wZXIncyB3b3Jrc3BhY2UgbmVlZHMgdG8KLSAqIGVuZCB1cCBpbiBhIGxvY2F0aW9uIGFuZCBmb3JtYXQgdGhhdCB0aGUgcnVubmluZyBzZXJ2ZXIgY2FuIHVzZSBmb3IgaXRzCi0gKiBzZXJ2aW5nIHB1cnBvc2VzLgotICogPC9wPgotICogPHA+Ci0gKiBJbiB0aGlzIHBpY3R1cmUsIGFuIDxjb2RlPklTZXJ2ZXI8L2NvZGU+IG9iamVjdCBpcyBhIHByb3h5IGZvciB0aGUgcmVhbCB3ZWIKLSAqIHNlcnZlci4gVGhyb3VnaCB0aGlzIHByb3h5LCBhIGNsaWVudCBjYW4gY29uZmlndXJlIHRoZSBzZXJ2ZXIsIGFuZCBzdGFydCwKLSAqIHN0b3AsIGFuZCByZXN0YXJ0IGl0LgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgc2VydmVyIGZyYW1ld29yayBtYWludGFpbnMgYSBnbG9iYWwgbGlzdCBvZiBhbGwga25vd24gc2VydmVyIGluc3RhbmNlcwotICogKHtAbGluayBTZXJ2ZXJDb3JlI2dldFNlcnZlcnMoKX0pLgotICogPC9wPgotICogPHA+Ci0gKiBbcm91Z2ggbm90ZXM6Ci0gKiBTZXJ2ZXIgaGFzIGEgc3RhdGUuCi0gKiBTZXJ2ZXIgY2FuIGJlIHN0YXJ0ZWQsIHN0b3BwZWQsIGFuZCByZXN0YXJ0ZWQuCi0gKiBUbyBtb2RpZnkgc2VydmVyIGF0dHJpYnV0ZXMsIGdldCBhIHdvcmtpbmcgY29weSwgbW9kaWZ5IGl0LCBhbmQgdGhlbiBzYXZlIGl0Ci0gKiB0byBjb21taXQgdGhlIGNoYW5nZXMuCi0gKiBTZXJ2ZXIgYXR0cmlidXRlcy4gU2VyaWFsaXphdGlvbi4KLSAqIENoYWluZWQgd29ya2luZyBjb3BpZXMgZm9yIHJ1bnRpbWUsIHNlcnZlciBjb25maWd1cmF0aW9uLgotICogU2VydmVyIGhhcyBhIHNldCBvZiByb290IG1vZHVsZXMuCi0gKiBNb2R1bGVzIGhhdmUgc3RhdGUgd3J0IGEgc2VydmVyLgotICogUmVzdGFydGluZyBtb2R1bGVzLgotICogXQotICogPC9wPgotICogPHA+Ci0gKiBUd28gc2VydmVycyBhcmUgaWRlbnRpY2FsIGlmIGFuZCBvbmx5IGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBpZC4KLSAqIDwvcD4KLSAqIAotICogPHA+VGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuPC9wPgotICogCi0gKiBAbm9pbXBsZW1lbnQKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyIGV4dGVuZHMgSVNlcnZlckF0dHJpYnV0ZXMsIElTY2hlZHVsaW5nUnVsZSB7Ci0JLyoqCi0JICogQW4gb3BlcmF0aW9uIGxpc3RlbmVyIGlzIHVzZWQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gYmFjayBhYm91dCBhCi0JICogc3BlY2lmaWMgc2VydmVyIG9wZXJhdGlvbiwgc3VjaCBhcyBzdGFydGluZyBvciBzdG9wcGluZyBhIHNlcnZlci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJT3BlcmF0aW9uTGlzdGVuZXIgewotCQkvKioKLQkJICogQ2FsbGVkIG9uY2Ugd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLgotCQkgKiAKLQkJICogQHBhcmFtIHJlc3VsdCBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCi0JCSAqICAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdAotCQkgKiAgICBpbmRpY2F0aW5nIHdoeSBpdCBkaWRuJ3QKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRvbmUoSVN0YXR1cyByZXN1bHQpOwotCX0KLQotCS8qKgotCSAqIFNlcnZlciBzdGF0ZSBjb25zdGFudCAodmFsdWUgMCkgaW5kaWNhdGluZyB0aGF0IHRoZQotCSAqIHNlcnZlciBpcyBpbiBhbiB1bmtub3duIHN0YXRlLgotCSAqIAotCSAqIEBzZWUgI2dldFNlcnZlclN0YXRlKCkKLQkgKiBAc2VlICNnZXRNb2R1bGVTdGF0ZShJTW9kdWxlW10pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVU5LTk9XTiA9IDA7Ci0KLQkvKioKLQkgKiBTZXJ2ZXIgc3RhdGUgY29uc3RhbnQgKHZhbHVlIDEpIGluZGljYXRpbmcgdGhhdCB0aGUKLQkgKiBzZXJ2ZXIgaXMgc3RhcnRpbmcsIGJ1dCBub3QgeWV0IHJlYWR5IHRvIHNlcnZlIGNvbnRlbnQuCi0JICogCi0JICogQHNlZSAjZ2V0U2VydmVyU3RhdGUoKQotCSAqIEBzZWUgI2dldE1vZHVsZVN0YXRlKElNb2R1bGVbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9TVEFSVElORyA9IDE7Ci0KLQkvKioKLQkgKiBTZXJ2ZXIgc3RhdGUgY29uc3RhbnQgKHZhbHVlIDIpIGluZGljYXRpbmcgdGhhdCB0aGUKLQkgKiBzZXJ2ZXIgaXMgcmVhZHkgdG8gc2VydmUgY29udGVudC4KLQkgKiAKLQkgKiBAc2VlICNnZXRTZXJ2ZXJTdGF0ZSgpCi0JICogQHNlZSAjZ2V0TW9kdWxlU3RhdGUoSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NUQVJURUQgPSAyOwotCi0JLyoqCi0JICogU2VydmVyIHN0YXRlIGNvbnN0YW50ICh2YWx1ZSAzKSBpbmRpY2F0aW5nIHRoYXQgdGhlCi0JICogc2VydmVyIGlzIHNodXR0aW5nIGRvd24uCi0JICogCi0JICogQHNlZSAjZ2V0U2VydmVyU3RhdGUoKQotCSAqIEBzZWUgI2dldE1vZHVsZVN0YXRlKElNb2R1bGVbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9TVE9QUElORyA9IDM7Ci0KLQkvKioKLQkgKiBTZXJ2ZXIgc3RhdGUgY29uc3RhbnQgKHZhbHVlIDQpIGluZGljYXRpbmcgdGhhdCB0aGUKLQkgKiBzZXJ2ZXIgaXMgc3RvcHBlZC4KLQkgKiAKLQkgKiBAc2VlICNnZXRTZXJ2ZXJTdGF0ZSgpCi0JICogQHNlZSAjZ2V0TW9kdWxlU3RhdGUoSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NUT1BQRUQgPSA0OwotCi0JLyoqCi0JICogUHVibGlzaCBzdGF0ZSBjb25zdGFudCAodmFsdWUgMCkgaW5kaWNhdGluZyB0aGF0IGl0J3MKLQkgKiBpbiBhbiB1bmtub3duIHN0YXRlLgotCSAqIAotCSAqIEBzZWUgI2dldFNlcnZlclB1Ymxpc2hTdGF0ZSgpCi0JICogQHNlZSAjZ2V0TW9kdWxlUHVibGlzaFN0YXRlKElNb2R1bGVbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQVUJMSVNIX1NUQVRFX1VOS05PV04gPSAwOwotCi0JLyoqCi0JICogUHVibGlzaCBzdGF0ZSBjb25zdGFudCAodmFsdWUgMSkgaW5kaWNhdGluZyB0aGF0IHRoZXJlCi0JICogaXMgbm8gcHVibGlzaCByZXF1aXJlZC4KLQkgKiAKLQkgKiBAc2VlICNnZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKQotCSAqIEBzZWUgI2dldE1vZHVsZVB1Ymxpc2hTdGF0ZShJTW9kdWxlW10pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElTSF9TVEFURV9OT05FID0gMTsKLQotCS8qKgotCSAqIFB1Ymxpc2ggc3RhdGUgY29uc3RhbnQgKHZhbHVlIDIpIGluZGljYXRpbmcgdGhhdCBhbgotCSAqIGluY3JlbWVudGFsIHB1Ymxpc2ggaXMgcmVxdWlyZWQuCi0JICogCi0JICogQHNlZSAjZ2V0U2VydmVyUHVibGlzaFN0YXRlKCkKLQkgKiBAc2VlICNnZXRNb2R1bGVQdWJsaXNoU3RhdGUoSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBVQkxJU0hfU1RBVEVfSU5DUkVNRU5UQUwgPSAyOwotCi0JLyoqCi0JICogUHVibGlzaCBzdGF0ZSBjb25zdGFudCAodmFsdWUgMykgaW5kaWNhdGluZyB0aGF0IGEKLQkgKiBmdWxsIHB1Ymxpc2ggaXMgcmVxdWlyZWQuCi0JICogCi0JICogQHNlZSAjZ2V0U2VydmVyUHVibGlzaFN0YXRlKCkKLQkgKiBAc2VlICNnZXRNb2R1bGVQdWJsaXNoU3RhdGUoSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBVQkxJU0hfU1RBVEVfRlVMTCA9IDM7Ci0KLQkvKioKLQkgKiBQdWJsaXNoIGtpbmQgY29uc3RhbnQgKHZhbHVlIDEpIGluZGljYXRpbmcgYW4gaW5jcmVtZW50YWwgcHVibGlzaCByZXF1ZXN0LgotCSAqIAotCSAqIEBzZWUgI3B1Ymxpc2goaW50LCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBVQkxJU0hfSU5DUkVNRU5UQUwgPSAxOwotCi0JLyoqCi0JICogUHVibGlzaCBraW5kIGNvbnN0YW50ICh2YWx1ZSAyKSBpbmRpY2F0aW5nIGEgZnVsbCBwdWJsaXNoIHJlcXVlc3QuCi0JICogCi0JICogQHNlZSAjcHVibGlzaChpbnQsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElTSF9GVUxMID0gMjsKLQotCS8qKgotCSAqIFB1Ymxpc2gga2luZCBjb25zdGFudCAodmFsdWUgMykgaW5kaWNhdGluZyBhbiBhdXRvbWF0aWMgcHVibGlzaCByZXF1ZXN0LgotCSAqIAotCSAqIEBzZWUgI3B1Ymxpc2goaW50LCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBVQkxJU0hfQVVUTyA9IDM7Ci0KLQkvKioKLQkgKiBQdWJsaXNoIGtpbmQgY29uc3RhbnQgKHZhbHVlIDQpIGluZGljYXRpbmcgYSBwdWJsaXNoIGNsZWFuIHJlcXVlc3QKLQkgKiAKLQkgKiBAc2VlICNwdWJsaXNoKGludCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQVUJMSVNIX0NMRUFOID0gNDsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhpcyBzZXJ2ZXIuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgb3BlcmF0aW9uIGlzIGd1YXJhbnRlZWQgdG8gYmUgZmFzdAotCSAqIChpdCBkb2VzIG5vdCBhY3R1YWxseSBjb21tdW5pY2F0ZSB3aXRoIGFueSBhY3R1YWwKLQkgKiBzZXJ2ZXIpLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gb25lIG9mIHRoZSBzZXJ2ZXIgc3RhdGUgKDxjb2RlPlNUQVRFX1hYWDwvY29kZT4pCi0JICogY29uc3RhbnRzIGRlY2xhcmVkIG9uIHtAbGluayBJU2VydmVyfQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2VydmVyU3RhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElMYXVuY2hNYW5hZ2VyIG1vZGUgdGhhdCB0aGUgc2VydmVyIGlzIGluLiBUaGlzIG1ldGhvZCB3aWxsCi0JICogcmV0dXJuIG51bGwgaWYgdGhlIHNlcnZlciBpcyBub3QgcnVubmluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2RlIGluIHdoaWNoIGEgc2VydmVyIGlzIHJ1bm5pbmcsIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMKLQkgKiAgICBkZWZpbmVkIGJ5IHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfSwgb3IKLQkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc2VydmVyIGlzIHN0b3BwZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIncyBzeW5jIHN0YXRlLgotCSAqCi0JICogQHJldHVybiBvbmUgb2YgdGhlIFBVQkxJU0hfWFhYIHN0YXRlIGZsYWdzCi0JICovCi0JcHVibGljIGludCBnZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKTsKLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIHNlcnZlciBzdGF0ZSBsaXN0ZW5lciB0byB0aGlzIHNlcnZlci4KLQkgKiBPbmNlIHJlZ2lzdGVyZWQsIGEgbGlzdGVuZXIgc3RhcnRzIHJlY2VpdmluZyBub3RpZmljYXRpb24gb2YgCi0JICogc3RhdGUgY2hhbmdlcyB0byB0aGlzIHNlcnZlci4gVGhlIGxpc3RlbmVyIGNvbnRpbnVlcyB0byByZWNlaXZlCi0JICogbm90aWZpY2F0aW9ucyB1bnRpbCBpdCBpcyByZW1vdmVkLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgc2VydmVyIGxpc3RlbmVyCi0JICogQHNlZSAjcmVtb3ZlU2VydmVyTGlzdGVuZXIoSVNlcnZlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlcnZlckxpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBzZXJ2ZXIgc3RhdGUgbGlzdGVuZXIgdG8gdGhpcyBzZXJ2ZXIuCi0JICogT25jZSByZWdpc3RlcmVkLCBhIGxpc3RlbmVyIHN0YXJ0cyByZWNlaXZpbmcgbm90aWZpY2F0aW9uIG9mIAotCSAqIHN0YXRlIGNoYW5nZXMgdG8gdGhpcyBzZXJ2ZXIuIFRoZSBsaXN0ZW5lciBjb250aW51ZXMgdG8gcmVjZWl2ZQotCSAqIG5vdGlmaWNhdGlvbnMgdW50aWwgaXQgaXMgcmVtb3ZlZC4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIHNlcnZlciBsaXN0ZW5lcgotCSAqIEBwYXJhbSBldmVudE1hc2sgdGhlIGJpdC13aXNlIE9SIG9mIGFsbCBldmVudCB0eXBlcyBvZiBpbnRlcmVzdCB0byB0aGUKLQkgKiBsaXN0ZW5lcgotCSAqIEBzZWUgI3JlbW92ZVNlcnZlckxpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXJ2ZXJMaXN0ZW5lcihJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIsIGludCBldmVudE1hc2spOwotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gc2VydmVyIHN0YXRlIGxpc3RlbmVyIGZyb20gdGhpcyBzZXJ2ZXIuIEhhcyBubwotCSAqIGVmZmVjdCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgotCSAqIEBzZWUgI2FkZFNlcnZlckxpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZXJ2ZXJMaXN0ZW5lcihJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQWRkcyBhIHB1Ymxpc2ggbGlzdGVuZXIgdG8gdGhpcyBzZXJ2ZXIuCi0JICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBwdWJsaXNoIGxpc3RlbmVyCi0JICogQHNlZSAjcmVtb3ZlUHVibGlzaExpc3RlbmVyKElQdWJsaXNoTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHVibGlzaExpc3RlbmVyKElQdWJsaXNoTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIHB1Ymxpc2ggbGlzdGVuZXIgZnJvbSB0aGlzIHNlcnZlci4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIHRoZSBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgcHVibGlzaCBsaXN0ZW5lcgotCSAqIEBzZWUgI2FkZFB1Ymxpc2hMaXN0ZW5lcihJUHVibGlzaExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVB1Ymxpc2hMaXN0ZW5lcihJUHVibGlzaExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHNlcnZlciBpcyBpbiBhIHN0YXRlIHRoYXQgaXQgY2FuCi0JICogYmUgcHVibGlzaGVkIHRvLgotCSAqCi0JICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgY2FuCi0JICogICBiZSBwdWJsaXNoZWQgdG8sIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuUHVibGlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlIHB1Ymxpc2hlZCB0by4gVGhpcyBpcyA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHRoZSBzZXJ2ZXIKLQkgKiBjYW4gYmUgcHVibGlzaGVkIHRvIGFuZCB0aGUgc2VydmVyJ3MgcHVibGlzaCBzdGF0ZSBvciBhbnkgbW9kdWxlJ3MgcHVibGlzaCBzdGF0ZSBpcyBub3QKLQkgKiBQVUJMSVNIX1NUQVRFX05PTkUuIAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRQdWJsaXNoKCk7Ci0KLQkvKioKLQkgKiBQdWJsaXNoIHRvIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIHByb2dyZXNzIG1vbml0b3IuIFRoZSByZXN1bHQgb2YgdGhlCi0JICogcHVibGlzaCBvcGVyYXRpb24gaXMgcmV0dXJuZWQgYXMgYW4gSVN0YXR1cy4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQuIFB1Ymxpc2hpbmcgaXMgbG9uZy0KLQkgKiBydW5uaW5nIGFuZCBtYXkgdHJpZ2dlciByZXNvdXJjZSBjaGFuZ2UgZXZlbnRzIG9yIGJ1aWxkcy4gQWx0aG91Z2ggdGhpcwotCSAqIGZyYW1ld29yayBpcyBzYWZlLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBvdGhlciBidW5kbGVzIGFyZSBVSS1zYWZlCi0JICogYW5kIHRoZSByaXNrIG9mIFVJIGRlYWRsb2NrIGlzIGhpZ2guIAotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBTaW5jZSB0aGlzIG1ldGhvZCBpcyBzeW5jaHJvbm91cyBhbmQgcmVxdWlyZXMgYWNjZXNzIHRvIHRoZSB3b3Jrc3BhY2UsCi0JICogaXQgd2lsbCBibG9jayB1bnRpbCBpdCBjYW4gYWNjZXNzIGEgcmVzb3VyY2UgYW5kIHNlcnZlciBzY2hlZHVsaW5nIGxvY2suCi0JICogVG8gcHVibGlzaCBhc3luY2hyb25vdXNseSB1c2luZyBhIGpvYiwgdXNlIHRoZSBhbHRlcm5hdGUgcHVibGlzaCgpIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGtpbmQgdGhlIGtpbmQgb2YgcHVibGlzaCBiZWluZyByZXF1ZXN0ZWQuIFZhbGlkIHZhbHVlcyBhcmU6Ci0JICogICAgPHVsPgotCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0ZVTEw8L2NvZGU+LSBpbmRpY2F0ZXMgYSBmdWxsIHB1Ymxpc2guPC9saT4KLQkgKiAgICA8bGk+PGNvZGU+UFVCTElTSF9JTkNSRU1FTlRBTDwvY29kZT4tIGluZGljYXRlcyBhIGluY3JlbWVudGFsIHB1Ymxpc2guCi0JICogICAgPGxpPjxjb2RlPlBVQkxJU0hfQ0xFQU48L2NvZGU+LSBpbmRpY2F0ZXMgYSBjbGVhbiByZXF1ZXN0LiBDbGVhbiB0aHJvd3MKLQkgKiAgICAgIG91dCBhbGwgc3RhdGUgYW5kIGNsZWFucyB1cCB0aGUgbW9kdWxlIG9uIHRoZSBzZXJ2ZXIgYmVmb3JlIGRvaW5nIGEKLQkgKiAgICAgIGZ1bGwgcHVibGlzaC4KLQkgKiAgICA8L3VsPgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIHN0YXR1cyBpbmRpY2F0aW5nIHdoYXQgKGlmIGFueXRoaW5nKSB3ZW50IHdyb25nCi0JICogQHNlZSAjcHVibGlzaChpbnQsIExpc3QsIElBZGFwdGFibGUsIElPcGVyYXRpb25MaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwdWJsaXNoKGludCBraW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUHVibGlzaCBvbmUgb3IgbW9yZSBtb2R1bGVzIHRvIHRoZSBzZXJ2ZXIuCi0JICogPHA+Ci0JICogVGhlIG9wZXJhdGlvbiBsaXN0ZW5lciBjYW4gYmUgdXNlZCB0byBhZGQgYSBsaXN0ZW5lciBmb3Igbm90aWZpY2F0aW9uCi0JICogb2YgdGhlIHB1Ymxpc2ggcmVzdWx0LiBUaGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQgd2l0aCBhCi0JICogc2luZ2xlIHN1Y2Nlc3NmdWwgc3RhdHVzIChzZXZlcml0eSBPSykgd2hlbiB0aGUgc2VydmVyIGhhcwotCSAqIGZpbmlzaGVkIHB1Ymxpc2hpbmcsIG9yIGEgc2luZ2xlIGZhaWx1cmUgKHNldmVyaXR5IEVSUk9SKSBpZgotCSAqIHRoZXJlIHdhcyBhbiBlcnJvciBwdWJsaXNoaW5nIHRvIHRoZSBzZXJ2ZXIuCi0JICogPC9wPjxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZC4gUHVibGlzaGluZyBpcyBsb25nLQotCSAqIHJ1bm5pbmcgYW5kIG1heSB0cmlnZ2VyIHJlc291cmNlIGNoYW5nZSBldmVudHMgb3IgYnVpbGRzLiBBbHRob3VnaCB0aGlzCi0JICogZnJhbWV3b3JrIGlzIHNhZmUsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IG90aGVyIGJ1bmRsZXMgYXJlIFVJLXNhZmUKLQkgKiBhbmQgdGhlIHJpc2sgb2YgVUkgZGVhZGxvY2sgaXMgaGlnaC4gCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBraW5kIHRoZSBraW5kIG9mIHB1Ymxpc2ggYmVpbmcgcmVxdWVzdGVkLiBWYWxpZCB2YWx1ZXMgYXJlOgotCSAqICAgIDx1bD4KLQkgKiAgICA8bGk+PGNvZGU+UFVCTElTSF9GVUxMPC9jb2RlPi0gaW5kaWNhdGVzIGEgZnVsbCBwdWJsaXNoLjwvbGk+Ci0JICogICAgPGxpPjxjb2RlPlBVQkxJU0hfSU5DUkVNRU5UQUw8L2NvZGU+LSBpbmRpY2F0ZXMgYSBpbmNyZW1lbnRhbCBwdWJsaXNoLgotCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0NMRUFOPC9jb2RlPi0gaW5kaWNhdGVzIGEgY2xlYW4gcmVxdWVzdC4gQ2xlYW4gdGhyb3dzCi0JICogICAgICBvdXQgYWxsIHN0YXRlIGFuZCBjbGVhbnMgdXAgdGhlIG1vZHVsZSBvbiB0aGUgc2VydmVyIGJlZm9yZSBkb2luZyBhCi0JICogICAgICBmdWxsIHB1Ymxpc2guCi0JICogICAgPC91bD4KLQkgKiBAcGFyYW0gbW9kdWxlcyBhIGxpc3Qgb2YgbW9kdWxlcyB0byBwdWJsaXNoLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotCSAqICAgIHB1Ymxpc2ggYWxsIG1vZHVsZXMKLQkgKiBAcGFyYW0gaW5mbyB0aGUgSUFkYXB0YWJsZSAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHByb3ZpZGVkIGJ5IHRoZQotCSAqICAgIGNhbGxlciBpbiBvcmRlciB0byBzdXBwbHkgVUkgaW5mb3JtYXRpb24gZm9yIHByb21wdGluZyB0aGUKLQkgKiAgICB1c2VyIGlmIG5lY2Vzc2FyeS4gV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBub3QKLQkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiwgaXQgc2hvdWxkIG1pbmltYWxseSBjb250YWluIGFuIGFkYXB0ZXIKLQkgKiAgICBmb3IgdGhlIFNoZWxsIGNsYXNzLgotCSAqIEBwYXJhbSBsaXN0ZW5lciBhbiBvcGVyYXRpb24gbGlzdGVuZXIgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gd2hlbiB0aGlzCi0JICogICAgb3BlcmF0aW9uIGlzIGRvbmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdGlmaWNhdGlvbiBpcyBub3QKLQkgKiAgICByZXF1aXJlZAotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdWJsaXNoKGludCBraW5kLCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlcywgSUFkYXB0YWJsZSBpbmZvLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2VydmVyIGlzIGluIGEgc3RhdGUgdGhhdCBpdCBjYW4KLQkgKiBiZSBzdGFydGVkIGluIHRoZSBnaXZlbiBtb2RlLgotCSAqCi0JICogQHBhcmFtIGxhdW5jaE1vZGUgYSBtb2RlIGluIHdoaWNoIGEgc2VydmVyIGNhbiBiZSBsYXVuY2hlZCwKLQkgKiAgICBvbmUgb2YgdGhlIG1vZGUgY29uc3RhbnRzIGRlZmluZWQgYnkKLQkgKiAgICB7QGxpbmsgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcn0KLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhlIHNlcnZlciBjYW4KLQkgKiAgICBiZSBzdGFydGVkLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2h5IGl0IGNhbid0Ci0JICovCi0JcHVibGljIElTdGF0dXMgY2FuU3RhcnQoU3RyaW5nIGxhdW5jaE1vZGUpOwotCi0JLyoqCi0JICogQXN5bmNocm9ub3VzbHkgc3RhcnRzIHRoaXMgc2VydmVyIGluIHRoZSBnaXZlbiBsYXVuY2ggbW9kZS4KLQkgKiA8cD4KLQkgKiBJZiBjYW5TdGFydChsYXVuY2hNb2RlKSBpcyBmYWxzZSwgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbgotCSAqIGV4Y2VwdGlvbi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSWYgdGhlIGNhbGxlciB3YW50cyB0byBsaXN0ZW4gZm9yIGZhaWx1cmUgb3Igc3VjY2VzcyBvZiB0aGUKLQkgKiBzZXJ2ZXIgc3RhcnRpbmcsIGl0IGNhbiBhZGQgYSBzZXJ2ZXIgbGlzdGVuZXIgb3IgdXNlIHRoZQotCSAqIHZlcnNpb24gb2YgdGhpcyBtZXRob2QgdGhhdCB0YWtlcyBhbiBvcGVyYXRpb24gbGlzdGVuZXIgYXMgYQotCSAqIHBhcmFtZXRlci4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBhIG1vZGUgaW4gd2hpY2ggYSBzZXJ2ZXIgY2FuIGJlIGxhdW5jaGVkLAotCSAqICAgIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMgZGVmaW5lZCBieQotCSAqICAgIHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHRyeWluZyB0byBzdGFydCB0aGUgc2VydmVyCi0JICogQHNlZSAjc3RhcnQoU3RyaW5nLCBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IHN0YXJ0cyB0aGlzIHNlcnZlciBpbiB0aGUgZ2l2ZW4gbGF1bmNoIG1vZGUuCi0JICogPHA+Ci0JICogSWYgY2FuU3RhcnQobGF1bmNoTW9kZSkgaXMgZmFsc2UsIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4KLQkgKiBleGNlcHRpb24uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZSBvcGVyYXRpb24gbGlzdGVuZXIgY2FuIGJlIHVzZWQgdG8gYWRkIGEgbGlzdGVuZXIgZm9yIG5vdGlmaWNhdGlvbgotCSAqIG9mIHRoaXMgc3BlY2lmaWMgc2VydmVyIGxhdW5jaC4gVGhlIGxpc3RlbmVyIHdpbGwgYmUgY2FsbGVkIHdpdGggYQotCSAqIHNpbmdsZSBzdWNjZXNzZnVsIHN0YXR1cyAoc2V2ZXJpdHkgT0spIHdoZW4gdGhlIHNlcnZlciBoYXMKLQkgKiBmaW5pc2hlZCBzdGFydGluZywgb3IgYSBzaW5nbGUgZmFpbHVyZSAoc2V2ZXJpdHkgRVJST1IpIGlmCi0JICogdGhlcmUgd2FzIGFuIGVycm9yIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEgbW9kZSBpbiB3aGljaCBhIHNlcnZlciBjYW4gYmUgbGF1bmNoZWQsCi0JICogICAgb25lIG9mIHRoZSBtb2RlIGNvbnN0YW50cyBkZWZpbmVkIGJ5Ci0JICogICAge0BsaW5rIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXJ9Ci0JICogQHBhcmFtIGxpc3RlbmVyIGFuIG9wZXJhdGlvbiBsaXN0ZW5lciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiB3aGVuIHRoaXMKLQkgKiAgICBvcGVyYXRpb24gaXMgZG9uZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90aWZpY2F0aW9uIGlzIG5vdAotCSAqICAgIHJlcXVpcmVkCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoU3RyaW5nIGxhdW5jaE1vZGUsIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbgotCSAqIGJlIHJlc3RhcnRlZCBpbiB0aGUgZ2l2ZW4gbW9kZS4gTm90ZSB0aGF0IG9ubHkgc2VydmVycwotCSAqIHRoYXQgYXJlIGN1cnJlbnRseSBydW5uaW5nIGNhbiBiZSByZXN0YXJ0ZWQuCi0JICoKLQkgKiBAcGFyYW0gbW9kZSBhIG1vZGUgaW4gd2hpY2ggYSBzZXJ2ZXIgY2FuIGJlIGxhdW5jaGVkLAotCSAqICAgIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMgZGVmaW5lZCBieQotCSAqICAgIHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfQotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgc2VydmVyIGNhbgotCSAqICAgIGJlIHJlc3RhcnRlZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoeSBpdCBjYW4ndAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhblJlc3RhcnQoU3RyaW5nIG1vZGUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlIHJlc3RhcnRlZC4gVGhpcyBpcyA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHRoZSBzZXJ2ZXIKLQkgKiBjYW4gYmUgcmVzdGFydGVkIGFuZCB0aGUgc2VydmVyJ3MgcmVzdGFydCBzdGF0ZSBvciBhbnkgbW9kdWxlJ3MgcmVzdGFydCBzdGF0ZXMgaXMgbm90Ci0JICogZmFsc2UuIAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZXN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgb3V0IG9mIHN5bmMgYW5kIG5lZWRzIHRvIGJlCi0JICogcmVzdGFydGVkLiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBmYWxzZSB3aGVuIHRoZQotCSAqIHNlcnZlciBpcyBub3QgcnVubmluZy4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IE5lZWQgdG8gZXhwbGFpbiB3aGF0IGlzIGl0IHRoYXQgY2FuIGdldCBvdXQgb2YKLQkgKiAib3V0IG9mIHN5bmMiIGhlcmUsIGFuZCBob3cgdGhpcyBjYW4gaGFwcGVuLl0KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHNlcnZlciBpcyBvdXQgb2Ygc3luYyBhbmQgbmVlZHMgdG8gYmUKLQkgKiByZXN0YXJ0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlIChlLmcuLCBpZiB0aGUgY29udGVudHMgaGF2ZQotCSAqIG5vdCBiZWVuIG1vZGlmaWVkIGFuZCB0aGUgc2VydmVyIHByb2Nlc3MgaXMgc3RpbGwgaW4gc3luYyk7IHRoZQotCSAqIHJlc3VsdCBpcyB1bnNwZWNpZmllZCBpZiB0aGUgc2VydmVyIGlzIG5vdCBjdXJyZW50bHkgcnVubmluZwotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFNlcnZlclJlc3RhcnRTdGF0ZSgpOwotCi0JLyoqCi0JICogU3luY2hyb25vdXNseSByZXN0YXJ0cyB0aGlzIHNlcnZlci4gVGhpcyBvcGVyYXRpb24gZG9lcwotCSAqIG5vdGhpbmcgaWYgdGhpcyBzZXJ2ZXIgY2Fubm90IGJlIHN0b3BwZWQgKHtAbGluayAjY2FuUmVzdGFydChTdHJpbmcpfQotCSAqIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LiBSZXN0YXJ0aW5nIHRoZSBzZXJ2ZXIgbWF5IGNhdXNlIGEgcHVibGlzaCAKLQkgKiBkdXJpbmcgdGhlIHN0YXJ0IGlmIG5lY2Vzc2FyeSBhbmQgYWNjb3JkaW5nIHRvIHRoZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBjYW5ub3QgYmUgdXNlZCB0byBzdGFydCB0aGUgc2VydmVyIGZyb20gYSBzdG9wcGVkIHN0YXRlLgotCSAqIDxwPgotCSAqIElmIHRoZSBjYWxsZXIgd2FudHMgdG8gbGlzdGVuIGZvciBmYWlsdXJlIG9yIHN1Y2Nlc3Mgb2YgdGhlCi0JICogc2VydmVyIHJlc3RhcnRpbmcsIGl0IGNhbiBhZGQgYSBzZXJ2ZXIgbGlzdGVuZXIgb3IgdXNlIHRoZQotCSAqIHZlcnNpb24gb2YgdGhpcyBtZXRob2QgdGhhdCB0YWtlcyBhbiBvcGVyYXRpb24gbGlzdGVuZXIgYXMgYQotCSAqIHBhcmFtZXRlci4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBhIG1vZGUgaW4gd2hpY2ggYSBzZXJ2ZXIgY2FuIGJlIGxhdW5jaGVkLAotCSAqICAgIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMgZGVmaW5lZCBieQotCSAqICAgIHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAc2VlICNyZXN0YXJ0KFN0cmluZywgSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVzdGFydChTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IHJlc3RhcnRzIHRoaXMgc2VydmVyLiBUaGlzIG9wZXJhdGlvbiBkb2VzCi0JICogbm90aGluZyBpZiB0aGlzIHNlcnZlciBjYW5ub3QgYmUgc3RvcHBlZCAoe0BsaW5rICNjYW5SZXN0YXJ0KFN0cmluZyl9Ci0JICogcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uIFJlc3RhcnRpbmcgdGhlIHNlcnZlciBtYXkgY2F1c2UgYSBwdWJsaXNoIAotCSAqIGR1cmluZyB0aGUgc3RhcnQgaWYgbmVjZXNzYXJ5IGFuZCBhY2NvcmRpbmcgdG8gdGhlIHNlcnZlciBkZWZpbml0aW9uLgotCSAqIFRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIHN0YXJ0IHRoZSBzZXJ2ZXIgZnJvbSBhIHN0b3BwZWQgc3RhdGUuCi0JICogPHA+Ci0JICogVGhlIG9wZXJhdGlvbiBsaXN0ZW5lciBjYW4gYmUgdXNlZCB0byBhZGQgYSBsaXN0ZW5lciBmb3Igbm90aWZpY2F0aW9uCi0JICogb2YgdGhpcyBzcGVjaWZpYyBzZXJ2ZXIgcmVzdGFydC4gVGhlIGxpc3RlbmVyIHdpbGwgYmUgY2FsbGVkIHdpdGggYQotCSAqIHNpbmdsZSBzdWNjZXNzZnVsIHN0YXR1cyAoc2V2ZXJpdHkgT0spIHdoZW4gdGhlIHNlcnZlciBoYXMKLQkgKiBmaW5pc2hlZCByZXN0YXJ0aW5nLCBvciBhIHNpbmdsZSBmYWlsdXJlIChzZXZlcml0eSBFUlJPUikgaWYKLQkgKiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVzdGFydGluZyB0aGUgc2VydmVyLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEgbW9kZSBpbiB3aGljaCBhIHNlcnZlciBjYW4gYmUgbGF1bmNoZWQsCi0JICogICAgb25lIG9mIHRoZSBtb2RlIGNvbnN0YW50cyBkZWZpbmVkIGJ5Ci0JICogICAge0BsaW5rIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXJ9Ci0JICogQHBhcmFtIGxpc3RlbmVyIGFuIG9wZXJhdGlvbiBsaXN0ZW5lciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiB3aGVuIHRoaXMKLQkgKiAgICBvcGVyYXRpb24gaXMgZG9uZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90aWZpY2F0aW9uIGlzIG5vdAotCSAqICAgIHJlcXVpcmVkCi0JICovCi0JcHVibGljIHZvaWQgcmVzdGFydChTdHJpbmcgbGF1bmNoTW9kZSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHNlcnZlciBpcyBpbiBhIHN0YXRlIHRoYXQgaXQgY2FuCi0JICogYmUgc3RvcHBlZC4KLQkgKiBTZXJ2ZXJzIGNhbiBiZSBzdG9wcGVkIGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5IHN0b3BwZWQgYW5kIGlmCi0JICogdGhleSBiZWxvbmcgdG8gYSBzdGF0ZS1zZXQgdGhhdCBjYW4gYmUgc3RvcHBlZC4KLQkgKgotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgc2VydmVyIGNhbgotCSAqICAgYmUgc3RvcHBlZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoeSBpdCBjYW4ndAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhblN0b3AoKTsKLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IHN0b3BzIHRoaXMgc2VydmVyLiBUaGlzIG9wZXJhdGlvbiBkb2VzCi0JICogbm90aGluZyBpZiB0aGlzIHNlcnZlciBjYW5ub3QgYmUgc3RvcHBlZCAoe0BsaW5rICNjYW5TdG9wKCl9Ci0JICogcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogPHA+Ci0JICogSWYgZm9yY2UgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpdCB3aWxsIGF0dGVtcHQgdG8gc3RvcCB0aGUgc2VydmVyCi0JICogbm9ybWFsbHkvZ3JhY2VmdWxseS4gSWYgZm9yY2UgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZW4gdGhlIHNlcnZlcgotCSAqIHByb2Nlc3Mgd2lsbCBiZSB0ZXJtaW5hdGVkIGFueSB3YXkgdGhhdCBpdCBjYW4uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIElmIHRoZSBjYWxsZXIgd2FudHMgdG8gbGlzdGVuIGZvciBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdGhlCi0JICogc2VydmVyIHN0b3BwaW5nLCBpdCBjYW4gYWRkIGEgc2VydmVyIGxpc3RlbmVyIG9yIHVzZSB0aGUKLQkgKiB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kIHRoYXQgdGFrZXMgYW4gb3BlcmF0aW9uIGxpc3RlbmVyIGFzIGEKLQkgKiBwYXJhbWV0ZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBmb3JjZSA8Y29kZT50cnVlPC9jb2RlPiB0byBraWxsIHRoZSBzZXJ2ZXIsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgIHRvIHN0b3Agbm9ybWFsbHkKLQkgKiBAc2VlICNzdGFydChTdHJpbmcsIElTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoYm9vbGVhbiBmb3JjZSk7Ci0KLQkvKioKLQkgKiBBc3luY2hyb25vdXNseSBzdG9wcyB0aGlzIHNlcnZlci4gVGhpcyBvcGVyYXRpb24gZG9lcwotCSAqIG5vdGhpbmcgaWYgdGhpcyBzZXJ2ZXIgY2Fubm90IGJlIHN0b3BwZWQgKHtAbGluayAjY2FuU3RvcCgpfQotCSAqIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIDxwPgotCSAqIElmIGZvcmNlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXQgd2lsbCBhdHRlbXB0IHRvIHN0b3AgdGhlIHNlcnZlcgotCSAqIG5vcm1hbGx5L2dyYWNlZnVsbHkuIElmIGZvcmNlIGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIHRoZSBzZXJ2ZXIKLQkgKiBwcm9jZXNzIHdpbGwgYmUgdGVybWluYXRlZCBhbnkgd2F5IHRoYXQgaXQgY2FuLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgb3BlcmF0aW9uIGxpc3RlbmVyIGNhbiBiZSB1c2VkIHRvIGFkZCBhIGxpc3RlbmVyIGZvciBub3RpZmljYXRpb24KLQkgKiBvZiB0aGlzIHNwZWNpZmljIHNlcnZlciBzdG9wLiBUaGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQgd2l0aCBhCi0JICogc2luZ2xlIHN1Y2Nlc3NmdWwgc3RhdHVzIChzZXZlcml0eSBPSykgd2hlbiB0aGUgc2VydmVyIGhhcwotCSAqIGZpbmlzaGVkIHN0b3BwaW5nLCBvciBhIHNpbmdsZSBmYWlsdXJlIChzZXZlcml0eSBFUlJPUikgaWYKLQkgKiB0aGVyZSB3YXMgYW4gZXJyb3Igc3RvcHBpbmcgdGhlIHNlcnZlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGZvcmNlIDxjb2RlPnRydWU8L2NvZGU+IHRvIGtpbGwgdGhlIHNlcnZlciwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgdG8gc3RvcCBub3JtYWxseQotCSAqIEBwYXJhbSBsaXN0ZW5lciBhbiBvcGVyYXRpb24gbGlzdGVuZXIgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gd2hlbiB0aGlzCi0JICogICAgb3BlcmF0aW9uIGlzIGRvbmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdGlmaWNhdGlvbiBpcyBub3QKLQkgKiAgICByZXF1aXJlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoYm9vbGVhbiBmb3JjZSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGdpdmVuIG1vZHVsZSBvbiB0aGlzIHNlcnZlci4KLQkgKiBSZXR1cm5zIDxjb2RlPlNUQVRFX1VOS05PV048L2NvZGU+IGlmIHRoZSBtb2R1bGUKLQkgKiBpcyBub3QgYW1vbmcgdGhlIG9uZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqIEByZXR1cm4gb25lIG9mIHRoZSBzdGF0ZSAoPGNvZGU+U1RBVEVfWFhYPC9jb2RlPikgY29uc3RhbnRzIGRlY2xhcmVkCi0JICogICAgb24ge0BsaW5rIElTZXJ2ZXJ9Ci0JICovCi0JcHVibGljIGludCBnZXRNb2R1bGVTdGF0ZShJTW9kdWxlW10gbW9kdWxlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSdzIHN5bmMgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCi0JICogQHJldHVybiBvbmUgb2YgdGhlIFBVQkxJU0hfU1RBVEVfWFhYIHN0YXRlIGZsYWdzCi0JICovCi0JcHVibGljIGludCBnZXRNb2R1bGVQdWJsaXNoU3RhdGUoSU1vZHVsZVtdIG1vZHVsZSk7Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gbW9kdWxlIGlzIGluIHN5bmMgb24gdGhlIHNlcnZlci4gSXQgc2hvdWxkCi0JICogcmV0dXJuIHRydWUgaWYgdGhlIG1vZHVsZSBzaG91bGQgYmUgcmVzdGFydGVkIChpcyBvdXQgb2YKLQkgKiBzeW5jKSBvciBmYWxzZSBpZiB0aGUgbW9kdWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgcmVzdGFydGVkLgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0TW9kdWxlUmVzdGFydFN0YXRlKElNb2R1bGVbXSBtb2R1bGUpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBtb2R1bGUgY2FuIGJlIHJlc3RhcnRlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBoYXMgYSBwcm9ncmVzcyBtb25pdG9yIGJlY2F1c2UgaXQgbWF5IGludm9sdmUgcGx1Z2luCi0JICogYW5kIGNsYXNzIGxvYWRpbmcuIE5vIGNvbW11bmljYXRpb24gdG8gdGhlIHNlcnZlciB3aWxsIG9jY3VyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBtb2R1bGUgY2FuCi0JICogICAgYmUgcmVzdGFydGVkLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2h5IGl0IGNhbid0Ci0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5Db250cm9sTW9kdWxlKElNb2R1bGVbXSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG1vZHVsZSBjYW4gYmUgcmVzdGFydGVkLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGhhcyBhIHByb2dyZXNzIG1vbml0b3IgYmVjYXVzZSBpdCBtYXkgaW52b2x2ZSBwbHVnaW4KLQkgKiBhbmQgY2xhc3MgbG9hZGluZy4gTm8gY29tbXVuaWNhdGlvbiB0byB0aGUgc2VydmVyIHdpbGwgb2NjdXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhlIG1vZHVsZSBjYW4KLQkgKiAgICBiZSByZXN0YXJ0ZWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aHkgaXQgY2FuJ3QKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5SZXN0YXJ0TW9kdWxlKElNb2R1bGVbXSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBtb2R1bGUgY2FuIGJlIHB1Ymxpc2hlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBoYXMgYSBwcm9ncmVzcyBtb25pdG9yIGJlY2F1c2UgaXQgbWF5IGludm9sdmUgcGx1Z2luCi0JICogYW5kIGNsYXNzIGxvYWRpbmcuIE5vIGNvbW11bmljYXRpb24gdG8gdGhlIHNlcnZlciB3aWxsIG9jY3VyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBtb2R1bGUgY2FuCi0JICogICAgYmUgcHVibGlzaGVkLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2h5IGl0IGNhbid0Ci0JICovCi0JcHVibGljIElTdGF0dXMgY2FuUHVibGlzaE1vZHVsZShJTW9kdWxlW10gbW9kdWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogQXN5bmNocm9ub3VzbHkgc3RhcnRzIHRoaXMgc2VydmVyIGluIHRoZSBnaXZlbiBsYXVuY2ggbW9kZS4KLQkgKiA8cD4KLQkgKiBJZiBjYW5TdGFydChsYXVuY2hNb2RlKSBpcyBmYWxzZSwgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbgotCSAqIGV4Y2VwdGlvbi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIG9wZXJhdGlvbiBsaXN0ZW5lciBjYW4gYmUgdXNlZCB0byBhZGQgYSBsaXN0ZW5lciBmb3Igbm90aWZpY2F0aW9uCi0JICogb2YgdGhpcyBzcGVjaWZpYyBtb2R1bGUgc3RhcnQuIFRoZSBsaXN0ZW5lciB3aWxsIGJlIGNhbGxlZCB3aXRoIGEKLQkgKiBzaW5nbGUgc3VjY2Vzc2Z1bCBzdGF0dXMgKHNldmVyaXR5IE9LKSB3aGVuIHRoZSBtb2R1bGUgaGFzCi0JICogZmluaXNoZWQgc3RhcnRpbmcsIG9yIGEgc2luZ2xlIGZhaWx1cmUgKHNldmVyaXR5IEVSUk9SKSBpZgotCSAqIHRoZXJlIHdhcyBhbiBlcnJvciBzdGFydGluZyB0aGUgbW9kdWxlLgotCSAqIDwvcD4KLQkgKgotCSAqQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlIHRvIGJlIHN0YXJ0ZWQKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYW4gb3BlcmF0aW9uIGxpc3RlbmVyIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIHdoZW4gdGhpcwotCSAqICAgIG9wZXJhdGlvbiBpcyBkb25lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3RpZmljYXRpb24gaXMgbm90Ci0JICogICAgcmVxdWlyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydE1vZHVsZShJTW9kdWxlW10gbW9kdWxlLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQXN5bmNocm9ub3VzbHkgc3RvcHMgdGhlIGdpdmVuIG1vZHVsZS4gVGhpcyBvcGVyYXRpb24gZG9lcwotCSAqIG5vdGhpbmcgaWYgdGhpcyBtb2R1bGUgY2Fubm90IGJlIHN0b3BwZWQuCi0JICogPHA+Ci0JICogVGhlIG9wZXJhdGlvbiBsaXN0ZW5lciBjYW4gYmUgdXNlZCB0byBhZGQgYSBsaXN0ZW5lciBmb3Igbm90aWZpY2F0aW9uCi0JICogb2YgdGhpcyBzcGVjaWZpYyBtb2R1bGUgc3RvcC4gVGhlIGxpc3RlbmVyIHdpbGwgYmUgY2FsbGVkIHdpdGggYQotCSAqIHNpbmdsZSBzdWNjZXNzZnVsIHN0YXR1cyAoc2V2ZXJpdHkgT0spIHdoZW4gdGhlIG1vZHVsZSBoYXMKLQkgKiBmaW5pc2hlZCBzdG9wcGluZywgb3IgYSBzaW5nbGUgZmFpbHVyZSAoc2V2ZXJpdHkgRVJST1IpIGlmCi0JICogdGhlcmUgd2FzIGFuIGVycm9yIHN0b3BwaW5nIHRoZSBtb2R1bGUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0byBiZSBzdG9wcGVkCi0JICogQHBhcmFtIGxpc3RlbmVyIGFuIG9wZXJhdGlvbiBsaXN0ZW5lciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiB3aGVuIHRoaXMKLQkgKiAgICBvcGVyYXRpb24gaXMgZG9uZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90aWZpY2F0aW9uIGlzIG5vdAotCSAqICAgIHJlcXVpcmVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcE1vZHVsZShJTW9kdWxlW10gbW9kdWxlLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQXN5bmNocm9ub3VzbHkgcmVzdGFydHMgdGhlIGdpdmVuIG1vZHVsZSBvbiB0aGUgc2VydmVyLgotCSAqIDxwPgotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgdXBkYXRlIHRoZSBtb2R1bGUgc3luYyBzdGF0ZSBhbmQgZmlyZQotCSAqIGFuIGV2ZW50IGZvciB0aGUgbW9kdWxlLiBJZiB0aGUgbW9kdWxlIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBzZXJ2ZXIsCi0JICogYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IElmIHRoZSBtb2R1bGUgd2FzIGp1c3QgcHVibGlzaGVkIHRvIHRoZSBzZXJ2ZXIKLQkgKiBhbmQgaGFkIG5ldmVyIGJlZW4gc3RhcnRlZCwgd291bGQgaXMgYmUgb2sgdG8gInN0YXJ0IgotCSAqIHRoZSBtb2R1bGUgdXNpbmcgdGhpcyBtZXRob2Q/XQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gYmUgc3RhcnRlZAotCSAqIEBwYXJhbSBsaXN0ZW5lciBhbiBvcGVyYXRpb24gbGlzdGVuZXIgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gd2hlbiB0aGlzCi0JICogICAgb3BlcmF0aW9uIGlzIGRvbmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdGlmaWNhdGlvbiBpcyBub3QKLQkgKiAgICByZXF1aXJlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RhcnRNb2R1bGUoSU1vZHVsZVtdIG1vZHVsZSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgc2VydmVyLiBJZiBvbmUgZG9lcyBub3QgZXhpc3QsIGl0Ci0JICogd2lsbCBiZSBjcmVhdGVkIGlmICJjcmVhdGUiIGlzIHRydWUsIGFuZCBvdGhlcndpc2Ugd2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogV2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBzZXJ2ZXIgdHlwZSBpcyBpbnZhbGlkIG9yIGhhcyBubyBhc3NvY2lhdGVkCi0JICogbGF1bmNoIGNvbmZpZ3VyYXRpb24gdHlwZSAoaS5lLiB0aGlzIHNlcnZlciB0eXBlIGNhbm5vdCBiZSBzdGFydGVkKS4KLQkgKiAKLQkgKiBAcGFyYW0gY3JlYXRlIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbmV3IGxhdW5jaCBjb25maWd1cmF0aW9uIHNob3VsZCBiZQotCSAqICAgIGNyZWF0ZWQgaWYgdGhlcmUgYXJlIG5vbmUgYWxyZWFkeQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgd2FzIG5vCi0JICogICAgZXhpc3RpbmcgbGF1bmNoIGNvbmZpZ3VyYXRpb24gYW5kIDxjb2RlPmNyZWF0ZTwvY29kZT4gd2FzIGZhbHNlCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBJTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRMYXVuY2hDb25maWd1cmF0aW9uKGJvb2xlYW4gY3JlYXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGF1bmNoIHRoYXQgd2FzIHVzZWQgdG8gc3RhcnQgdGhlIHNlcnZlciwgaWYgYXZhaWxhYmxlLiBJZiB0aGUgc2VydmVyCi0JICogaXMgbm90IHJ1bm5pbmcsIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LiAKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsYXVuY2ggdXNlZCB0byBzdGFydCB0aGUgY3VycmVudGx5IHJ1bm5pbmcgc2VydmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgIGlmIHRoZSBsYXVuY2ggaXMgdW5hdmFpbGFibGUgb3IgY291bGQgbm90IGJlIGZvdW5kCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBJTGF1bmNoIGdldExhdW5jaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhcnQgdGltZW91dCBpbiBzZWNvbmRzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0YXJ0IHRpbWVvdXQgaW4gc2Vjb25kcwotCSAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0VGltZW91dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RvcCB0aW1lb3V0IGluIHNlY29uZHMuCi0JICogCi0JICogQHJldHVybiB0aGUgc3RvcCB0aW1lb3V0IGluIHNlY29uZHMKLQkgKiBAc2luY2UgMS4xCi0JICovCi0JcHVibGljIGludCBnZXRTdG9wVGltZW91dCgpOwotCi0JLyoqCi0JICogU3RhcnRzIHRoaXMgc2VydmVyIGluIHRoZSBnaXZlbiBsYXVuY2ggbW9kZSBhbmQgd2FpdHMgdW50aWwgdGhlIHNlcnZlcgotCSAqIGhhcyBmaW5pc2hlZCBzdGFydGluZy4KLQkgKiA8cD4KLQkgKiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCB1c2VzIHtAbGluayAjc3RhcnQoU3RyaW5nLCBJUHJvZ3Jlc3NNb25pdG9yKX0KLQkgKiB0byBzdGFydCB0aGUgc2VydmVyLCBhbmQgYW4gaW50ZXJuYWwgdGhyZWFkIGFuZCBsaXN0ZW5lciB0byBkZXRlY3QKLQkgKiB3aGVuIHRoZSBzZXJ2ZXIgaGFzIGZpbmlzaGVkIHN0YXJ0aW5nLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEgbW9kZSBpbiB3aGljaCBhIHNlcnZlciBjYW4gYmUgbGF1bmNoZWQsCi0JICogICAgb25lIG9mIHRoZSBtb2RlIGNvbnN0YW50cyBkZWZpbmVkIGJ5Ci0JICogICAge0BsaW5rIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXJ9Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI3N0YXJ0KFN0cmluZywgSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXIpfQotCSAqICAgIGluc3RlYWQKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHRyeWluZyB0byBzdGFydCB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgc3luY2hyb25vdXNTdGFydChTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFN0b3BzIHRoaXMgc2VydmVyIGFuZCB3YWl0cyB1bnRpbCB0aGUgc2VydmVyIGhhcyBjb21wbGV0ZWx5IHN0b3BwZWQuCi0JICogPHA+Ci0JICogVGhpcyBjb252ZW5pZW5jZSBtZXRob2QgdXNlcyB7QGxpbmsgI3N0b3AoYm9vbGVhbil9Ci0JICogdG8gc3RvcCB0aGUgc2VydmVyLCBhbmQgYW4gaW50ZXJuYWwgdGhyZWFkIGFuZCBsaXN0ZW5lciB0byBkZXRlY3QKLQkgKiB3aGVuIHRoZSBzZXJ2ZXIgaGFzIGNvbXBsaWVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yY2UgPGNvZGU+dHJ1ZTwvY29kZT4gdG8ga2lsbCB0aGUgc2VydmVyLCBvciA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICB0byBzdG9wIG5vcm1hbGx5Ci0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjc3RvcChib29sZWFuLCBJT3BlcmF0aW9uTGlzdGVuZXIpfQotCSAqICAgIGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbm91c1N0b3AoYm9vbGVhbiBmb3JjZSk7Ci0KLQkvKioKLQkgKiBTeW5jaHJvbm91c2x5IHJlc3RhcnRzIHRoaXMgc2VydmVyLiBUaGlzIG9wZXJhdGlvbiBkb2VzCi0JICogbm90aGluZyBpZiB0aGlzIHNlcnZlciBjYW5ub3QgYmUgc3RvcHBlZCAoe0BsaW5rICNjYW5SZXN0YXJ0KFN0cmluZyl9Ci0JICogcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogPHA+Ci0JICoKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBhIG1vZGUgaW4gd2hpY2ggYSBzZXJ2ZXIgY2FuIGJlIGxhdW5jaGVkLAotCSAqICAgIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMgZGVmaW5lZCBieQotCSAqICAgIHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjcmVzdGFydChTdHJpbmcsIElTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyKX0gCi0JICogICAgaW5zdGVhZAotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNocm9ub3VzUmVzdGFydChTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyQXR0cmlidXRlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlckF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FkYTBmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyQXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLS8qKgotICogUmVwcmVzZW50cyBhIHNlcnZlciBpbnN0YW5jZS4gRXZlcnkgc2VydmVyIGlzIGFuIGluc3RhbmNlIG9mIGEKLSAqIHBhcnRpY3VsYXIsIGZpeGVkIHNlcnZlciB0eXBlLgotICogPHA+Ci0gKiBOb3Qgc3VycHJpc2luZ2x5LCB0aGUgbm90aW9uIG9mIDxiPnNlcnZlcjwvYj4gaXMgY2VudHJhbCBpbiB0aGUgd2ViIHRvb2xzCi0gKiBzZXJ2ZXIgaW5mcmFzdHJ1Y3R1cmUuIEluIHRoaXMgY29udGV4dCwgdW5kZXJzdGFuZCB0aGF0IGEgc2VydmVyIGlzCi0gKiBhIHdlYiBzZXJ2ZXIgb2Ygc29tZSBpbGsuIEl0IGNvdWxkIGJlIGEgc2ltcGxlIHdlYiBzZXJ2ZXIgbGFja2luZyBKYXZhCi0gKiBzdXBwb3J0LCBvciBhbiBKMkVFIGJhc2VkIHNlcnZlciwgb3IgcGVyaGFwcyBldmVuIHNvbWUga2luZCBvZiBkYXRhYmFzZQotICogc2VydmVyLiBBIG1vcmUgZXhhY3QgZGVmaW5pdGlvbiBpcyBub3QgcmVxdWlyZWQgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIEFQSS4KLSAqIEZyb20gYSB0b29sLWNlbnRyaWMgcG9pbnQgb2YgdmlldywgYSBzZXJ2ZXIKLSAqIGlzIHNvbWV0aGluZyB0aGF0IHRoZSBkZXZlbG9wZXIgaXMgd3JpdGluZyAiY29udGVudCIgZm9yLgotICogVGhlIHVuaXQgb2YgY29udGVudCBpcyB0ZXJtZWQgYSBtb2R1bGUuCi0gKiBJbiBhIHNlbnNlLCB0aGUgc2VydmVyIGV4aXN0cywgYnV0IGxhY2tzIHVzZWZ1bCBjb250ZW50LiBUaGUKLSAqIGRldmVsb3BtZW50IHRhc2sgaXMgdG8gcHJvdmlkZSB0aGF0IGNvbnRlbnQuIFRoZSBjb250ZW50IGNhbiBpbmNsdWRlCi0gKiBhbnl0aGluZyBmcm9tIHNpbXBsZSwgc3RhdGljIEhUTUwgd2ViIHBhZ2VzIHRvIGNvbXBsZXgsIGhpZ2hseSBkeW5hbWljCi0gKiB3ZWIgYXBwbGljYXRpb25zLgotICogSW4gdGhlIGNvdXJzZSBvZiB3cml0aW5nIGFuZCBkZWJ1Z2dpbmcgdGhpcyBjb250ZW50LAotICogdGhlIGRldmVsb3BlciB3aWxsIHdhbnQgdG8gdGVzdCB0aGVpciBjb250ZW50IG9uIGEgd2ViIHNlcnZlciwgdG8gc2VlIGhvdyBpdAotICogZ2V0cyBzZXJ2ZWQgdXAuIEZvciB0aGlzIHRoZXkgd2lsbCBuZWVkIHRvIGxhdW5jaCBhIHNlcnZlciBwcm9jZXNzIHJ1bm5pbmcgb24KLSAqIHNvbWUgaG9zdCBtYWNoaW5lIChvZnRlbiB0aGUgbG9jYWwgaG9zdCBvbiB3aGljaCB0aGUgSURFIGlzIHJ1bm5pbmcpLCBvcgotICogYXR0YWNoIHRvIGEgc2VydmVyIHRoYXQncyBhbHJlYWR5IHJ1bm5pbmcgb24gYSByZW1vdGUgKG9yIGxvY2FsKSBob3N0LiAKLSAqIFRoZSBuZXdseSBkZXZlbG9wZWQgY29udGVudCBzaXR0aW5nIGluIHRoZSBkZXZlbG9wZXIncyB3b3Jrc3BhY2UgbmVlZHMgdG8KLSAqIGVuZCB1cCBpbiBhIGxvY2F0aW9uIGFuZCBmb3JtYXQgdGhhdCB0aGUgcnVubmluZyBzZXJ2ZXIgY2FuIHVzZSBmb3IgaXRzCi0gKiBzZXJ2aW5nIHB1cnBvc2VzLgotICogPC9wPgotICogPHA+Ci0gKiBJbiB0aGlzIHBpY3R1cmUsIGFuIDxjb2RlPklTZXJ2ZXI8L2NvZGU+IG9iamVjdCBpcyBhIHByb3h5IGZvciB0aGUgcmVhbCB3ZWIKLSAqIHNlcnZlci4gVGhyb3VnaCB0aGlzIHByb3h5LCBhIGNsaWVudCBjYW4gY29uZmlndXJlIHRoZSBzZXJ2ZXIsIGFuZCBzdGFydCwKLSAqIHN0b3AsIGFuZCByZXN0YXJ0IGl0LgotICogPC9wPgotICogPHA+Ci0gKiBJU2VydmVyQXR0cmlidXRlcyBpbXBsZW1lbnRzIElBZGFwdGFibGUgdG8gYWxsb3cgdXNlcnMgdG8gb2J0YWluIGEKLSAqIHNlcnZlci10eXBlLXNwZWNpZmljIGNsYXNzLiBCeSBjYXN0aW5nIHRoZSBydW50aW1lIGV4dGVuc2lvbiB0byB0aGUgdHlwZQotICogcHJlc2NyaWJlZCBpbiB0aGUgQVBJIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgcGFydGljdWxhciBzZXJ2ZXIgdHlwZSwgdGhlCi0gKiBjbGllbnQgY2FuIGFjY2VzcyBzZXJ2ZXItdHlwZS1zcGVjaWZpYyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLgotICogZ2V0QWRhcHRlcigpIG1heSBpbnZvbHZlIHBsdWdpbiBsb2FkaW5nLCBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbQotICogcG9wdXAgbWVudXMsIGV0Yy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIHNlcnZlciBmcmFtZXdvcmsgbWFpbnRhaW5zIGEgZ2xvYmFsIGxpc3Qgb2YgYWxsIGtub3duIHNlcnZlciBpbnN0YW5jZXMKLSAqICh7QGxpbmsgU2VydmVyQ29yZSNnZXRTZXJ2ZXJzKCl9KS4KLSAqIDwvcD4KLSAqIDxwPgotICogW3JvdWdoIG5vdGVzOgotICogU2VydmVyIGhhcyBhIHN0YXRlLgotICogU2VydmVyIGNhbiBiZSBzdGFydGVkLCBzdG9wcGVkLCBhbmQgcmVzdGFydGVkLgotICogVG8gbW9kaWZ5IHNlcnZlciBhdHRyaWJ1dGVzLCBnZXQgYSB3b3JraW5nIGNvcHksIG1vZGlmeSBpdCwgYW5kIHRoZW4gc2F2ZSBpdAotICogdG8gY29tbWl0IHRoZSBjaGFuZ2VzLgotICogU2VydmVyIGF0dHJpYnV0ZXMuIFNlcmlhbGl6YXRpb24uCi0gKiBDaGFpbmVkIHdvcmtpbmcgY29waWVzIGZvciBydW50aW1lLCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSAqIFNlcnZlciBoYXMgYSBzZXQgb2Ygcm9vdCBtb2R1bGVzLgotICogTW9kdWxlcyBoYXZlIHN0YXRlIHdydCBhIHNlcnZlci4KLSAqIFJlc3RhcnRpbmcgbW9kdWxlcy5dCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFR3byBzZXJ2ZXJzIGFyZSBpZGVudGljYWwgaWYgYW5kIG9ubHkgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGlkLgotICogPC9wPgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyQXR0cmlidXRlcyBleHRlbmRzIElBZGFwdGFibGUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIG5hbWUgZm9yIHRoaXMgc2VydmVyLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIG5hbWUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgc2VydmVyLgotCSAqIEVhY2ggc2VydmVyIChvZiBhIGdpdmVuIHR5cGUpIGhhcyBhIGRpc3RpbmN0IGlkLCBmaXhlZCBmb3IKLQkgKiBpdHMgbGlmZXRpbWUuIElkcyBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbnRlcm5hbGx5IGFzIGtleXM7Ci0JICogdGhleSBhcmUgbm90IGludGVuZGVkIHRvIGJlIHNob3duIHRvIGVuZCB1c2Vycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBwZXJzaXN0ZW50IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2VydmVyLgotCSAqIAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW55IGVycm9yIHJlY2VpdmVkIHdoaWxlIGRlbGV0aW5nIHRoZSBzZXJ2ZXIKLQkgKiAgICBvciBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYSB3b3JraW5nIGNvcHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHNlcnZlciBpcyBtYXJrZWQgcmVhZCBvbmx5LgotCSAqIFdoZW4gYSBzZXJ2ZXIgaXMgcmVhZCBvbmx5LCB3b3JraW5nIGNvcGllcyBjYW4gYmUgY3JlYXRlZCBidXQKLQkgKiB0aGV5IGNhbm5vdCBiZSBzYXZlZC4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZXJ2ZXIgaXMgbWFya2VkIGFzIHJlYWQgb25seSwKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgd29ya2luZyBjb3B5LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZXJ2ZXIgaXMgYSB3b3JraW5nIGNvcHksCi0JICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIG9iamVjdCB3aGljaCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MKLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiBubyBzdWNoIG9iamVjdCBjYW4gYmUgZm91bmQsIG9yIGlmIHRoZSBkZWxlZ2F0ZSBpcyBub3QKLQkgKiBsb2FkZWQuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgd2lsbCBub3QgY2hlY2sgdGhlIGRlbGVnYXRlIGNsYXNzZXMgZm9yIGFkYXB0aW5nCi0JICogdW5sZXNzIHRoZXkgYXJlIGFscmVhZHkgbG9hZGVkLiBObyBwbHVnaW4gbG9hZGluZyB3aWxsIG9jY3VyCi0JICogd2hlbiBjYWxsaW5nIHRoaXMgbWV0aG9kLiBJdCBpcyBzdWl0YWJsZSBmb3IgcG9wdXAgbWVudXMgYW5kCi0JICogb3RoZXIgVUkgYXJ0aWZhY3RzIHdoZXJlIHBlcmZvcm1hbmNlIGlzIGEgY29uY2Vybi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIgdGhlIGFkYXB0ZXIgY2xhc3MgdG8gbG9vayB1cAotCSAqIEByZXR1cm4gYSBvYmplY3QgY2FzdGFibGUgdG8gdGhlIGdpdmVuIGNsYXNzLCAKLQkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG9iamVjdCBkb2VzIG5vdAotCSAqICAgIGhhdmUgYW4gYWRhcHRlciBmb3IgdGhlIGdpdmVuIGNsYXNzCi0JICogQHNlZSBJQWRhcHRhYmxlI2dldEFkYXB0ZXIoQ2xhc3MpCi0JICogQHNlZSAjbG9hZEFkYXB0ZXIoQ2xhc3MsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IG9ubHkgaWYKLQkgKiBubyBzdWNoIG9iamVjdCBjYW4gYmUgZm91bmQgYWZ0ZXIgbG9hZGluZyBhbmQgaW5pdGlhbGl6aW5nCi0JICogZGVsZWdhdGVzLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgZm9yY2UgYSBsb2FkIGFuZCBpbml0aWFsaXphdGlvbiBvZiBhbGwgZGVsZWdhdGUKLQkgKiBjbGFzc2VzIGFuZCBjaGVjayB0aGVtIGZvciBhZGFwdGluZy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIgdGhlIGFkYXB0ZXIgY2xhc3MgdG8gbG9vayB1cAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgb2JqZWN0IGNhc3RhYmxlIHRvIHRoZSBnaXZlbiBjbGFzcywgCi0JICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvYmplY3QgZG9lcyBub3QKLQkgKiAgICBoYXZlIGFuIGFkYXB0ZXIgZm9yIHRoZSBnaXZlbiBjbGFzcwotCSAqIEBzZWUgI2dldEFkYXB0ZXIoQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBsb2FkQWRhcHRlcihDbGFzcyBhZGFwdGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaG9zdCBmb3IgdGhlIHNlcnZlci4KLQkgKiBUaGUgZm9ybWF0IG9mIHRoZSBob3N0IGNhbiBiZSBlaXRoZXIgYSBxdWFsaWZpZWQgb3IgdW5xdWFsaWZpZWQgaG9zdG5hbWUsCi0JICogb3IgYW4gSVAgYWRkcmVzcyBhbmQgbXVzdCBjb25mb3JtIHRvIFJGQyAyNzMyLgotCSAqIAotCSAqIEByZXR1cm4gYSBob3N0IHN0cmluZyBjb25mb3JtaW5nIHRvIFJGQyAyNzMyCi0JICogQHNlZSBqYXZhLm5ldC5VUkwjZ2V0SG9zdCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBydW50aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlci4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgcnVudGltZSBvZiBhIHNlcnZlciB3b3JraW5nIGNvcHkgbWF5IG9yIG1heSBub3QKLQkgKiBiZSBhIHdvcmtpbmcgY29weS4gRm9yIGEgc2VydmVyIGluc3RhbmNlIHRoYXQgaXMgbm90IGEKLQkgKiB3b3JraW5nIGNvcHksIHRoZSBydW50aW1lIGluc3RhbmNlIGlzIG5vdCBhIHdvcmtpbmcgY29weQotCSAqIGVpdGhlci4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBBY2NvcmRpbmcgdG8gc2VydmVyVHlwZSBleHRlbnNpb24gcG9pbnQsIAotCSAqIHJ1bnRpbWVUeXBlSWQgaXMgYSBtYW5kYXRvcnkgYXR0cmlidXRlLiBJdCBzZWVtcyBvZGQKLQkgKiB0aGVuIHRvIGhhdmUgc2VydmVyIHJ1bnRpbWUgaW5zdGFuY2UgYmVpbmcgYW4KLQkgKiBvcHRpb25hbCBwcm9wZXJ0eSBvZiBzZXJ2ZXIgaW5zdGFuY2UuIFdoYXQgZG9lcyBpdCBtZWFuCi0JICogZm9yIGEgc2VydmVyIHRvIG5vdCBoYXZlIGEgcnVudGltZT9dCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWUgZ2V0UnVudGltZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBzZXJ2ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyIHR5cGUKLQkgKiBAc2VlIElTZXJ2ZXJUeXBlCi0JICovCi0JcHVibGljIElTZXJ2ZXJUeXBlIGdldFNlcnZlclR5cGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2ZXIuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHNlcnZlciBjb25maWd1cmF0aW9uIG9mIGEgc2VydmVyIHdvcmtpbmcgY29weSBtYXkKLQkgKiBvciBtYXkgbm90IGJlIGEgd29ya2luZyBjb3B5LiBGb3IgYSBzZXJ2ZXIgaW5zdGFuY2UgdGhhdCBpcwotCSAqIG5vdCBhIHdvcmtpbmcgY29weSwgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGluc3RhbmNlIGlzIG5vdAotCSAqIGEgd29ya2luZyBjb3B5IGVpdGhlci4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBBY2NvcmRpbmcgdG8gc2VydmVyVHlwZSBleHRlbnNpb24gcG9pbnQsIAotCSAqIGNvbmZpZ3VyYXRpb25UeXBlSWQgaXMgYW4gb3B0aW9uYWwgYXR0cmlidXRlLiBJZiBhIHNlcnZlciB0eXBlCi0JICogaGFzIG5vIHNlcnZlciBjb25maWd1cmF0aW9uIHR5cGUsIHRoZW4gaXQgc2VlbXMgcmVhc29uYWJsZSB0byAKLQkgKiBleHBlY3QgdGhpcyBtZXRob2QgdG8gcmV0dXJuIG51bGwgZm9yIGFsbCBpbnN0YW5jZXMgb2YgdGhhdCBzZXJ2ZXIKLQkgKiB0eXBlLiBCdXQgd2hhdCBhYm91dCBhIHNlcnZlciB0eXBlIHRoYXQgZXhwbGljaXRseSBzcGVjaWZpZXMKLQkgKiBhIHNlcnZlciBjb25maWd1cmF0aW9uIHR5cGUuIERvZXMgdGhhdCBtZWFuIHRoYXQgYWxsIHNlcnZlcgotCSAqIGluc3RhbmNlcyBvZiB0aGF0IHNlcnZlciB0eXBlIG11c3QgaGF2ZSBhIHNlcnZlciBjb25maWd1cmF0aW9uCi0JICogaW5zdGFuY2Ugb2YgdGhhdCBzZXJ2ZXIgY29uZmlndXJhdGlvbiB0eXBlLCBhbmQgdGhhdCB0aGlzIG1ldGhvZAotCSAqIG5ldmVyIHJldHVybnMgbnVsbCBpbiB0aG9zZSBjYXNlcz9dCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIElGb2xkZXIgZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHNlcnZlciB3b3JraW5nIGNvcHkgZm9yIG1vZGlmeWluZyB0aGlzIHNlcnZlciBpbnN0YW5jZS4KLQkgKiBJZiB0aGlzIGluc3RhbmNlIGlzIGFscmVhZHkgYSB3b3JraW5nIGNvcHksIGl0IGlzIHJldHVybmVkLgotCSAqIElmIHRoaXMgaW5zdGFuY2UgaXMgbm90IGEgd29ya2luZyBjb3B5LCBhIG5ldyBzZXJ2ZXIgd29ya2luZyBjb3B5Ci0JICogaXMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIGlkIGFuZCBhdHRyaWJ1dGVzLgotCSAqIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBzYXZpbmcgb3IgcmVsZWFzaW5nIHRoZSB3b3JraW5nIGNvcHkgd2hlbgotCSAqIHRoZXkgYXJlIGRvbmUgd2l0aCBpdC4KLQkgKiA8cD4KLQkgKiBUaGUgc2VydmVyIHdvcmtpbmcgY29weSBpcyByZWxhdGVkIHRvIHRoaXMgc2VydmVyIGluc3RhbmNlCi0JICogaW4gdGhlIGZvbGxvd2luZyB3YXlzOgotCSAqIDxwcmU+Ci0JICogdGhpcy5nZXRXb3JraW5nQ29weSgpLmdldElkKCkgPT0gdGhpcy5nZXRJZCgpCi0JICogdGhpcy5nZXRXb3JraW5nQ29weSgpLmdldEZpbGUoKSA9PSB0aGlzLmdldEZpbGUoKQotCSAqIHRoaXMuZ2V0V29ya2luZ0NvcHkoKS5nZXRPcmlnaW5hbCgpID09IHRoaXMKLQkgKiB0aGlzLmdldFdvcmtpbmdDb3B5KCkuZ2V0UnVudGltZSgpID09IHRoaXMuZ2V0UnVudGltZSgpCi0JICogdGhpcy5nZXRXb3JraW5nQ29weSgpLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSA9PSB0aGlzLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKQotCSAqIDwvcHJlPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IElTZXJ2ZXJXb3JraW5nQ29weSBleHRlbmRzIElTZXJ2ZXIuIAotCSAqIFNlcnZlci5nZXRXb3JraW5nQ29weSgpIGNyZWF0ZSBhIG5ldyB3b3JraW5nIGNvcHk7Ci0JICogU2VydmVyV29ya2luZ0NvcHkuZ2V0V29ya2luZ0NvcHkoKSByZXR1cm5zIHRoaXMuCi0JICogVGhpcyBtYXkgYmUgY29udmVuaWVudCBpbiBjb2RlIHRoYXQgaXMgaWdub3JhbnQgb2YKLQkgKiB3aGV0aGVyIHRoZXkgYXJlIGRlYWxpbmcgd2l0aCBhIHdvcmtpbmcgY29weSBvciBub3QuCi0JICogSG93ZXZlciwgaXQgaXMgaGFyZCBmb3IgY2xpZW50cyB0byBtYW5hZ2Ugd29ya2luZyBjb3BpZXMKLQkgKiB3aXRoIHRoaXMgZGVzaWduLl0KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyB3b3JraW5nIGNvcHkKLQkgKi8KLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG1vZHVsZXMgdGhhdCBhcmUgY3VycmVudGx5IGNvbmZpZ3VyZWQgb24KLQkgKiB0aGUgc2VydmVyLiBXaGVuIHRoZSBzZXJ2ZXIgaXMgcHVibGlzaGVkLCB0aGVzZSBhcmUgdGhlIG1vZHVsZXMKLQkgKiB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBvbiB0aGUgc2VydmVyLiBUaGlzIG1ldGhvZCBtYXkgbm90IHJldHVybgotCSAqIHRoZSBsaXN0IG9mIG1vZHVsZXMgdGhhdCBhcmUgY3VycmVudGx5IG9uIHRoZSBzZXJ2ZXIgaWYgYSBtb2R1bGUKLQkgKiBoYXMgYmVlbiBhZGRlZCBvciByZW1vdmVkIHNpbmNlIHRoZSBsYXN0IHB1Ymxpc2guCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgcm9vdCBtb2R1bGVzLCB3aGljaCBhcmUgbm90IHBhcmVudGVkIHdpdGhpbgotCSAqIGFub3RoZXIgbW9kdWxlcy4gRWFjaCBvZiB0aGVzZSBtYXkgY29udGFpbiBjaGlsZCBtb2R1bGVzLCB3aGljaCBhcmUKLQkgKiBhbHNvIGRlcGxveWVkIHRvIHRoaXMgc2VydmVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgbW9kdWxlcwotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbW9kdWxlIG1vZGlmaWNhdGlvbnMgY291bGQgYmUgbWFkZSB0byB0aGlzCi0JICogc2VydmVyIGF0IHRoaXMgdGltZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBtYXkgZGVjaWRlIGJhc2VkIG9uIHRoZSB0eXBlIG9mIG1vZHVsZQotCSAqIG9yIHJlZnVzZSBzaW1wbHkgZHVlIHRvIHJlYWNoaW5nIGEgbWF4aW11bSBudW1iZXIgb2YKLQkgKiBtb2R1bGVzIG9yIG90aGVyIGNyaXRlcmlhLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFRoaXMgc2VlbXMgb2RkIHRvIGhhdmUgYSBwcmUtZmxpZ2h0IG1ldGhvZC4KLQkgKiBJIHNob3VsZCBleHBlY3QgdGhhdCB0aGUgY2xpZW50IGNhbiBwcm9wb3NlIG1ha2luZwotCSAqIGFueSBzZXQgb2YgbW9kdWxlIGNoYW5nZXMgdGhleSBkZXNpcmUgKHZpYSBhIHNlcnZlcgotCSAqIHdvcmtpbmcgY29weSkuIElmIHRoZSBzZXJ2ZXIgZG9lc24ndCBsaWtlIGl0LCB0aGUgb3BlcmF0aW9uCi0JICogc2hvdWxkIGZhaWwuXQotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhZGQgYSBwb3NzaWJseS1lbXB0eSBsaXN0IG9mIG1vZHVsZXMgdG8gYWRkCi0JICogQHBhcmFtIHJlbW92ZSBhIHBvc3NpYmx5LWVtcHR5IGxpc3Qgb2YgbW9kdWxlcyB0byByZW1vdmUKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvcG9zZWQgbW9kaWZpY2F0aW9ucwotCSAqIGxvb2sgZmVhc2libGUsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuTW9kaWZ5TW9kdWxlcyhJTW9kdWxlW10gYWRkLCBJTW9kdWxlW10gcmVtb3ZlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogR2V0IHRoZSBzZXJ2ZXIgYXR0cmlidXRlIHZhbHVlIHRoYXQgaXMgc3RvcmVkIGluIHRoaXMgc2VydmVyIGF0dHJpYnV0ZSBvYmplY3QuCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgaXMgYmVpbmcgcXVlcmllZC4KLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgaXMgbm90IGRlZmluZWQuCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgaW50IGRlZmF1bHRWYWx1ZSk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNlcnZlciBhdHRyaWJ1dGUgdmFsdWUgdGhhdCBpcyBzdG9yZWQgaW4gdGhpcyBzZXJ2ZXIgYXR0cmlidXRlIG9iamVjdC4KLQkgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCBpcyBiZWluZyBxdWVyaWVkLgotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIGdpdmVuIGF0dHJpYnV0ZSBpcyBub3QgZGVmaW5lZC4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpOwotCi0JLyoqCi0JICogR2V0IHRoZSBzZXJ2ZXIgYXR0cmlidXRlIHZhbHVlIHRoYXQgaXMgc3RvcmVkIGluIHRoaXMgc2VydmVyIGF0dHJpYnV0ZSBvYmplY3QuCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgaXMgYmVpbmcgcXVlcmllZC4KLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgaXMgbm90IGRlZmluZWQuCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNlcnZlciBhdHRyaWJ1dGUgdmFsdWUgdGhhdCBpcyBzdG9yZWQgaW4gdGhpcyBzZXJ2ZXIgYXR0cmlidXRlIG9iamVjdC4KLQkgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCBpcyBiZWluZyBxdWVyaWVkLgotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIGdpdmVuIGF0dHJpYnV0ZSBpcyBub3QgZGVmaW5lZC4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBMaXN0PFN0cmluZz4gZGVmYXVsdFZhbHVlKTsKLQotCS8qKgotCSAqIEdldCB0aGUgc2VydmVyIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGlzIHN0b3JlZCBpbiB0aGlzIHNlcnZlciBhdHRyaWJ1dGUgb2JqZWN0LgotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IGlzIGJlaW5nIHF1ZXJpZWQuCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkLgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIE1hcCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIE1hcCBkZWZhdWx0VmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgbW9kdWxlKHMpIG9mIHRoaXMgbW9kdWxlLiBJZiB0aGlzCi0JICogbW9kdWxlIGNvbnRhaW5zIG90aGVyIG1vZHVsZXMsIGl0IHNob3VsZCBsaXN0IHRob3NlCi0JICogbW9kdWxlcy4gSWYgbm90LCBpdCBzaG91bGQgcmV0dXJuIGFuIGVtcHR5IGxpc3QuCi0JICoKLQkgKiA8cD5UaGlzIG1ldGhvZCBzaG91bGQgb25seSByZXR1cm4gdGhlIGRpcmVjdCBjaGlsZHJlbi4KLQkgKiBUbyBvYnRhaW4gdGhlIGZ1bGwgbW9kdWxlIHRyZWUsIHRoaXMgbWV0aG9kIG1heSBiZQotCSAqIHJlY3Vyc2l2ZWx5IGNhbGxlZCBvbiB0aGUgY2hpbGRyZW4uPC9wPgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGRpcmVjdCBtb2R1bGUgY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcyhJTW9kdWxlIG1vZHVsZVtdLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyZW50IG1vZHVsZShzKSBvZiB0aGlzIG1vZHVsZS4gV2hlbiBkZXRlcm1pbmluZyBpZiBhIGdpdmVuCi0JICogcHJvamVjdCBjYW4gcnVuIG9uIGEgc2VydmVyLCB0aGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gZmluZCB0aGUgYWN0dWFsCi0JICogbW9kdWxlKHMpIHRoYXQgbWF5IGJlIHJ1biBvbiB0aGUgc2VydmVyLiBGb3IgaW5zdGFuY2UsIGEgV2ViIG1vZHVsZSBtYXkKLQkgKiByZXR1cm4gYSBsaXN0IG9mIEVBUiBtb2R1bGVzIHRoYXQgaXQgaXMgY29udGFpbmVkIGluIGlmIHRoZSBzZXJ2ZXIgb25seQotCSAqIHN1cHBvcnRzIGNvbmZpZ3VyaW5nIEVBUiBtb2R1bGVzLiBJZiB0aGUgc2VydmVyIHN1cHBvcnRzIHJ1bm5pbmcgYSBtb2R1bGUKLQkgKiBkaXJlY3RseSwgdGhlIHJldHVybmVkIGFycmF5IHNob3VsZCBjb250YWluIHRoZSBtb2R1bGUuCi0JICogCi0JICogPHA+SWYgdGhlIG1vZHVsZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgb3IKLQkgKiBhbiBlbXB0eSBhcnJheS4gSWYgdGhlIHR5cGUgaXMgbm9ybWFsbHkgc3VwcG9ydGVkIGJ1dCB0aGVyZSBpcyBhCi0JICogY29uZmlndXJhdGlvbiBwcm9ibGVtIG9yIG1pc3NpbmcgcGFyZW50LCBldGMuLCB0aGlzIG1ldGhvZCB3aWxsIGZpcmUgYQotCSAqIENvcmVFeGNlcHRpb24gdGhhdCBtYXkgdGhlbiBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuPC9wPgotCSAqIAotCSAqIDxwPklmIGl0IGRvZXMgcmV0dXJuIHZhbGlkIHBhcmVudChzKSwgdGhpcyBtZXRob2Qgd2lsbCBhbHdheXMgcmV0dXJuCi0JICogdGhlIHRvcG1vc3QgcGFyZW50IG1vZHVsZShzKSwgZXZlbiBpZiB0aGVyZSBhcmUgYSBmZXcgbGV2ZWxzCi0JICogKGEgaGllcmFyY2h5KSBvZiBtb2R1bGVzLjwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcG9zc2libGUgcm9vdCBtb2R1bGVzCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbQotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0Um9vdE1vZHVsZXMoSU1vZHVsZSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFNlcnZlclBvcnRzIHRoYXQgdGhpcyBzZXJ2ZXIgaGFzLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2Ygc2VydmVycyBwb3J0cwotCSAqLwotCXB1YmxpYyBTZXJ2ZXJQb3J0W10gZ2V0U2VydmVyUG9ydHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmMyMGI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0vKioKLSAqIExpc3RlbmVyIGludGVyZmFjZSBmb3IgY2hhbmdlcyB0byBzZXJ2ZXJzLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBmaXJlZCB3aGVuZXZlciBhIHNlcnZlciBpcyBhZGRlZCwgbW9kaWZpZWQsIG9yIHJlbW92ZWQuCi0gKiBBbGwgZXZlbnRzIGFyZSBmaXJlZCBwb3N0LWNoYW5nZSwgc28gdGhhdCBhbGwgc2VydmVyIHRvb2xzIEFQSSBjYWxsZWQgYXMgYQotICogcmVzdWx0IG9mIHRoZSBldmVudCB3aWxsIHJldHVybiB0aGUgdXBkYXRlZCByZXN1bHRzLiAoZm9yIGV4YW1wbGUsIG9uCi0gKiBzZXJ2ZXJBZGRlZCB0aGUgbmV3IHNlcnZlciB3aWxsIGJlIGluIHRoZSBnbG9iYWwgbGlzdCBvZiBzZXJ2ZXJzCi0gKiAoe0BsaW5rIFNlcnZlckNvcmUjZ2V0U2VydmVycygpfSksIGFuZCBvbiBzZXJ2ZXJSZW1vdmVkIHRoZSBzZXJ2ZXIgd2lsbAotICogbm90IGJlIGluIHRoZSBsaXN0LgotICogPC9wPgotICogCi0gKiBAc2VlIFNlcnZlckNvcmUKLSAqIEBzZWUgSVNlcnZlcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciB7Ci0JLyoqCi0JICogQSBuZXcgc2VydmVyIGhhcyBiZWVuIGNyZWF0ZWQuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBuZXcgc2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgc2VydmVyQWRkZWQoSVNlcnZlciBzZXJ2ZXIpOwotCi0JLyoqCi0JICogQW4gZXhpc3Rpbmcgc2VydmVyIGhhcyBiZWVuIHVwZGF0ZWQgb3IgbW9kaWZpZWQuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBtb2RpZmllZCBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKElTZXJ2ZXIgc2VydmVyKTsKLQotCS8qKgotCSAqIEEgZXhpc3Rpbmcgc2VydmVyIGhhcyBiZWVuIHJlbW92ZWQuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSByZW1vdmVkIHNlcnZlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNlcnZlclJlbW92ZWQoSVNlcnZlciBzZXJ2ZXIpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDA1ODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSB0aGUgc2VydmVyIHRvIGJyb2FkY2FzdCBhIGNoYW5nZSBvZiBzdGF0ZS4KLSAqIFVzdWFsbHksIHRoZSBjaGFuZ2Ugb2Ygc3RhdGUgd2lsbCBiZSBjYXVzZWQgYnkgc29tZSB1c2VyIGFjdGlvbiwKLSAqIChlLmcuIHJlcXVlc3RpbmcgdG8gc3RhcnQgYSBzZXJ2ZXIpIGhvd2V2ZXIsIGl0IGlzIGVxdWFsbHkgZmluZSBmb3IKLSAqIGEgc2VydmVyIHRvIGJyb2FkY2FzdCBhIGNoYW5nZSBvZiBzdGF0ZSB0aHJvdWdoIG5vIGRpcmVjdCB1c2VyIGFjdGlvbi4KLSAqIChlLmcuIHN0b3BwaW5nIGJlY2F1c2UgdGhlIHNlcnZlciBjcmFzaGVkKSBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZQotICogdXNlZCB0byBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIGNoYW5nZSBvciB1cGRhdGUgdGhlIFVJLgotICoKLSAqIDxwPk5vdGU6IFRoZSBzZXJ2ZXIgbGlzdGVuZXIgZXZlbnQgTVVTVCBOT1QgZGlyZWN0bHkgYmUgdXNlZCB0byBtb2RpZnkKLSAqIHRoZSBzZXJ2ZXIncyBvciBtb2R1bGUncyBzdGF0ZSB2aWEgb25lIG9mIHRoZSBzZXJ2ZXIncyBtZXRob2QuIEZvciBleGFtcGxlLCAKLSAqIGEgc2VydmVyIHN0b3BwZWQgZXZlbnQgY2Fubm90IGRpcmVjdGx5IHRyaWdnZXIgYSBzdGFydCgpLiBEb2luZyB0aGlzIG1heSAKLSAqIGNhdXNlIHRoZSB0aHJlYWQgdG8gaGFuZy48L3A+Ci0gKiAgIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJMaXN0ZW5lciB7Ci0JLyoqCi0JICogQSBzZXJ2ZXIgb3IgbW9kdWxlIGhhcyBiZWVuIGNoYW5nZWQgYXMgc3BlY2lmaWVkIGluIHRoZSBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgYSBzZXJ2ZXIgZXZlbnQgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgY2hhbmdlCi0JICovCi0JcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCk7IAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2MzNzdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotLyoqCi0gKiBSZXByZXNlbnRzIGEgc2VydmVyIHR5cGUgZnJvbSB3aGljaCBzZXJ2ZXIgaW5zdGFuY2VzIGNhbiBiZSBjcmVhdGVkLgotICogPHA+Ci0gKiBUaGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrIHN1cHBvcnRzCi0gKiBhbiBvcGVuLWVuZGVkIHNldCBvZiBzZXJ2ZXIgdHlwZXMsIHdoaWNoIGFyZSBjb250cmlidXRlZCB2aWEKLSAqIHRoZSA8Y29kZT5zZXJ2ZXJUeXBlczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50IGluIHRoZSBzZXJ2ZXIgY29yZQotICogcGx1Zy1pbi4gU2VydmVyIHR5cGUgb2JqZWN0cyBjYXJyeSBubyBzdGF0ZSAoYWxsIGluZm9ybWF0aW9uIGlzCi0gKiByZWFkLW9ubHkgYW5kIGlzIHN1cHBsaWVkIGJ5IHRoZSBzZXJ2ZXIgdHlwZSBkZWNsYXJhdGlvbikuCi0gKiBUaGUgZ2xvYmFsIGxpc3Qgb2Yga25vd24gc2VydmVyIHR5cGVzIGlzIGF2YWlsYWJsZSB2aWEKLSAqIHtAbGluayBTZXJ2ZXJDb3JlI2dldFNlcnZlclR5cGVzKCl9LiAKLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFR3byBzZXJ2ZXIgdHlwZXMgYXJlIGlkZW50aWNhbCBpZiBhbmQgb25seSBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgaWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyVHlwZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBzZXJ2ZXIgdHlwZS4KLQkgKiBFYWNoIGtub3duIHNlcnZlciB0eXBlIGhhcyBhIGRpc3RpbmN0IGlkLiAKLQkgKiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOyB0aGV5IGFyZSBub3QKLQkgKiBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyIHR5cGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIHNlcnZlciB0eXBlLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIG5hbWUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBzZXJ2ZXIgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgc2VydmVyIHR5cGUuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgZGVzY3JpcHRpb24gaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgc2VydmVyIHR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHNlcnZlciBydW50aW1lIHRoYXQgdGhpcyB0eXBlCi0JICogb2Ygc2VydmVyIHJlcXVpcmVzLgotCSAqIDxwPgotCSAqIFtpc3N1ZTogInJ1bnRpbWVUeXBlSWQiIGlzIG1hbmRhdG9yeSBhY2NvcmRpbmcgdGhlCi0JICogc2VydmVyVHlwZXMgc2NoZW1hLiBUaGlzIHN1Z2dlc3RzIHRoYXQgYWxsIHR5cGVzCi0JICogb2Ygc2VydmVycyBoYXZlIGEgc2VydmVyIHJ1bnRpbWUuIEJ1dCB0aGVyZSBpcyBhbHNvCi0JICogYSBib29sZWFuICJydW50aW1lIiBhdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZQotCSAqIHNlcnZlciByZXF1aXJlcyBhIHJ1bnRpbWUuIEkgc3VwZWN0IHRoYXQgc2VydmVyIHR5cGUKLQkgKiBoYXMgYW4gb3B0aW9uYWwgc2VydmVyIHJ1bnRpbWUsIGluIHdoaWNoIGNhc2UgeW91Ci0JICogY2FuIG1ha2UgInJ1bnRpbWVUeXBlSWQiIG9wdGlvbmFsIGFuZCBkaXNwZW5zZSB3aXRoCi0JICogInJ1bnRpbWUiLl0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBEb2VzIGl0IHJlYWxseSBtYWtlIHNlbnNlIGZvcgotCSAqIHJ1bnRpbWVUeXBlcyBhbmQgc2VydmVyVHlwZXMgYmUgc2VwYXJhdGUgZXh0ZW5zaW9uCi0JICogcG9pbnRzPyBXb3VsZCBpdCBub3QgYmUgc3VmZmljaWVudCB0byBoYXZlIHRoZSBwYXJ0eSBkZWNsYXJpbmcKLQkgKiB0aGUgc2VydmVyIHR5cGUgYWxzbyBkZWNsYXJlIHRoZSBzZXJ2ZXIgcnVudGltZSB0eXBlPwotCSAqIEhhdmluZyBydW50aW1lVHlwZSBhcyBhIHNlcGFyYXRlIGV4dGVuc2lvbiBwb2ludAotCSAqIG9ubHkgbWFrZXMgc2Vuc2UgaWYgaXQgd291bGQgYmUgcG9zc2libGUgaW4gcHJpbmNpcGxlIHRvIAotCSAqIGRlY2xhcmUgYSBzZXJ2ZXIgcnVudGltZSB0eXBlIHRoYXQgY291bGQgYWN0dWFsbHkgYmUKLQkgKiB1c2VkIG9uIHNlcnZlcmFsIHNlcnZlciB0eXBlcy4gSWYgc2VydmVyIHJ1bnRpbWVzCi0JICogYWx3YXlzIGVuZCB1cCBiZWluZyBzZXJ2ZXItdHlwZSBzcGVjaWZpYywgaXQgd291bGQgYmUgYmV0dGVyCi0JICogdG8gY29tYmluZSB0aGVtLl0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBXaGF0IHNob3VsZCBoYXBwZW4gd2hlbiBhIHNlcnZlciB0eXBlIG1lbnRpb25zCi0JICogdGhlIGlkIG9mIGEgc2VydmVyIHJ1bnRpbWUgdHlwZSB0aGF0IGlzIG5vdCBrbm93bgotCSAqIHRvIHRoZSBzeXN0ZW0/XQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc2VydmVyIHJ1bnRpbWUgdHlwZQotCSAqLwotCXB1YmxpYyBJUnVudGltZVR5cGUgZ2V0UnVudGltZVR5cGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIG9mIHNlcnZlciByZXF1aXJlcyBhIHNlcnZlcgotCSAqIHJ1bnRpbWUuCi0JICogPHA+Ci0JICogW2lzc3VlOiBTZWUgaXNzdWVzIG9uIGdldFJ1bnRpbWVUeXBlKCkuIEkgc3VzcGVjdCB0aGlzCi0JICogbWV0aG9kIGlzIHVubmVjZXNzYXJ5LCBhbmQgdGhhdCAKLQkgKiB0aGlzLmdldFJ1bnRpbWVUeXBlKCkgIT0gbnVsbCB3aWxsIGRvLl0KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHR5cGUgb2Ygc2VydmVyIHJlcXVpcmVzCi0JICogYSBzZXJ2ZXIgcnVudGltZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBkb2VzIG5vdAotCSAqIEBzZWUgI2dldFJ1bnRpbWVUeXBlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNSdW50aW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBvZiBzZXJ2ZXIgc3VwcG9ydHMgdGhlIGdpdmVuIGxhdW5jaCBtb2RlLgotCSAqIDxwPgotCSAqIFtpc3N1ZTogSXQgYWxzbyBzZWVtcyBvZGQgdGhhdCB0aGlzIGlzIHBhcnQgb2YgdGhlIHNlcnZlciB0eXBlCi0JICogZGVjbGFyYXRpb24uIFRoaXMgbWVhbnMgdGhhdCBhbnkgc2VydmVyIHR5cGUgaGFzIHRvIGNvbW1pdAotCSAqIHNvIGVhcmx5IG9uIHdoaWNoIG1vZGVzIGl0IHN1cHBvcnRzLl0KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGxhdW5jaE1vZGUgYSBtb2RlIGluIHdoaWNoIGEgc2VydmVyIGNhbiBiZSBsYXVuY2hlZCwKLQkgKiAgICBvbmUgb2YgdGhlIG1vZGUgY29uc3RhbnRzIGRlZmluZWQgYnkKLQkgKiAgICB7QGxpbmsgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcn0KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyB0eXBlIG9mIHNlcnZlciBzdXBwb3J0cyB0aGUgZ2l2ZW4gbW9kZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzTGF1bmNoTW9kZShTdHJpbmcgbGF1bmNoTW9kZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIG9mIHNlcnZlciByZXF1aXJlcyBhIHNlcnZlcgotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICogPHA+Ci0JICogW2lzc3VlOiBJdCdzIG5vdCBjbGVhciBob3cgdGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIAotCSAqIHRoaXMuZ2V0U2VydmVyQ29uZmlndXJhdGlvblR5cGUoKSAhPSBudWxsXQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHlwZSBvZiBzZXJ2ZXIgcmVxdWlyZXMKLQkgKiAgICBhIHNlcnZlciBjb25maWd1cmF0aW9uLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGRvZXMgbm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzU2VydmVyQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHR5cGUgb2Ygc2VydmVyIGNhbiBydW4gb24gYSByZW1vdGUgaG9zdC4KLQkgKiBSZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgc2VydmVyIHR5cGUgY2FuIG9ubHkgYmUgcnVuIG9uICJsb2NhbGhvc3QiCi0JICogKHRoZSBsb2NhbCBtYWNoaW5lKS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHlwZSBvZiBzZXJ2ZXIgY2FuIHJ1biBvbgotCSAqICAgIGEgcmVtb3RlIGhvc3QsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgY2Fubm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSZW1vdGVIb3N0cygpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiB3b3JraW5nIGNvcHkgaW5zdGFuY2Ugb2YgdGhpcyBzZXJ2ZXIgdHlwZS4KLQkgKiBBZnRlciBzZXR0aW5nIHZhcmlvdXMgcHJvcGVydGllcyBvZiB0aGUgd29ya2luZyBjb3B5LAotCSAqIHRoZSBjbGllbnQgc2hvdWxkIGNhbGwge0BsaW5rIElTZXJ2ZXJXb3JraW5nQ29weSNzYXZlKGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpfQotCSAqIHRvIGJyaW5nIHRoZSBzZXJ2ZXIgaW5zdGFuY2UgaW50byBleGlzdGVuY2UuCi0JICogPHA+Ci0JICogW2lzc3VlOiBXaHkgaXMgYSBydW50aW1lIHBhc3NlZCBpbj8gCi0JICogSVNlcnZlcldvcmtpbmdDb3B5LnNldFJ1bnRpbWUocnVudGltZSkgY291bGQgYmUgY2FsbGVkIG9uCi0JICogdGhlIHJlc3VsdCB0byBhY2NvbXBsaXNoIHRoZSBzYW1lIHRoaW5nLl0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgbmV2ZXIgY3JlYXRlcyBhIHNlcnZlcgotCSAqIGNvbmZpZyB3b3JraW5nIGNvcHksIHdoZXJlYXMgdGhlIG90aGVyIG9uZSBkb2VzIT9dCi0JICogQ29uc2lkZXIgY29tYmluaW5nIHRoZSBtZXRob2Qgd2l0aCB0aGUgb3RoZXIuXQotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgc2VydmVyIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2Qgd2lsbCBoYXZlIGl0J3MgaG9zdCBzZXQgdG8KLQkgKiAibG9jYWxob3N0Ii4gT3RoZXIgZGVmYXVsdHMgd2lsbCBiZSBzZXQgYnkgY2FsbGluZyB0aGUgc2VydmVyCi0JICogZGVsZWdhdGUncyBzZXREZWZhdWx0cygpIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGlkIHRoZSBpZCB0byBhc3NpZ24gdG8gdGhlIHNlcnZlciBpbnN0YW5jZTsgdGhlIGRlZmF1bHQgbmFtZSBpcwotCSAqICAgIHVzZWQgaWYgaWQgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gZW1wdHkgc3RyaW5nCi0JICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZSB3aGVyZSB0aGUgc2VydmVyIGluc3RhbmNlCi0JICogICAgaXMgdG8gYmUgc2VyaWFsaXplZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGluZm9ybWF0aW9uIGlzCi0JICogICAgaW5zdGVhZCB0byBiZSBwZXJzaXN0ZWQgd2l0aCB0aGUgd29ya3NwYWNlIGJ1dCBub3Qgd2l0aCBhbnkKLQkgKiAgICBwYXJ0aWN1bGFyIHdvcmtzcGFjZSByZXNvdXJjZQotCSAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzZXJ2ZXIgaW5zdGFuY2UsCi0JICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgbmV3IHNlcnZlciB3b3JraW5nIGNvcHkgd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGlzIHJ1bnRpbWUKLQkgKiAgICBvciBzZXR0aW5nIGl0J3MgZGVmYXVsdCB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGNyZWF0ZVNlcnZlcihTdHJpbmcgaWQsIElGaWxlIGZpbGUsIElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgd29ya2luZyBjb3B5IGluc3RhbmNlIG9mIHRoaXMgc2VydmVyIHR5cGUuCi0JICogQWZ0ZXIgc2V0dGluZyB2YXJpb3VzIHByb3BlcnRpZXMgb2YgdGhlIHdvcmtpbmcgY29weSwKLQkgKiB0aGUgY2xpZW50IHNob3VsZCBjYWxsIHtAbGluayBJU2VydmVyV29ya2luZ0NvcHkjc2F2ZShib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKX0KLQkgKiB0byBicmluZyB0aGUgc2VydmVyIGluc3RhbmNlIGludG8gZXhpc3RlbmNlLgotCSAqIDxwPgotCSAqIFtpc3N1ZTogU2luY2UgdGhpcyBtZXRob2QganVzdCBjcmVhdGVzIGEgd29ya2luZyBjb3B5LAotCSAqIGl0J3Mgbm90IGNsZWFyIHRoZSBvcGVyYXRpb24gaXMgbG9uZy1ydW5uaW5nIGFuZCBpbiBuZWVkCi0JICogb2YgYSBwcm9ncmVzcyBtb25pdG9yLl0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIHNlcnZlciByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBpdCdzIGhvc3Qgc2V0IHRvCi0JICogImxvY2FsaG9zdCIuIE90aGVyIGRlZmF1bHRzIHdpbGwgYmUgc2V0IGJ5IGNhbGxpbmcgdGhlIHNlcnZlcgotCSAqIGRlbGVnYXRlJ3Mgc2V0RGVmYXVsdHMoKSBtZXRob2QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzZXJ2ZXIKLQkgKiBjb25maWcgd29ya2luZyBjb3B5LCB3aGVyZWFzIHRoZSBvdGhlciBvbmUgZG9lcyBub3QhPwotCSAqIENvbnNpZGVyIGNvbWJpbmluZyB0aGUgbWV0aG9kIHdpdGggdGhlIG90aGVyLl0KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGlkIHRoZSBpZCB0byBhc3NpZ24gdG8gdGhlIHNlcnZlciBpbnN0YW5jZTsgdGhlIGRlZmF1bHQgbmFtZSBpcwotCSAqICAgIHVzZWQgaWYgaWQgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gZW1wdHkgc3RyaW5nCi0JICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZSB3aGVyZSB0aGUgc2VydmVyIGluc3RhbmNlCi0JICogICAgaXMgdG8gYmUgc2VyaWFsaXplZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGluZm9ybWF0aW9uIGlzCi0JICogICAgaW5zdGVhZCB0byBiZSBwZXJzaXN0ZWQgd2l0aCB0aGUgd29ya3NwYWNlIGJ1dCBub3Qgd2l0aCBhbnkKLQkgKiAgICBwYXJ0aWN1bGFyIHdvcmtzcGFjZSByZXNvdXJjZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgbmV3IHNlcnZlciB3b3JraW5nIGNvcHkgd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGlzIHJ1bnRpbWUKLQkgKiAgICBvciBzZXR0aW5nIGl0J3MgZGVmYXVsdCB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGNyZWF0ZVNlcnZlcihTdHJpbmcgaWQsIElGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyV29ya2luZ0NvcHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJXb3JraW5nQ29weS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODUxNzM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJXb3JraW5nQ29weS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIEEgd29ya2luZyBjb3B5IHNlcnZlciBvYmplY3QgdXNlZCBmb3IgZm9ybXVsYXRpbmcgY2hhbmdlcwotICogdG8gYSBzZXJ2ZXIgaW5zdGFuY2UgKHtAbGluayBJU2VydmVyfSkuIENoYW5nZXMgbWFkZSBvbiBhCi0gKiB3b3JraW5nIGNvcHkgZG8gbm90IG9jY3VyIChhbmQgYXJlIG5vdCBwZXJzaXN0ZWQpIHVudGlsIGEKLSAqIHNhdmUoKSBpcyBwZXJmb3JtZWQuCi0gKiA8cD4KLSAqIElmIHRoZSBjbGllbnQgb2YgdGhpcyB3b3JraW5nIGNvcHkgY2FsbHMgbG9hZEFkYXB0ZXIoKSwgYSBuZXcgaW5zdGFuY2Ugb2YKLSAqIHRoZSBkZWxlZ2F0ZSAoU2VydmVyRGVsZWdhdGUpIHdpbGwgYmUgY3JlYXRlZCB0byBoZWxwIHRoaXMgd29ya2luZyBjb3B5LgotICogVGhpcyBkZWxlZ2F0ZSBpbnN0YW5jZSB3aWxsIGJlIHVzZWQgYXMgbG9uZyBhcyB0aGlzIHdvcmtpbmcgY29weSBleGlzdHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlcldvcmtpbmdDb3B5IGV4dGVuZHMgSVNlcnZlckF0dHJpYnV0ZXMgewotCS8qKgotCSAqIFN0YXR1cyBjb2RlICh2YWx1ZSAxKSByZXR1cm5lZCBmcm9tIHRoZSBzYXZlKCkgbWV0aG9kIHdoZW4gdGhlIHNhdmUKLQkgKiBmYWlsZWQgd2l0aCBmb3JjZSBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGJlY2F1c2UgdGhlIHJ1bnRpbWUgaGFzCi0JICogYmVlbiBtb2RpZmllZCBhbmQgc2F2ZWQgc2luY2UgdGhpcyB3b3JraW5nIGNvcHkgd2FzIGNyZWF0ZWQuCi0JICogCi0JICogQHNlZSAjc2F2ZShib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNBVkVfQ09ORkxJQ1QgPSAxOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBzZXJ2ZXIuCi0JICogPHA+Ci0JICogVGhlIG5hbWUgc2hvdWxkIGJlIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIG5hbWUgYSBkaXNwbGF5YWJsZSBuYW1lCi0JICogQHNlZSBJU2VydmVyQXR0cmlidXRlcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQkKLQkvKioKLQkgKiBTZXRzIG9yIHVuc2V0cyB3aGV0aGVyIHRoaXMgc2VydmVyIGlzIG1hcmtlZCBhcyByZWFkIG9ubHkuCi0JICogV2hlbiBhIHNlcnZlciBpcyByZWFkIG9ubHksIHdvcmtpbmcgY29waWVzIGNhbiBiZSBjcmVhdGVkIGJ1dAotCSAqIHRoZXkgY2Fubm90IGJlIHNhdmVkLgotCSAqCi0JICogQHBhcmFtIHJlYWRPbmx5IDxjb2RlPnRydWU8L2NvZGU+IHRvIHNldCB0aGlzIHNlcnZlciB0byBiZSBtYXJrZWQKLQkgKiAgICByZWFkIG9ubHksIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gdG8gdW5zZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB3b3JraW5nIGNvcHkgaGFzIHVuc2F2ZWQgY2hhbmdlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgd29ya2luZyBjb3B5IGhhcyB1bnNhdmVkCi0JICogICAgY2hhbmdlcywgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCk7Ci0KLQkvKioKLQkgKiBBZGRzIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgc2VydmVyLgotCSAqIDxwPgotCSAqIE9uY2UgcmVnaXN0ZXJlZCwgYSBsaXN0ZW5lciBzdGFydHMgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbiBvZiAKLQkgKiBwcm9wZXJ0eSBjaGFuZ2VzIHRvIHRoaXMgc2VydmVyLiBUaGUgbGlzdGVuZXIgY29udGludWVzIHRvIHJlY2VpdmUKLQkgKiBub3RpZmljYXRpb25zIHVudGlsIGl0IGlzIHJlbW92ZWQuCi0JICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotCSAqIEBzZWUgI3JlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoaXMgc2VydmVyLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyCi0JICogQHNlZSAjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2ZXIgd29ya2luZyBjb3B5LgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBvZiBhIHNlcnZlciB3b3JraW5nIGNvcHkgbWF5Ci0JICogb3IgbWF5IG5vdCBiZSBhIHdvcmtpbmcgY29weS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBBY2NvcmRpbmcgdG8gc2VydmVyVHlwZSBleHRlbnNpb24gcG9pbnQsIAotCSAqIGNvbmZpZ3VyYXRpb25UeXBlSWQgaXMgYW4gb3B0aW9uYWwgYXR0cmlidXRlLiBXaGF0IGhhcHBlbnMgaWYgdGhlCi0JICogc2VydmVyIGNvbmZpZ3VyYXRpb24gcGFzc2VkIGlzIG51bGwgYnV0IHRoZSBzZXJ2ZXIgbXVzdCBoYXZlIGEKLQkgKiBzZXJ2ZXIgY29uZmlndXJhdGlvbj8gV2hhdCBoYXBwZW5zIG9mIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbgotCSAqIGhhcyB0aGUgd3JvbmcgdHlwZT8gRG8gdGhlIGVycm9ycyBnZXQgZGV0ZWN0ZWQgYW5kIHJlcG9ydGVkIG5vdywgb3IKLQkgKiB1cG9uIHNhdmUoKT9dCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlckNvbmZpZ3VyYXRpb24oSUZvbGRlciBjb25maWd1cmF0aW9uKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgaW5zdGFuY2UgdGhhdCB0aGlzIHdvcmtpbmcgY29weSBpcwotCSAqIGFzc29jaWF0ZWQgd2l0aC4KLQkgKiA8cD4KLQkgKiBGb3IgYSBzZXJ2ZXIgd29ya2luZyBjb3B5IGNyZWF0ZWQgYnkgYSBjYWxsIHRvCi0JICoge0BsaW5rIElTZXJ2ZXIjY3JlYXRlV29ya2luZ0NvcHkoKX0sCi0JICogPGNvZGU+dGhpcy5nZXRPcmlnaW5hbCgpPC9jb2RlPiByZXR1cm5zIHRoZSBvcmlnaW5hbAotCSAqIHNlcnZlciBvYmplY3QuIEZvciBhIHNlcnZlciB3b3JraW5nIGNvcHkganVzdCBjcmVhdGVkIGJ5Ci0JICogYSBjYWxsIHRvIHtAbGluayBJU2VydmVyVHlwZSNjcmVhdGVTZXJ2ZXIoU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSwgSVByb2dyZXNzTW9uaXRvcil9LAotCSAqIDxjb2RlPnRoaXMuZ2V0T3JpZ2luYWwoKTwvY29kZT4gcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCBzZXJ2ZXIgaW5zdGFuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgSVNlcnZlciBnZXRPcmlnaW5hbCgpOwotCi0JLyoqCi0JICogQ29tbWl0cyB0aGUgY2hhbmdlcyBtYWRlIGluIHRoaXMgd29ya2luZyBjb3B5LiBJZiB0aGVyZSBpcwotCSAqIG5vIGV4dGFudCBzZXJ2ZXIgaW5zdGFuY2Ugd2l0aCBhIG1hdGNoaW5nIGlkIGFuZCBzZXJ2ZXIKLQkgKiB0eXBlLCB0aGlzIHdpbGwgY3JlYXRlIGEgc2VydmVyIGluc3RhbmNlIHdpdGggYXR0cmlidXRlcwotCSAqIHRha2VuIGZyb20gdGhpcyB3b3JraW5nIGNvcHkuIElmIHRoZXJlIGFuIGV4aXN0aW5nIHNlcnZlcgotCSAqIGluc3RhbmNlIHdpdGggYSBtYXRjaGluZyBpZCBhbmQgc2VydmVyIHR5cGUsIHRoaXMgd2lsbAotCSAqIGNoYW5nZSB0aGUgc2VydmVyIGluc3RhbmNlIGFjY29yZGluZ2x5LgotCSAqIDxwPgotCSAqIElmIHRoZXJlIGFuIGV4aXN0aW5nIHNlcnZlciBpbnN0YW5jZSB3aXRoIGEgbWF0Y2hpbmcgaWQgYW5kCi0JICogc2VydmVyIHR5cGUsIHRoaXMgd2lsbCBjaGFuZ2UgdGhlIHNlcnZlciBpbnN0YW5jZSBhY2NvcmRpbmdseS4KLQkgKiBUaGUgcmV0dXJuZWQgc2VydmVyIHdpbGwgYmUgdGhlIHNhbWUgc2VydmVyIHRoaXMgaXMgcmV0dXJuZWQKLQkgKiBmcm9tIGdldE9yaWdpbmFsKCksIGFmdGVyIHRoZSBjaGFuZ2VzIGhhdmUgYmVlbiBhcHBsaWVkLgotCSAqIE90aGVyd2lzZSwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBuZXdseSBjcmVhdGVkIHNlcnZlci4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogU2VydmVycyBjYW4gYmUgc2F2ZWQgZXZlbiB3aGVuIHRoZXkgaGF2ZSBpbnZhbGlkIHByb3BlcnRpZXMuIEl0Ci0JICogaXMgdGhlIGNsaWVudHMgcmVzcG9uc2liaWxpdHkgdG8gdmFsaWRhdGUgb3IgY2hlY2sgdGhlCi0JICogcHJvcGVydGllcyBiZWZvcmUgc2F2aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBhcHBseSBjaGFuZ2VzIHRvIHRoZSBzZXJ2ZXIuIEEgcHVibGlzaCgpCi0JICogbXVzdCBiZSBjb21wbGV0ZWQgdG8gcHVzaCBvdXQgYWZ0ZXIgdGhlIHNhdmUgdG8gcHVzaCBvdXQgYW55Ci0JICogY2hhbmdlcyB0byB0aGUgc2VydmVyLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFNpbmNlIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gY29tbWl0IGEgc2VydmVyCi0JICogd29ya2luZyBjb3B5IHdpdGhvdXQgZmlyc3QgY29tbWl0dGluZyBhbnkgYXNzb2NpYXRlZAotCSAqIHJ1bnRpbWUgYW5kIHNlcnZlciBjb25maWcgd29ya2luZyBjb3BpZXMsIHRoZSBzZW1hbnRpY3MKLQkgKiBvZiBzYXZlQWxsIHNob3VsZCBiZSBwYXJ0IGFuZCBwYXJjZWwgb2YgdGhlCi0JICogbm9ybWFsIHNhdmUsIGFuZCB0aGUgc2F2ZUFsbCBtZXRob2QgZWxpbWluYXRlZC5dCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBmb3JjZSA8Y29kZT50cnVlPC9jb2RlPiB0byBmb3JjZSB0aGUgc2F2ZSwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBuZXcgc2VydmVyIGluc3RhbmNlCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIHNhdmluZyB0aGUgc2VydmVyCi0JICogQHNlZSAjU0FWRV9DT05GTElDVAotCSAqLwotCXB1YmxpYyBJU2VydmVyIHNhdmUoYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvbW1pdHMgdGhlIGNoYW5nZXMgbWFkZSBpbiB0aGlzIHNlcnZlciB3b3JraW5nIGNvcHkgYWZ0ZXIKLQkgKiBmaXJzdCBjb21taXR0aW5nIGFueSBhc3NvY2lhdGVkIHNlcnZlciBjb25maWd1cmF0aW9uIG9yCi0JICogc2VydmVyIHJ1bnRpbWUgd29ya2luZyBjb3BpZXMuCi0JICogPHA+Ci0JICogVGhpcyBjb252ZW5pZW5jZSBtZXRob2QgaXMgZXF1aXZhbGVudCB0bzoKLQkgKiA8cHJlPgotCSAqIElSdW50aW1lIHJ0ID0gdGhpcy5nZXRSdW50aW1lKCk7Ci0JICogaWYgKHJ0ICE9IG51bGwgJiYgcnQuaXNXb3JraW5nQ29weSgpKSB7Ci0JICogICAgKChJUnVudGltZVdvcmtpbmdDb3B5KSBydCkuc2F2ZShtb25pdG9yKTsKLQkgKiB9Ci0JICogSVNlcnZlckNvbmZpZ3VyYXRpb24gY2YgPSB0aGlzLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKLQkgKiBpZiAoY2YgIT0gbnVsbCAmJiBjZi5pc1dvcmtpbmdDb3B5KCkpIHsKLQkgKiAgICAoKElTZXJ2ZXJDb25maWd1cmF0aW9uV29ya2luZ0NvcHkpIGNmKS5zYXZlKG1vbml0b3IpOwotCSAqIH0KLQkgKiByZXR1cm4gc2F2ZShtb25pdG9yKTsKLQkgKiA8L3ByZT4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBTaW5jZSBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGNvbW1pdCBhIHNlcnZlcgotCSAqIHdvcmtpbmcgY29weSB3aXRob3V0IGZpcnN0IGNvbW1pdHRpbmcgYW55IGFzc29jaWF0ZWQKLQkgKiBydW50aW1lIGFuZCBzZXJ2ZXIgY29uZmlnIHdvcmtpbmcgY29waWVzLCB0aGUgc2VtYW50aWNzCi0JICogb2YgdGhpcyBvcGVyYXRpb24gc2hvdWxkIGJlIHBhcnQgYW5kIHBhcmNlbCBvZiB0aGUKLQkgKiBub3JtYWwgc2F2ZSwgYW5kIHRoZSBzYXZlQWxsIG1ldGhvZCBlbGltaW5hdGVkLl0KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGZvcmNlIDxjb2RlPnRydWU8L2NvZGU+IHRvIGZvcmNlIHRoZSBzYXZlLCBvciA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICBvdGhlcndpc2UKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIG5ldyBzZXJ2ZXIgaW5zdGFuY2UKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3Igc2F2aW5nIHRoZSBzZXJ2ZXIsIHJ1bnRpbWUsIG9yCi0JICogICAgc2VydmVyIGNvbmZpZ3VyYXRpb24KLQkgKiBAc2VlICNTQVZFX0NPTkZMSUNUCi0JICovCi0JcHVibGljIElTZXJ2ZXIgc2F2ZUFsbChib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcnVudGltZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2ZXIgd29ya2luZyBjb3B5LgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBydW50aW1lIG9mIGEgc2VydmVyIHdvcmtpbmcgY29weSBtYXkKLQkgKiBvciBtYXkgbm90IGJlIGEgd29ya2luZyBjb3B5LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IEFjY29yZGluZyB0byBzZXJ2ZXJUeXBlIGV4dGVuc2lvbiBwb2ludCwgCi0JICogcnVudGltZVR5cGVJZCBpcyBhIG1hbmRhdG9yeSBhdHRyaWJ1dGUuIEJ1dCBJU2VydmVyLmdldFJ1bnRpbWUoKQotCSAqIGlzIGFsbG93ZWQgdG8gcmV0dXJuIG51bGwsIHN1Z2dlc3RpbmcgdGhhdCBpdCBpcyBvcHRpb25hbCBmb3IgaW5zdGFuY2VzLgotCSAqIFdoYXQgaGFwcGVucyBpZiB0aGUgcnVudGltZSBwYXNzZWQgaXMgbnVsbCBidXQgdGhlIHNlcnZlciBtdXN0Ci0JICogaGF2ZSBhIHJ1bnRpbWU/IFdoYXQgaGFwcGVucyBpZiB0aGUgcnVudGltZSBoYXMgdGhlIHdyb25nCi0JICogdHlwZT8gRG8gdGhlIGVycm9ycyBnZXQgZGV0ZWN0ZWQgYW5kIHJlcG9ydGVkIG5vdywgb3IgdXBvbiBzYXZlKCk/XQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSB0aGUgcnVudGltZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJ1bnRpbWUoSVJ1bnRpbWUgcnVudGltZSk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNlcnZlciBhdHRyaWJ1dGUgdmFsdWUgdGhhdCBpcyBzdG9yZWQgaW4gdGhlIHNlcnZlciB3b3JraW5nIGNvcHkuIFRocm93cyAKLQkgKiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpZiB0aGUgYXR0cmlidXRlIGNhbid0IGJlIG1vZGlmaWVkCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgbmVlZHMgdG8gYmUgbW9kaWZpZWQuCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGdpdmVuIGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNlcnZlciBhdHRyaWJ1dGUgdmFsdWUgdGhhdCBpcyBzdG9yZWQgaW4gdGhlIHNlcnZlciB3b3JraW5nIGNvcHkuIFRocm93cyAKLQkgKiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpZiB0aGUgYXR0cmlidXRlIGNhbid0IGJlIG1vZGlmaWVkCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgbmVlZHMgdG8gYmUgbW9kaWZpZWQuCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGdpdmVuIGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogU2V0IHRoZSBzZXJ2ZXIgYXR0cmlidXRlIHZhbHVlIHRoYXQgaXMgc3RvcmVkIGluIHRoZSBzZXJ2ZXIgd29ya2luZyBjb3B5LiBUaHJvd3MgCi0JICoge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaWYgdGhlIGF0dHJpYnV0ZSBjYW4ndCBiZSBtb2RpZmllZAotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IG5lZWRzIHRvIGJlIG1vZGlmaWVkLgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogU2V0IHRoZSBzZXJ2ZXIgYXR0cmlidXRlIHZhbHVlIHRoYXQgaXMgc3RvcmVkIGluIHRoZSBzZXJ2ZXIgd29ya2luZyBjb3B5LiBUaHJvd3MgCi0JICoge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaWYgdGhlIGF0dHJpYnV0ZSBjYW4ndCBiZSBtb2RpZmllZAotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IG5lZWRzIHRvIGJlIG1vZGlmaWVkLgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBMaXN0PFN0cmluZz4gdmFsdWUpOwotCi0JLyoqCi0JICogU2V0IHRoZSBzZXJ2ZXIgYXR0cmlidXRlIHZhbHVlIHRoYXQgaXMgc3RvcmVkIGluIHRoZSBzZXJ2ZXIgd29ya2luZyBjb3B5LiBUaHJvd3MgCi0JICoge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaWYgdGhlIGF0dHJpYnV0ZSBjYW4ndCBiZSBtb2RpZmllZAotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IG5lZWRzIHRvIGJlIG1vZGlmaWVkLgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBNYXAgdmFsdWUpOwotCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgaG9zdCBmb3IgdGhlIHNlcnZlci4KLQkgKiBUaGUgZm9ybWF0IG9mIHRoZSBob3N0IGNhbiBiZSBlaXRoZXIgYSBxdWFsaWZpZWQgb3IgdW5xdWFsaWZpZWQgaG9zdG5hbWUsCi0JICogb3IgYW4gSVAgYWRkcmVzcyBhbmQgbXVzdCBjb25mb3JtIHRvIFJGQyAyNzMyLgotCSAqIAotCSAqIDxwPgotCSAqIFtpc3N1ZTogVGhpcyBpcyBhIHF1ZXN0aW9uYWJsZSBvcGVyYXRpb24gaWYgdGhlcmUgaXMgYSBydW5uaW5nCi0JICogc2VydmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwuIFdoZW4gYSBob3N0IG5hbWUKLQkgKiBjaGFuZ2UgaXMgY29tbWl0dGVkLCB0aGUgc2VydmVyIGluc3RhbmNlIGxvc2VzIGNvbnRhY3Qgd2l0aAotCSAqIHRoZSBydW5uaW5nIHNlcnZlciBiZWNhdXNlIG9mIHRoZSBob3N0IG5hbWUgY2hhbmdlLl0KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGhvc3QgYSBob3N0IHN0cmluZyBjb25mb3JtaW5nIHRvIFJGQyAyNzMyCi0JICogQHNlZSBJU2VydmVyI2dldEhvc3QoKQotCSAqIEBzZWUgamF2YS5uZXQuVVJMI2dldEhvc3QoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpOwotCi0JLyoqCi0JICogTW9kaWZpZXMgdGhlIGxpc3Qgb2YgbW9kdWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZlci4KLQkgKiBUaGUgbW9kdWxlcyBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+YWRkPC9jb2RlPiBsaXN0Ci0JICogbXVzdCBleGlzdCBpbiB0aGUgd29ya3NwYWNlIGFuZCBtdXN0IG5vdCBhbHJlYWR5IGJlIGFzc29jaWF0ZWQKLQkgKiB3aXRoIHRoZSBzZXJ2ZXIuCi0JICogVGhlIG1vZHVsZXMgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPnJlbW92ZTwvY29kZT4gbGlzdAotCSAqIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2ZXIsIGJ1dCBtYXkgb3IgbWF5IG5vdCBleGlzdAotCSAqIGluIHRoZSB3b3Jrc3BhY2UuCi0JICogRW50cmllcyBpbiB0aGUgYWRkIG9yIHJlbW92ZSBsaXN0cyBtYXkgbm90IGJlIG51bGwuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgd2lsbCBub3QgY29tbXVuaWNhdGUgd2l0aCB0aGUgc2VydmVyLiBBZnRlciBzYXZpbmcsCi0JICogcHVibGlzaCgpIGNhbiBiZSB1c2VkIHRvIHN5bmMgdXAgd2l0aCB0aGUgc2VydmVyLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIGZhaWwgd2l0aCB0aGUgc2FtZSBzdGF0dXMgZXhjZXB0aW9uCi0JICogaWYgdGhlIHJlc3VsdCBvZiBjYW5Nb2RpZnlNb2R1bGVzKCkgaXMgYW4gZXJyb3Igc3RhdHVzLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IEhvdyB0byBmb3JtdWxhdGUgd2hhdCBpdCBtZWFucwotCSAqIHRvIHNheSAidGhlIG1vZHVsZSBtdXN0IGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UiP10KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBUaGUgc3BlYyBzaG91bGQgYmUgbW9yZSBsYXguIEF0dGVtcHRpbmcgdG8gYWRkCi0JICogYSBtb2R1bGUgdGhhdCdzIGFscmVhZHkgaW5jbHVkZSBzaG91bGQgYmUgcXVpZXRseSBpZ25vcmU7Ci0JICogZGl0dG8gcmVtb3ZpbmcgYSBtb2R1bGUgdGhhdCdzIG5vdCBvbiB0aGlzIGxpc3QuIFRoaXMKLQkgKiBzaW1wbGlmaWVzIHRoZSBoYW5kbGluZyBvZiB2YXJpb3VzIG90aGVyIHdhY2tvIGNhc2VzIAotCSAqIHN1Y2ggYXMgZHVwbGljYXRpb24gd2l0aGluIGFuZCBiZXR3ZWVuIHRoZSBhZGQgYW5kIHJlbW92ZQotCSAqIGxpc3RzLl0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBXaGF0IGVycm9yIGNoZWNraW5nIHNob3VsZCBiZSBwZXJmb3JtZWQgYnkgdGhpcwotCSAqIG9wZXJhdGlvbiwgYW5kIHdoYXQgbmVlZHMgdG8gYmUgcGVyZm9ybWVkIGJ5IHNhdmUoKSBpZgotCSAqIHRoZSBjbGllbnQgdHJpZXMgdG8gY29tbWl0IHRoZXNlIGh5cG90aGV0aXNpemVkIGNoYW5nZXM/XQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYWRkIGEgcG9zc2libHktZW1wdHkgbGlzdCBvZiBtb2R1bGVzIHRvIGFkZAotCSAqIEBwYXJhbSByZW1vdmUgYSBwb3NzaWJseS1lbXB0eSBsaXN0IG9mIG1vZHVsZXMgdG8gcmVtb3ZlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgY2hhbmdlcyBhcmUgbm90IGFsbG93ZWQgb3IgY291bGQgbm90Ci0JICogICAgYmUgcHJvY2Vzc2VkCi0JICogQHNlZSBJU2VydmVyQXR0cmlidXRlcyNjYW5Nb2RpZnlNb2R1bGVzKElNb2R1bGVbXSwgSU1vZHVsZVtdLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJDb3JlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJDb3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NDc2MzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvU2VydmVyQ29yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuKjsKLS8qKgotICogTWFpbiBjbGFzcyBmb3Igc2VydmVyIGNvcmUgQVBJLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIEFQSSB0byBhY2Nlc3MgbW9zdCBvZiB0aGUgdHlwZXMgaW4gdGhlIHNlcnZlcgotICogZnJhbWV3b3JrLCBpbmNsdWRpbmcgc2VydmVyIHJ1bnRpbWVzIGFuZCBzZXJ2ZXJzLgotICogVGhlIG1ldGhvZHMgb24gdGhpcyBjbGFzcyBhcmUgdGhyZWFkIHNhZmUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxsIGl0cyBmdW5jdGlvbmFsaXR5IHRocm91Z2ggc3RhdGljIG1lbWJlcnMuCi0gKiBJdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvciBpbnN0YW50aWF0ZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlcnZlckNvcmUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fU0VSVkVSX1RZUEUgPSAic2VydmVyVHlwZXMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUlVOVElNRV9UWVBFID0gInJ1bnRpbWVUeXBlcyI7Ci0KLQkvLwljYWNoZWQgY29weSBvZiBhbGwgcnVudGltZSB0eXBlcwotCXByaXZhdGUgc3RhdGljIExpc3Q8SVJ1bnRpbWVUeXBlPiBydW50aW1lVHlwZXM7Ci0KLQkvLwljYWNoZWQgY29weSBvZiBhbGwgc2VydmVyIGFuZCBjb25maWd1cmF0aW9uIHR5cGVzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxJU2VydmVyVHlwZT4gc2VydmVyVHlwZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBJUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lciByZWdpc3RyeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBSZWdpc3RyeUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCByZWdpc3RyeUNoYW5nZWQoSVJlZ2lzdHJ5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUlFeHRlbnNpb25EZWx0YVtdIGRlbHRhcyA9IGV2ZW50LmdldEV4dGVuc2lvbkRlbHRhcyhTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fUlVOVElNRV9UWVBFKTsKLQkJCWlmIChkZWx0YXMgIT0gbnVsbCkgewotCQkJCWZvciAoSUV4dGVuc2lvbkRlbHRhIGRlbHRhIDogZGVsdGFzKQotCQkJCQloYW5kbGVSdW50aW1lVHlwZURlbHRhKGRlbHRhKTsKLQkJCX0KLQkJCQotCQkJZGVsdGFzID0gZXZlbnQuZ2V0RXh0ZW5zaW9uRGVsdGFzKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIEVYVEVOU0lPTl9TRVJWRVJfVFlQRSk7Ci0JCQlpZiAoZGVsdGFzICE9IG51bGwpIHsKLQkJCQlmb3IgKElFeHRlbnNpb25EZWx0YSBkZWx0YSA6IGRlbHRhcykKLQkJCQkJaGFuZGxlU2VydmVyVHlwZURlbHRhKGRlbHRhKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENhbm5vdCBpbnN0YW50aWF0ZSBTZXJ2ZXJDb3JlIC0gdXNlIHN0YXRpYyBtZXRob2RzLgotCSAqLwotCXByaXZhdGUgU2VydmVyQ29yZSgpIHsKLQkJLy8gY2FuJ3QgY3JlYXRlCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgbWFuYWdlci4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIG1hbmFnZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgewotCQlyZXR1cm4gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHByb2plY3QuIFRoZSBwcm9qZWN0IG1heSBub3QKLQkgKiBiZSBudWxsLgotCSAqCi0JICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0Ci0JICogQHJldHVybiB0aGUgcHJvcGVydGllcyBvZiB0aGUgcHJvamVjdAotCSAqIEBkZXByZWNhdGVkIFByb2plY3QgZmFjZXQgc3VwcG9ydCBzaG91bGQgbm93IGJlIHVzZWQgaW5zdGVhZCBvZiB0aGlzIEFQSS4gQHNlZQotCSAqICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdCNnZXRSdW50aW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0UHJvcGVydGllcyBnZXRQcm9qZWN0UHJvcGVydGllcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXJldHVybiBuZXcgSVByb2plY3RQcm9wZXJ0aWVzKCkgewotCQkJcHVibGljIElSdW50aW1lIGdldFJ1bnRpbWVUYXJnZXQoKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gcnVudGltZSB0eXBlcy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBydW50aW1lIHR5cGVzIHtAbGluayBJUnVudGltZVR5cGV9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZVR5cGVbXSBnZXRSdW50aW1lVHlwZXMoKSB7Ci0JCWlmIChydW50aW1lVHlwZXMgPT0gbnVsbCkKLQkJCWxvYWRSdW50aW1lVHlwZXMoKTsKLQkJCi0JCUlSdW50aW1lVHlwZVtdIHJ0ID0gbmV3IElSdW50aW1lVHlwZVtydW50aW1lVHlwZXMuc2l6ZSgpXTsKLQkJcnVudGltZVR5cGVzLnRvQXJyYXkocnQpOwotCQlyZXR1cm4gcnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSB0eXBlIHdpdGggdGhlIGdpdmVuIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vbmUuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHNlYXJjaGVzIHRoZSBsaXN0IG9mIGtub3duCi0JICogcnVudGltZSB0eXBlcyAoe0BsaW5rICNnZXRSdW50aW1lVHlwZXMoKX0pIGZvciB0aGUgb25lIHdpdGggYSBtYXRjaGluZwotCSAqIHJ1bnRpbWUgdHlwZSBpZCAoe0BsaW5rIElSdW50aW1lVHlwZSNnZXRJZCgpfSkuIFRoZSBpZCBtYXkgbm90IGJlIG51bGwuCi0JICoKLQkgKiBAcGFyYW0gaWQgdGhlIHJ1bnRpbWUgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gcnVudGltZSB0eXBlCi0JICogd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSdW50aW1lVHlwZSBmaW5kUnVudGltZVR5cGUoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCi0JCWlmIChydW50aW1lVHlwZXMgPT0gbnVsbCkKLQkJCWxvYWRSdW50aW1lVHlwZXMoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcnVudGltZVR5cGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IChJUnVudGltZVR5cGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpZC5lcXVhbHMocnVudGltZVR5cGUuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIHJ1bnRpbWVUeXBlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIHNlcnZlciB0eXBlcy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBzZXJ2ZXIgdHlwZXMge0BsaW5rIElTZXJ2ZXJUeXBlfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNlcnZlclR5cGVbXSBnZXRTZXJ2ZXJUeXBlcygpIHsKLQkJaWYgKHNlcnZlclR5cGVzID09IG51bGwpCi0JCQlsb2FkU2VydmVyVHlwZXMoKTsKLQkJCi0JCUlTZXJ2ZXJUeXBlW10gc3QgPSBuZXcgSVNlcnZlclR5cGVbc2VydmVyVHlwZXMuc2l6ZSgpXTsKLQkJc2VydmVyVHlwZXMudG9BcnJheShzdCk7Ci0JCXJldHVybiBzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgdHlwZSB3aXRoIHRoZSBnaXZlbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBub25lLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBzZWFyY2hlcyB0aGUgbGlzdCBvZiBrbm93bgotCSAqIHNlcnZlciB0eXBlcyAoe0BsaW5rICNnZXRTZXJ2ZXJUeXBlcygpfSkgZm9yIHRoZSBvbmUgd2l0aCBhIG1hdGNoaW5nCi0JICogc2VydmVyIHR5cGUgaWQgKHtAbGluayBJU2VydmVyVHlwZSNnZXRJZCgpfSkuIFRoZSBpZCBtYXkgbm90IGJlIG51bGwuCi0JICoKLQkgKiBAcGFyYW0gaWQgdGhlIHNlcnZlciB0eXBlIGlkCi0JICogQHJldHVybiB0aGUgc2VydmVyIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHNlcnZlciB0eXBlCi0JICogd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXJUeXBlIGZpbmRTZXJ2ZXJUeXBlKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotCQlpZiAoc2VydmVyVHlwZXMgPT0gbnVsbCkKLQkJCWxvYWRTZXJ2ZXJUeXBlcygpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2ZXJUeXBlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gKElTZXJ2ZXJUeXBlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaWQuZXF1YWxzKHNlcnZlclR5cGUuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIHNlcnZlclR5cGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgcnVudGltZSB0eXBlcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkUnVudGltZVR5cGVzKCkgewotCQlpZiAocnVudGltZVR5cGVzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICItPi0gTG9hZGluZyAucnVudGltZVR5cGVzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJfQotCQkKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX1JVTlRJTUVfVFlQRSk7Ci0JCUxpc3Q8SVJ1bnRpbWVUeXBlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUnVudGltZVR5cGU+KGNmLmxlbmd0aCk7Ci0JCWFkZFJ1bnRpbWVUeXBlcyhjZiwgbGlzdCk7Ci0JCWFkZFJlZ2lzdHJ5TGlzdGVuZXIoKTsKLQkJcnVudGltZVR5cGVzID0gbGlzdDsKLQkJCi0JCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5ydW50aW1lVHlwZXMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgcnVudGltZSB0eXBlcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRSdW50aW1lVHlwZXMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YsIExpc3Q8SVJ1bnRpbWVUeXBlPiBsaXN0KSB7Ci0JCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlIDogY2YpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKCFTZXJ2ZXJQbHVnaW4uY29udGFpbnMoU2VydmVyUGx1Z2luLmdldEV4Y2x1ZGVkU2VydmVyQWRhcHRlcnMoKSwgY2UuZ2V0QXR0cmlidXRlKCJpZCIpKSkKLQkJCQkJbGlzdC5hZGQobmV3IFJ1bnRpbWVUeXBlKGNlKSk7Ci0JCQkJaWYgKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRVhURU5TSU9OX1BPSU5ULCAiICBMb2FkZWQgcnVudGltZVR5cGU6ICIgKyBjZS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBydW50aW1lVHlwZTogIiArIGNlLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgc2VydmVyIHR5cGVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRTZXJ2ZXJUeXBlcygpIHsKLQkJaWYgKHNlcnZlclR5cGVzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRVhURU5TSU9OX1BPSU5ULCAiLT4tIExvYWRpbmcgLnNlcnZlclR5cGVzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJfQotCQkKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX1NFUlZFUl9UWVBFKTsKLQkJTGlzdDxJU2VydmVyVHlwZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVNlcnZlclR5cGU+KGNmLmxlbmd0aCk7Ci0JCWFkZFNlcnZlclR5cGVzKGNmLCBsaXN0KTsKLQkJYWRkUmVnaXN0cnlMaXN0ZW5lcigpOwotCQlzZXJ2ZXJUeXBlcyA9IGxpc3Q7Ci0JCQotCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRVhURU5TSU9OX1BPSU5ULCAiLTwtIERvbmUgbG9hZGluZyAuc2VydmVyVHlwZXMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgc2VydmVyIHR5cGVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFNlcnZlclR5cGVzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmLCBMaXN0PElTZXJ2ZXJUeXBlPiBsaXN0KSB7Ci0JCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlIDogY2YpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKCFTZXJ2ZXJQbHVnaW4uY29udGFpbnMoU2VydmVyUGx1Z2luLmdldEV4Y2x1ZGVkU2VydmVyQWRhcHRlcnMoKSwgY2UuZ2V0QXR0cmlidXRlKCJpZCIpKSkKLQkJCQkJbGlzdC5hZGQobmV3IFNlcnZlclR5cGUoY2UpKTsKLQkJCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBzZXJ2ZXJUeXBlOiAiICsgY2UuZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgc2VydmVyVHlwZTogIiArIGNlLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSB3aXRoIHRoZSBnaXZlbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBub25lLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBzZWFyY2hlcyB0aGUgbGlzdCBvZiBrbm93bgotCSAqIHJ1bnRpbWVzICh7QGxpbmsgI2dldFJ1bnRpbWVzKCl9KSBmb3IgdGhlIG9uZSB3aXRoIGEgbWF0Y2hpbmcKLQkgKiBydW50aW1lIGlkICh7QGxpbmsgSVJ1bnRpbWUjZ2V0SWQoKX0pLiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsLgotCSAqCi0JICogQHBhcmFtIGlkIHRoZSBydW50aW1lIGlkCi0JICogQHJldHVybiB0aGUgcnVudGltZSBpbnN0YW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gcnVudGltZQotCSAqIHdpdGggdGhlIGdpdmVuIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZSBmaW5kUnVudGltZShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTWFuYWdlcigpLmdldFJ1bnRpbWUoaWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIHJ1bnRpbWUgaW5zdGFuY2VzLiBUaGUgbGlzdCB3aWxsIG5vdCBjb250YWluIGFueQotCSAqIHdvcmtpbmcgY29waWVzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBydW50aW1lIGluc3RhbmNlcyB7QGxpbmsgSVJ1bnRpbWV9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZVtdIGdldFJ1bnRpbWVzKCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VNYW5hZ2VyKCkuZ2V0UnVudGltZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgZ2l2ZW4gaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24KLQkgKiBzZXJ2ZXJzICh7QGxpbmsgI2dldFNlcnZlcnMoKX0pIGZvciB0aGUgb25lIHdpdGggYSBtYXRjaGluZwotCSAqIHNlcnZlciBpZCAoe0BsaW5rIElTZXJ2ZXIjZ2V0SWQoKX0pLiBUaGUgaWQgbXVzdCBub3QgYmUgbnVsbC4KLQkgKgotCSAqIEBwYXJhbSBpZCB0aGUgc2VydmVyIGlkCi0JICogQHJldHVybiB0aGUgc2VydmVyIGluc3RhbmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzZXJ2ZXIKLQkgKiB3aXRoIHRoZSBnaXZlbiBpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNlcnZlciBmaW5kU2VydmVyKFN0cmluZyBpZCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VNYW5hZ2VyKCkuZ2V0U2VydmVyKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBzZXJ2ZXIgaW5zdGFuY2VzLiBUaGUgYXJyYXkgd2lsbCBub3QgaW5jbHVkZSBhbnkKLQkgKiB3b3JraW5nIGNvcGllcy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2Ygc2VydmVyIGluc3RhbmNlcyB7QGxpbmsgSVNlcnZlcn0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXJbXSBnZXRTZXJ2ZXJzKCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VNYW5hZ2VyKCkuZ2V0U2VydmVycygpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgcnVudGltZSBsaWZlY3ljbGUgbGlzdGVuZXIuCi0JICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGEgcnVudGltZSBsaWZlY3ljbGUgbGlzdGVuZXIKLQkgKiBAc2VlICNyZW1vdmVSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIoSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZ2V0UmVzb3VyY2VNYW5hZ2VyKCkuYWRkUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgcnVudGltZSBsaWZlY3ljbGUgbGlzdGVuZXIuCi0JICogSGFzIG5vIGVmZmVjdCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBydW50aW1lIGxpZmVjeWNsZSBsaXN0ZW5lcgotCSAqIEBzZWUgI2FkZFJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcihJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIoSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlnZXRSZXNvdXJjZU1hbmFnZXIoKS5yZW1vdmVSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgc2VydmVyIGxpZmVjeWNsZSBsaXN0ZW5lci4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBzZXJ2ZXIgbGlmZWN5Y2xlIGxpc3RlbmVyCi0JICogQHNlZSAjcmVtb3ZlU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZ2V0UmVzb3VyY2VNYW5hZ2VyKCkuYWRkU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBzZXJ2ZXIgbGlmZWN5Y2xlIGxpc3RlbmVyLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGEgc2VydmVyIGxpZmVjeWNsZSBsaXN0ZW5lcgotCSAqICNhZGRTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlnZXRSZXNvdXJjZU1hbmFnZXIoKS5yZW1vdmVTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJlZmVycmVkIHJ1bnRpbWUgc2VydmVyIGZvciB0aGUgZ2l2ZW4gbW9kdWxlLiBUaGlzIG1ldGhvZAotCSAqIHJldHVybnMgbnVsbCBpZiB0aGUgc2VydmVyIHdhcyBuZXZlciBjaG9zZW4gb3IgZG9lcyBub3QgY3VycmVudGx5IGV4aXN0LiAoaWYgdGhlCi0JICogc2VydmVyIGlzIHJlY3JlYXRlZCBvciB3YXMgaW4gYSBjbG9zZWQgcHJvamVjdCwgZXRjLiB0aGlzIG1ldGhvZCB3aWxsIHJldHVybgotCSAqIHRoZSBvcmlnaW5hbCB2YWx1ZSBpZiBpdCBiZWNvbWVzIGF2YWlsYWJsZSBhZ2FpbikKLQkgKgotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGRlZmF1bHQgc2VydmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubwotCSAqICAgIGRlZmF1bHQgc2VydmVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJU2VydmVyIGdldERlZmF1bHRTZXJ2ZXIoSU1vZHVsZSBtb2R1bGUpIHsKLQkJcmV0dXJuIE1vZHVsZVByb3BlcnRpZXMuZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0U2VydmVyKG1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHJlZmVycmVkIHJ1bnRpbWUgc2VydmVyIGZvciB0aGUgZ2l2ZW4gbW9kdWxlLiBTZXQgdGhlIHNlcnZlciB0bwotCSAqIG51bGwgdG8gY2xlYXIgdGhlIHNldHRpbmcuIElmIHRoZXJlIGlzIGEgcHJvYmxlbSBzYXZpbmcgdGhlIGZpbGUsIGEgQ29yZUV4Y2VwdGlvbgotCSAqIHdpbGwgYmUgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0byBzZXQgdGhlIGRlZmF1bHQgZm9yCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRvIHNldCB0aGUgZGVmYXVsdCBzZXJ2ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgdG8gdW5zZXQgdGhlIGRlZmF1bHQKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBzZXR0aW5nIHRoZSBkZWZhdWx0IHNlcnZlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0U2VydmVyKElNb2R1bGUgbW9kdWxlLCBJU2VydmVyIHNlcnZlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU1vZHVsZVByb3BlcnRpZXMuZ2V0SW5zdGFuY2UoKS5zZXREZWZhdWx0U2VydmVyKG1vZHVsZSwgc2VydmVyLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgY2hhbmdlIHRvIHRoZSBzZXJ2ZXIgdHlwZSBleHRlbnNpb24gcG9pbnQgZHVlIHRvIGJ1bmRsZXMgZ2V0dGluZyBhZGRlZAotCSAqIG9yIHJlbW92ZWQgZHluYW1pY2FsbHkgYXQgcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEgYW4gZXh0ZW5zaW9uIGRlbHRhCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGhhbmRsZVNlcnZlclR5cGVEZWx0YShJRXh0ZW5zaW9uRGVsdGEgZGVsdGEpIHsKLQkJaWYgKHNlcnZlclR5cGVzID09IG51bGwpIC8vIG5vdCBsb2FkZWQgeWV0Ci0JCQlyZXR1cm47Ci0JCQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IGRlbHRhLmdldEV4dGVuc2lvbigpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkKLQkJTGlzdDxJU2VydmVyVHlwZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVNlcnZlclR5cGU+KHNlcnZlclR5cGVzKTsKLQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJRXh0ZW5zaW9uRGVsdGEuQURERUQpIHsKLQkJCWFkZFNlcnZlclR5cGVzKGNmLCBsaXN0KTsKLQkJfSBlbHNlIHsKLQkJCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCQlTZXJ2ZXJUeXBlW10gc3QgPSBuZXcgU2VydmVyVHlwZVtzaXplXTsKLQkJCWxpc3QudG9BcnJheShzdCk7Ci0JCQlpbnQgc2l6ZTIgPSBjZi5sZW5ndGg7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCWlmIChzdFtpXS5nZXRJZCgpLmVxdWFscyhjZltqXS5nZXRBdHRyaWJ1dGUoImlkIikpKSB7Ci0JCQkJCQlzdFtpXS5kaXNwb3NlKCk7Ci0JCQkJCQlsaXN0LnJlbW92ZShzdFtpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2VydmVyVHlwZXMgPSBsaXN0OwotCQlnZXRSZXNvdXJjZU1hbmFnZXIoKS5yZXNvbHZlU2VydmVycygpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBjaGFuZ2UgdG8gdGhlIHJ1bnRpbWUgdHlwZSBleHRlbnNpb24gcG9pbnQgZHVlIHRvIGJ1bmRsZXMgZ2V0dGluZyBhZGRlZAotCSAqIG9yIHJlbW92ZWQgZHluYW1pY2FsbHkgYXQgcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEgYW4gZXh0ZW5zaW9uIGRlbHRhCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGhhbmRsZVJ1bnRpbWVUeXBlRGVsdGEoSUV4dGVuc2lvbkRlbHRhIGRlbHRhKSB7Ci0JCWlmIChydW50aW1lVHlwZXMgPT0gbnVsbCkgLy8gbm90IGxvYWRlZCB5ZXQKLQkJCXJldHVybjsKLQkJCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gZGVsdGEuZ2V0RXh0ZW5zaW9uKCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQotCQlMaXN0PElSdW50aW1lVHlwZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWVUeXBlPihydW50aW1lVHlwZXMpOwotCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElFeHRlbnNpb25EZWx0YS5BRERFRCkgewotCQkJYWRkUnVudGltZVR5cGVzKGNmLCBsaXN0KTsKLQkJfSBlbHNlIHsKLQkJCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCQlSdW50aW1lVHlwZVtdIHJ0ID0gbmV3IFJ1bnRpbWVUeXBlW3NpemVdOwotCQkJbGlzdC50b0FycmF5KHJ0KTsKLQkJCWludCBzaXplMiA9IGNmLmxlbmd0aDsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJaWYgKHJ0W2ldLmdldElkKCkuZXF1YWxzKGNmW2pdLmdldEF0dHJpYnV0ZSgiaWQiKSkpIHsKLQkJCQkJCXJ0W2ldLmRpc3Bvc2UoKTsKLQkJCQkJCWxpc3QucmVtb3ZlKHJ0W2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlydW50aW1lVHlwZXMgPSBsaXN0OwotCQlnZXRSZXNvdXJjZU1hbmFnZXIoKS5yZXNvbHZlUnVudGltZXMoKTsKLQkJZ2V0UmVzb3VyY2VNYW5hZ2VyKCkucmVzb2x2ZVNlcnZlcnMoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFJlZ2lzdHJ5TGlzdGVuZXIoKSB7Ci0JCWlmIChyZWdpc3RyeUxpc3RlbmVyICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlyZWdpc3RyeUxpc3RlbmVyID0gbmV3IFJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJcmVnaXN0cnkuYWRkUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcihyZWdpc3RyeUxpc3RlbmVyLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lEKTsKLQkJU2VydmVyUGx1Z2luLnNldFJlZ2lzdHJ5TGlzdGVuZXIocmVnaXN0cnlMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQgdG8gYXV0b21hdGljYWxseQotCSAqIHB1Ymxpc2ggd2hlbiBzdGFydGluZyBzZXJ2ZXJzLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQgdG8gYXV0b21hdGljYWxseQotCSAqICAgIHB1Ymxpc2ggd2hlbiBzdGFydGluZyBzZXJ2ZXJzLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1dG9QdWJsaXNoaW5nKCkgewotCQlyZXR1cm4gU2VydmVyUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKS5pc0F1dG9QdWJsaXNoaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHVibGlzaFJlcXVpcmVkKElTZXJ2ZXIgc2VydmVyLCBJUmVzb3VyY2VEZWx0YSBkZWx0YTIpIHsKLQkJUHVibGlzaENvbnRyb2xsZXJbXSBjb250cm9sbGVycyA9IFNlcnZlclBsdWdpbi5nZXRQdWJsaXNoQ29udHJvbGxlcigpOwotCQlpZiAoY29udHJvbGxlcnMubGVuZ3RoID4gMCl7Ci0JCQlmb3IgKFB1Ymxpc2hDb250cm9sbGVyIGNvbnRyb2xsZXIgOiBjb250cm9sbGVycyl7Ci0JCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJiBjb250cm9sbGVyLnN1cHBvcnRzVHlwZShzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpKQotCQkJCQlyZXR1cm4gY29udHJvbGxlci5pc1B1Ymxpc2hSZXF1aXJlZChzZXJ2ZXIsIGRlbHRhMik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlckV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTJkZDdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIEFuIGV2ZW50IGZpcmVkIHdoZW4gYSBzZXJ2ZXIgY2hhbmdlIG9yIG1vZHVsZSBjaGFuZ2VzLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJFdmVudCB7Ci0JcHJpdmF0ZSBJU2VydmVyIHNlcnZlcjsKLQlwcml2YXRlIGludCBraW5kOwotCXByaXZhdGUgSU1vZHVsZVtdIG1vZHVsZVRyZWU7Ci0JcHJpdmF0ZSBpbnQgc3RhdGU7Ci0JcHJpdmF0ZSBpbnQgcHVibGlzaFN0YXRlOwotCXByaXZhdGUgYm9vbGVhbiByZXN0YXJ0U3RhdGU7Ci0JcHJpdmF0ZSBJU3RhdHVzIHN0YXR1czsKLQkKLQkvKioKLQkgKiBGb3Igbm90aWZpY2F0aW9uIHdoZW4gdGhlIHN0YXRlIGhhcyBjaGFuZ2VkLgotCSAqIDxwPgotCSAqIFRoaXMga2luZCBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCA8Y29kZT5QVUJMSVNIX1NUQVRFX0NIQU5HRTwvY29kZT4gYW5kIAotCSAqIDxjb2RlPlJFU1RBUlRfU1RBVEVfQ0hBTkdFPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ0hBTkdFID0gMHgwMDAxOwotCQotCS8qKgotCSAqIEZpcmVkIHdoZW4gcHVibGlzaGVkIGlzIG5lZWRlZCBvciBubyBsb25nZXIgbmVlZHMgdG8gYmUgcHVibGlzaGVkLCAKLQkgKiBvciBpdCdzIHN0YXRlIGhhcyBjaGFuZ2VkLgotCSAqIDxwPgotCSAqIFRoaXMga2luZCBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCA8Y29kZT5TVEFURV9DSEFOR0U8L2NvZGU+IGFuZCAKLQkgKiA8Y29kZT5SRVNUQVJUX1NUQVRFX0NIQU5HRTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBVQkxJU0hfU1RBVEVfQ0hBTkdFID0gMHgwMDAyOwotCQotCS8qKgotCSAqIEZvciBub3RpZmljYXRpb24gd2hlbiB0aGUgc2VydmVyIGlzUmVzdGFydE5lZWRlZCgpIHByb3BlcnR5IGNoYW5nZXMuCi0JICogPHA+Ci0JICogVGhpcyBraW5kIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIDxjb2RlPlNUQVRFX0NIQU5HRTwvY29kZT4gYW5kIAotCSAqIDxjb2RlPlBVQkxJU0hfU1RBVEVfQ0hBTkdFPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVEFSVF9TVEFURV9DSEFOR0UgPSAweDAwMDQ7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NIQU5HRSA9IDB4MDAwODsKLQkKLQkvKioKLQkgKiBGb3IgZXZlbnQgb24gc2VydmVyIGNoYW5nZXMuIFRoaXMga2luZCBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCA8Y29kZT5NT0RVTEVfQ0hBTkdFPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWRVJfQ0hBTkdFID0gMHgwMDEwOwotCQotCS8qKgotCSAqIEZvciBldmVudCBvbiBtb2R1bGUgY2hhbmdlcy4gVGhpcyBraW5kIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIDxjb2RlPlNFUlZFUl9DSEFOR0U8L2NvZGU+LgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PRFVMRV9DSEFOR0UgPSAweDAwMjA7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgc2VydmVyIGV2ZW50IGZvciBzZXJ2ZXIgY2hhbmdlIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiB0aGUgY2hhbmdlLiAoPGNvZGU+WFhYX0NIQU5HRTwvY29kZT4pLiBJZiB0aGUga2luZCBkb2VzIG5vdCAKLQkgKiAgICBpbmNsdWRlIHRoZSA8Y29kZT5TRVJWRVJfQ0hBTkdFPC9jb2RlPiBraW5kLCB0aGUgU0VSVkVSX0NIQU5HRSB3aWxsIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuICAKLQkgKiAgICBjb25zdGFudHMgZGVjbGFyZWQgb24ge0BsaW5rIFNlcnZlckV2ZW50fQotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlciB0aGF0IHRoZSBzZXJ2ZXIgZXZlbnQgdGFrZXMgcGxhY2UKLQkgKiBAcGFyYW0gc3RhdGUgdGhlIHNlcnZlciBzdGF0ZSBhZnRlciB0aGUgY2hhbmdlICg8Y29kZT5TVEFURV9YWFg8L2NvZGU+KQotCSAqICAgIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB7QGxpbmsgSVNlcnZlcn0KLQkgKiBAcGFyYW0gcHVibGlzaGluZ1N0YXRlIHRoZSBzZXJ2ZXIgcHVibGlzaGluZyBzdGF0ZSBhZnRlciB0aGUgCi0JICogICAgY2hhbmdlICg8Y29kZT5QVUJMSVNIX1NUQVRFX1hYWDwvY29kZT4pCi0JICogICAgY29uc3RhbnRzIGRlY2xhcmVkIG9uIHtAbGluayBJU2VydmVyfQotCSAqIEBwYXJhbSByZXN0YXJ0U3RhdGUgZ2V0IHRoZSBzZXJ2ZXIgcmVzdGFydCBzdGF0ZSBhZnRlciB0aGUgc2VydmVyIGlzIHJlc3RhcnQgCi0JICogICAgbmVlZGVkIHByb3BlcnR5IGNoYW5nZSBldmVudAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJFdmVudChpbnQga2luZCwgSVNlcnZlciBzZXJ2ZXIsIGludCBzdGF0ZSwgaW50IHB1Ymxpc2hpbmdTdGF0ZSwgYm9vbGVhbiByZXN0YXJ0U3RhdGUpIHsKLQkJdGhpcy5raW5kID0ga2luZCB8PSBTRVJWRVJfQ0hBTkdFOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5zdGF0ZSA9IHN0YXRlOwotCQl0aGlzLnB1Ymxpc2hTdGF0ZSA9IHB1Ymxpc2hpbmdTdGF0ZTsKLQkJdGhpcy5yZXN0YXJ0U3RhdGUgPSByZXN0YXJ0U3RhdGU7Ci0JCQotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZXJ2ZXIgcGFyYW1ldGVyIG11c3Qgbm90IGJlIG51bGwiKTsKLQkJaWYgKChraW5kICYgTU9EVUxFX0NIQU5HRSkgIT0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIktpbmQgcGFyYW1ldGVyIGludmFsaWQiKTsKLQkJCi0JCWNoZWNrS2luZCgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgc2VydmVyIGV2ZW50IGZvciBzZXJ2ZXIgY2hhbmdlIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiB0aGUgY2hhbmdlLiAoPGNvZGU+WFhYX0NIQU5HRTwvY29kZT4pLiBJZiB0aGUga2luZCBkb2VzIG5vdCAKLQkgKiAgICBpbmNsdWRlIHRoZSA8Y29kZT5TRVJWRVJfQ0hBTkdFPC9jb2RlPiBraW5kLCB0aGUgU0VSVkVSX0NIQU5HRSB3aWxsIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuICAKLQkgKiAgICBjb25zdGFudHMgZGVjbGFyZWQgb24ge0BsaW5rIFNlcnZlckV2ZW50fQotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlciB0aGF0IHRoZSBzZXJ2ZXIgZXZlbnQgdGFrZXMgcGxhY2UKLQkgKiBAcGFyYW0gc3RhdGUgdGhlIHNlcnZlciBzdGF0ZSBhZnRlciB0aGUgY2hhbmdlICg8Y29kZT5TVEFURV9YWFg8L2NvZGU+KQotCSAqICAgIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB7QGxpbmsgSVNlcnZlcn0KLQkgKiBAcGFyYW0gcHVibGlzaGluZ1N0YXRlIHRoZSBzZXJ2ZXIgcHVibGlzaGluZyBzdGF0ZSBhZnRlciB0aGUgCi0JICogICAgY2hhbmdlICg8Y29kZT5QVUJMSVNIX1NUQVRFX1hYWDwvY29kZT4pCi0JICogICAgY29uc3RhbnRzIGRlY2xhcmVkIG9uIHtAbGluayBJU2VydmVyfQotCSAqIEBwYXJhbSByZXN0YXJ0U3RhdGUgZ2V0IHRoZSBzZXJ2ZXIgcmVzdGFydCBzdGF0ZSBhZnRlciB0aGUgc2VydmVyIGlzIHJlc3RhcnQgCi0JICogICAgbmVlZGVkIHByb3BlcnR5IGNoYW5nZSBldmVudAotCSAqIEBwYXJhbSBzdGF0dXMgdGhlIHNlcnZlciBzdGF0dXMgYWZ0ZXIgdGhlIGNoYW5nZQotCSAqLwotCXB1YmxpYyBTZXJ2ZXJFdmVudChpbnQga2luZCwgSVNlcnZlciBzZXJ2ZXIsIGludCBzdGF0ZSwgaW50IHB1Ymxpc2hpbmdTdGF0ZSwgYm9vbGVhbiByZXN0YXJ0U3RhdGUsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCXRoaXMua2luZCA9IGtpbmQgfD0gU0VSVkVSX0NIQU5HRTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQkJdGhpcy5wdWJsaXNoU3RhdGUgPSBwdWJsaXNoaW5nU3RhdGU7Ci0JCXRoaXMucmVzdGFydFN0YXRlID0gcmVzdGFydFN0YXRlOwotCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQkJCi0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNlcnZlciBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgbnVsbCIpOwotCQlpZiAoKGtpbmQgJiBNT0RVTEVfQ0hBTkdFKSAhPSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiS2luZCBwYXJhbWV0ZXIgaW52YWxpZCIpOwotCQkKLQkJY2hlY2tLaW5kKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFNlcnZlckV2ZW50IGZvciBtb2R1bGUgY2hhbmdlIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiB0aGUgY2hhbmdlLiAoPGNvZGU+WFhYX0NIQU5HRTwvY29kZT4pLiBJZiB0aGUga2luZCBkb2VzIG5vdCAKLQkgKiAgICBpbmNsdWRlIHRoZSA8Y29kZT5NT0RVTEVfQ0hBTkdFPC9jb2RlPiBraW5kLCB0aGUgTU9EVUxFX0NIQU5HRSB3aWxsIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuICAKLQkgKiAgICBjb25zdGFudHMgZGVjbGFyZWQgb24ge0BsaW5rIFNlcnZlckV2ZW50fQotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlciB0aGF0IHRoZSBtb2R1bGUgZXZlbnQgdGFrZXMgcGxhY2UKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdGhhdCBoYXMgY2hhbmdlZAotCSAqIEBwYXJhbSBzdGF0ZSB0aGUgbW9kdWxlIHN0YXRlIGFmdGVyIHRoZSBjaGFuZ2UgKDxjb2RlPlNUQVRFX1hYWDwvY29kZT4pCi0JICogICAgY29uc3RhbnRzIGRlY2xhcmVkIG9uIHtAbGluayBJU2VydmVyfQotCSAqIEBwYXJhbSBwdWJsaXNoaW5nU3RhdGUgdGhlIG1vZHVsZSBwdWJsaXNoaW5nIHN0YXRlIGFmdGVyIHRoZSAKLQkgKiAgICBjaGFuZ2UgKDxjb2RlPlBVQkxJU0hfU1RBVEVfWFhYPC9jb2RlPikKLQkgKiAgICBjb25zdGFudHMgZGVjbGFyZWQgb24ge0BsaW5rIElTZXJ2ZXJ9Ci0JICogQHBhcmFtIHJlc3RhcnRTdGF0ZSBnZXQgdGhlIG1vZHVsZSByZXN0YXJ0IHN0YXRlIGFmdGVyIHRoZSBtb2R1bGUgaXMgcmVzdGFydCAKLQkgKiAgICBuZWVkZWQgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJFdmVudChpbnQga2luZCwgSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVbXSBtb2R1bGUsIGludCBzdGF0ZSwgaW50IHB1Ymxpc2hpbmdTdGF0ZSwgYm9vbGVhbiByZXN0YXJ0U3RhdGUpIHsKLQkJdGhpcy5raW5kID0ga2luZCB8PSBNT0RVTEVfQ0hBTkdFOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5tb2R1bGVUcmVlID0gbW9kdWxlOwotCQl0aGlzLnN0YXRlID0gc3RhdGU7Ci0JCXRoaXMucHVibGlzaFN0YXRlID0gcHVibGlzaGluZ1N0YXRlOwotCQl0aGlzLnJlc3RhcnRTdGF0ZSA9IHJlc3RhcnRTdGF0ZTsKLQkJCi0JCWlmIChtb2R1bGVUcmVlID09IG51bGwgfHwgbW9kdWxlVHJlZS5sZW5ndGggPT0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBwYXJhbWV0ZXIgaW52YWxpZCIpOwotCQlpZiAoKGtpbmQgJiBTRVJWRVJfQ0hBTkdFKSAhPSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiS2luZCBwYXJhbWV0ZXIgaW52YWxpZCIpOwotCQkKLQkJY2hlY2tLaW5kKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBTZXJ2ZXJFdmVudCBmb3IgbW9kdWxlIGNoYW5nZSBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGtpbmQgdGhlIGtpbmQgb2YgdGhlIGNoYW5nZS4gKDxjb2RlPlhYWF9DSEFOR0U8L2NvZGU+KS4gSWYgdGhlIGtpbmQgZG9lcyBub3QgCi0JICogICAgaW5jbHVkZSB0aGUgPGNvZGU+TU9EVUxFX0NIQU5HRTwvY29kZT4ga2luZCwgdGhlIE1PRFVMRV9DSEFOR0Ugd2lsbCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5LiAgCi0JICogICAgY29uc3RhbnRzIGRlY2xhcmVkIG9uIHtAbGluayBTZXJ2ZXJFdmVudH0KLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgbW9kdWxlIGV2ZW50IHRha2VzIHBsYWNlCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlIHRoYXQgaGFzIGNoYW5nZWQKLQkgKiBAcGFyYW0gc3RhdGUgdGhlIG1vZHVsZSBzdGF0ZSBhZnRlciB0aGUgY2hhbmdlICg8Y29kZT5TVEFURV9YWFg8L2NvZGU+KQotCSAqICAgIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB7QGxpbmsgSVNlcnZlcn0KLQkgKiBAcGFyYW0gcHVibGlzaGluZ1N0YXRlIHRoZSBtb2R1bGUgcHVibGlzaGluZyBzdGF0ZSBhZnRlciB0aGUgCi0JICogICAgY2hhbmdlICg8Y29kZT5QVUJMSVNIX1NUQVRFX1hYWDwvY29kZT4pCi0JICogICAgY29uc3RhbnRzIGRlY2xhcmVkIG9uIHtAbGluayBJU2VydmVyfQotCSAqIEBwYXJhbSByZXN0YXJ0U3RhdGUgZ2V0IHRoZSBtb2R1bGUgcmVzdGFydCBzdGF0ZSBhZnRlciB0aGUgbW9kdWxlIGlzIHJlc3RhcnQgCi0JICogICAgbmVlZGVkIHByb3BlcnR5IGNoYW5nZSBldmVudC4KLQkgKiBAcGFyYW0gc3RhdHVzIHRoZSBtb2R1bGUgc3RhdHVzIGFmdGVyIHRoZSBjaGFuZ2UKLQkgKi8KLQlwdWJsaWMgU2VydmVyRXZlbnQoaW50IGtpbmQsIElTZXJ2ZXIgc2VydmVyLCBJTW9kdWxlW10gbW9kdWxlLCBpbnQgc3RhdGUsIGludCBwdWJsaXNoaW5nU3RhdGUsIGJvb2xlYW4gcmVzdGFydFN0YXRlLCBJU3RhdHVzIHN0YXR1cykgewotCQl0aGlzLmtpbmQgPSBraW5kIHw9IE1PRFVMRV9DSEFOR0U7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQl0aGlzLm1vZHVsZVRyZWUgPSBtb2R1bGU7Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQkJdGhpcy5wdWJsaXNoU3RhdGUgPSBwdWJsaXNoaW5nU3RhdGU7Ci0JCXRoaXMucmVzdGFydFN0YXRlID0gcmVzdGFydFN0YXRlOwotCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQkJCi0JCWlmIChtb2R1bGVUcmVlID09IG51bGwgfHwgbW9kdWxlVHJlZS5sZW5ndGggPT0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBwYXJhbWV0ZXIgaW52YWxpZCIpOwotCQlpZiAoKGtpbmQgJiBTRVJWRVJfQ0hBTkdFKSAhPSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiS2luZCBwYXJhbWV0ZXIgaW52YWxpZCIpOwotCQkKLQkJY2hlY2tLaW5kKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrS2luZCgpIHsKLQkJaW50IGkgPSAwOwotCQlpZiAoKGtpbmQgJiBTVEFURV9DSEFOR0UpICE9IDApCi0JCQlpKys7Ci0JCWlmICgoa2luZCAmIFJFU1RBUlRfU1RBVEVfQ0hBTkdFKSAhPSAwKQotCQkJaSsrOwotCQlpZiAoKGtpbmQgJiBQVUJMSVNIX1NUQVRFX0NIQU5HRSkgIT0gMCkKLQkJCWkrKzsKLQkJaWYgKChraW5kICYgU1RBVFVTX0NIQU5HRSkgIT0gMCkKLQkJCWkrKzsJCQotCQkKLQkJaWYgKGkgIT0gMCAmJiBpICE9IDEpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJLaW5kIHBhcmFtZXRlciBpbnZhbGlkIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUga2luZCBvZiB0aGUgc2VydmVyIGV2ZW50LgotCSAqIDxwPgotCSAqIFRoaXMga2luZCBjYW4gYmUgdXNlZCB0byB0ZXN0IHdoZXRoZXIgdGhpcyBldmVudCBpcyBhIHNlcnZlciBldmVudCBvciBtb2R1bGUgZXZlbnQgYnkgdXNpbmcKLQkgKiB0aGUgZm9sbG93aW5nIGNvZGUgKHRoZSBleGFtcGxlIGlzIGNoZWNraW5nIGZvciB0aGUgc2VydmVyIGV2ZW50KToKLQkgKiAgICAoKGdldEtpbmQoKSAmIFNFUlZFUl9DSEFOR0UpICE9IDApIAotCSAqIHRoZSBmb2xsb3dpbmcgY29kZSAodGhlIGV4YW1wbGUgaXMgY2hlY2tpbmcgZm9yIHRoZSBtb2R1bGUgZXZlbnQpOgotCSAqICAgICgoZ2V0S2luZCgpICYgTU9EVUxFX0NIQU5HRSkgIT0gMCkgCi0JICogCi0JICogQHJldHVybiB0aGUga2luZCBvZiB0aGUgY2hhbmdlICg8Y29kZT5YWFhfQ0hBTkdFPC9jb2RlPgotCSAqICAgIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB7QGxpbmsgU2VydmVyRXZlbnR9Ci0JICovCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIHRyZWUgb2YgdGhlIG1vZHVsZSBpbnZvbHZlZCBpbiB0aGUgbW9kdWxlIGNoYW5nZSBldmVudCwKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZXZlbnQgaXMgbm90IGEgbW9kdWxlIGV2ZW50LCBpLmUuIGlzTW9kdWxlRXZlbnQoKSBpcyBmYWxzZS4KLQkgKiAgCi0JICogQHJldHVybiB0aGUgbW9kdWxlIHRyZWUgb2YgdGhlIG1vZHVsZSBpbnZvbHZlZCBpbiB0aGUgbW9kdWxlIGNoYW5nZSBldmVudCwKLQkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZXZlbnQgaXMgbm90IGEgbW9kdWxlIGV2ZW50LCBpLmUuCi0JICogICAgaXNNb2R1bGVFdmVudCgpIGlzIGZhbHNlLgotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlKCkgewotCQlyZXR1cm4gbW9kdWxlVHJlZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBwdWJsaXNoIHN0YXRlIGFmdGVyIHRoZSBjaGFuZ2UgdGhhdCB0cmlnZ2VycyB0aGlzIHNlcnZlciBldmVudC4gSWYgdGhpcyBldmVudCAKLQkgKiBpcyBvZiB0aGUgU0VSVkVSX0NIQU5HRSBraW5kLCB0aGVuIHRoZSBwdWJsaXNoaW5nIHN0YXRlIGlzIHRoZSBzZXJ2ZXIgcHVibGlzaGluZyBzdGF0ZS4KLQkgKiBJZiB0aGlzIGV2ZW50IGlzIG9mIHRoZSBNT0RVTEVfQ0hBTkdFIGtpbmQsIHRoZW4gdGhlIHB1Ymxpc2hpbmcgc3RhdGUgaXMgdGhlIG1vZHVsZQotCSAqIHB1Ymxpc2hpbmcgc3RhdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHVibGlzaGluZyBzdGF0ZSBhZnRlciB0aGUgY2hhbmdlICg8Y29kZT5QVUJMSVNIX1NUQVRFX1hYWDwvY29kZT4pCi0JICogICAgY29uc3RhbnRzIGRlY2xhcmVkIG9uIHtAbGluayBJU2VydmVyfQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UHVibGlzaFN0YXRlKCkgewotCQlyZXR1cm4gcHVibGlzaFN0YXRlOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHJlc3RhcnQgc3RhdGUgYWZ0ZXIgaXNSZXN0YXJ0TmVlZGVkKCkgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqIElmIHRoaXMgZXZlbnQgaXMgb2YgdGhlIFNFUlZFUl9DSEFOR0Uga2luZCwgdGhlbiB0aGUgcmVzdGFydCBzdGF0ZSBpcyB0aGUgc2VydmVyIAotCSAqIHJlc3RhcnQgc3RhdGUuIElmIHRoaXMgZXZlbnQgaXMgb2YgdGhlIE1PRFVMRV9DSEFOR0Uga2luZCwgdGhlbiB0aGUgcmVzdGFydCBzdGF0ZSAKLQkgKiBpcyB0aGUgbW9kdWxlIHJlc3RhcnQgc3RhdGUuIAotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVzdGFydCBpcyBuZWVkZWQsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRSZXN0YXJ0U3RhdGUoKSB7Ci0JCXJldHVybiByZXN0YXJ0U3RhdGU7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgc3RhdGUgYWZ0ZXIgdGhlIGNoYW5nZSB0aGF0IHRyaWdnZXJzIHRoaXMgc2VydmVyIGV2ZW50LiBJZiB0aGlzIGV2ZW50IAotCSAqIGlzIG9mIHRoZSBTRVJWRVJfQ0hBTkdFIGtpbmQsIHRoZW4gdGhlIHN0YXRlIGlzIHRoZSBzZXJ2ZXIgc3RhdGUuCi0JICogSWYgdGhpcyBldmVudCBpcyBvZiB0aGUgTU9EVUxFX0NIQU5HRSBraW5kLCB0aGVuIHRoZSBzdGF0ZSBpcyB0aGUgbW9kdWxlCi0JICogc3RhdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyIHN0YXRlIGFmdGVyIHRoZSBjaGFuZ2UgKDxjb2RlPlNUQVRFX1hYWDwvY29kZT4pCi0JICogICAgY29uc3RhbnRzIGRlY2xhcmVkIG9uIHtAbGluayBJU2VydmVyfQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhdGUoKSB7Ci0JCXJldHVybiBzdGF0ZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBzdGF0dXMgYWZ0ZXIgdGhlIGNoYW5nZSB0aGF0IHRyaWdnZXJzIHRoaXMgc2VydmVyIGV2ZW50LiBJZiB0aGlzIGV2ZW50IAotCSAqIGlzIG9mIHRoZSBTRVJWRVJfQ0hBTkdFIGtpbmQsIHRoZW4gdGhlIHN0YXR1cyBpcyB0aGUgc2VydmVyIHN0YXR1cy4KLQkgKiBJZiB0aGlzIGV2ZW50IGlzIG9mIHRoZSBNT0RVTEVfQ0hBTkdFIGtpbmQsIHRoZW4gdGhlIHN0YXR1cyBpcyB0aGUgbW9kdWxlCi0JICogc3RhdHVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlcnZlciBzdGF0ZSBhZnRlciB0aGUgY2hhbmdlICg8Y29kZT5TVEFURV9YWFg8L2NvZGU+KQotCSAqICAgIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB7QGxpbmsgSVNlcnZlcn0KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciBpbnZvbHZlZCBpbiB0aGUgY2hhbmdlIGV2ZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlcnZlciBpbnZvbHZlZCBpbiB0aGUgY2hhbmdlIGV2ZW50LgotCSAqLwotCXB1YmxpYyBJU2VydmVyIGdldFNlcnZlcigpIHsKLQkJcmV0dXJuIHNlcnZlcjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCQlyZXR1cm4gIjxTZXJ2ZXItRXZlbnQiIAotCQkJCSsgIiBpZD0iK3RoaXMuaGFzaENvZGUoKQotCQkJCSsgIiBraW5kPSIrZ2V0S2luZCgpIAotCQkJCSsgIiBzZXJ2ZXI9IitnZXRTZXJ2ZXIoKSAKLQkJCQkrICIgbW9kdWxlPSIrZ2V0TW9kdWxlKCkKLQkJCQkrICIgc3RhdGU9IitnZXRTdGF0ZSgpCi0JCQkJKyAiIHB1Ymxpc2hTdGF0ZT0iK2dldFB1Ymxpc2hTdGF0ZSgpCi0JCQkJKyAiIHJlc3RhcnRTdGF0ZT0iK2dldFJlc3RhcnRTdGF0ZSgpCi0JCQkJKyAiIHN0YXR1cz0iK2dldFN0YXR1cygpCi0JCQkJKyAiPiI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlclBvcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlclBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxNGJmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJQb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHBvcnQgb24gYSBzZXJ2ZXIuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclBvcnQgewotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBpbnQgcG9ydDsKLQlwcml2YXRlIFN0cmluZyBwcm90b2NvbDsKLQlwcml2YXRlIFN0cmluZ1tdIGNvbnRlbnRUeXBlczsKLQlwcml2YXRlIGJvb2xlYW4gYWR2YW5jZWQ7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHNlcnZlciBwb3J0LgotCSAqIAotCSAqIEBwYXJhbSBpZCBhIHNlcnZlci1zcGVjaWZpYyBwb3J0IGlkCi0JICogQHBhcmFtIG5hbWUgYSBodW1hbi1yZWFkYWJsZSBuYW1lIGZvciB0aGUgcG9ydAotCSAqIEBwYXJhbSBwb3J0IHRoZSBudW1iZXIgbnVtYmVyCi0JICogQHBhcmFtIHByb3RvY29sIHRoZSBwb3J0J3MgcHJvdG9jb2wKLQkgKi8KLQlwdWJsaWMgU2VydmVyUG9ydChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBpbnQgcG9ydCwgU3RyaW5nIHByb3RvY29sKSB7Ci0JCXRoaXMoaWQsIG5hbWUsIHBvcnQsIHByb3RvY29sLCBudWxsLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgc2VydmVyIHBvcnQuCi0JICogCi0JICogQHBhcmFtIGlkIGEgc2VydmVyLXNwZWNpZmljIHBvcnQgaWQKLQkgKiBAcGFyYW0gbmFtZSBhIGh1bWFuLXJlYWRhYmxlIG5hbWUgZm9yIHRoZSBwb3J0Ci0JICogQHBhcmFtIHBvcnQgdGhlIG51bWJlciBudW1iZXIKLQkgKiBAcGFyYW0gcHJvdG9jb2wgdGhlIHBvcnQncyBwcm90b2NvbAotCSAqIEBwYXJhbSBjb250ZW50VHlwZXMgdGhlIGNvbnRlbnQgdHlwZXMgdGhhdCB0aGUgcG9ydCBzdXBwb3J0cwotCSAqIEBwYXJhbSBhZHZhbmNlZCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcG9ydCBpcyAiYWR2YW5jZWQiIGFuZCBzaG91bGQgb25seQotCSAqICAgIGJlIHNob3duIHRvIGFkdmFuY2VkIHVzZXJzLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIFNlcnZlclBvcnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgaW50IHBvcnQsIFN0cmluZyBwcm90b2NvbCwgU3RyaW5nW10gY29udGVudFR5cGVzLCBib29sZWFuIGFkdmFuY2VkKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5wb3J0ID0gcG9ydDsKLQkJdGhpcy5wcm90b2NvbCA9IHByb3RvY29sOwotCQl0aGlzLmNvbnRlbnRUeXBlcyA9IGNvbnRlbnRUeXBlczsKLQkJdGhpcy5hZHZhbmNlZCA9IGFkdmFuY2VkOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBvcHRpb25hbCBpbnRlcm5hbCBpZCB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgcG9ydC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGludGVybmFsIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgcG9ydC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwb3J0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFjdHVhbCBwb3J0IG51bWJlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwb3J0IG51bWJlcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKLQkJcmV0dXJuIHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvdG9jb2wsIGUuZy4gSFRUUCBvZiB0aGlzIHBvcnQuIFJldHVybnMgbnVsbAotCSAqIGlmIHRoZSBwcm90b2NvbCBpcyB1bmtub3duLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb2NvdG9sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsKLQkJcmV0dXJuIHByb3RvY29sOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgdHlwZXMgdGhhdCB0aGlzIHBvcnQgd291bGQgbm9ybWFsbHkgc2VydmUsIG9yIG51bGwKLQkgKiBpZiB0aGUgY29udGVudCBpcyB1bmtub3duLgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBjb250ZW50IHR5cGVzCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldENvbnRlbnRUeXBlcygpIHsKLQkJcmV0dXJuIGNvbnRlbnRUeXBlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBwb3J0IGlzIGFuICJhZHZhbmNlZCIgcG9ydCBhbmQgc2hvdWxkIG5vdCBiZSBzaG93bgotCSAqIHRvIG5vdmljZSB1c2Vycy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwb3J0IGlzIGFkdmFuY2VkLCBvciA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkdmFuY2VkKCkgewotCQlyZXR1cm4gYWR2YW5jZWQ7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgU2VydmVyUG9ydCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVNlcnZlclBvcnQgc3AgPSAoU2VydmVyUG9ydCkgb2JqOwotCQlyZXR1cm4gKHNwLnBvcnQgPT0gcG9ydCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBwb3J0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNlcnZlclBvcnQgWyIgKyBnZXROYW1lKCkgKyAiLCAiICsgZ2V0SWQoKSArICIsICIgKyBnZXRQb3J0KCkgKyAiLCAiICsgZ2V0UHJvdG9jb2woKSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvU2VydmVyVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvU2VydmVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTc1OTU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLio7Ci0vKioKLSAqIFNlcnZlciB1dGlsaXR5IG1ldGhvZHMuIFRoZXNlIHN0YXRpYyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0KLSAqIGNvbW1vbiBvcGVyYXRpb25zIG9uIHNlcnZlciBhcnRpZmFjdHMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxsIGl0cyBmdW5jdGlvbmFsaXR5IHRocm91Z2ggc3RhdGljIG1lbWJlcnMuCi0gKiBJdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViLWNsYXNzZWQgb3IgaW5zdGFudGlhdGVkLgotICogPC9wPgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVXRpbCB7Ci0JLyoqCi0JICogQ29uc3RhbnQgaWRlbnRpZnlpbmcgdGhlIGpvYiBmYW1pbHkgaWRlbnRpZmllciBmb3Igc2VydmVyIG9wZXJhdGlvbnMuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iTWFuYWdlciNqb2luKE9iamVjdCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU0VSVkVSX0pPQl9GQU1JTFkgPSBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lEOwotCi0JLyoqCi0JICogU3RhdGljIHV0aWxpdHkgY2xhc3MgLSBjYW5ub3QgY3JlYXRlIGFuIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgU2VydmVyVXRpbCgpIHsKLQkJLy8gY2FuJ3QgY3JlYXRlCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGdpdmVuIHByb2plY3QuIElmIG1vcmUgdGhhbiBvbmUgbW9kdWxlCi0JICogaXMgY29udGFpbmVkIHdpdGggdGhlIHByb2plY3QsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGFuIGFyYml0cmFyeSBtb2R1bGUKLQkgKiB1bmxlc3MgdGhlIG1vZHVsZSBmYWN0b3J5IGRlZmluZXMgYW4gb3JkZXJpbmcuIElmIHRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlCi0JICogbW9kdWxlcyBpbiBhIHByb2plY3QsIHVzZXJzIHNob3VsZCB0eXBpY2FsbHkgdXNlIGdldE1vZHVsZXMoSVByb2plY3QpIGluc3RlYWQuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbWF5IHRyaWdnZXIgYnVuZGxlIGxvYWRpbmcgYW5kIGlzIG5vdCBzdWl0YWJsZSBmb3IKLQkgKiBzaG9ydC9VSSBvcGVyYXRpb25zLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKLQkgKiBAcmV0dXJuIGEgbW9kdWxlIHRoYXQgaXMgY29udGFpbmVkIHdpdGggdGhlIHByb2plY3QsIG9yIG51bGwgaWYgbm8KLQkgKiAgICBtb2R1bGVzIGFyZSBjb250YWluZWQgaW4gdGhlIGdpdmVuIHByb2plY3QKLQkgKiBAc2VlICNnZXRNb2R1bGVzKElQcm9qZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vZHVsZSBnZXRNb2R1bGUoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBnZXRNb2R1bGVzKHByb2plY3QpOwotCQlpZiAobW9kdWxlcyAhPSBudWxsICYmIG1vZHVsZXMubGVuZ3RoID4gMCkKLQkJCXJldHVybiBtb2R1bGVzWzBdOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlcyBjb250YWluZWQgd2l0aGluIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIG1heSB0cmlnZ2VyIGJ1bmRsZSBsb2FkaW5nIGFuZCBpcyBub3Qgc3VpdGFibGUgZm9yCi0JICogc2hvcnQvVUkgb3BlcmF0aW9ucy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0Ci0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIG1vZHVsZXMKLQkgKiBAc2VlICNnZXRNb2R1bGUoSVByb2plY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQkvLyB1c2UgYSBzZXQgZm9yIGJldHRlciBjb250YWlucygpIHBlcmZvcm1hbmNlCi0JCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKLQkJCi0JCU1vZHVsZUZhY3RvcnlbXSBmYWN0b3JpZXMgPSBTZXJ2ZXJQbHVnaW4uZ2V0TW9kdWxlRmFjdG9yaWVzKCk7Ci0KLQkJaWYgKGZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQlmb3IgKE1vZHVsZUZhY3RvcnkgZmFjdG9yeSA6IGZhY3RvcmllcykgewotCQkJCWlmIChmYWN0b3J5LmlzRW5hYmxlZChwcm9qZWN0LCBudWxsKSl7Ci0JCQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gZmFjdG9yeS5nZXRNb2R1bGVzKHByb2plY3QsIG51bGwpOwotCQkJCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKElNb2R1bGUgbW9kdWxlIDogbW9kdWxlcykgewotCQkJCQkJCWlmICghbGlzdC5jb250YWlucyhtb2R1bGUpKQotCQkJCQkJCQlsaXN0LmFkZChtb2R1bGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IElNb2R1bGVbbGlzdC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgd2l0aCB0aGUgZ2l2ZW4gbW9kdWxlSWQsIGlmIG9uZSBleGlzdHMuIFRoZSBtb2R1bGVJZAotCSAqIG11c3Qgbm90IGJlIG51bGwuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbWF5IHRyaWdnZXIgYnVuZGxlIGxvYWRpbmcgYW5kIGlzIG5vdCBzdWl0YWJsZSBmb3IKLQkgKiBzaG9ydC9VSSBvcGVyYXRpb25zLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlSWQgYSBtb2R1bGUgaWQKLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtb2R1bGUgY291bGQgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShTdHJpbmcgbW9kdWxlSWQpIHsKLQkJaWYgKG1vZHVsZUlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlpbnQgaW5kZXggPSBtb2R1bGVJZC5pbmRleE9mKCI6Iik7Ci0JCWlmIChpbmRleCA8PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlTdHJpbmcgZmFjdG9yeUlkID0gbW9kdWxlSWQuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJTW9kdWxlRmFjdG9yeSBtb2R1bGVGYWN0b3J5ID0gU2VydmVyUGx1Z2luLmZpbmRNb2R1bGVGYWN0b3J5KGZhY3RvcnlJZCk7Ci0JCWlmIChtb2R1bGVGYWN0b3J5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVN0cmluZyBtb2R1bGVTdWJJZCA9IG1vZHVsZUlkLnN1YnN0cmluZyhpbmRleCsxKTsKLQkJcmV0dXJuIG1vZHVsZUZhY3RvcnkuZmluZE1vZHVsZShtb2R1bGVTdWJJZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgYXZhaWxhYmxlIG1vZHVsZXMgZnJvbSBhbGwgZmFjdG9yaWVzIHdob3NlCi0JICogdHlwZSBtYXRjaGVzIHRoZSBnaXZlbiBtb2R1bGUgdHlwZXMuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbWF5IHRyaWdnZXIgYnVuZGxlIGxvYWRpbmcgYW5kIGlzIG5vdCBzdWl0YWJsZSBmb3IKLQkgKiBzaG9ydC9VSSBvcGVyYXRpb25zLiBJdCBhbHNvIHBlcmZvcm1zIGEgc2VhcmNoIG9mIGFsbCBhdmFpbGFibGUKLQkgKiBtb2R1bGVzIG9mIHRoZSBnaXZlbiB0eXBlcywgYW5kIGR1ZSB0byBwZXJmb3JtYW5jZSByZWFzb25zIHNob3VsZAotCSAqIG5vdCBiZSB1c2VkIHVubGVzcyBhYnNvbHV0ZWx5IHJlcXVpcmVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlVHlwZXMgYW4gYXJyYXkgb2YgbW9kdWxlIHR5cGVzCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIG1vZHVsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKElNb2R1bGVUeXBlW10gbW9kdWxlVHlwZXMpIHsKLQkJTGlzdDxJTW9kdWxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQkKLQkJTW9kdWxlRmFjdG9yeVtdIGZhY3RvcmllcyA9IFNlcnZlclBsdWdpbi5nZXRNb2R1bGVGYWN0b3JpZXMoKTsKLQkJaWYgKGZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQlmb3IgKE1vZHVsZUZhY3RvcnkgZmFjdG9yeSA6IGZhY3RvcmllcykgewotCQkJCWlmIChpc1N1cHBvcnRlZE1vZHVsZShmYWN0b3J5LmdldE1vZHVsZVR5cGVzKCksIG1vZHVsZVR5cGVzKSkgewotCQkJCQlJTW9kdWxlW10gbW9kdWxlcyA9IGZhY3RvcnkuZ2V0TW9kdWxlcyhudWxsKTsKLQkJCQkJaWYgKG1vZHVsZXMgIT0gbnVsbCkgewotCQkJCQkJZm9yIChJTW9kdWxlIG1vZHVsZSA6IG1vZHVsZXMpCi0JCQkJCQkJbGlzdC5hZGQobW9kdWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlJTW9kdWxlW10gbW9kdWxlcyA9IG5ldyBJTW9kdWxlW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KG1vZHVsZXMpOwotCQlyZXR1cm4gbW9kdWxlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBhdmFpbGFibGUgbW9kdWxlcyBmcm9tIGFsbCBmYWN0b3JpZXMgd2hvc2UKLQkgKiB0eXBlIG1hdGNoZXMgdGhlIGdpdmVuIG1vZHVsZSB0eXBlIGlkLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIG1heSB0cmlnZ2VyIGJ1bmRsZSBsb2FkaW5nIGFuZCBpcyBub3Qgc3VpdGFibGUgZm9yCi0JICogc2hvcnQvVUkgb3BlcmF0aW9ucy4gSXQgYWxzbyBwZXJmb3JtcyBhIHNlYXJjaCBvZiBhbGwgYXZhaWxhYmxlCi0JICogbW9kdWxlcyBvZiB0aGlzIHR5cGUsIGFuZCBkdWUgdG8gcGVyZm9ybWFuY2UgcmVhc29ucyBzaG91bGQgbm90Ci0JICogYmUgdXNlZCB1bmxlc3MgYWJzb2x1dGVseSByZXF1aXJlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHR5cGUgYSBtb2R1bGUgdHlwZQotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBtb2R1bGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcyhTdHJpbmcgdHlwZSkgewotCQlMaXN0PElNb2R1bGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7Ci0JCQotCQlNb2R1bGVGYWN0b3J5W10gZmFjdG9yaWVzID0gU2VydmVyUGx1Z2luLmdldE1vZHVsZUZhY3RvcmllcygpOwotCQlpZiAoZmFjdG9yaWVzICE9IG51bGwpIHsKLQkJCWZvciAoTW9kdWxlRmFjdG9yeSBmYWN0b3J5IDogZmFjdG9yaWVzKSB7Ci0JCQkJaWYgKGlzU3VwcG9ydGVkTW9kdWxlKGZhY3RvcnkuZ2V0TW9kdWxlVHlwZXMoKSwgdHlwZSwgbnVsbCkpIHsKLQkJCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBmYWN0b3J5LmdldE1vZHVsZXMobnVsbCk7Ci0JCQkJCWlmIChtb2R1bGVzICE9IG51bGwpIHsKLQkJCQkJCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBtb2R1bGVzKQotCQkJCQkJCWlmICh0eXBlLmVxdWFscyhtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkpKQotCQkJCQkJCQlsaXN0LmFkZChtb2R1bGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUlNb2R1bGVbXSBtb2R1bGVzID0gbmV3IElNb2R1bGVbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkobW9kdWxlcyk7Ci0JCXJldHVybiBtb2R1bGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW55IG9mIHRoZSBnaXZlbiBtb2R1bGVUeXBlcyBoYXZlIHRoZSBnaXZlbgotCSAqIG1vZHVsZSB0eXBlIGlkIGFuZCB2ZXJzaW9uIGlkLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGVUeXBlcyBhbiBhcnJheSBvZiBtb2R1bGUgdHlwZXMsIG1heSBub3QgYmUgbnVsbAotCSAqIEBwYXJhbSB0eXBlSWQgYSBtb2R1bGUgdHlwZSBpZCwgb3IgbnVsbCBmb3IgYW55IG1vZHVsZSB0eXBlCi0JICogQHBhcmFtIHZlcnNpb25JZCBhIG1vZHVsZSB2ZXJzaW9uLCBvciBudWxsIGZvciBhbnkgdmVyc2lvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vZHVsZSB0eXBlIGlzIHN1cHBvcnRlZCwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1cHBvcnRlZE1vZHVsZShJTW9kdWxlVHlwZVtdIG1vZHVsZVR5cGVzLCBTdHJpbmcgdHlwZUlkLCBTdHJpbmcgdmVyc2lvbklkKSB7Ci0JCWlmIChtb2R1bGVUeXBlcyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJaWYgKCIiLmVxdWFscyh0eXBlSWQpKQotCQkJdHlwZUlkID0gbnVsbDsKLQkJaWYgKCIiLmVxdWFscyh2ZXJzaW9uSWQpKQotCQkJdmVyc2lvbklkID0gbnVsbDsKLQkJCi0JCWlmICh0eXBlSWQgPT0gbnVsbCAmJiB2ZXJzaW9uSWQgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJZm9yIChJTW9kdWxlVHlwZSBtb2R1bGVUeXBlIDogbW9kdWxlVHlwZXMpIHsKLQkJCWlmIChpc1N1cHBvcnRlZE1vZHVsZShtb2R1bGVUeXBlLCB0eXBlSWQsIHZlcnNpb25JZCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3VwcG9ydGVkTW9kdWxlKElNb2R1bGVUeXBlW10gbW9kdWxlVHlwZXMsIElNb2R1bGVUeXBlW10gbXQpIHsKLQkJaWYgKG10ICE9IG51bGwpIHsKLQkJCWZvciAoSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSA6IG10KSB7Ci0JCQkJaWYgKGlzU3VwcG9ydGVkTW9kdWxlKG1vZHVsZVR5cGVzLCBtb2R1bGVUeXBlKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW55IG9mIHRoZSBnaXZlbiBtb2R1bGVUeXBlcyBtYXRjaCB0aGUgZ2l2ZW4KLQkgKiBtb2R1bGUgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlVHlwZXMgYW4gYXJyYXkgb2YgbW9kdWxlcyB0eXBlcywgbWF5IG5vdCBiZSBudWxsCi0JICogQHBhcmFtIG10IGEgbW9kdWxlIHR5cGUsIG1heSBub3QgYmUgbnVsbAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vZHVsZSB0eXBlIGlzIHN1cHBvcnRlZCwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1cHBvcnRlZE1vZHVsZShJTW9kdWxlVHlwZVtdIG1vZHVsZVR5cGVzLCBJTW9kdWxlVHlwZSBtdCkgewotCQlpZiAobW9kdWxlVHlwZXMgPT0gbnVsbCB8fCBtdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJZm9yIChJTW9kdWxlVHlwZSBtb2R1bGVUeXBlIDogbW9kdWxlVHlwZXMpIHsKLQkJCWlmIChpc1N1cHBvcnRlZE1vZHVsZShtb2R1bGVUeXBlLCBtdCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTdXBwb3J0ZWRNb2R1bGUoSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCVN0cmluZyB0eXBlMiA9IG1vZHVsZVR5cGUuZ2V0SWQoKTsKLQkJaWYgKFNlcnZlclBsdWdpbi5tYXRjaGVzKHR5cGUsIHR5cGUyKSkgewotCQkJU3RyaW5nIHZlcnNpb24yID0gbW9kdWxlVHlwZS5nZXRWZXJzaW9uKCk7Ci0JCQlpZiAoU2VydmVyUGx1Z2luLm1hdGNoZXModmVyc2lvbiwgdmVyc2lvbjIpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBnaXZlbiBtb2R1bGUgdHlwZXMgYXJlIGNvbXBhdGlibGUuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZVR5cGUgYSBtb2R1bGUgdHlwZSwgbWF5IG5vdCBiZSBudWxsCi0JICogQHBhcmFtIG10IGEgbW9kdWxlIHR5cGUsIG1heSBub3QgYmUgbnVsbAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vZHVsZSB0eXBlIGlzIHN1cHBvcnRlZCwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1cHBvcnRlZE1vZHVsZShJTW9kdWxlVHlwZSBtb2R1bGVUeXBlLCBJTW9kdWxlVHlwZSBtdCkgewotCQlpZiAobW9kdWxlVHlwZSA9PSBudWxsIHx8IG10ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlpZiAoU2VydmVyUGx1Z2luLm1hdGNoZXMobXQuZ2V0SWQoKSwgbW9kdWxlVHlwZS5nZXRJZCgpKSAmJgotCQkJCVNlcnZlclBsdWdpbi5tYXRjaGVzKG10LmdldFZlcnNpb24oKSwgbW9kdWxlVHlwZS5nZXRWZXJzaW9uKCkpKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBvciByZW1vdmVzIG1vZHVsZXMgZnJvbSBhIHNlcnZlci4gV2lsbCBzZWFyY2ggZm9yIHRoZSBmaXJzdCBwYXJlbnQgbW9kdWxlCi0JICogb2YgZWFjaCBtb2R1bGUgYW5kIGFkZCBpdCB0byB0aGUgc2VydmVyIGluc3RlYWQuIFRoaXMgbWV0aG9kIHdpbGwgaGFuZGxlIG11bHRpcGxlCi0JICogbW9kdWxlcyBoYXZpbmcgdGhlIHNhbWUgcGFyZW50ICh0aGUgcGFyZW50IHdpbGwgb25seSBiZSBhZGRlZCBvbmNlKSwgYnV0IG1heSBub3QKLQkgKiBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHNhbWUgbW9kdWxlIG9yIHBhcmVudCBpcyBiZWluZyBib3RoIGFkZGVkIGFuZCByZW1vdmVkLgotCSAqIEVudHJpZXMgaW4gdGhlIGFkZCBvciByZW1vdmUgYXJyYXlzIG1heSBub3QgYmUgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHBhcmFtIGFkZCBhbiBhcnJheSBvZiBtb2R1bGVzIHRvIGFkZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gbm90IGFkZCBhbnkKLQkgKiBAcGFyYW0gcmVtb3ZlIGFuIGFycmF5IG9mIG1vZHVsZXMgdG8gcmVtb3ZlLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBub3QgcmVtb3ZlIGFueQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtb2RpZnlNb2R1bGVzKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIElNb2R1bGVbXSBhZGQsIElNb2R1bGVbXSByZW1vdmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZXJ2ZXIgY2Fubm90IGJlIG51bGwiKTsKLQkJCi0JCWlmIChhZGQgPT0gbnVsbCkKLQkJCWFkZCA9IG5ldyBJTW9kdWxlWzBdOwotCQlpZiAocmVtb3ZlID09IG51bGwpCi0JCQlyZW1vdmUgPSBuZXcgSU1vZHVsZVswXTsKLQkJCi0JCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBhZGQpIHsKLQkJCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgYWRkIG51bGwgZW50cmllcyIpOwotCQl9Ci0JCQotCQlMaXN0PElNb2R1bGU+IGFkZFBhcmVudE1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7Ci0JCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBhZGQpIHsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJSU1vZHVsZVtdIHBhcmVudHMgPSBzZXJ2ZXIuZ2V0Um9vdE1vZHVsZXMobW9kdWxlLCBtb25pdG9yKTsKLQkJCQlpZiAocGFyZW50cyAhPSBudWxsICYmIHBhcmVudHMubGVuZ3RoID4gMCkgewkJCQkKLQkJCQkJSU1vZHVsZSBwYXJlbnQgPSBwYXJlbnRzWzBdOwotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWlmICghYWRkUGFyZW50TW9kdWxlcy5jb250YWlucyhwYXJlbnQpKQotCQkJCQkJYWRkUGFyZW50TW9kdWxlcy5hZGQocGFyZW50KTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiQ291bGQgbm90IGZpbmQgcGFyZW50IG1vZHVsZSIsIGUpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKCFmb3VuZCkKLQkJCQlhZGRQYXJlbnRNb2R1bGVzLmFkZChtb2R1bGUpOwotCQl9Ci0JCQotCQlmb3IgKElNb2R1bGUgbW9kdWxlIDogcmVtb3ZlKSB7Ci0JCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHJlbW92ZSBudWxsIGVudHJpZXMiKTsKLQkJfQotCQkKLQkJTGlzdDxJTW9kdWxlPiByZW1vdmVQYXJlbnRNb2R1bGVzID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQlmb3IgKElNb2R1bGUgbW9kdWxlIDogcmVtb3ZlKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCUlNb2R1bGVbXSBwYXJlbnRzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKG1vZHVsZSwgbW9uaXRvcik7Ci0JCQkJaWYgKHBhcmVudHMgIT0gbnVsbCAmJiBwYXJlbnRzLmxlbmd0aCA+IDApIHsJCQkJCi0JCQkJCUlNb2R1bGUgcGFyZW50ID0gcGFyZW50c1swXTsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlpZiAoIXJlbW92ZVBhcmVudE1vZHVsZXMuY29udGFpbnMocGFyZW50KSkKLQkJCQkJCXJlbW92ZVBhcmVudE1vZHVsZXMuYWRkKHBhcmVudCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkNvdWxkIG5vdCBmaW5kIHBhcmVudCBtb2R1bGUgMiIsIGUpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKCFmb3VuZCkKLQkJCQlyZW1vdmVQYXJlbnRNb2R1bGVzLmFkZChtb2R1bGUpOwotCQl9Ci0JCQotCQlJTW9kdWxlW10gYWRkMiA9IG5ldyBJTW9kdWxlW2FkZFBhcmVudE1vZHVsZXMuc2l6ZSgpXTsKLQkJYWRkUGFyZW50TW9kdWxlcy50b0FycmF5KGFkZDIpOwotCQlJTW9kdWxlW10gcmVtb3ZlMiA9IG5ldyBJTW9kdWxlW3JlbW92ZVBhcmVudE1vZHVsZXMuc2l6ZSgpXTsKLQkJcmVtb3ZlUGFyZW50TW9kdWxlcy50b0FycmF5KHJlbW92ZTIpOwotCQkKLQkJc2VydmVyLm1vZGlmeU1vZHVsZXMoYWRkMiwgcmVtb3ZlMiwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhIGRlZmF1bHQgbmFtZSBvbiB0aGUgZ2l2ZW4gcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UnVudGltZURlZmF1bHROYW1lKElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSkgewotCQlzZXRSdW50aW1lRGVmYXVsdE5hbWUocnVudGltZSwgLTEpOwotCX0KLQotCS8qKgotCSAqIFNldHMgYSBkZWZhdWx0IG5hbWUgb24gdGhlIGdpdmVuIHJ1bnRpbWUuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUKLQkgKiAgICAgICAgICBhIHJ1bnRpbWUKLQkgKiBAcGFyYW0gc3VmZml4Ci0JICogICAgICAgICAgdGhlIG51bWJlcmluZyB0byBzdGFydCBhdCBmb3IgdGhlIHN1ZmZpeCwgaWYgc3VmZml4IGlzIC0xLCB0aGVuIHRoZSBubyBzdWZmaXggbmFtZSB3aWxsIGJlIHRyaWVkIGZpcnN0LgotCSAqIEByZXR1cm4gdGhlIHN1ZmZpeCBpdCBmb3VuZCBubyBuYW1lIGNvbmZsaWN0cyBhdCBhbmQgaXMgdXNpbmcgYXMgcGFydCBvZgotCSAqICAgICAgICAgdGhlIGRlZmF1bHQgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHNldFJ1bnRpbWVEZWZhdWx0TmFtZShJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUsIGludCBzdWZmaXgpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldE5hbWUoKTsKLQotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCWlmIChzdWZmaXggPT0gLTEpIHsKLQkJCW5hbWUgPSBOTFMuYmluZChNZXNzYWdlcy5kZWZhdWx0UnVudGltZU5hbWUsIHR5cGVOYW1lKTsKLQkJCS8vIFN0YXJ0IG5leHQgc3VmZml4IGZyb20gMiB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgYmVoYXZpb3VyIGJlZm9yZSB0aGlzIGNoYW5nZS4KLQkJCXN1ZmZpeCA9IDI7Ci0JCX0gZWxzZSB7Ci0JCQluYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMuZGVmYXVsdFJ1bnRpbWVOYW1lMiwgbmV3IFN0cmluZ1tdIHsgdHlwZU5hbWUsIHN1ZmZpeCArICIiIH0pOwotCQl9Ci0KLQkJd2hpbGUgKFNlcnZlclBsdWdpbi5pc05hbWVJblVzZShydW50aW1lLmdldE9yaWdpbmFsKCksIG5hbWUpKSB7Ci0JCQluYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMuZGVmYXVsdFJ1bnRpbWVOYW1lMiwgbmV3IFN0cmluZ1tdIHsgdHlwZU5hbWUsIHN1ZmZpeCArICIiIH0pOwotCQkJc3VmZml4Kys7Ci0JCX0KLQkJcnVudGltZS5zZXROYW1lKG5hbWUpOwotCQlyZXR1cm4gc3VmZml4OwotCX0KLQotCS8qKgotCSAqIFNldHMgYSBkZWZhdWx0IG5hbWUgb24gdGhlIGdpdmVuIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNlcnZlckRlZmF1bHROYW1lKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJU3RyaW5nIHR5cGVOYW1lID0gc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBob3N0ID0gc2VydmVyLmdldEhvc3QoKTsKLQkJCi0JCS8vIGJhc2UgdGhlIG5hbWUgb24gdGhlIHJ1bnRpbWUgaWYgaXQgZXhpc3RzIGFuZCBoYXMgYmVlbiBjaGFuZ2VkIGZyb20gdGhlIGRlZmF1bHQKLQkJSVJ1bnRpbWUgcnVudGltZSA9IHNlcnZlci5nZXRSdW50aW1lKCk7Ci0JCWlmIChydW50aW1lICE9IG51bGwgJiYgIShydW50aW1lIGluc3RhbmNlb2YgUnVudGltZVdvcmtpbmdDb3B5KSkgewotCQkJSVJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IHJ1bnRpbWUuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCXNldFJ1bnRpbWVEZWZhdWx0TmFtZSh3Yyk7Ci0JCQlpZiAoIXdjLmdldE5hbWUoKS5lcXVhbHMocnVudGltZS5nZXROYW1lKCkpKQotCQkJCXR5cGVOYW1lID0gcnVudGltZS5nZXROYW1lKCk7Ci0JCX0KLQkJCi0JCVN0cmluZyBuYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMuZGVmYXVsdFNlcnZlck5hbWUsIG5ldyBTdHJpbmdbXSB7dHlwZU5hbWUsIGhvc3R9KTsKLQkJaW50IGkgPSAyOwotCQl3aGlsZSAoU2VydmVyUGx1Z2luLmlzTmFtZUluVXNlKHNlcnZlci5nZXRPcmlnaW5hbCgpLCBuYW1lKSkgewotCQkJbmFtZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmRlZmF1bHRTZXJ2ZXJOYW1lMiwgbmV3IFN0cmluZ1tdIHt0eXBlTmFtZSwgaG9zdCwgaSArICIifSk7Ci0JCQlpKys7Ci0JCX0KLQkJc2VydmVyLnNldE5hbWUobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRmlsZW5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVOYW1lKG5hbWUsIElSZXNvdXJjZS5GSUxFKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJc3RhdHVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlTmFtZShuYW1lLCBJUmVzb3VyY2UuRk9MREVSKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFZhbGlkRmlsZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGlzVmFsaWRGaWxlbmFtZShuYW1lKSkKLQkJCXJldHVybiBuYW1lOwotCQotCQkvLyByZW1vdmUgaW52YWxpZCBjaGFyYWN0ZXJzCi0JCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW10geyIuIiwgIlxcIiwgIi8iLCAiPyIsICI6IiwgIioiLCAiXCIiLCAifCIsICI8IiwgIj4ifTsKLQkJaW50IGluZCA9IDA7Ci0JCXdoaWxlIChpbmQgPCBzLmxlbmd0aCkgewotCQkJaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKHNbaW5kXSk7Ci0JCQl3aGlsZSAoaW5kZXggPj0gMCkgewotCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCkgKyBuYW1lLnN1YnN0cmluZyhpbmRleCsxKTsKLQkJCQlpbmRleCA9IG5hbWUuaW5kZXhPZihzW2luZF0pOwotCQkJfQotCQkJaW5kKys7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiB1bnVzZWQgZmlsZSBpbiB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHJldHVybiBhbiB1bnVzZWQgZmlsZSB3aXRoaW4gdGhlIGdpdmVuIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldFVudXNlZFNlcnZlckZpbGUoSVByb2plY3QgcHJvamVjdCwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCBzZXJ2ZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCVN0cmluZyB0eXBlTmFtZSA9IGdldFZhbGlkRmlsZU5hbWUoc2VydmVyLmdldE5hbWUoKSk7Ci0JCVN0cmluZyBuYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMuZGVmYXVsdFNlcnZlck5hbWUzLCB0eXBlTmFtZSkrICIuIiAgKyBTZXJ2ZXIuRklMRV9FWFRFTlNJT047Ci0JCWludCBpID0gMjsKLQkJd2hpbGUgKGlzRmlsZU5hbWVJblVzZShwcm9qZWN0LCBuYW1lKSkgewotCQkJbmFtZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmRlZmF1bHRTZXJ2ZXJOYW1lNCwgbmV3IFN0cmluZ1tdIHt0eXBlTmFtZSwgaSArICIifSkgKyAiLiIgICsgU2VydmVyLkZJTEVfRVhURU5TSU9OOwotCQkJaSsrOwotCQl9Ci0JCXJldHVybiBwcm9qZWN0LmdldEZpbGUobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGFuIGVsZW1lbnQgZXhpc3RzIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICoKLQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKLQkgKiBAcGFyYW0gbmFtZSBhIGZpbGUgb3IgZm9sZGVyIG5hbWUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGUgb3IgZm9sZGVyIG5hbWUgaXMgYmVpbmcKLQkgKiAgICB1c2VkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNGaWxlTmFtZUluVXNlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgcHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKHByb2plY3QuZ2V0RmlsZShuYW1lKS5leGlzdHMoKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAocHJvamVjdC5nZXRGb2xkZXIobmFtZSkuZXhpc3RzKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIHJ1bnRpbWUgdGFyZ2V0cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiB0eXBlIGFuZCB2ZXJzaW9uLgotCSAqIElmIHR5cGUgb3IgdmVyc2lvbiBpcyBudWxsLCBpdCBtYXRjaGVzIGFsbCBvZiB0aGF0IHR5cGUgb3IgdmVyc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSBhIG1vZHVsZSB0eXBlCi0JICogQHBhcmFtIHZlcnNpb24gYSBtb2R1bGUgdmVyc2lvbgotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBydW50aW1lIGluc3RhbmNlcyB7QGxpbmsgSVJ1bnRpbWV9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZVtdIGdldFJ1bnRpbWVzKFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbikgewotCQlMaXN0PElSdW50aW1lPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUnVudGltZT4oKTsKLQkJSVJ1bnRpbWVbXSBydW50aW1lcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZXMoKTsKLQkJaWYgKHJ1bnRpbWVzICE9IG51bGwpIHsKLQkJCWZvciAoSVJ1bnRpbWUgcnVudGltZSA6IHJ1bnRpbWVzKSB7Ci0JCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotCQkJCWlmIChydW50aW1lVHlwZSAhPSBudWxsICYmIGlzU3VwcG9ydGVkTW9kdWxlKHJ1bnRpbWVUeXBlLmdldE1vZHVsZVR5cGVzKCksIHR5cGUsIHZlcnNpb24pKSB7Ci0JCQkJCWxpc3QuYWRkKHJ1bnRpbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJSVJ1bnRpbWVbXSBydW50aW1lczIgPSBuZXcgSVJ1bnRpbWVbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocnVudGltZXMyKTsKLQkJcmV0dXJuIHJ1bnRpbWVzMjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBydW50aW1lIHR5cGVzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHR5cGUgYW5kIHZlcnNpb24uCi0JICogSWYgdHlwZSBvciB2ZXJzaW9uIGlzIG51bGwsIGl0IG1hdGNoZXMgYWxsIG9mIHRoYXQgdHlwZSBvciB2ZXJzaW9uLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIGEgbW9kdWxlIHR5cGUKLQkgKiBAcGFyYW0gdmVyc2lvbiBhIG1vZHVsZSB2ZXJzaW9uCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHJ1bnRpbWUgdHlwZSBpbnN0YW5jZXMge0BsaW5rIElSdW50aW1lVHlwZX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSdW50aW1lVHlwZVtdIGdldFJ1bnRpbWVUeXBlcyhTdHJpbmcgdHlwZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJTGlzdDxJUnVudGltZVR5cGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lVHlwZT4oKTsKLQkJSVJ1bnRpbWVUeXBlW10gcnVudGltZVR5cGVzID0gU2VydmVyQ29yZS5nZXRSdW50aW1lVHlwZXMoKTsKLQkJaWYgKHJ1bnRpbWVUeXBlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKElSdW50aW1lVHlwZSBydW50aW1lVHlwZSA6IHJ1bnRpbWVUeXBlcykgewotCQkJCWlmIChpc1N1cHBvcnRlZE1vZHVsZShydW50aW1lVHlwZS5nZXRNb2R1bGVUeXBlcygpLCB0eXBlLCB2ZXJzaW9uKSkgewotCQkJCQlsaXN0LmFkZChydW50aW1lVHlwZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlJUnVudGltZVR5cGVbXSBydCA9IG5ldyBJUnVudGltZVR5cGVbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocnQpOwotCQlyZXR1cm4gcnQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIHJ1bnRpbWUgdHlwZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gdHlwZSwgdmVyc2lvbiwKLQkgKiBhbmQgcGFydGlhbCBydW50aW1lIHR5cGUgaWQuIE11bHRpcGxlIHBhcnRpYWwgcnVudGltZSB0eXBlIGlkIGFyZSBhY2NlcHRlZCAKLQkgKiB1c2luZyBhIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmcuIElmIHR5cGUsIHZlcnNpb24sIG9yIHJ1bnRpbWVUeXBlSWQgaXMgbnVsbCwKLQkgKiBpdCBtYXRjaGVzIGFsbCBvZiB0aGF0IHR5cGUgb3IgdmVyc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSBhIG1vZHVsZSB0eXBlCi0JICogQHBhcmFtIHZlcnNpb24gYSBtb2R1bGUgdmVyc2lvbgotCSAqIEBwYXJhbSBydW50aW1lVHlwZUlkKHMpIHRoZSBpZCBvZiBhIHJ1bnRpbWUgdHlwZS4gSWYgbXVsdGlwbGUgc2VwYXJhdGUgdXNpbmcgY29tbWEKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgcnVudGltZSB0eXBlIGluc3RhbmNlcyB7QGxpbmsgSVJ1bnRpbWVUeXBlfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJ1bnRpbWVUeXBlW10gZ2V0UnVudGltZVR5cGVzKFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHJ1bnRpbWVUeXBlSWQpIHsKLQkJTGlzdDxJUnVudGltZVR5cGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lVHlwZT4oKTsKLQkJSVJ1bnRpbWVUeXBlW10gcnVudGltZVR5cGVzID0gU2VydmVyQ29yZS5nZXRSdW50aW1lVHlwZXMoKTsKLQkJaWYgKHJ1bnRpbWVUeXBlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKElSdW50aW1lVHlwZSBydW50aW1lVHlwZSA6IHJ1bnRpbWVUeXBlcykgewotCQkJCWlmIChpc1N1cHBvcnRlZE1vZHVsZShydW50aW1lVHlwZS5nZXRNb2R1bGVUeXBlcygpLCB0eXBlLCB2ZXJzaW9uKSkgewotCQkJCQlpZiAocnVudGltZVR5cGVJZCA9PSBudWxsKSB7Ci0JCQkJCQlsaXN0LmFkZChydW50aW1lVHlwZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihydW50aW1lVHlwZUlkLCAiLCIpOwotCQkJCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCQlTdHJpbmcgY3VyUnVudGltZVR5cGVJZCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQkJCQlpZiAocnVudGltZVR5cGUuZ2V0SWQoKS5zdGFydHNXaXRoKGN1clJ1bnRpbWVUeXBlSWQpKSB7Ci0JCQkJCQkJCWxpc3QuYWRkKHJ1bnRpbWVUeXBlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCUlSdW50aW1lVHlwZVtdIHJ0ID0gbmV3IElSdW50aW1lVHlwZVtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShydCk7Ci0JCXJldHVybiBydDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgc2VydmVycyB0aGF0IHRoaXMgbW9kdWxlIGlzIG5vdCBjdXJyZW50bHkKLQkgKiBjb25maWd1cmVkIG9uLCBidXQgY291bGQgYmUgYWRkZWQgdG8uIElmIGluY2x1ZGVFcnJvcnMgaXMgdHJ1ZSwgdGhpcwotCSAqIG1ldGhvZCByZXR1cm4gc2VydmVycyB3aGVyZSB0aGUgcGFyZW50IG1vZHVsZSBtYXkgdGhyb3cgZXJyb3JzLiBGb3IKLQkgKiBpbnN0YW5jZSwgdGhpcyBtb2R1bGUgbWF5IGJlIHRoZSB3cm9uZyBzcGVjIGxldmVsLgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEBwYXJhbSBpbmNsdWRlRXJyb3JzIDxjb2RlPnRydWU8L2NvZGU+IHRvIGluY2x1ZGUgc2VydmVycyB0aGF0IHJldHVybmVkCi0JICogICAgZXJyb3JzIHdoZW4gdHJ5aW5nIHRvIGFkZCB0aGUgbW9kdWxlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2Ygc2VydmVycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNlcnZlcltdIGdldEF2YWlsYWJsZVNlcnZlcnNGb3JNb2R1bGUoSU1vZHVsZSBtb2R1bGUsIGJvb2xlYW4gaW5jbHVkZUVycm9ycywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSVNlcnZlclswXTsKLQotCQkvLyBkbyBpdCB0aGUgc2xvdyB3YXkgLSBnbyB0aHJvdWdoIGFsbCBzZXJ2ZXJzIGFuZAotCQkvLyBzZWUgaWYgdGhpcyBkZXBsb3lhYmxlIGlzIG5vdCBjb25maWd1cmVkIGluIGl0Ci0JCS8vIGJ1dCBjb3VsZCBiZSBhZGRlZAotCQlMaXN0PElTZXJ2ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXI+KCk7Ci0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWZvciAoSVNlcnZlciBzZXJ2ZXIgOiBzZXJ2ZXJzKSB7IAotCQkJCWlmICghY29udGFpbnNNb2R1bGUoc2VydmVyLCBtb2R1bGUsIG1vbml0b3IpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJTW9kdWxlW10gcGFyZW50cyA9IHNlcnZlci5nZXRSb290TW9kdWxlcyhtb2R1bGUsIG1vbml0b3IpOwotCQkJCQkJaWYgKHBhcmVudHMgIT0gbnVsbCAmJiBwYXJlbnRzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQkJaW50IHNpemUyID0gcGFyZW50cy5sZW5ndGg7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7ICFmb3VuZCAmJiBqIDwgc2l6ZTI7IGorKykgewotCQkJCQkJCQlJTW9kdWxlIHBhcmVudCA9IHBhcmVudHNbal07Ci0JCQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gc2VydmVyLmNhbk1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IHBhcmVudCB9LCBuZXcgSU1vZHVsZVswXSwgbW9uaXRvcik7Ci0JCQkJCQkJCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuaXNPSygpKXsKLQkJCQkJCQkJCWxpc3QuYWRkKHNlcnZlcik7Ci0JCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBzZSkgewotCQkJCQkJaWYgKGluY2x1ZGVFcnJvcnMpCi0JCQkJCQkJbGlzdC5hZGQoc2VydmVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHByZWZlcnJlZCBzZXJ2ZXIgaXMgdGhlIGZpcnN0IG9uZQotCQkvL0lTZXJ2ZXIgc2VydmVyID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJQcmVmZXJlbmNlcygpLmdldERlcGxveWFibGVTZXJ2ZXJQcmVmZXJlbmNlKGRlcGxveWFibGUpOwotCQkvL2lmIChzZXJ2ZXIgIT0gbnVsbCAmJiBsaXN0LmNvbnRhaW5zKHNlcnZlcikgJiYgbGlzdC5pbmRleE9mKHNlcnZlcikgIT0gMCkgewotCQkvLwlsaXN0LnJlbW92ZShzZXJ2ZXIpOwotCQkvLwlsaXN0LmFkZCgwLCBzZXJ2ZXIpOwotCQkvL30KLQotCQlJU2VydmVyW10gYWxsU2VydmVycyA9IG5ldyBJU2VydmVyW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KGFsbFNlcnZlcnMpOwotCQlyZXR1cm4gYWxsU2VydmVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgc2VydmVycyB0aGF0IHRoaXMgbW9kdWxlIGlzIGNvbmZpZ3VyZWQgb24uCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2Ygc2VydmVyIGluc3RhbmNlcyB7QGxpbmsgSVNlcnZlcn0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXJbXSBnZXRTZXJ2ZXJzQnlNb2R1bGUoSU1vZHVsZSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElTZXJ2ZXJbMF07Ci0KLQkJLy8gZG8gaXQgdGhlIHNsb3cgd2F5IC0gZ28gdGhyb3VnaCBhbGwgc2VydmVycyBhbmQKLQkJLy8gc2VlIGlmIHRoaXMgbW9kdWxlIGlzIGNvbmZpZ3VyZWQgaW4gaXQKLQkJTGlzdDxJU2VydmVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJU2VydmVyPigpOwotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKElTZXJ2ZXIgc2VydmVyIDogc2VydmVycykgewotCQkJCWlmIChjb250YWluc01vZHVsZShzZXJ2ZXIsIG1vZHVsZSwgbW9uaXRvcikpCi0JCQkJCWxpc3QuYWRkKHNlcnZlcik7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlTZXJ2ZXJbXSBhbGxTZXJ2ZXJzID0gbmV3IElTZXJ2ZXJbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkoYWxsU2VydmVycyk7Ci0JCXJldHVybiBhbGxTZXJ2ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VydmVyIGN1cnJlbnRseSBjb250YWlucyB0aGUgZ2l2ZW4gbW9kdWxlLgotCSAqCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb2R1bGUgaXMgY29udGFpbmVkIG9uIHRoZSBzZXJ2ZXIsCi0JICogICAgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc01vZHVsZShJU2VydmVyIHNlcnZlciwgZmluYWwgSU1vZHVsZSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoc2VydmVyID09IG51bGwgfHwgbW9kdWxlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBcmd1bWVudHMgY2Fubm90IGJlIG51bGwiKTsKLQkJCi0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJjb250YWluc01vZHVsZSgpICIgKyBzZXJ2ZXIgKyAiICIgKyBtb2R1bGUpOwotCQl9Ci0JCQotCQlmaW5hbCBib29sZWFuW10gYiA9IG5ldyBib29sZWFuWzFdOwotCQkKLQkJKChTZXJ2ZXIpc2VydmVyKS52aXNpdChuZXcgSU1vZHVsZVZpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJTW9kdWxlW10gbW9kdWxlcykgewotCQkJCWludCBzaXplID0gbW9kdWxlcy5sZW5ndGg7Ci0JCQkJaWYgKG1vZHVsZXNbc2l6ZSAtIDFdLmVxdWFscyhtb2R1bGUpKSB7Ci0JCQkJCWJbMF0gPSB0cnVlOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9LCBudWxsKTsKLQkJcmV0dXJuIGJbMF07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gYSBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIHNlcnZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uLCBvcgotCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHNlcnZlciBjb3VsZCBiZSBmb3VuZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gZ2V0dGluZyB0aGUgYXR0cmlidXRlIGZyb20KLQkgKiAgICB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXIgZ2V0U2VydmVyKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHNlcnZlcklkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoU2VydmVyLkFUVFJfU0VSVkVSX0lELCAoU3RyaW5nKSBudWxsKTsKLQotCQlpZiAoc2VydmVySWQgIT0gbnVsbCkKLQkJCXJldHVybiBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2VydmVySWQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgd2hldGhlciB0aGlzIHNlcnZlciBjYW4gYmUgZWRpdHRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCAoU2hlbGwpCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyCi0JICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIKLQkgKiAgIGNhbiBiZSBlZGl0ZWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGF0IHdoZW4gd3JvbmcKLQkgKiAgIHdpdGggdGhlIGNoZWNrb3V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlRWRpdChPYmplY3QgY29udGV4dCwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJcmV0dXJuICgoU2VydmVyKXNlcnZlcikudmFsaWRhdGVFZGl0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBvcnQgdGhhdCBpcyBiZWluZyB1c2VkIHRvIG1vbml0b3IgdGhlIGdpdmVuIHBvcnQgb24gdGhlIHNlcnZlci4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB3aGVuZXZlciBjcmVhdGluZyBhICdjbGllbnQnIGZvciB0aGUgc2VydmVyLCBhbmQgYWxsb3dzCi0JICogdGhlIGNsaWVudCB0byBzZWFtbGVzc2x5IHVzZSBhIG1vbml0b3JlZCBwb3J0IGluc3RlYWQgb2YgZ29pbmcgZGlyZWN0bHkgdG8gdGhlCi0JICogc2VydmVyLgotCSAqIAotCSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gcG9ydCBhIHBvcnQgb24gdGhlIHNlcnZlcgotCSAqIEBwYXJhbSBjb250ZW50VHlwZSB0aGUgY29udGVudCB0eXBlLCBlLmcuICJ3ZWIiCi0JICogQHJldHVybiB0aGUgbW9uaXRvcmVkIHBvcnQsIG9yIHRoZSBvcmlnaW5hbCBwb3J0IG51bWJlciBpZiB0aGUgcG9ydCBpcyBub3QKLQkgKiAgICBjdXJyZW50bHkgYmVpbmcgbW9uaXRvcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TW9uaXRvcmVkUG9ydChJU2VydmVyIHNlcnZlciwgaW50IHBvcnQsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlyZXR1cm4gU2VydmVyTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb25pdG9yZWRQb3J0KHNlcnZlciwgcG9ydCwgY29udGVudFR5cGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzY2hlZHVsaW5nIHJ1bGUgdG8gcHJldmVudCBqb2JzIGZyb20gc2ltdWx0YW5lb3VzbHkgc3RhcnRpbmcsCi0JICogcHVibGlzaGluZywgb3Igc3RvcHBpbmcgdGhlIHNhbWUgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcmV0dXJuIGEgc2NoZWR1bGluZyBydWxlIGZvciB0aGlzIHNlcnZlcgotCSAqIEBzaW5jZSAyLjAKLQkgKiBAZGVwcmVjYXRlZCB0aGUgc2VydmVyIGluc3RhbmNlIGlzIG5vdyBhIHNjaGVkdWxpbmcgcnVsZSBkaXJlY3RseQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNjaGVkdWxpbmdSdWxlIGdldFNlcnZlclNjaGVkdWxpbmdSdWxlKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBzZXJ2ZXI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1Rhc2tNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvVGFza01vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNzUwNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvVGFza01vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotLyoqCi0gKiBBIHRhc2sgbW9kZWwgcmVwcmVzZW50cyBhIG1vZGVsIHRoYXQgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIG11bHRpcGxlCi0gKiB0YXNrcyBpbiBhIGNvbW1vbiB3b3JrZmxvdy4KLSAqIDxwPgotICogVGhlIHRhc2sgbW9kZWwgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG92ZXJhbGwgdGFzayBmbG93IGFuZCBhbGxvd3MKLSAqIHRhc2tzIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBkYXRhLiBJdHMgdXNhZ2UgYWxsb3dzIG11bHRpcGxlIHRhc2tzIHRvIGJlCi0gKiBjaGFpbmVkIHRvZ2V0aGVyIGFuZCBzaGFyZSBkYXRhIGZyb20gdGhlIG91dHB1dCBvZiBvbmUgdGFzayB0byB0aGUgaW5wdXQKLSAqIG9mIGFub3RoZXIuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tNb2RlbCB7Ci0JLyoqCi0JICogVGFzayBtb2RlbCBpZCBmb3IgYW4gSVJ1bnRpbWUuCi0JICogCi0JICogQHNlZSAjZ2V0T2JqZWN0KFN0cmluZykKLQkgKiBAc2VlICNwdXRPYmplY3QoU3RyaW5nLCBPYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19SVU5USU1FID0gInJ1bnRpbWUiOwotCi0JLyoqCi0JICogVGFzayBtb2RlbCBpZCBmb3IgYW4gSVNlcnZlci4KLQkgKiAKLQkgKiBAc2VlICNnZXRPYmplY3QoU3RyaW5nKQotCSAqIEBzZWUgI3B1dE9iamVjdChTdHJpbmcsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1NFUlZFUiA9ICJzZXJ2ZXIiOwotCi0JLyoqCi0JICogVGFzayBtb2RlbCBpZCBmb3IgYW4gYXJyYXkgb2YgbW9kdWxlcy4KLQkgKiBUaGUgdmFsdWUgaXMgYSBMaXN0IGNvbnRhaW5pbmcgSU1vZHVsZVtdIGFycmF5cy4KLQkgKiAKLQkgKiBAc2VlICNnZXRPYmplY3QoU3RyaW5nKQotCSAqIEBzZWUgVGFza01vZGVsI3B1dE9iamVjdChTdHJpbmcsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX01PRFVMRVMgPSAibW9kdWxlcyI7Ci0KLQkvKioKLQkgKiBUYXNrIG1vZGVsIGlkIGZvciBhbiBhcnJheSBvZiBkZWx0YSBraW5kcyB0aGF0IG1hcHMgdG8gdGhlIG1vZHVsZXMgaW4gdGhlIFRBU0tfTU9EVUxFUy4KLQkgKiBUaGUgdmFsdWUgaXMgYSBMaXN0IGNvbnRhaW5pbmcgSW50ZWdlciBmb3IgdGhlIGRlbHRhIGtpbmQgaWQuCi0JICogCi0JICogQHNlZSAjZ2V0T2JqZWN0KFN0cmluZykKLQkgKiBAc2VlIFRhc2tNb2RlbCNwdXRPYmplY3QoU3RyaW5nLCBPYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19ERUxUQV9LSU5EUyA9ICJkZWx0YUtpbmRzIjsKLQotCS8qKgotCSAqIFRhc2sgbW9kZWwgaWQgZm9yIGEgbGF1bmNoIG1vZGUuCi0JICogCi0JICogQHNlZSAjZ2V0T2JqZWN0KFN0cmluZykKLQkgKiBAc2VlICNwdXRPYmplY3QoU3RyaW5nLCBPYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19MQVVOQ0hfTU9ERSA9ICJsYXVuY2gtbW9kZSI7Ci0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgaW4gdGhlIHRhc2sgbW9kZWwgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICogPHA+Ci0JICogVGhlIGlkIGNhbiBiZSBhbnkgb2YgdGhlIHByZWRlZmluZWQgaWRzIHdpdGhpbiBUYXNrTW9kZWwsIG9yCi0JICogYW55IG90aGVyIGtleSB0byByZXRyaWV2ZSB0YXNrLXNwZWNpZmljIGRhdGEuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBpZCBhbiBpZCBmb3IgdGhlIG9iamVjdAotCSAqIEByZXR1cm4gdGhlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICBpZiBubyBvYmplY3QgY291bGQgYmUgZm91bmQgd2l0aCB0aGF0IGlkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoU3RyaW5nIGlkKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbWFwLmdldChpZCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFB1dCBhbiBvYmplY3QgaW50byB0aGUgdGFzayBtb2RlbCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKiA8cD4KLQkgKiBUaGUgaWQgY2FuIGJlIGFueSBvZiB0aGUgcHJlZGVmaW5lZCBpZHMgd2l0aGluIFRhc2tNb2RlbCwgb3IKLQkgKiBhbnkgb3RoZXIga2V5IHRvIHN0b3JlIHRhc2stc3BlY2lmaWMgZGF0YS4gCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgaWQgdG8gYXNzb2NpYXRlIHRoZSBvYmplY3Qgd2l0aAotCSAqIEBwYXJhbSBvYmogYW4gb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byByZXNldCAoY2xlYXIpIHRoZSBpZAotCSAqLwotCXB1YmxpYyB2b2lkIHB1dE9iamVjdChTdHJpbmcgaWQsIE9iamVjdCBvYmopIHsKLQkJbWFwLnB1dChpZCwgb2JqKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvQmFzZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzNhMmY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0Jhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3Igc3RvcmluZyBydW50aW1lIGFuZCBzZXJ2ZXIgYXR0cmlidXRlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2UgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTE9DS0VEID0gImxvY2tlZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9QUklWQVRFID0gInByaXZhdGUiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTkFNRSA9ICJuYW1lIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lEID0gImlkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lEX1NFVCA9ICJpZC1zZXQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVElNRVNUQU1QID0gInRpbWVzdGFtcCI7Ci0KLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotCS8vIGZpbGUgbG9hZGVkIGZyb20sIG9yIG51bGwgaWYgaXQgaXMgc2F2ZWQgaW4gbWV0YWRhdGEKLQlwcm90ZWN0ZWQgSUZpbGUgZmlsZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKi8KLQlwdWJsaWMgQmFzZShJRmlsZSBmaWxlKSB7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBpZAotCSAqLwotCXB1YmxpYyBCYXNlKElGaWxlIGZpbGUsIFN0cmluZyBpZCkgewotCQl0aGlzLmZpbGUgPSBmaWxlOwotCQlpZiAoaWQgIT0gbnVsbCAmJiBpZC5sZW5ndGgoKSA+IDApIHsKLQkJCW1hcC5wdXQoUFJPUF9JRCwgaWQpOwotCQkJbWFwLnB1dChQUk9QX0lEX1NFVCwgQm9vbGVhbi50b1N0cmluZyh0cnVlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0aW1lc3RhbXAgb2YgdGhpcyBvYmplY3QuCi0JICogVGltZXN0YW1wcyBhcmUgbW9ub3RvbmljYWxseSBpbmNyZWFzZWQgZWFjaCB0aW1lIHRoZSBvYmplY3QgaXMgc2F2ZWQKLQkgKiBhbmQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFueSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIG9uIGRpc2sKLQkgKiBzaW5jZSB0aGUgb2JqZWN0IHdhcyBsb2FkZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgb2JqZWN0J3MgdGltZXN0YW1wCi0JICovCi0JcHVibGljIGludCBnZXRUaW1lc3RhbXAoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9USU1FU1RBTVAsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIHdoZXJlIHRoaXMgc2VydmVyIGluc3RhbmNlIGlzIHNlcmlhbGl6ZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgZmlsZSBpbiB0aGUgd29ya3NwYWNlIHdoZXJlIHRoZSBzZXJ2ZXIgaW5zdGFuY2UKLQkgKiBpcyBzZXJpYWxpemVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW5mb3JtYXRpb24gaXMKLQkgKiBpbnN0ZWFkIHRvIGJlIHBlcnNpc3RlZCB3aXRoIHRoZSB3b3Jrc3BhY2UgYnV0IG5vdCB3aXRoIGFueQotCSAqIHBhcnRpY3VsYXIgd29ya3NwYWNlIHJlc291cmNlCi0JICovCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGF0dHJpYnV0ZSBpcyBjdXJyZW50bHkgc2V0LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXR0cmlidXRlIGlzIGN1cnJlbnRseSBzZXQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZVNldChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQl0cnkgewotCQkJT2JqZWN0IG9iaiA9IG1hcC5nZXQoYXR0cmlidXRlTmFtZSk7Ci0JCQlpZiAob2JqICE9IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJdHJ5IHsKLQkJCU9iamVjdCBvYmogPSBtYXAuZ2V0KGF0dHJpYnV0ZU5hbWUpOwotCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCQlyZXR1cm4gKFN0cmluZykgb2JqOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgaW50IGRlZmF1bHRWYWx1ZSkgewotCQl0cnkgewotCQkJT2JqZWN0IG9iaiA9IG1hcC5nZXQoYXR0cmlidXRlTmFtZSk7Ci0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIG9iaik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJdHJ5IHsKLQkJCU9iamVjdCBvYmogPSBtYXAuZ2V0KGF0dHJpYnV0ZU5hbWUpOwotCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKChTdHJpbmcpIG9iaikuYm9vbGVhblZhbHVlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBMaXN0PFN0cmluZz4gZGVmYXVsdFZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3Qgb2JqID0gbWFwLmdldChhdHRyaWJ1dGVOYW1lKTsKLQkJCWlmIChvYmogPT0gbnVsbCkKLQkJCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCQkJcmV0dXJuIChMaXN0PFN0cmluZz4pIG9iajsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JcHVibGljIE1hcCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIE1hcCBkZWZhdWx0VmFsdWUpIHsKLQkJdHJ5IHsKLQkJCU9iamVjdCBvYmogPSBtYXAuZ2V0KGF0dHJpYnV0ZU5hbWUpOwotCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCQlyZXR1cm4gKE1hcCkgb2JqOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfSUQsICIiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9OQU1FLCAiIik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX0xPQ0tFRCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBydW50aW1lIGlzIHByaXZhdGUgKG5vdCBzaG93bgotCSAqIGluIHRoZSBVSSB0byB0aGUgdXNlcnMpLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcnVudGltZSBpcyBwcml2YXRlLAotCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcml2YXRlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfUFJJVkFURSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0WE1MUm9vdCgpOwotCQotCXByb3RlY3RlZCB2b2lkIHNhdmUoSU1lbWVudG8gbWVtZW50bykgewotCQkvL0lNZW1lbnRvIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZCgicHJvcGVydGllcyIpOwotCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG87Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqID0gbWFwLmdldChrZXkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykKLQkJCQljaGlsZC5wdXRTdHJpbmcoa2V5LCAoU3RyaW5nKSBvYmopOwotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikgb2JqOwotCQkJCWNoaWxkLnB1dEludGVnZXIoa2V5LCBpbi5pbnRWYWx1ZSgpKTsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJCUJvb2xlYW4gYm9vbCA9IChCb29sZWFuKSBvYmo7Ci0JCQkJY2hpbGQucHV0Qm9vbGVhbihrZXksIGJvb2wuYm9vbGVhblZhbHVlKCkpOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJTGlzdCBsaXN0ID0gKExpc3QpIG9iajsKLQkJCQlzYXZlTGlzdChjaGlsZCwga2V5LCBsaXN0KTsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWFwKSB7Ci0JCQkJTWFwIG1hcDIgPSAoTWFwKSBvYmo7Ci0JCQkJc2F2ZU1hcChjaGlsZCwga2V5LCBtYXAyKTsKLQkJCQkKLQkJCX0KLQkJfQotCQlzYXZlU3RhdGUoY2hpbGQpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTWFwKElNZW1lbnRvIG1lbWVudG8sIFN0cmluZyBrZXksIE1hcCBtYXAyKSB7Ci0JCUlNZW1lbnRvIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZCgibWFwIik7Ci0JCWNoaWxkLnB1dFN0cmluZygia2V5Iiwga2V5KTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXAyLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBzID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJY2hpbGQucHV0U3RyaW5nKHMsIChTdHJpbmcpbWFwMi5nZXQocykpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNhdmVMaXN0KElNZW1lbnRvIG1lbWVudG8sIFN0cmluZyBrZXksIExpc3QgbGlzdCkgewotCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoImxpc3QiKTsKLQkJY2hpbGQucHV0U3RyaW5nKCJrZXkiLCBrZXkpOwotCQlpbnQgaSA9IDA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgcyA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWNoaWxkLnB1dFN0cmluZygidmFsdWUiICsgKGkrKyksIHMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVRvRmlsZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KGdldFhNTFJvb3QoKSk7Ci0JCQlzYXZlKG1lbWVudG8pOwotCi0JCQlJbnB1dFN0cmVhbSBpbiA9IG1lbWVudG8uZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCWZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDEwMDApKTsKLQkJCWVsc2UKLQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwMCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSAiICsgZ2V0WE1MUm9vdCgpLCBlKTsKLQkJCX0KLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JTYXZpbmcsIGdldEZpbGUoKS50b1N0cmluZygpKSwgZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJc2F2ZVRvRmlsZShtb25pdG9yKTsKLQkJZWxzZQotCQkJc2F2ZVRvTWV0YWRhdGEobW9uaXRvcik7Ci0JCVJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlc29sdmVTZXJ2ZXJzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVRvTWV0YWRhdGEoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50byk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCQotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gbWVtZW50by5nZXROYW1lcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBrZXkgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQltYXAucHV0KGtleSwgbWVtZW50by5nZXRTdHJpbmcoa2V5KSk7Ci0JCX0KLQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oImxpc3QiKTsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWZvciAoSU1lbWVudG8gY2hpbGQgOiBjaGlsZHJlbikKLQkJCQlsb2FkTGlzdChjaGlsZCk7Ci0JCX0KLQkJSU1lbWVudG9bXSBtYXBzID0gbWVtZW50by5nZXRDaGlsZHJlbigibWFwIik7Ci0JCWlmIChtYXBzICE9IG51bGwpIHsKLQkJCWZvciAoSU1lbWVudG8gbSA6IG1hcHMpCi0JCQkJbG9hZE1hcChtKTsKLQkJfQotCQkKLQkJbG9hZFN0YXRlKG1lbWVudG8pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRNYXAoSU1lbWVudG8gbWVtZW50bykgewotCQlTdHJpbmcga2V5ID0gbWVtZW50by5nZXRTdHJpbmcoImtleSIpOwotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHZNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IG1lbWVudG8uZ2V0TmFtZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBzID0gaXRlcmF0b3IubmV4dCgpOwotCQkJU3RyaW5nIHYgPSBtZW1lbnRvLmdldFN0cmluZyhzKTsKLQkJCXZNYXAucHV0KHMsdik7Ci0JCX0KLQkJbWFwLnB1dChrZXksIHZNYXApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRMaXN0KElNZW1lbnRvIG1lbWVudG8pIHsKLQkJU3RyaW5nIGtleSA9IG1lbWVudG8uZ2V0U3RyaW5nKCJrZXkiKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaW50IGkgPSAwOwotCQlTdHJpbmcga2V5MiA9IG1lbWVudG8uZ2V0U3RyaW5nKCJ2YWx1ZSIgKyAoaSsrKSk7Ci0JCXdoaWxlIChrZXkyICE9IG51bGwpIHsKLQkJCWxpc3QuYWRkKGtleTIpOwotCQkJa2V5MiA9IG1lbWVudG8uZ2V0U3RyaW5nKCJ2YWx1ZSIgKyAoaSsrKSk7Ci0JCX0KLQkJbWFwLnB1dChrZXksIGxpc3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsb2FkU3RhdGUoSU1lbWVudG8gbWVtZW50byk7Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZWxldGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChpc1dvcmtpbmdDb3B5KCkpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsICJDYW5ub3QgZGVsZXRlIGEgd29ya2luZyBjb3B5IiwgbnVsbCkpOwotCQkKLQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCWRlbGV0ZUZyb21GaWxlKCk7Ci0JCWVsc2UKLQkJCWRlbGV0ZUZyb21NZXRhZGF0YSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUZyb21GaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmaWxlLmRlbGV0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVGcm9tTWV0YWRhdGEoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBCYXNlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCUJhc2UgYmFzZSA9IChCYXNlKSBvYmo7Ci0JCWlmIChnZXRJZCgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghZ2V0SWQoKS5lcXVhbHMoYmFzZS5nZXRJZCgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChpc1dvcmtpbmdDb3B5KCkgIT0gYmFzZS5pc1dvcmtpbmdDb3B5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoaXNXb3JraW5nQ29weSgpICYmIHRoaXMgIT0gYmFzZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWRGcm9tRmlsZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQl0cnkgewotCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlJTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5sb2FkTWVtZW50byhpbik7Ci0JCQlsb2FkKG1lbWVudG8pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZCBub3QgbG9hZCBmcm9tIGZpbGUiLCBlKTsKLQkJCX0KLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JMb2FkaW5nLCBnZXRGaWxlKCkudG9TdHJpbmcoKSksIGUpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvYWRGcm9tTWVtZW50byhJTWVtZW50byBtZW1lbnRvLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJbG9hZChtZW1lbnRvKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZEZyb21QYXRoKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC50b0ZpbGUoKSkpOwotCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oaW4pOwotCQkJbG9hZChtZW1lbnRvKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IGxvYWQgZnJvbSBwYXRoIiwgZSk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yTG9hZGluZywgcGF0aC50b1N0cmluZygpKSwgZSkpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVFZGl0KE9iamVjdCBjb250ZXh0KSB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkKLQkJcmV0dXJuIGZpbGUuZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KG5ldyBJRmlsZVtdIHsgZmlsZSB9LCBjb250ZXh0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvQ2hhaW5lZEpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvQ2hhaW5lZEpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjc2ZmUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0NoYWluZWRKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLS8qKgotICogQSBKb2IgdGhhdCBjYW4gc3RhcnQgYW5vdGhlciBqb2IgdXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDaGFpbmVkSm9iIGV4dGVuZHMgSm9iIHsKLQlwcml2YXRlIElTZXJ2ZXIgc2VydmVyOwotCXByaXZhdGUgSm9iIG5leHRKb2I7Ci0JcHJpdmF0ZSBJSm9iQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgZGVwZW5kZW50IGpvYi4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgam9iCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRvIHB1Ymxpc2ggdG8KLQkgKi8KLQlwdWJsaWMgQ2hhaW5lZEpvYihTdHJpbmcgbmFtZSwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSm9iI2JlbG9uZ3NUbyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCXJldHVybiBTZXJ2ZXJVdGlsLlNFUlZFUl9KT0JfRkFNSUxZLmVxdWFscyhmYW1pbHkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciB0aGF0IHRoaXMgam9iIHdhcyBjcmVhdGVkIHdpdGguCi0JICogCi0JICogQHJldHVybiBhIHNlcnZlcgotCSAqLwotCXB1YmxpYyBJU2VydmVyIGdldFNlcnZlcigpIHsKLQkJcmV0dXJuIHNlcnZlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBsaXN0ZW5lciBmb3Igd2hlbiB0aGlzIGpvYiBmaW5pc2hlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMaXN0ZW5lcigpIHsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlsaXN0ZW5lciA9IG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlqb2JEb25lKGV2ZW50LmdldFJlc3VsdCgpKTsKLQkJCX0KLQkJfTsKLQkJCi0JCWFkZEpvYkNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGlzIGpvYiBpcyBjb21wbGV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdHVzIHRoZSByZXN1bHQgb2YgdGhlIGN1cnJlbnQgam9iCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgam9iRG9uZShJU3RhdHVzIHN0YXR1cykgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCXJlbW92ZUpvYkNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJbGlzdGVuZXIgPSBudWxsOwotCQkKLQkJaWYgKG5leHRKb2IgIT0gbnVsbCAmJiBzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SCi0JCQkJJiYgc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5DQU5DRUwpCi0JCQluZXh0Sm9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBuZXh0IGpvYiwgd2hpY2ggc2hvdWxkIGJlIHNjaGVkdWxlZCBpZiBhbmQgb25seSBpZiB0aGlzIGpvYiBjb21wbGV0ZXMKLQkgKiBzdWNjZXNzZnVsbHkuIFRoZSBuZXh0IGpvYiB3aWxsIGJlIHJ1biBhcyBsb25nIGFzIHRoZSByZXN1bHQgb2YgdGhpcyBqb2IgaXMKLQkgKiBub3QgYW4gRVJST1Igb3IgQ0FOQ0VMIHN0YXR1cy4KLQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgdGhyZWFkLXNhZmUuIEhvd2V2ZXIsIHRoZSBuZXh0IGpvYiBjYW4gYmUgY2hhbmdlZCBhbnl0aW1lCi0JICogdXAgdW50aWwgdGhlIGN1cnJlbnQgam9iIGNvbXBsZXRlcy4KLQkgKiAKLQkgKiBAcGFyYW0gam9iIHRoZSBuZXh0IGpvYiB0aGF0IHNob3VsZCBiZSBzY2hlZHVsZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXh0Sm9iKEpvYiBqb2IpIHsKLQkJbmV4dEpvYiA9IGpvYjsKLQkJY3JlYXRlTGlzdGVuZXIoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvQ2xpZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9DbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3MDNlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9DbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuQ2xpZW50RGVsZWdhdGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ2xpZW50IGltcGxlbWVudHMgSUNsaWVudCB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIENsaWVudERlbGVnYXRlIGRlbGVnYXRlOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGNsaWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqLwotCXB1YmxpYyBDbGllbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDbGllbnQjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBwcmlvcml0eSBvZiB0aGlzIGFkYXB0ZXIuCi0JICoKLQkgKiBAcmV0dXJuIGEgcHJpb3JpdHkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFByaW9yaXR5KCkgewotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInByaW9yaXR5IikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDbGllbnQjZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhdW5jaGFibGUoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgibGF1bmNoYWJsZSIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNsaWVudCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBsYWJlbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JCWlmIChsYWJlbCA9PSBudWxsKQotCQkJcmV0dXJuICJuL2EiOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWxlZ2F0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWxlZ2F0ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgY291bGRuJ3QgYmUgbG9hZGVkCi0JICovCi0JcHVibGljIENsaWVudERlbGVnYXRlIGdldERlbGVnYXRlKCkgewotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkZWxlZ2F0ZSA9IChDbGllbnREZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlIiArIHRvU3RyaW5nKCksIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ2xpZW50I3N1cHBvcnRzKElTZXJ2ZXIsIE9iamVjdCwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKElTZXJ2ZXIgc2VydmVyLCBPYmplY3QgbGF1bmNoYWJsZSwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJaWYgKGxhdW5jaGFibGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy9pZiAoIWxhdW5jaGFibGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKGdldExhdW5jaGFibGUoKSkpCi0JCS8vCXJldHVybiBmYWxzZTsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXREZWxlZ2F0ZSgpLnN1cHBvcnRzKHNlcnZlciwgbGF1bmNoYWJsZSwgbGF1bmNoTW9kZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ2xpZW50I2xhdW5jaChJU2VydmVyLCBPYmplY3QsIFN0cmluZywgSUxhdW5jaCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBsYXVuY2goSVNlcnZlciBzZXJ2ZXIsIE9iamVjdCBsYXVuY2hhYmxlLCBTdHJpbmcgbGF1bmNoTW9kZSwgSUxhdW5jaCBsYXVuY2gpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXREZWxlZ2F0ZSgpLmxhdW5jaChzZXJ2ZXIsIGxhdW5jaGFibGUsIGxhdW5jaE1vZGUsIGxhdW5jaCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQ2xpZW50WyIgKyBnZXRJZCgpICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9EZWxldGVkTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9EZWxldGVkTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMmEwZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvRGVsZXRlZE1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlVHlwZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVkTW9kdWxlIGltcGxlbWVudHMgSU1vZHVsZSB7Ci0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JcHJvdGVjdGVkIElNb2R1bGVUeXBlIG1vZHVsZVR5cGUyOwotCi0JcHVibGljIERlbGV0ZWRNb2R1bGUoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSkgewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubW9kdWxlVHlwZTIgPSBtb2R1bGVUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgSU1vZHVsZVR5cGUgZ2V0TW9kdWxlVHlwZSgpIHsKLQkJcmV0dXJuIG1vZHVsZVR5cGUyOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBsb2FkQWRhcHRlcihDbGFzcyBhZGFwdGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSU1vZHVsZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJSU1vZHVsZSBtID0gKElNb2R1bGUpIG9iajsKLQkJaWYgKCFnZXRJZCgpLmVxdWFscyhtLmdldElkKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkRlbGV0ZWRNb2R1bGVbIiArIG5hbWUgKyAiLCIgKyBpZCArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0V4dGVybmFsTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMzkzNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZURlbGVnYXRlOwotLyoqCi0gKiBBbiBFeHRlcm5hbE1vZHVsZSBpcyBhIHVuaXQgb2YgImNvbnRlbnQiIHRoYXQgaXMgYWxyZWFkeSBwdWJsaXNoZWQgdG8gdGhlIHNlcnZlcgotICogYnV0IGl0IGRvZXNuJ3QgY29udGFpbiBhIHZhbGlkIHJlc291cmNlIGluIHRoZSB3b3Jrc3BhY2UuCi0gKiA8cD4KLSAqIEV4dGVybmFsTW9kdWxlIGFyZSBjcmVhdGVkIHVzaW5nIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLgotICovCi1wdWJsaWMgY2xhc3MgRXh0ZXJuYWxNb2R1bGUgZXh0ZW5kcyBNb2R1bGUgewotCS8qKgotCSAqIEV4dGVybmFsTW9kdWxlIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBtb2R1bGUgaWQKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbW9kdWxlIG5hbWUKLQkgKiBAcGFyYW0gdHlwZSB0aGUgbW9kdWxlIHR5cGUgaWQKLQkgKiBAcGFyYW0gdmVyc2lvbiB0aGUgbW9kdWxlIHZlcnNpb24gaWQKLQkgKiBAcGFyYW0gZGVsZWdhdGUKLQkgKi8KLQlwdWJsaWMgRXh0ZXJuYWxNb2R1bGUoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uLCBNb2R1bGVEZWxlZ2F0ZSBkZWxlZ2F0ZSkgewotCQlzdXBlcihudWxsLCAiZXh0ZXJuYWw6IiArIGlkLCBuYW1lLCB0eXBlLCB2ZXJzaW9uLCBudWxsKTsKLQkJdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JQ2xpZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MTVlZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogQSBsYXVuY2hhYmxlIGNsaWVudCBpcyBhIGNsaWVudCBzaWRlIGFwcGxpY2F0aW9uIG9yIHRlc3QKLSAqIGhhcm5lc3MgdGhhdCBjYW4gYmUgbGF1bmNoZWQgKHJ1bikgYWdhaW5zdCBhIHJlc291cmNlCi0gKiBydW5uaW5nIG9uIGEgc2VydmVyLgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNsaWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBjbGllbnQuIEVhY2gga25vd24gY2xpZW50IGhhcyBhIGRpc3RpbmN0IGlkLiAKLQkgKiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOyB0aGV5IGFyZSBub3QKLQkgKiBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgY2xpZW50IGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBjbGllbnQuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgbmFtZSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIGNsaWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgY2xpZW50LgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIGRlc2NyaXB0aW9uIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIGRlc2NyaXB0aW9uIGZvciB0aGlzIGNsaWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGxhdW5jaGFibGUgY2FuIGJlIHJ1biBieSB0aGlzIGNsaWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbGF1bmNoYWJsZSB0aGUgbGF1bmNoYWJsZSBvYmplY3QKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSB0aGUgbW9kZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKElTZXJ2ZXIgc2VydmVyLCBPYmplY3QgbGF1bmNoYWJsZSwgU3RyaW5nIGxhdW5jaE1vZGUpOwotCi0JLyoqCi0JICogTGF1bmNoZXMgdGhlIGNsaWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbGF1bmNoYWJsZSB0aGUgbGF1bmNoYWJsZSBvYmplY3QKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSB0aGUgbW9kZQotCSAqIEBwYXJhbSBsYXVuY2ggdGhlIGxhdW5jaAotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgbGF1bmNoIHdhcwotCSAqICAgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgd2VudCB3cm9uZwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGxhdW5jaChJU2VydmVyIHNlcnZlciwgT2JqZWN0IGxhdW5jaGFibGUsIFN0cmluZyBsYXVuY2hNb2RlLCBJTGF1bmNoIGxhdW5jaCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUluc3RhbGxhYmxlUnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUluc3RhbGxhYmxlUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjc4YzA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lJbnN0YWxsYWJsZVJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIFJlcHJlc2VudHMgYW4gaW5zdGFsbGFibGUgcnVudGltZS4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUluc3RhbGxhYmxlUnVudGltZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBydW50aW1lIHR5cGUuCi0JICogRWFjaCBrbm93biBzZXJ2ZXIgcnVudGltZSB0eXBlIGhhcyBhIGRpc3RpbmN0IGlkLiAKLQkgKiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOyB0aGV5IGFyZSBub3QKLQkgKiBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgcnVudGltZSB0eXBlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUHJvdmlkZXMgYSBuYW1lIGZvciB0aGlzIHJ1bnRpbWUuCi0JICogCi0JICogQHJldHVybiBhIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIERvd25sb2FkcyB0aGUgbGljZW5zZSBmcm9tIHRoZSB1cGRhdGUgc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcmV0dXJuIHRoZSBsaWNlbnNlCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWNlbnNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBLaWNrcyBvZmYgYSBiYWNrZ3JvdW5kIGpvYiB0byBpbnN0YWxsIHRoZSBydW50aW1lLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIGluc3RhbGwgdGhlIHJ1bnRpbWUgYXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKElQYXRoIHBhdGgpOwotCi0JLyoqCi0JICogSW5zdGFsbCB0aGlzIHJ1bnRpbWUuCi0JICogCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gaW5zdGFsbCB0aGUgcnVudGltZSBhdAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQgCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhpcyBydW50aW1lCi0JICogICAgb3Igc2V0dGluZyBpdCdzIGRlZmF1bHQgdmFsdWVzCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lMYXVuY2hhYmxlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUxhdW5jaGFibGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MDk1Y2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUxhdW5jaGFibGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogVGhpcyBpbnRlcmZhY2UsIHR5cGljYWxseSBpbXBsZW1lbnRlZCBieSB0aGUgc2VydmVyCi0gKiBjb2RlLCBjb252ZXJ0cyBmcm9tIGFuIElNb2R1bGVBcnRpZmFjdCB0byBhbgotICogSUxhdW5jaGFibGUuCi0gKiAKLSAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLjwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTGF1bmNoYWJsZUFkYXB0ZXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgYWRhcHRlci4gRWFjaCBrbm93biBhZGFwdGVyIGhhcyBhIGRpc3RpbmN0IGlkLiAKLQkgKiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOyB0aGV5IGFyZSBub3QKLQkgKiBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBsYXVuY2hhYmxlIG9iamVjdCBmcm9tIHRoaXMgbW9kdWxlIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbW9kdWxlQXJ0aWZhY3QgYW4gYXJ0aWZhY3QgaW4gdGhlIG1vZHVsZQotCSAqIEByZXR1cm4gYSBsYXVuY2hhYmxlIG9iamVjdAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJldHVybmluZyB0aGUgbGF1bmNoYWJsZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGF1bmNoYWJsZShJU2VydmVyIHNlcnZlciwgSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTWVtZW50by5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjMWFhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLS8qKgotICogSW50ZXJmYWNlIHRvIGEgbWVtZW50byB1c2VkIGZvciBzYXZpbmcgdGhlIGltcG9ydGFudCBzdGF0ZSBvZiBhbiBvYmplY3QKLSAqIGluIGEgZm9ybSB0aGF0IGNhbiBiZSBwZXJzaXN0ZWQgaW4gdGhlIGZpbGUgc3lzdGVtLgotICogPHA+Ci0gKiBNZW1lbnRvcyB3ZXJlIGRlc2lnbmVkIHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgaW4gbWluZDoKLSAqIDxvbD4KLSAqICA8bGk+Q2VydGFpbiBvYmplY3RzIG5lZWQgdG8gYmUgc2F2ZWQgYW5kIHJlc3RvcmVkIGFjcm9zcyBwbGF0Zm9ybSBzZXNzaW9ucy4KLSAqICAgIDwvbGk+Ci0gKiAgPGxpPldoZW4gYW4gb2JqZWN0IGlzIHJlc3RvcmVkLCBhbiBhcHByb3ByaWF0ZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1pZ2h0IG5vdAotICogICAgYmUgYXZhaWxhYmxlLiBJdCBtdXN0IGJlIHBvc3NpYmxlIHRvIHNraXAgYW4gb2JqZWN0IGluIHRoaXMgY2FzZS48L2xpPgotICogIDxsaT5XaGVuIGFuIG9iamVjdCBpcyByZXN0b3JlZCwgdGhlIGFwcHJvcHJpYXRlIGNsYXNzIGZvciB0aGUgb2JqZWN0IG1heSBiZQotICogICAgZGlmZmVyZW50IGZyb20gdGhlIG9uZSB3aGVuIHRoZSBvYmplY3Qgd2FzIG9yaWdpbmFsbHkgc2F2ZWQuIElmIHNvLCB0aGUKLSAqICAgIG5ldyBjbGFzcyBzaG91bGQgc3RpbGwgYmUgYWJsZSB0byByZWFkIHRoZSBvbGQgZm9ybSBvZiB0aGUgZGF0YS48L2xpPgotICogPC9vbD4KLSAqIDwvcD4KLSAqIDxwPgotICogTWVtZW50b3MgbWVldCB0aGVzZSByZXF1aXJlbWVudHMgYnkgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIHN0b3JpbmcgYQotICogbWFwcGluZyBvZiBhcmJpdHJhcnkgc3RyaW5nIGtleXMgdG8gcHJpbWl0aXZlIHZhbHVlcywgYW5kIGJ5IGFsbG93aW5nCi0gKiBtZW1lbnRvcyB0byBoYXZlIG90aGVyIG1lbWVudG9zIGFzIGNoaWxkcmVuIChhcnJhbmdlZCBpbnRvIGEgdHJlZSkuCi0gKiBBIHJvYnVzdCBleHRlcm5hbCBzdG9yYWdlIGZvcm1hdCBiYXNlZCBvbiBYTUwgaXMgdXNlZC4KLSAqIDwvcD48cD4KLSAqIFRoZSBrZXkgZm9yIGFuIGF0dHJpYnV0ZSBtYXkgYmUgYW55IGFscGhhIG51bWVyaWMgdmFsdWUuICBIb3dldmVyLCB0aGUKLSAqIHZhbHVlIG9mIDxjb2RlPlRBR19JRDwvY29kZT4gaXMgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZS4KLSAqIDwvcD48cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZW1lbnRvIHsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNoaWxkIG9mIHRoaXMgbWVtZW50byB3aXRoIHRoZSBnaXZlbiB0eXBlLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5nZXRDaGlsZDwvY29kZT4gYW5kIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiBtZXRob2RzCi0JICogYXJlIHVzZWQgdG8gcmV0cmlldmUgY2hpbGRyZW4gb2YgYSBnaXZlbiB0eXBlLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlCi0JICogQHJldHVybiBhIG5ldyBjaGlsZCBtZW1lbnRvCi0JICogQHNlZSAjZ2V0Q2hpbGQKLQkgKiBAc2VlICNnZXRDaGlsZHJlbgotCSAqLwotCXB1YmxpYyBJTWVtZW50byBjcmVhdGVDaGlsZChTdHJpbmcgdHlwZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCB3aXRoIHRoZSBnaXZlbiB0eXBlIGlkLgotCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgaWQKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBjaGlsZCB3aXRoIHRoZSBnaXZlbiB0eXBlCi0JICovCi0JcHVibGljIElNZW1lbnRvIGdldENoaWxkKFN0cmluZyB0eXBlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBjaGlsZHJlbiB3aXRoIHRoZSBnaXZlbiB0eXBlIGlkLgotCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgaWQKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNoaWxkcmVuIHdpdGggdGhlIGdpdmVuIHR5cGUKLQkgKi8KLQlwdWJsaWMgSU1lbWVudG9bXSBnZXRDaGlsZHJlbihTdHJpbmcgdHlwZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmxvYXRpbmcgcG9pbnQgdmFsdWUgb2YgdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEByZXR1cm4gdGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IHdhcyBub3QgZm91bmQgb3Igd2FzIGZvdW5kCi0JICogICBidXQgd2FzIG5vdCBhIGZsb2F0aW5nIHBvaW50IG51bWJlcgotCSAqLwotCXB1YmxpYyBGbG9hdCBnZXRGbG9hdChTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEByZXR1cm4gdGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IHdhcyBub3QgZm91bmQgb3Igd2FzIGZvdW5kCi0JICogICBidXQgd2FzIG5vdCBhbiBpbnRlZ2VyCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0SW50ZWdlcihTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5LgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHJldHVybiB0aGUgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBrZXkgd2FzIG5vdCBmb3VuZCBvciB3YXMgZm91bmQKLQkgKiAgYnV0IHdhcyBub3QgYW4gaW50ZWdlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5LgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHJldHVybiB0aGUgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBrZXkgd2FzIG5vdCBmb3VuZCBvciB3YXMgZm91bmQKLQkgKiAgYnV0IHdhcyBub3QgYSBib29sZWFuCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcga2V5KTsKLQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TmFtZXMoKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IHRvIHRoZSBnaXZlbiBpbnRlZ2VyLgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEludGVnZXIoU3RyaW5nIGtleSwgaW50IHZhbHVlKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IHRvIHRoZSBnaXZlbiBib29sZWFuIHZhbHVlLgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IHRvIHRoZSBnaXZlbiBzdHJpbmcuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgcHV0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1vZHVsZVB1Ymxpc2hIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNb2R1bGVQdWJsaXNoSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNmRmYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1vZHVsZVB1Ymxpc2hIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBUZW1wb3JhcnkgaW50ZXJmYWNlIHRvIGhlbHAgdGhlIHdlYiBzZXJ2aWNlcyB0ZWFtLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVQdWJsaXNoSGVscGVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoIHRoYXQgdGhlIG1vZHVsZSBpcyBwdWJsaXNoZWQgdG8sIG9yIG51bGwgaWYgdGhlIG1vZHVsZSBpcyBub3QKLQkgKiBwdWJsaXNoZWQgdG8gdGhlIHNlcnZlciBvciB0aGUgbG9jYXRpb24gaXMgdW5rbm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlIG9uIHRoZSBzZXJ2ZXIgCi0JICogQHJldHVybiB0aGUgcGF0aCB0aGF0IHRoZSBtb2R1bGUgaXMgcHVibGlzaGVkIHRvLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QKLQkgKiAgIGEgdmFsaWQgbW9kdWxlIG9yIHRoZSBsb2NhdGlvbiBpcyB1bmtub3duCi0JICovCi0JcHVibGljIElQYXRoIGdldFB1Ymxpc2hEaXJlY3RvcnkoSU1vZHVsZVtdIG1vZHVsZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTW9kdWxlVmlzaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1vZHVsZVZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlMzYyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTW9kdWxlVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLS8qKgotICogQSB2aXNpdG9yIG9uIGEgc2VydmVyJ3MgbW9kdWxlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kdWxlVmlzaXRvciB7Ci0JLyoqCi0JICogVmlzaXQgYSBzaW5nbGUgbW9kdWxlLiBSZXR1cm5zIHRydWUgdG8ga2VlcCB2aXNpdGluZywgYW5kCi0JICogZmFsc2UgaWYgaXQgc2hvdWxkIHN0b3AgdmlzaXRpbmcgdGhlIG1vZHVsZS4gCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZSBvbiB0aGUgc2VydmVyCi0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IHRvIHZpc2l0IHRoZSBuZXh0IG1vZHVsZSwgb3IKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gdG8gc3RvcCB2aXNpdGluZwotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KElNb2R1bGVbXSBtb2R1bGUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNb25pdG9yZWRTZXJ2ZXJQb3J0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTW9uaXRvcmVkU2VydmVyUG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWFlMjNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNb25pdG9yZWRTZXJ2ZXJQb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotCi0vKioKLSAqIEFuIG1vbml0b3JlZCBwb3J0IG9uIGEgc2VydmVyLgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vbml0b3JlZFNlcnZlclBvcnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciB0aGF0IGl0IGJlaW5nIG1vbml0b3JlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgcG9ydC4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIubW9kZWwuSVNlcnZlclBvcnQKLQkgKi8KLQlwdWJsaWMgU2VydmVyUG9ydCBnZXRTZXJ2ZXJQb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBvcnQgdGhhdCBpcyBiZWluZyB1c2VkIHRvIG1vbml0b3IuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1vbml0b3JQb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHR5cGVzIHRoYXQgYXJlIGJlaW5nIG1vbml0b3JlZCwgb3IgbnVsbCBmb3IgYWxsIGNvbnRlbnQuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nW10KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29udGVudFR5cGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1vbml0b3IgaXMgY3VycmVudGx5IHJ1bm5pbmcvYWN0aXZlLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhcnRlZCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lPcmRlcmVkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JT3JkZXJlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGYzMDA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lPcmRlcmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLS8qKgotICogQW4gb2JqZWN0IHRoYXQgaGFzIGFuIGFic29sdXRlIG9yZGVyaW5nLCBhbmQgY2FuIGJlIG9yZGVyZWQgYWdhaW5zdCBvdGhlciBvYmplY3RzLgotICogCi0gKiA8cD4KLSAqIFtpc3N1ZTogSXQgaXMgbm90b3Jpb3VzbHkgZGlmZmljdWx0IHRvIHBsYWNlIGFueSBraW5kIG9mCi0gKiB1c2VmdWwgb3JkZXIgb24gb2JqZWN0cyB0aGF0IGFyZSBjb250cmlidXRlZCBpbmRlcGVuZGVudGx5IGJ5Ci0gKiBub24tY29sbGFib3JhdGluZyBwYXJ0aWVzLiBUaGUgSU9yZGVyZWQgbWVjaGFuaXNtIGlzIHdlYWssIGFuZAotICogY2FuJ3QgcmVhbGx5IHNvbHZlIHRoZSBwcm9ibGVtLiBJc3N1ZXMgb2YgcHJlc2VudGF0aW9uIGFyZSB1c3VhbGx5Ci0gKiBiZXN0IGxlZnQgdG8gdGhlIFVJLCB3aGljaCBjYW4gc29ydCBvYmplY3RzIGJhc2VkIG9uIGFyYml0cmFyeQotICogcHJvcGVydGllcy5dCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLjwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJT3JkZXJlZCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgb3JkZXIgKGluZGV4L3ByaW9yaXR5KS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3JkZXIoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JUHVibGlzaFRhc2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lQdWJsaXNoVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDkxNWUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lQdWJsaXNoVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUHVibGlzaE9wZXJhdGlvbjsKLS8qKgotICogQSB0YXNrIGZvciBhIHNlcnZlci4KLSAqIAotICogPHA+VGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQdWJsaXNoVGFzayB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIGFkYXB0ZXIuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHR5cGUgKGdpdmVuIGJ5IHRoZSBpZCkgY2FuIHVzZSB0aGlzIHRhc2suIFRoaXMKLQkgKiByZXN1bHQgaXMgYmFzZWQgb24gdGhlIHJlc3VsdCBvZiB0aGUgZ2V0VHlwZUlkcygpIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYSBzZXJ2ZXIgdHlwZSBpZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzVHlwZShTdHJpbmcgaWQpOwotCi0JLyoqCi0JICogTGV0cyB0aGUgdGFzayBrbm93IHRoYXQgaXQgaXMgYWJvdXQgdG8gYmUgdXNlZC4gVGhpcyBtZXRob2Qgc2hvdWxkCi0JICogYmUgdXNlZCB0byBjbGVhbiBvdXQgYW55IHByZXZpb3VzbHkgY2FjaGVkIGluZm9ybWF0aW9uLCBvciBzdGFydCB0bwotCSAqIGNyZWF0ZSBhIG5ldyBjYWNoZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbW9kdWxlcyBhIGxpc3QgY29udGFpbmluZyBJTW9kdWxlIGFycmF5cwotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBvcHRpb25hbCB0YXNrcyAKLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wZXJhdGlvbltdIGdldFRhc2tzKElTZXJ2ZXIgc2VydmVyLCBMaXN0IG1vZHVsZXMpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFza3MgdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIGR1cmluZyBwdWJsaXNoaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgotCSAqIEBwYXJhbSBtb2R1bGVzIGEgbGlzdCBjb250YWluaW5nIElNb2R1bGUgYXJyYXlzCi0JICogQHBhcmFtIGtpbmQgb25lIG9mIHRoZSBJU2VydmVyLlBVQkxJU0hfWFggY29uc3RhbnRzCi0JICogQHBhcmFtIGtpbmRMaXN0IG9uZSBvZiB0aGUgSVNlcnZlciBwdWJsaXNoIGNoYW5nZSBjb25zdGFudHMKLQkgKiBAcmV0dXJuIHRoZSB0YXNrcyB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgb24gdGhlIHNlcnZlcgotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3BlcmF0aW9uW10gZ2V0VGFza3MoSVNlcnZlciBzZXJ2ZXIsIGludCBraW5kLCBMaXN0IG1vZHVsZXMsIExpc3Qga2luZExpc3QpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lSdW50aW1lTG9jYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSVJ1bnRpbWVMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YmY5ZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSVJ1bnRpbWVMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLS8qKgotICogQSBydW50aW1lIGxvY2F0b3IgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gbG9jYXRlIG9yIHNlYXJjaCBmb3IgYWRkaXRpb25hbAotICogcnVudGltZXMgb2YgYSBwYXJ0aWN1bGFyIHR5cGUuCi0gKiA8cD4KLSAqIFJ1bnRpbWUgbG9jYXRvcnMgYXJlIGZvdW5kIHZpYSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVMb2NhdG9ycygpLgotICogPC9wPgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVMb2NhdG9yIHsKLQkvKioKLQkgKiBBIGNhbGxiYWNrIGxpc3RlbmVyIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lU2VhcmNoTGlzdGVuZXIgewotCQkvKioKLQkJICogQ2FsbGVkIHdoZW4gYSBuZXcgcnVudGltZSBpcyBmb3VuZCBieSB0aGUgbG9jYXRvci4KLQkJICogVGhlIHJ1bnRpbWUgbXVzdCBuZXZlciBiZSBudWxsLgotCQkgKiAKLQkJICogQHBhcmFtIHJ1bnRpbWUgdGhlIHJ1bnRpbWUgdGhhdCB3YXMgZm91bmQuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW50aW1lRm91bmQoSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIHJ1bnRpbWUgbG9jYXRvci4KLQkgKiBFYWNoIGtub3duIHJ1bnRpbWUgbG9jYXRvciBoYXMgYSBkaXN0aW5jdCBpZC4gCi0JICogSWRzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkgYXMga2V5czsgdGhleSBhcmUgbm90Ci0JICogaW50ZW5kZWQgdG8gYmUgc2hvd24gdG8gZW5kIHVzZXJzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgbG9jYXRvciBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcnVudGltZSBsb2NhdG9yIGNhbiBmaW5kIHJ1bnRpbWVzIG9mIHRoZSBnaXZlbiB0eXBlLgotCSAqIFRoZSBpZCBzaG91bGQgbmV2ZXIgYmUgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZVR5cGVJZCB0aGUgaWQgb2YgYSBydW50aW1lIHR5cGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1R5cGUoU3RyaW5nIHJ1bnRpbWVUeXBlSWQpOwotCi0JLyoqCi0JICogU2VhcmNoZXMgZm9yIGxvY2FsIHJ1bnRpbWVzLgotCSAqIEl0IHVzZXMgdGhlIGNhbGxiYWNrIGxpc3RlbmVyIHRvIHJlcG9ydCBydW50aW1lcyB0aGF0IGFyZSBmb3VuZC4KLQkgKiBUaGUgcGF0aCBjb250YWlucyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZm9sZGVyIHRvIHNlYXJjaCBpbiwKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBzZWFyY2ggdGhlIGVudGlyZSBtYWNoaW5lLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHNlYXJjaCBmb3IgcnVudGltZXMgaW4KLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBsaXN0ZW5lciB0byByZXBvcnQgc3RhdHVzIHRvCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNlYXJjaEZvclJ1bnRpbWVzKElQYXRoIHBhdGgsIElSdW50aW1lU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSVNlcnZlckxvY2F0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lTZXJ2ZXJMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MmNhZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSVNlcnZlckxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLS8qKgotICogQSBzZXJ2ZXIgbG9jYXRvciBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBsb2NhdGUgb3Igc2VhcmNoIGZvciBhZGRpdGlvbmFsCi0gKiBzZXJ2ZXJzIG9mIGEgcGFydGljdWxhciB0eXBlLCBvbiBhIHBhcnRpY3VsYXIgaG9zdC4KLSAqIDxwPgotICogU2VydmVyIGxvY2F0b3JzIGFyZSBmb3VuZCB2aWEgU2VydmVyQ29yZS5nZXRTZXJ2ZXJMb2NhdG9ycygpLgotICogPC9wPgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlckxvY2F0b3IgewotCS8qKgotCSAqIEEgY2FsbGJhY2sgbGlzdGVuZXIgaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlclNlYXJjaExpc3RlbmVyIHsKLQkJLyoqCi0JCSAqIENhbGxlZCB3aGVuIGEgbmV3IHNlcnZlciBpcyBmb3VuZCBieSB0aGUgbG9jYXRvci4KLQkJICogVGhlIHNlcnZlciBtdXN0IG5ldmVyIGJlIG51bGwuCi0JCSAqIAotCQkgKiBAcGFyYW0gc2VydmVyIHRoZSBydW50aW1lIHRoYXQgd2FzIGZvdW5kLgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2VydmVyRm91bmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBzZXJ2ZXIgbG9jYXRvci4KLQkgKiBFYWNoIGtub3duIHNlcnZlciBsb2NhdG9yIGhhcyBhIGRpc3RpbmN0IGlkLiAKLQkgKiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOyB0aGV5IGFyZSBub3QKLQkgKiBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyIGxvY2F0b3IgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciBsb2NhdG9yIGNhbiBmaW5kIHNlcnZlcnMgb2YgdGhlIGdpdmVuIHR5cGUuCi0JICogVGhlIGlkIHNob3VsZCBuZXZlciBiZSBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXJUeXBlSWQgdGhlIGlkIG9mIGEgc2VydmVyIHR5cGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1R5cGUoU3RyaW5nIHNlcnZlclR5cGVJZCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHR5cGUgb2Ygc2VydmVyIGNhbiBydW4gb24gYSByZW1vdGUgaG9zdC4KLQkgKiBSZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgc2VydmVyIHR5cGUgY2FuIG9ubHkgYmUgcnVuIG9uICJsb2NhbGhvc3QiCi0JICogKHRoZSBsb2NhbCBtYWNoaW5lKS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHlwZSBvZiBzZXJ2ZXIgY2FuIHJ1biBvbgotCSAqICAgIGEgcmVtb3RlIGhvc3QsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgY2Fubm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSZW1vdGVIb3N0cygpOwotCi0JLyoqCi0JICogU2VhcmNoZXMgZm9yIHNlcnZlcnMuIAotCSAqIEl0IHVzZXMgdGhlIGNhbGxiYWNrIGxpc3RlbmVyIHRvIHJlcG9ydCBzZXJ2ZXJzIHRoYXQgYXJlIGZvdW5kLgotCSAqIAotCSAqIEBwYXJhbSBob3N0IGEgaG9zdCBzdHJpbmcgY29uZm9ybWluZyB0byBSRkMgMjczMgotCSAqIEBwYXJhbSBsaXN0ZW5lciBhIGxpc3RlbmVyIHRvIHJlcG9ydCBzdGF0dXMgdG8KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2VhcmNoRm9yU2VydmVycyhTdHJpbmcgaG9zdCwgSVNlcnZlclNlYXJjaExpc3RlbmVyIGxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lTZXJ2ZXJNb25pdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JU2VydmVyTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODBkMTg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lTZXJ2ZXJNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLS8qKgotICogQW4gaW50ZXJmYWNlIHRvIGEgVENQL0lQIG1vbml0b3IuCi0gKiAKLSAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLjwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyTW9uaXRvciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIG1vbml0b3IuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCAobmFtZSkgb2YgdGhpcyBtb25pdG9yLgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBtb25pdG9yLgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFN0YXJ0IG1vbml0b3JpbmcgdGhlIGdpdmVuIHBvcnQsIGFuZCByZXR1cm4gdGhlIHBvcnQgbnVtYmVyIHRvCi0JICogdHVubmVsIHJlcXVlc3RzIHRocm91Z2guIFRoZSBtb25pdG9yUG9ydCBpcyB0aGUgbmV3IHBvcnQgdG8gdXNlLCBvcgotCSAqIC0xIHRvIHBpY2sgYSByYW5kb20gcG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gcG9ydAotCSAqIEByZXR1cm4KLQkgKi8KLQkvL3B1YmxpYyBpbnQgc3RhcnRNb25pdG9yaW5nKElTZXJ2ZXIgc2VydmVyLCBTZXJ2ZXJQb3J0IHBvcnQsIGludCBtb25pdG9yUG9ydCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTdG9wIG1vbml0b3JpbmcgdGhlIGdpdmVuIHBvcnQuCi0JICogCi0JICogQHBhcmFtIHBvcnQKLQkgKi8KLQkvL3B1YmxpYyB2b2lkIHN0b3BNb25pdG9yaW5nKElTZXJ2ZXIgc2VydmVyLCBTZXJ2ZXJQb3J0IHBvcnQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lTZXJ2ZXJNb25pdG9yTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSVNlcnZlck1vbml0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMWZhZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSVNlcnZlck1vbml0b3JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotLyoqCi0gKiAKLSAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLjwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyTW9uaXRvck1hbmFnZXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGFycmF5IG9mIHBvcnRzIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyBtb25pdG9yZWQuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBtb25pdG9yZWQgcG9ydHMgZm9yIHRoaXMgc2VydmVyCi0JICovCi0JcHVibGljIElNb25pdG9yZWRTZXJ2ZXJQb3J0W10gZ2V0TW9uaXRvcmVkUG9ydHMoSVNlcnZlciBzZXJ2ZXIpOwotCi0JLyoqCi0JICogU3RhcnRzIG1vbml0b3JpbmcgdGhlIGdpdmVuIHBvcnQsIGFuZCByZXR1cm5zIHRoZSBuZXcgcG9ydCAjIHRvIHVzZSB0aGF0IHdpbGwKLQkgKiByb3V0ZSB0byB0aGUgbW9uaXRvcmVkIHBvcnQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlcgotCSAqIEBwYXJhbSBwb3J0Ci0JICogQHBhcmFtIG1vbml0b3JQb3J0IC0gdGhlIG5ldyBwb3J0IG51bWJlciB0byB1c2UgZm9yIG1vbml0b3JpbmcsIG9yIC0xIHRvIHBpY2sgYSBuZXcgcG9ydAotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogQHJldHVybiBtb25pdG9yIHBvcnQgbnVtYmVyCi0JICovCi0JcHVibGljIElNb25pdG9yZWRTZXJ2ZXJQb3J0IGNyZWF0ZU1vbml0b3IoSVNlcnZlciBzZXJ2ZXIsIFNlcnZlclBvcnQgcG9ydCwgaW50IG1vbml0b3JQb3J0LCBTdHJpbmdbXSBjb250ZW50KTsKLQotCS8qKgotCSAqIFN0b3AgbW9uaXRvcmluZyB0aGUgZ2l2ZW4gcG9ydC4gVGhyb3dzIGEgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtCi0JICogc3RvcHBpbmcgdGhlIG1vbml0b3JpbmcKLQkgKgotCSAqIEBwYXJhbSBtc3AgdGhlIG1vbml0b3JlZCBwb3J0Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTW9uaXRvcihJTW9uaXRvcmVkU2VydmVyUG9ydCBtc3ApOwotCi0JLyoqCi0JICogU3RhcnQgdGhlIG1vbml0b3IuIElmIHRoZSBtc3AgcG9ydCBpcyAtMSwgaXQgd2lsbCBiZSB1cGRhdGVkIHRvIHRoZSBwb3J0IHRoYXQgaXMgYWN0dWFsbHkgaW4gdXNlLgotCSAqIAotCSAqIEBwYXJhbSBtc3AgdGhlIG1vbml0b3JlZCBwb3J0IAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcihJTW9uaXRvcmVkU2VydmVyUG9ydCBtc3ApIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU3RvcCBtb25pdG9yaW5nLgotCSAqIAotCSAqIEBwYXJhbSBtc3AgdGhlIG1vbml0b3JlZCBwb3J0Ci0JICovCi0JcHVibGljIHZvaWQgc3RvcE1vbml0b3IoSU1vbml0b3JlZFNlcnZlclBvcnQgbXNwKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vbml0b3JlZCBwb3J0IHRvIHVzZSB3aGVuIG1ha2luZyByZXF1ZXN0cyB0byB0aGUgZ2l2ZW4gc2VydmVyLCBwb3J0IG51bWJlciwKLQkgKiBhbmQgY29udGVudC4gUmV0dXJucyB0aGUgZXhpc3RpbmcgcG9ydCBudW1iZXIgaWYgdGhlIHBvcnQgaXMgbm90IGJlaW5nIG1vbml0b3JlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyCi0JICogQHBhcmFtIHBvcnQKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiBAcmV0dXJuIHRoZSBtb25pdG9yZWQgcG9ydCBudW1iZXIKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1vbml0b3JlZFBvcnQoSVNlcnZlciBzZXJ2ZXIsIGludCBwb3J0LCBTdHJpbmcgY29udGVudFR5cGUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lTdGFydHVwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JU3RhcnR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjEzMzA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lTdGFydHVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIHRoZSBzdGFydHVwIGV4dGVuc2lvbiBwb2ludC4KLSAqIFBsdWctaW5zIHRoYXQgcmVnaXN0ZXIgYSBzdGFydHVwIGV4dGVuc2lvbiB3aWxsIGJlIGFjdGl2YXRlZCB3aGVuIHRoZSBzZXJ2ZXIKLSAqIGNvcmUgcGx1Zy1pbiBpbml0aWFsaXplcyBhbmQgaGF2ZSBhbiBvcHBvcnR1bml0eSB0byBydW4gY29kZSB0aGF0IGNhbid0IGJlCi0gKiBpbXBsZW1lbnRlZCB1c2luZyB0aGUgbm9ybWFsIGNvbnRyaWJ1dGlvbiBtZWNoYW5pc21zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdGFydHVwIHsKLQkvKioKLQkgKiBXaWxsIGJlIGNhbGxlZCBvbiBzZXJ2ZXIgY29yZSBzdGFydHVwLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JbnN0YWxsYWJsZVJ1bnRpbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0luc3RhbGxhYmxlUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTFmNjk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0luc3RhbGxhYmxlUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLS8qKgotICogQGRlcHJlY2F0ZWQgKHNpbmNlIDMuMykgCi0gKiBUaGUgc3VwcG9ydCBmb3IgSW5zdGFsbGFibGVSdW50aW1lIGhhcyBiZWVuIG1vdmVkIHRvIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZGlzY292ZXJ5Ci0gKiBhbmQgaXMgbm93IHN1cHBvcnRlZCB0aHJvdWdoIHRoZSBwMiByZXBvc2l0b3J5IGxvb2t1cCBBUElzCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YWxsYWJsZVJ1bnRpbWUgaW1wbGVtZW50cyBJSW5zdGFsbGFibGVSdW50aW1lIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0JcHVibGljIEluc3RhbGxhYmxlUnVudGltZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0UGF0aCgpICsgIiI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGZWF0dXJlVmVyc2lvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZmVhdHVyZVZlcnNpb24iKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZUlkKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJmZWF0dXJlSWQiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QnVuZGxlSWQoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImJ1bmRsZUlkIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJ1bmRsZVZlcnNpb24oKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImJ1bmRsZVZlcnNpb24iKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgicGF0aCIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGcm9tU2l0ZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZmVhdHVyZVNpdGUiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBCdW5kbGUgZ2V0QnVuZGxlVmVyc2lvbihCdW5kbGVbXSBidW5kbGVzLCBTdHJpbmcgdmVyc2lvbikgewotCQlpZiAoYnVuZGxlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlpbnQgc2l6ZSA9IGJ1bmRsZXMubGVuZ3RoOwotCQlyZXR1cm4gYnVuZGxlc1tzaXplIC0gMV07Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsYWJsZVJ1bnRpbWUjaW5zdGFsbChJUGF0aCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKGZpbmFsIElQYXRoIHBhdGgpIHsKLQkJSm9iIGluc3RhbGxSdW50aW1lSm9iID0gbmV3IEpvYihNZXNzYWdlcy5qb2JJbnN0YWxsaW5nUnVudGltZSkgewotCQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJCQlyZXR1cm4gU2VydmVyUGx1Z2luLlBMVUdJTl9JRC5lcXVhbHMoZmFtaWx5KTsKLQkJCX0KLQkJCQotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCXRyeSB7Ci0JCQkJCWluc3RhbGwocGF0aCwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQlyZXR1cm4gY2UuZ2V0U3RhdHVzKCk7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQkKLQkJaW5zdGFsbFJ1bnRpbWVKb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkluc3RhbGxhYmxlUnVudGltZVsiICsgZ2V0SWQoKSArICJdIjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExpY2Vuc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zdGFsbChJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0luc3RhbGxhYmxlUnVudGltZTIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0luc3RhbGxhYmxlUnVudGltZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwZmQzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JbnN0YWxsYWJsZVJ1bnRpbWUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5HWklQSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLnRhci5UYXJFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwudGFyLlRhcklucHV0U3RyZWFtOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxhYmxlUnVudGltZTIgaW1wbGVtZW50cyBJSW5zdGFsbGFibGVSdW50aW1lIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgYnl0ZVtdIEJVRkZFUiA9IG51bGw7Ci0KLQkvLyBEZWZhdWx0IHNpemVzIChpbmZpbml0ZSBsb2dhcml0aG1pYyBwcm9ncmVzcyB3aWxsIGJlIHVzZWQgd2hlbiBkZWZhdWx0IGlzIGVtcGxveWVkKQotCXByaXZhdGUgaW50IERFRkFVTFRfRE9XTkxPQURfU0laRSA9IDEwMDAwMDAwOwotCXByaXZhdGUgaW50IERFRkFVTFRfRklMRV9DT1VOVCA9IDEwMDA7Ci0KLQlwdWJsaWMgSW5zdGFsbGFibGVSdW50aW1lMihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXJjaGl2ZVBhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFyY2hpdmVVcmwoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImFyY2hpdmVVcmwiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXJjaGl2ZVBhdGgoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImFyY2hpdmVQYXRoIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEFyY2hpdmVTaXplKCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNpemUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiYXJjaGl2ZVNpemUiKTsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHNpemUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RmlsZUNvdW50KCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNpemUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZmlsZUNvdW50Iik7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChzaXplKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExpY2Vuc2VVUkwoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImxpY2Vuc2VVcmwiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbGFibGVSdW50aW1lI2dldExpY2Vuc2UoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpY2Vuc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVN0cmluZyBsaWNlbnNlVVJMID0gZ2V0TGljZW5zZVVSTCgpOwotCQkJaWYgKGxpY2Vuc2VVUkwgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCQotCQkJdXJsID0gbmV3IFVSTChsaWNlbnNlVVJMKTsKLQkJCUlucHV0U3RyZWFtIGluID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCW91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCWNvcHlXaXRoU2l6ZShpbiwgb3V0LCBudWxsLCAwKTsKLQkJCXJldHVybiBuZXcgU3RyaW5nKG91dC50b0J5dGVBcnJheSgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJFcnJvciBsb2FkaW5nIGxpY2Vuc2UiLCBlKTsKLQkJCX0KLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwKLQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JJbnN0YWxsaW5nU2VydmVyLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSksIGUpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKG91dCAhPSBudWxsKQotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbGFibGVSdW50aW1lI2luc3RhbGwoSVBhdGgpCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChmaW5hbCBJUGF0aCBwYXRoKSB7Ci0JCUpvYiBpbnN0YWxsUnVudGltZUpvYiA9IG5ldyBKb2IoTWVzc2FnZXMuam9iSW5zdGFsbGluZ1J1bnRpbWUpIHsKLQkJCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCQkJcmV0dXJuIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQuZXF1YWxzKGZhbWlseSk7Ci0JCQl9Ci0JCQkKLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQl0cnkgewotCQkJCQlpbnN0YWxsKHBhdGgsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJcmV0dXJuIGNlLmdldFN0YXR1cygpOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJCi0JCWluc3RhbGxSdW50aW1lSm9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvcHlXaXRoU2l6ZShJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKEJVRkZFUiA9PSBudWxsKQotCQkJQlVGRkVSID0gbmV3IGJ5dGVbODE5Ml07Ci0JCVN1Yk1vbml0b3IgcHJvZ3Jlc3MgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgc2l6ZSk7Ci0JCWludCByID0gaW4ucmVhZChCVUZGRVIpOwotCQl3aGlsZSAociA+PSAwKSB7Ci0JCQlvdXQud3JpdGUoQlVGRkVSLCAwLCByKTsKLQkJCXByb2dyZXNzLndvcmtlZChyKTsKLQkJCXIgPSBpbi5yZWFkKEJVRkZFUik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG93bmxvYWQoSW5wdXRTdHJlYW0gaW4sIE91dHB1dFN0cmVhbSBvdXQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIG5hbWUsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoQlVGRkVSID09IG51bGwpCi0JCQlCVUZGRVIgPSBuZXcgYnl0ZVs4MTkyXTsKLQkJCi0JCVN0cmluZyBtc2cgPSBOTFMuYmluZCgoc2l6ZSA+IDApID8gTWVzc2FnZXMudGFza0Rvd25sb2FkU2l6ZUtub3duIDogTWVzc2FnZXMudGFza0Rvd25sb2FkU2l6ZVVua25vd24sCi0JCQkJbmV3IE9iamVjdCBbXSB7IG5hbWUsICJ7MH0iLCBJbnRlZ2VyLnRvU3RyaW5nKHNpemUgLyAxMDI0KSB9KTsKLQkJU3ViTW9uaXRvciBwcm9ncmVzcyA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBOTFMuYmluZChtc2csICIwIiksIChzaXplID4gMCkgPyBzaXplIDogREVGQVVMVF9ET1dOTE9BRF9TSVpFKTsKLQkJCi0JCWludCByID0gaW4ucmVhZChCVUZGRVIpOwotCQlpbnQgdG90YWwgPSAwOwotCQlpbnQgbGFzdFRvdGFsID0gMDsKLQkJd2hpbGUgKHIgPj0gMCkgewotCQkJb3V0LndyaXRlKEJVRkZFUiwgMCwgcik7Ci0JCQl0b3RhbCArPSByOwotCQkJaWYgKHRvdGFsID49IGxhc3RUb3RhbCArIDgxOTIpIHsKLQkJCQlsYXN0VG90YWwgPSB0b3RhbDsKLQkJCQlwcm9ncmVzcy5zdWJUYXNrKE5MUy5iaW5kKG1zZywgSW50ZWdlci50b1N0cmluZyhsYXN0VG90YWwgLyAxMDI0KSkpOwotCQkJfQotCQkJcHJvZ3Jlc3Mud29ya2VkKHIpOwotCQkJLy8gaWYgc2l6ZSBpcyBub3Qga25vd24sIHVzZSBpbmZpbml0ZSBsb2dhcml0aG1pYyBwcm9ncmVzcwotCQkJaWYgKHNpemUgPD0gMCkKLQkJCQlwcm9ncmVzcy5zZXRXb3JrUmVtYWluaW5nKERFRkFVTFRfRE9XTkxPQURfU0laRSk7Ci0JCQkKLQkJCWlmIChwcm9ncmVzcy5pc0NhbmNlbGVkKCkpCi0JCQkJYnJlYWs7Ci0JCQlyID0gaW4ucmVhZChCVUZGRVIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsYWJsZVJ1bnRpbWUjaW5zdGFsbChJUGF0aCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdWJNb25pdG9yIHByb2dyZXNzID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIDEwMDApOwotCQlVUkwgdXJsID0gbnVsbDsKLQkJRmlsZSB0ZW1wID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwoZ2V0QXJjaGl2ZVVybCgpKTsKLQkJCXRlbXAgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJydW50aW1lIiwgIiIpOwotCQkJdGVtcC5kZWxldGVPbkV4aXQoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJFcnJvciBjcmVhdGluZyB1cmwgYW5kIHRlbXAgZmlsZSIsIGUpOwotCQkJfQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9ySW5zdGFsbGluZ1NlcnZlciwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpLCBlKSk7Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSB1cmwuZ2V0UGF0aCgpOwotCQlpbnQgc2xhc2hJZHggPSBuYW1lLmxhc3RJbmRleE9mKCcvJyk7Ci0JCWlmIChzbGFzaElkeCA+PSAwKQotCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKHNsYXNoSWR4ICsgMSk7Ci0JCQotCQlpbnQgYXJjaGl2ZVNpemUgPSBnZXRBcmNoaXZlU2l6ZSgpOwotCQkKLQkJLy8gZG93bmxvYWQKLQkJRmlsZU91dHB1dFN0cmVhbSBmb3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlucHV0U3RyZWFtIGluID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCWZvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wKTsKLQkJCWRvd25sb2FkKGluLCBmb3V0LCBwcm9ncmVzcy5uZXdDaGlsZCg1MDApLCBuYW1lLCBhcmNoaXZlU2l6ZSk7Ci0JCQlwcm9ncmVzcy5zZXRXb3JrUmVtYWluaW5nKDUwMCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkVycm9yIGRvd25sb2FkaW5nIHJ1bnRpbWUiLCBlKTsKLQkJCX0KLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwKLQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvckluc3RhbGxpbmdTZXJ2ZXIsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKSwgZSkpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZm91dCAhPSBudWxsKQotCQkJCQlmb3V0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJaWYgKHByb2dyZXNzLmlzQ2FuY2VsZWQoKSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKFN0YXR1cy5DQU5DRUxfU1RBVFVTKTsKLQkJCi0JCUZpbGVJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGVtcCk7Ci0JCQlpZiAobmFtZS5lbmRzV2l0aCgiemlwIikpCi0JCQkJdW56aXAoaW4sIHBhdGgsIHByb2dyZXNzLm5ld0NoaWxkKDUwMCkpOwotCQkJZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgidGFyIikpCi0JCQkJdW50YXIoaW4sIHBhdGgsIHByb2dyZXNzLm5ld0NoaWxkKDUwMCkpOwotCQkJZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgidGFyLmd6IikpIHsKLQkJCQlGaWxlIHRhckZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJydW50aW1lIiwgIi50YXIiKTsKLQkJCQl0YXJGaWxlLmRlbGV0ZU9uRXhpdCgpOwotCQkJCVN0cmluZyB0YXJOYW1lID0gbmFtZTsKLQkJCQlpZiAoc2xhc2hJZHggPj0gMCkKLQkJCQkJdGFyTmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSAzKTsKLQkJCQkKLQkJCQlwcm9ncmVzcy5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLnRhc2tVbmNvbXByZXNzaW5nLCB0YXJOYW1lKSk7Ci0JCQkJaW50IHRlbXBTaXplID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCQkJaWYgKHRlbXAubGVuZ3RoKCkgPCBJbnRlZ2VyLk1BWF9WQUxVRSkKLQkJCQkJdGVtcFNpemUgPSAoaW50KXRlbXAubGVuZ3RoKCk7Ci0JCQkJCi0JCQkJdW5nemlwKGluLCB0YXJGaWxlLCBwcm9ncmVzcy5uZXdDaGlsZCgyNTApLCB0ZW1wU2l6ZSk7Ci0JCQkJcHJvZ3Jlc3Muc2V0V29ya1JlbWFpbmluZygyNTApOwotCQkJCWlmICghcHJvZ3Jlc3MuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0YXJGaWxlKTsKLQkJCQkJdW50YXIoaW4sIHBhdGgsIHByb2dyZXNzLm5ld0NoaWxkKDI1MCkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgdW5jb21wcmVzc2luZyBydW50aW1lIiwgZSk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JJbnN0YWxsaW5nU2VydmVyLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSksIGUpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQlwcm9ncmVzcy5kb25lKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVbnppcCB0aGUgaW5wdXQgc3RyZWFtIGludG8gdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIGluCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgdW56aXAoSW5wdXRTdHJlYW0gaW4sIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGZpbGVDbnQgPSBnZXRGaWxlQ291bnQoKTsKLQkJU3ViTW9uaXRvciBwcm9ncmVzcyA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCAoZmlsZUNudCA+IDApID8gZmlsZUNudCA6IERFRkFVTFRfRklMRV9DT1VOVCk7Ci0JCVN0cmluZyBhcmNoaXZlUGF0aCA9IGdldEFyY2hpdmVQYXRoKCk7Ci0JCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW4pOwotCQlaaXBJbnB1dFN0cmVhbSB6aW4gPSBuZXcgWmlwSW5wdXRTdHJlYW0oYmluKTsKLQkJWmlwRW50cnkgZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCk7Ci0JCXdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLQkJCXByb2dyZXNzLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMudGFza1VuY29tcHJlc3NpbmcsIG5hbWUpKTsKLQkJCWlmIChhcmNoaXZlUGF0aCAhPSBudWxsICYmIG5hbWUuc3RhcnRzV2l0aChhcmNoaXZlUGF0aCkpIHsKLQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoYXJjaGl2ZVBhdGgubGVuZ3RoKCkpOwotCQkJCWlmIChuYW1lLmxlbmd0aCgpID4gMSkKLQkJCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOwotCQkJfQotCQkJCi0JCQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpCi0JCQkJCXBhdGguYXBwZW5kKG5hbWUpLnRvRmlsZSgpLm1rZGlycygpOwotCQkJCWVsc2UgewotCQkJCQlGaWxlT3V0cHV0U3RyZWFtIGZvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoLmFwcGVuZChuYW1lKS50b0ZpbGUoKSk7Ci0JCQkJCWNvcHlXaXRoU2l6ZSh6aW4sIGZvdXQsIHByb2dyZXNzLm5ld0NoaWxkKDEpLCAoaW50KWVudHJ5LmdldFNpemUoKSk7Ci0JCQkJCWZvdXQuY2xvc2UoKTsKLQkJCQkJLy8gaWYgY291bnQgaXMgbm90IGtub3duLCB1c2UgaW5maW5pdGUgbG9nYXJpdGhtaWMgcHJvZ3Jlc3MKLQkJCQkJaWYgKGZpbGVDbnQgPD0gMCkKLQkJCQkJCXByb2dyZXNzLnNldFdvcmtSZW1haW5pbmcoREVGQVVMVF9GSUxFX0NPVU5UKTsKLQkJCQl9Ci0JCQl9Ci0JCQl6aW4uY2xvc2VFbnRyeSgpOwotCQkJZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCk7Ci0JCX0KLQkJemluLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogVW50YXIgdGhlIGlucHV0IHN0cmVhbSBpbnRvIHRoZSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBpbgotCSAqIEBwYXJhbSBwYXRoCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW50YXIoSW5wdXRTdHJlYW0gaW4sIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGZpbGVDbnQgPSBnZXRGaWxlQ291bnQoKTsKLQkJU3ViTW9uaXRvciBwcm9ncmVzcyA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCAoZmlsZUNudCA+IDApID8gZmlsZUNudCA6IDUwMCk7Ci0JCVN0cmluZyBhcmNoaXZlUGF0aCA9IGdldEFyY2hpdmVQYXRoKCk7Ci0JCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW4pOwotCQlUYXJJbnB1dFN0cmVhbSB6aW4gPSBuZXcgVGFySW5wdXRTdHJlYW0oYmluKTsKLQkJVGFyRW50cnkgZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCk7Ci0JCXdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLQkJCXByb2dyZXNzLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMudGFza1VuY29tcHJlc3NpbmcsIG5hbWUpKTsKLQkJCWlmIChhcmNoaXZlUGF0aCAhPSBudWxsICYmIG5hbWUuc3RhcnRzV2l0aChhcmNoaXZlUGF0aCkpIHsKLQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoYXJjaGl2ZVBhdGgubGVuZ3RoKCkpOwotCQkJCWlmIChuYW1lLmxlbmd0aCgpID4gMSkKLQkJCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOwotCQkJfQotCQkJCi0JCQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaWYgKGVudHJ5LmdldEZpbGVUeXBlKCkgPT0gVGFyRW50cnkuRElSRUNUT1JZKQotCQkJCQlwYXRoLmFwcGVuZChuYW1lKS50b0ZpbGUoKS5ta2RpcnMoKTsKLQkJCQllbHNlIHsKLQkJCQkJRmlsZSBkaXIgPSBwYXRoLmFwcGVuZChuYW1lKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9GaWxlKCk7Ci0JCQkJCWlmICghZGlyLmV4aXN0cygpKQotCQkJCQkJZGlyLm1rZGlycygpOwotCQkJCQkKLQkJCQkJRmlsZU91dHB1dFN0cmVhbSBmb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGF0aC5hcHBlbmQobmFtZSkudG9GaWxlKCkpOwotCQkJCQljb3B5V2l0aFNpemUoemluLCBmb3V0LCBwcm9ncmVzcy5uZXdDaGlsZCgxKSwgKGludCllbnRyeS5nZXRTaXplKCkpOwotCQkJCQlmb3V0LmNsb3NlKCk7Ci0JCQkJCWlmIChmaWxlQ250IDw9IDApCi0JCQkJCQlwcm9ncmVzcy5zZXRXb3JrUmVtYWluaW5nKDUwMCk7Ci0JCQkJfQotCQkJfQotCQkJZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCk7Ci0JCX0KLQkJemluLmNsb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdW5nemlwKElucHV0U3RyZWFtIGluLCBGaWxlIHRhckZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUdaSVBJbnB1dFN0cmVhbSBnemluID0gbnVsbDsKLQkJRmlsZU91dHB1dFN0cmVhbSBmb3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWd6aW4gPSBuZXcgR1pJUElucHV0U3RyZWFtKGluKTsKLQkJCWZvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJGaWxlKTsKLQkJCWNvcHlXaXRoU2l6ZShnemluLCBmb3V0LCBtb25pdG9yLCBzaXplKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChnemluICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlnemluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQkJaWYgKGZvdXQgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJZm91dC5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiSW5zdGFsbGFibGVSdW50aW1lMlsiICsgZ2V0SWQoKSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTGF1bmNoYWJsZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0xhdW5jaGFibGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMjBjN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTGF1bmNoYWJsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuKjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hhYmxlQWRhcHRlciBpbXBsZW1lbnRzIElMYXVuY2hhYmxlQWRhcHRlciB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUgZGVsZWdhdGU7Ci0KLQkvKioKLQkgKiBMYXVuY2hhYmxlQWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHVibGljIExhdW5jaGFibGVBZGFwdGVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBMYXVuY2hhYmxlQWRhcHRlci4KLQkgKgotCSAqIEByZXR1cm4gYW4gaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVsYXRpdmUgcHJpb3JpdHkgb2YgdGhpcyBhZGFwdGVyLgotCSAqCi0JICogQHJldHVybiBhIHByaW9yaXR5Ci0JICovCi0JcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJwcmlvcml0eSIpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcHVibGljIExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB7Ci0JCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWRlbGVnYXRlID0gKExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSIgKyB0b1N0cmluZygpLCB0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUxhdW5jaGFibGVBZGFwdGVyI2dldExhdW5jaGFibGUoSVNlcnZlciwgSU1vZHVsZUFydGlmYWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGF1bmNoYWJsZShJU2VydmVyIHNlcnZlciwgSU1vZHVsZUFydGlmYWN0IG9iamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKCkuZ2V0TGF1bmNoYWJsZShzZXJ2ZXIsIG9iamVjdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXRocm93IGNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCBlKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gYSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkxhdW5jaGFibGVBZGFwdGVyWyIgKyBnZXRJZCgpICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzM2RjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotICogVHJhbnNsYXRlZCBtZXNzYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUnVudGltZU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEdXBsaWNhdGVSdW50aW1lTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclNhdmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckxvYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDYW5ub3RBZGRNb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFZlbmRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0VmVyc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0aW5nVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0U2VydmVyUHJvamVjdE5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFJ1bnRpbWVOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRSdW50aW1lTmFtZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFNlcnZlck5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFNlcnZlck5hbWUyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRTZXJ2ZXJOYW1lMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0U2VydmVyTmFtZTQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JXb3JraW5nQ29weVRpbWVzdGFtcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclB1Ymxpc2hTdGFydGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclB1Ymxpc2hOb1J1bnRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQdWJsaXNoTm9Db25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTm9Db25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hpbmdTdGF0dXNJbmZvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hpbmdTdGF0dXNXYXJuaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hpbmdTdGF0dXNFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclB1Ymxpc2hpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaGluZ1N0b3A7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaGluZ01vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoZWRNb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTdGFydFRpbWVvdXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTdGFydEZhaWxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclN0b3BGYWlsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JSZXN0YXJ0VGltZW91dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclJlc3RhcnRGYWlsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JNb2R1bGVSZXN0YXJ0RmFpbGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySW5zdGFsbGluZ1NlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckluc3RhbGxpbmdTZXJ2ZXJGZWF0dXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUmVzdGFydE1vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclB1Ymxpc2hNb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FuU3RhcnRFcnJvclN0YXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTGF1bmNoTW9kZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclJlc3RhcnROb3RTdGFydGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU3RvcEFscmVhZHlTdG9wcGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vZHVsZVR5cGVVbmtub3duOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvYlN0YXJ0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvYlN0b3BwaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvYlJlc3RhcnRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgam9iVXBkYXRpbmdTZXJ2ZXJzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvYlVwZGF0ZVNlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBqb2JJbnN0YWxsaW5nUnVudGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck1pc3NpbmdBZGFwdGVyOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yQ29weWluZ0ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEZWxldGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck1rZGlyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlpbmdUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUmVhZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNyZWF0aW5nWmlwRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclJlbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vdEFEaXJlY3Rvcnk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vUnVudGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckZhY2V0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza01vZGlmeU1vZHVsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1BlcmZvcm1pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1VuY29tcHJlc3Npbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0Rvd25sb2FkU2l6ZUtub3duOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tEb3dubG9hZFNpemVVbmtub3duOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhTZXJ2ZXJQbHVnaW4uUExVR0lOX0lEICsgIi5pbnRlcm5hbC5NZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZWY5MTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgLS0tLS0tLS0tLS0tLS0tIFRhc2tzIChwcm9ncmVzcyBtb25pdG9ycykgLS0tLS0tLS0tLS0tLS0tCi1zYXZpbmdUYXNrPVNhdmluZyB7MH0KLWRlbGV0aW5nVGFzaz1EZWxldGluZyB7MH0KLQotdGFza1BlcmZvcm1pbmc9UGVyZm9ybWluZyBUYXNrcwotdGFza01vZGlmeU1vZHVsZXM9QWRkaW5nIGFuZC9vciByZW1vdmluZyByZXNvdXJjZXMuCi10YXNrVW5jb21wcmVzc2luZz1VbmNvbXByZXNzaW5nOiB7MH0KLXRhc2tEb3dubG9hZFNpemVLbm93bj1Eb3dubG9hZGluZzogezB9LCByZWNlaXZlZCB7MX0gb2YgezJ9IGtieXRlcwotdGFza0Rvd25sb2FkU2l6ZVVua25vd249RG93bmxvYWRpbmc6IHswfSwgcmVjZWl2ZWQgezF9IGtieXRlcwotCi1wdWJsaXNoaW5nPVB1Ymxpc2hpbmcgdG8gezB9Li4uCi1wdWJsaXNoaW5nU3RhdHVzSW5mbz1QdWJsaXNoaW5nIGNvbXBsZXRlZCB3aXRoIGluZm9ybWF0aW9uCi1wdWJsaXNoaW5nU3RhdHVzV2FybmluZz1QdWJsaXNoaW5nIGNvbXBsZXRlZCB3aXRoIGEgd2FybmluZwotcHVibGlzaGluZ1N0YXR1c0Vycm9yPVB1Ymxpc2hpbmcgZmFpbGVkCi1wdWJsaXNoaW5nU3RvcD1EaXNjb25uZWN0aW5nIGZyb20gc2VydmVyCi0KLXB1Ymxpc2hpbmdNb2R1bGU9UHVibGlzaGluZzogezB9Ci1wdWJsaXNoZWRNb2R1bGU9ezB9IHB1Ymxpc2hlZCBzdWNjZXNzZnVsbHkKLQotam9iU3RhcnRpbmc9U3RhcnRpbmcgezB9Ci1qb2JTdG9wcGluZz1TdG9wcGluZyB7MH0KLWpvYlJlc3RhcnRpbmc9UmVzdGFydGluZyB7MH0KLWpvYlVwZGF0aW5nU2VydmVycz1VcGRhdGluZyBzZXJ2ZXIgc3RhdHVzCi1qb2JVcGRhdGVTZXJ2ZXI9VXBkYXRpbmcgc3RhdHVzIGZvciB7MH0uLi4KLWpvYkluc3RhbGxpbmdSdW50aW1lPUluc3RhbGxpbmcgc2VydmVyIHJ1bnRpbWUgZW52aXJvbm1lbnQKLQotIyAtLS0tLS0tLS0tLS0tLS0gTWlzYyBVSSAtLS0tLS0tLS0tLS0tLS0KLQotIyBFcnJvciBNZXNzYWdlcwotZXJyb3JQdWJsaXNoaW5nPUNvdWxkIG5vdCBwdWJsaXNoIHRvIHRoZSBzZXJ2ZXIuCi1lcnJvck5vQ29uZmlndXJhdGlvbj1UaGUgc2VydmVyIGhhcyBubyBjb25maWd1cmF0aW9uLgotZXJyb3JMb2FkaW5nPUVycm9yIGxvYWRpbmcgZnJvbSB7MH0uCi1lcnJvclNhdmluZz1Db3VsZCBub3Qgc2F2ZSB0byB7MH0uCi1lcnJvck1vZHVsZVJlc3RhcnRGYWlsZWQ9Q291bGQgbm90IHJlc3RhcnQgdGhlIG1vZHVsZS4KLWVycm9yV29ya2luZ0NvcHlUaW1lc3RhbXA9Q291bGQgbm90IHNhdmUgYmVjYXVzZSB0aGUgZmlsZSBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGUgc3RhcnQgb2YgZWRpdGluZy4KLWVycm9yUnVudGltZU5hbWU9RW50ZXIgYSBuYW1lIGZvciB0aGUgcnVudGltZSBlbnZpcm9ubWVudC4KLWVycm9yRHVwbGljYXRlUnVudGltZU5hbWU9VGhlIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2UuIFNwZWNpZnkgYSBkaWZmZXJlbnQgbmFtZS4KLWVycm9yU3RhcnRUaW1lb3V0PVNlcnZlciB7MH0gd2FzIHVuYWJsZSB0byBzdGFydCB3aXRoaW4gezF9IHNlY29uZHMuIElmIHRoZSBzZXJ2ZXIgcmVxdWlyZXMgbW9yZSB0aW1lLCB0cnkgaW5jcmVhc2luZyB0aGUgdGltZW91dCBpbiB0aGUgc2VydmVyIGVkaXRvci4KLWVycm9yU3RhcnRGYWlsZWQ9U2VydmVyIHswfSBmYWlsZWQgdG8gc3RhcnQuCi1lcnJvclN0b3BGYWlsZWQ9U2VydmVyIHswfSBmYWlsZWQgdG8gc3RvcC4KLWVycm9yUmVzdGFydFRpbWVvdXQ9U2VydmVyIHswfSBmYWlsZWQgdG8gcmVzdGFydCB3aXRoaW4gezF9IHNlY29uZHMuCi1lcnJvclJlc3RhcnRGYWlsZWQ9U2VydmVyIHswfSBmYWlsZWQgdG8gcmVzdGFydC4KLWVycm9yQ2Fubm90QWRkTW9kdWxlPVRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB2ZXJzaW9uIHsxfSBvZiB0aGUgezB9IHNwZWNpZmljYXRpb24uCi1lcnJvckluc3RhbGxpbmdTZXJ2ZXI9RXJyb3Igb2NjdXJyZWQgaW5zdGFsbGluZyBzZXJ2ZXI6IHswfQotZXJyb3JJbnN0YWxsaW5nU2VydmVyRmVhdHVyZT1Db3VsZCBub3QgZG93bmxvYWQgYW5kIGluc3RhbGwgdXBkYXRlIGZlYXR1cmUuCi0KLSMgRGVmYXVsdCBzZXJ2ZXIgY3JlYXRpb24gbmFtZXMKLSMgezB9IHdpbGwgYmUgcmVwbGFjZWQgYnkgYSBudW1iZXIgaWYgdGhlIGdpdmVuIG5hbWUgaXMgYWxyZWFkeSBiZWluZyB1c2VkCi1kZWZhdWx0U2VydmVyUHJvamVjdE5hbWU9U2VydmVyc3swfQotZGVmYXVsdFJ1bnRpbWVOYW1lPXswfQotZGVmYXVsdFJ1bnRpbWVOYW1lMj17MH0gKHsxfSkKLWRlZmF1bHRTZXJ2ZXJOYW1lPXswfSBhdCB7MX0KLWRlZmF1bHRTZXJ2ZXJOYW1lMj17MH0gYXQgezF9ICh7Mn0pCi1kZWZhdWx0U2VydmVyTmFtZTM9ezB9Ci1kZWZhdWx0U2VydmVyTmFtZTQ9ezB9ICh7MX0pCi0KLSMgVXNlZCB3aGVuIGEgbmFtZSBjYW4ndCBiZSBmb3VuZAotZGVmYXVsdFZlbmRvcj1CYXNpYwotZGVmYXVsdFZlcnNpb249Tm9uZQotbW9kdWxlVHlwZVVua25vd249VW5rbm93biBtb2R1bGUKLQotY2FuU3RhcnRFcnJvclN0YXRlPVRoZSBzZXJ2ZXIgY2Fubm90IHN0YXJ0IGJlY2F1c2UgaXQgaXMgY3VycmVudGx5IHN0YXJ0aW5nIG9yIHN0b3BwaW5nLiBXYWl0IGZvciB0aGUgY3VycmVudCBvcGVyYXRpb24gdG8gY29tcGxldGUuCi1lcnJvckxhdW5jaE1vZGU9VGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBnaXZlbiBsYXVuY2ggbW9kZS4KLWVycm9yUmVzdGFydE5vdFN0YXJ0ZWQ9Q2Fubm90IHJlc3RhcnQgdGhlIHNlcnZlciBiZWNhdXNlIGl0IGlzIG5vdCBjdXJyZW50bHkgcnVubmluZy4KLWVycm9yUHVibGlzaFN0YXJ0aW5nPUNhbm5vdCBwdWJsaXNoIHRvIHRoZSBzZXJ2ZXIgYmVjYXVzZSBpdCBpcyBjdXJyZW50bHkgc3RhcnRpbmcgb3Igc3RvcHBpbmcuCi1lcnJvclB1Ymxpc2hOb1J1bnRpbWU9Q2Fubm90IHB1Ymxpc2ggdG8gdGhlIHNlcnZlciBiZWNhdXNlIGl0IGlzIG1pc3NpbmcgaXRzIHJ1bnRpbWUgZW52aXJvbm1lbnQuCi1lcnJvclB1Ymxpc2hOb0NvbmZpZ3VyYXRpb249Q2Fubm90IHB1Ymxpc2ggdG8gdGhlIHNlcnZlciBiZWNhdXNlIHRoZSBjb25maWd1cmF0aW9uIGlzIG1pc3NpbmcuCi1lcnJvclN0b3BBbHJlYWR5U3RvcHBlZD1UaGUgc2VydmVyIGNhbm5vdCBiZSBzdG9wcGVkIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBzdG9wcGVkIG9yIHN0b3BwaW5nLgotZXJyb3JSZXN0YXJ0TW9kdWxlPVRoZSBtb2R1bGUgY2Fubm90IGJlIHJlc3RhcnRlZC4KLWVycm9yUHVibGlzaE1vZHVsZT1UaGUgbW9kdWxlIGNhbm5vdCBiZSBwdWJsaXNoZWQuCi1lcnJvck1pc3NpbmdBZGFwdGVyPUNvdWxkIG5vdCBsb2FkIHNlcnZlciBhZGFwdGVyLiBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlLgotCi1lcnJvckNvcHlpbmdGaWxlPUVycm9yIGNvcHlpbmcgZmlsZSB7MH06IHsxfQotZXJyb3JEZWxldGluZz1Db3VsZCBub3QgZGVsZXRlIHswfS4gTWF5IGJlIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MuCi1lcnJvck1rZGlyPUNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5IHswfS4KLWNvcHlpbmdUYXNrPUNvcHlpbmcgZnJvbSB7MH0gdG8gezF9Ci1lcnJvclJlYWRpbmc9RXJyb3IgcmVhZGluZyBmaWxlIHswfQotZXJyb3JDcmVhdGluZ1ppcEZpbGU9RXJyb3IgY3JlYXRpbmcgemlwIGZpbGUgezB9OiB7MX0KLWVycm9yUmVuYW1lPUNvdWxkIG5vdCByZXBsYWNlIHdpdGggdGVtcCBmaWxlIHswfS4KLWVycm9yTm90QURpcmVjdG9yeT1Db3VsZCBub3QgZGVsZXRlIHswfSBzaW5jZSBpdCBpcyBub3QgYSBkaXJlY3RvcnkuCi0KLWVycm9yTm9SdW50aW1lPUNhbm5vdCB2ZXJpZnkgZmFjZXRzIGJlY2F1c2UgdGhlcmUgaXMgbm8gcnVudGltZSBlbnZpcm9ubWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZlci4KLWVycm9yRmFjZXQ9UHJvamVjdCBmYWNldCB7MH0gdmVyc2lvbiB7MX0gaXMgbm90IHN1cHBvcnRlZC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjY0OGU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZURlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZSBpbXBsZW1lbnRzIElNb2R1bGUgewotCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCXByb3RlY3RlZCBNb2R1bGVGYWN0b3J5IGZhY3Rvcnk7Ci0JcHJvdGVjdGVkIE1vZHVsZVR5cGUgbW9kdWxlVHlwZTsKLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQlwcm90ZWN0ZWQgTW9kdWxlRGVsZWdhdGUgZGVsZWdhdGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBpZDI7Ci0KLQkvKioKLQkgKiBNb2R1bGUgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGZhY3RvcnkKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIHZlcnNpb24KLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqLwotCXB1YmxpYyBNb2R1bGUoTW9kdWxlRmFjdG9yeSBmYWN0b3J5LCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZlcnNpb24sIElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJdGhpcy5tb2R1bGVUeXBlID0gTW9kdWxlVHlwZS5nZXRNb2R1bGVUeXBlKHR5cGUsIHZlcnNpb24pOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpCi0JCQlpZDIgPSBmYWN0b3J5LmdldElkKCkgKyAiOiI7Ci0JCWVsc2UKLQkJCWlkMiA9ICI6IjsKLQkJaWQyICs9IGlkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgbW9kdWxlLgotCSAqCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludGVybmFsIChwYXJ0aWFsKSBpZCBvZiB0aGlzIG1vZHVsZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHBhcnRpYWwgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEludGVybmFsSWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgbW9kdWxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSB0eXBlCi0JICovCi0JcHVibGljIElNb2R1bGVUeXBlIGdldE1vZHVsZVR5cGUoKSB7Ci0JCXJldHVybiBtb2R1bGVUeXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtiZW5jaCBwcm9qZWN0IHRoYXQgdGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluLAotCSAqIG9yIG51bGwgaWYgdGhlIG1vZHVsZSBpcyBvdXRzaWRlIG9mIHRoZSB3b3Jrc3BhY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJvamVjdCB0aGF0IHRoZSBtb2R1bGUgaXMgY29udGFpbmVkIGluCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qCi0JICogQHNlZSBJTW9kdWxlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+TW9kdWxlRmFjdG9yeTwvY29kZT4gdGhhdCBjcmVhdGVkIHRoaXMgbW9kdWxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSBmYWN0b3J5IHRoYXQgY3JlYXRlZCB0aGlzIG1vZHVsZQotCSAqLwotCXB1YmxpYyBNb2R1bGVGYWN0b3J5IGdldE1vZHVsZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXByb3RlY3RlZCBNb2R1bGVEZWxlZ2F0ZSBnZXREZWxlZ2F0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGU7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCWRlbGVnYXRlID0gZmFjdG9yeS5nZXREZWxlZ2F0ZShtb25pdG9yKS5nZXRNb2R1bGVEZWxlZ2F0ZSh0aGlzKTsKLQkJCQkJZGVsZWdhdGUuaW5pdGlhbGl6ZSh0aGlzKTsKLQkJCQkJaWYgKFRyYWNlLlBFUkZPUk1BTkNFKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfUEVSRk9STUFOQ0UsICJNb2R1bGUuZ2V0RGVsZWdhdGUoKTogPCIKLQkJCQkJCQkJKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSArICIgIiArIGZhY3RvcnkuZ2V0SWQoKSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCB0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgbW9kdWxlcyBvZiB0aGlzIG1vZHVsZS4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBtb2R1bGVzCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRDaGlsZE1vZHVsZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUobW9uaXRvcikuZ2V0Q2hpbGRNb2R1bGVzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgZ2V0Q2hpbGRNb2R1bGVzKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhpcyBtb2R1bGUuCi0JICogPHA+Ci0JICogW2lzc3VlOiBDb25qZWN0dXJlOiBFYWNoIGRpZmZlcmVudCB0eXBlIG9mIG1vZHVsZSBwcmVzY3JpYmVzCi0JICogbGVnYWwgYXJyYW5nZW1lbnRzIG9mLCBhbmQgdGhlIHNpZ25pZmljYW5jZSBvZiwgdGhlIGZpbGVzIHdpdGhpbgotCSAqIGl0LiBUaGlzIHdvdWxkIGJlIHNwZWxsZWQgb3V0IGluIHRoZSBzcGVjIGZvciB0aGUgcGFydGljdWxhcgotCSAqIG1vZHVsZSB0eXBlcy4KLQkgKiBUaGlzIHZhbGlkYXRlIG9wZXJhdGlvbiBpcyBzdXBwb3NlIHRvIGNoZWNrIHRoZSBhY3R1YWwKLQkgKiBhcnJhbmdlbWVudCBvZiBmaWxlcyBpbiB0aGlzIG1vZHVsZSB0byBzZWUgd2hldGhlciB0aGV5Ci0JICogbWVldCBleHBlY3RhdGlvbnMuCi0JICogSXQncyBhbiBvcGVuIHF1ZXN0aW9uIGFzIHRvIGhvdyAic3RyZW51b3VzIiBhIGNoZWNrIHRoaXMKLQkgKiBpcy5dCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogT2xkIGNvbW1lbnQgc2FpZDogIklmIHRoZXJlIGlzIGFuIGVycm9yCi0JICogdGhhdCBzaG91bGQgYmxvY2sgdGhlIHNlcnZlciBmcm9tIHN0YXJ0aW5nIChlLmcuIG1ham9yIGVycm9ycykKLQkgKiBpdCBzaG91bGQgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZC4gVGhpcyBtZXRob2QgY2FuIGFsc28gYmUgdXNlZCB0bwotCSAqIHJldHVybiB3YXJuaW5nIGZvciBzdWNoIHRoaW5ncyBhcyBhbiBvcGVuIChhbmQgZGlydHkpIGVkaXRvci4iXQotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IEFsbCBleGlzdGluZyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyByZXR1cm4gbnVsbCwKLQkgKiB3aGljaCBpcyBpbGxlZ2FsLl0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBPbGQgY29tbWVudCBzYWlkOiAiUmV0dXJucyBhbiBJU3RhdHVzIHRoYXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhpcyBvYmplY3QgY2FuCi0JICogYmUgcHVibGlzaGVkIHRvIHRoZSBzZXJ2ZXIuIiBTaW5jZSB0aGUgc2FtZSBtb2R1bGUgY2FuCi0JICogYmUgYXNzb2NpYXRlZCB3aXRoIGFueSBudW1iZXIgb2Ygc2VydmVycywgInRoZSBzZXJ2ZXIiIGlzCi0JICogaWxsLWRlZmluZWQuXQotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IE9sZCBjb21tZW50IHNhaWQ6ICJTaG91bGQgcmV0dXJuIGFuIGVycm9yIGlmIHRoZXJlCi0JICogaXMgYSBtYWpvciBwcm9ibGVtIHdpdGggdGhlIHJlc291cmNlcywgb3IgY2FuIGJlIHVzZWQgdG8KLQkgKiByZXR1cm4gd2FybmluZ3Mgb24gdW5zYXZlZCBmaWxlcywgZXRjLiIgSXQgaXMgdXN1YWxseQotCSAqIGRpZmZpY3VsdCBpbiBwcmluY2lwbGUgZm9yIGNvcmUtbGV2ZWwgaW5mcmFzdHJ1Y3R1cmUgdG8KLQkgKiBkZXRlY3Qgd2hldGhlciB0aGVyZSBhcmUgb3BlbiBlZGl0b3JzIHdpdGggdW5zYXZlZCBjaGFuZ2VzLl0KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0JICogICAgcHJvZ3Jlc3MgcmVwb3J0aW5nIGlzIHJlcXVpcmVkCi0JICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBnaXZlbgotCSAqICAgIG1vZHVsZSBpcyB2YWxpZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMKLQkgKiAgICB3cm9uZyB3aXRoIGl0Ci0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUobW9uaXRvcikudmFsaWRhdGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSB2YWxpZGF0ZSgpICIgKyB0b1N0cmluZygpLCBlKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kdWxlI2dldEFkYXB0ZXIoQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWlmIChhZGFwdGVyLmlzSW5zdGFuY2UoZGVsZWdhdGUpKQotCQkJCXJldHVybiBkZWxlZ2F0ZTsKLQkJfQotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZHVsZSNsb2FkQWRhcHRlcihDbGFzcywgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGxvYWRBZGFwdGVyKENsYXNzIGFkYXB0ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlnZXREZWxlZ2F0ZShtb25pdG9yKTsKLQkJaWYgKGFkYXB0ZXIuaXNJbnN0YW5jZShkZWxlZ2F0ZSkpCi0JCQlyZXR1cm4gZGVsZWdhdGU7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmxvYWRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IHRoaXMpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWlmICghKG9iaiBpbnN0YW5jZW9mIElNb2R1bGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJSU1vZHVsZSBtID0gKElNb2R1bGUpIG9iajsKLQkJaWYgKCFpZDIuZXF1YWxzKG0uZ2V0SWQoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgbS5nZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiAhcHJvamVjdC5lcXVhbHMobS5nZXRQcm9qZWN0KCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvL2lmICghZ2V0TW9kdWxlVHlwZSgpLmVxdWFscyhtLmdldE1vZHVsZVR5cGUoKSkpCi0JCS8vCXJldHVybiBmYWxzZTsKLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCByZXN1bHQgPSBpZDIuaGFzaENvZGUoKSArIDE3OwotCQlpZiAocHJvamVjdCAhPSBudWxsKQotCQkJcmVzdWx0ICs9IHByb2plY3QuaGFzaENvZGUoKSAqIDM3OwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlI2lzRXh0ZXJuYWwoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZSNleGlzdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiTW9kdWxlWyIgKyBuYW1lICsgIiwiICsgaWQyICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVBcnRpZmFjdEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUFydGlmYWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2FmMDJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUFydGlmYWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVBcnRpZmFjdEFkYXB0ZXIgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBFeHByZXNzaW9uIGZDb250ZXh0dWFsTGF1bmNoRXhwciA9IG51bGw7Ci0JcHJpdmF0ZSBNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCS8qKgotCSAqIE1vZHVsZUFydGlmYWN0QWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHVibGljIE1vZHVsZUFydGlmYWN0QWRhcHRlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgTW9kdWxlQXJ0aWZhY3RBZGFwdGVyLgotCSAqCi0JICogQHJldHVybiBhbiBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBwcmlvcml0eSBvZiB0aGlzIGFkYXB0ZXIuCi0JICoKLQkgKiBAcmV0dXJuIGEgcHJpb3JpdHkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFByaW9yaXR5KCkgewotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInByaW9yaXR5IikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBsdWdpbiB0aGF0IGxvYWRlZCB0aGlzIGNsYXNzIGhhcyBiZWVuIGxvYWRlZC4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGx1Z2luQWN0aXZhdGVkKCkgewotCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRCdW5kbGUobmFtZSkuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gZXhwcmVzc2lvbiB0aGF0IHJlcHJlc2VudHMgdGhlIGVuYWJsZW1lbnQgbG9naWMgZm9yIHRoZQotCSAqIGNvbnRleHR1YWwgbGF1bmNoIGVsZW1lbnQgb2YgdGhpcyBsYXVuY2ggc2hvcnRjdXQgZGVzY3JpcHRpb24gb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqIEByZXR1cm4gYW4gZXZhbHVhdGFibGUgZXhwcmVzc2lvbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGNhbid0IGJlCi0JICogIGNvbnZlcnRlZC4gUmVhc29ucyBpbmNsdWRlOiAoYSkgbm8gaGFuZGxlciBpcyBhdmFpbGFibGUgdG8KLQkgKiAgY29wZSB3aXRoIGEgY2VydGFpbiBjb25maWd1cmF0aW9uIGVsZW1lbnQgb3IgKGIpIHRoZSBYTUwKLQkgKiAgZXhwcmVzc2lvbiB0cmVlIGlzIG1hbGZvcm1lZC4KLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvbiBnZXRDb250ZXh0dWFsTGF1bmNoRW5hYmxlbWVudEV4cHJlc3Npb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmQ29udGV4dHVhbExhdW5jaEV4cHIgPT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBlbGVtZW50LmdldENoaWxkcmVuKEV4cHJlc3Npb25UYWdOYW1lcy5FTkFCTEVNRU5UKTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbmFibGVtZW50ID0gZWxlbWVudHMubGVuZ3RoID4gMCA/IGVsZW1lbnRzWzBdIDogbnVsbDsgCi0KLQkJCWlmIChlbmFibGVtZW50ICE9IG51bGwpCi0JCQkJZkNvbnRleHR1YWxMYXVuY2hFeHByID0gRXhwcmVzc2lvbkNvbnZlcnRlci5nZXREZWZhdWx0KCkucGVyZm9ybShlbmFibGVtZW50KTsKLQkJfQotCQlyZXR1cm4gZkNvbnRleHR1YWxMYXVuY2hFeHByOwotCX0KLQotCS8qKgotCSAqIEV2YWx1YXRlIHRoZSBnaXZlbiBleHByZXNzaW9uIHdpdGhpbiB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgcmV0dXJuCi0JICogdGhlIHJlc3VsdC4gUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZmYgcmVzdWx0IGlzIGVpdGhlciBUUlVFIG9yIE5PVF9MT0FERUQuCi0JICogVGhpcyBhbGxvd3Mgb3B0aW1pc3RpYyBpbmNsdXNpb24gb2Ygc2hvcnRjdXRzIGJlZm9yZSBwbHVnaW5zIGFyZSBsb2FkZWQuCi0JICogUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgZXhwIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBleHAgdGhlIGVuYWJsZW1lbnQgZXhwcmVzc2lvbiB0byBldmFsdWF0ZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IG9mIHRoZSBldmFsdWF0aW9uLiBVc3VhbGx5LCB0aGUKLQkgKiAgdXNlcidzIHNlbGVjdGlvbi4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGV2YWxFbmFibGVtZW50RXhwcmVzc2lvbihJRXZhbHVhdGlvbkNvbnRleHQgY29udGV4dCwgRXhwcmVzc2lvbiBleHApIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChleHAgIT0gbnVsbCkgPyAoKGV4cC5ldmFsdWF0ZShjb250ZXh0KSkgIT0gRXZhbHVhdGlvblJlc3VsdC5GQUxTRSkgOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGFuIEV2YWx1YXRpb24gY29udGV4dCB3aXRoIGRlZmF1bHQgdmFyaWFibGUgPSBzZWxlY3Rpb24KLQkgKi8KLQkvKnByb3RlY3RlZCBJRXZhbHVhdGlvbkNvbnRleHQgY3JlYXRlQ29udGV4dChPYmplY3Qgb2JqKSB7Ci0JCUxpc3QgbGlzdCA9IG51bGw7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gRGVidWdVSVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCSAgICBJV29ya2JlbmNoUGFydCBhY3RpdmVQYXJ0ID0gcGFnZS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQkgICAgaWYgKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJICAgICAgICBsaXN0LmFkZCgoKElFZGl0b3JQYXJ0KWFjdGl2ZVBhcnQpLmdldEVkaXRvcklucHV0KCkpOwotCQkJICAgIH0gZWxzZSBpZiAoYWN0aXZlUGFydCAhPSBudWxsKSB7Ci0JCQkgICAgICAgIElXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlID0gYWN0aXZlUGFydC5nZXRTaXRlKCk7Ci0JCQkgICAgICAgIGlmIChzaXRlICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgICAgIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IHNpdGUuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQkJICAgICAgICAgICAgbGlzdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS50b0xpc3QoKTsKLQkJCQkJICAgICAgICB9Ci0JICAgICAgICAgICAgICAgICAgICB9Ci0JCQkgICAgICAgIH0KLQkJCSAgICB9Ci0JCQl9Ci0JCX0KLQkJLy8gY3JlYXRlIGEgZGVmYXVsdCBldmFsdWF0aW9uIGNvbnRleHQgd2l0aCBkZWZhdWx0IHZhcmlhYmxlCi0JCS8vIG9mIHRoZSB1c2VyIHNlbGVjdGlvbiBvciBlZGl0b3IgaW5wdXQKLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkgICAgbGlzdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJSUV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgRXZhbHVhdGlvbkNvbnRleHQobnVsbCwgbGlzdCk7Ci0JCWNvbnRleHQuYWRkVmFyaWFibGUoInNlbGVjdGlvbiIsIGxpc3QpOyAvLyROT04tTkxTLTEkCi0JCQotCQlyZXR1cm4gY29udGV4dDsKLQl9Ki8KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBlbmFibGVkIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmogYW4gb2JqZWN0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlbmFibGVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoT2JqZWN0IG9iaikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRXZhbHVhdGlvbkNvbnRleHQgY29udGV4dCA9IG5ldyBFdmFsdWF0aW9uQ29udGV4dChudWxsLCBvYmopOwotCQljb250ZXh0LmFkZFZhcmlhYmxlKCJzZWxlY3Rpb24iLCBvYmopOwotCQlyZXR1cm4gZXZhbEVuYWJsZW1lbnRFeHByZXNzaW9uKGNvbnRleHQsIGdldENvbnRleHR1YWxMYXVuY2hFbmFibGVtZW50RXhwcmVzc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB7Ci0JCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWRlbGVnYXRlID0gKE1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUiICsgdG9TdHJpbmcoKSwgdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGVnYXRlTG9hZGVkKCkgewotCQlyZXR1cm4gKGRlbGVnYXRlICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSBhcnRpZmFjdHMuCi0JICogCi0JICogQHBhcmFtIG9iaiBhbiBvYmplY3QKLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUgYXJ0aWZhY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIElNb2R1bGVBcnRpZmFjdFtdIGdldE1vZHVsZUFydGlmYWN0cyhPYmplY3Qgb2JqKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5nZXRNb2R1bGVBcnRpZmFjdHMob2JqKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJNb2R1bGVBcnRpZmFjdEFkYXB0ZXJbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2NzcwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JbnRlcm5hbEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVGYWN0b3J5RGVsZWdhdGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlRmFjdG9yeSBpbXBsZW1lbnRzIElPcmRlcmVkIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXB1YmxpYyBNb2R1bGVGYWN0b3J5RGVsZWdhdGUgZGVsZWdhdGU7Ci0JcHJpdmF0ZSBMaXN0PElNb2R1bGVUeXBlPiBtb2R1bGVUeXBlczsKLQlwcml2YXRlIEV4cHJlc3Npb24gZkNvbnRleHR1YWxMYXVuY2hFeHByID0gbnVsbDsKLQotCS8qKgotCSAqIE1vZHVsZUZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqLwotCXB1YmxpYyBNb2R1bGVGYWN0b3J5KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBmYWN0b3J5LgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluZGV4IChvcmRlcmluZykgb2YgdGhpcyB0YXNrLgotCSAqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9yZGVyKCkgewotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm9yZGVyIikpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdXBwb3J0ZWQgbW9kdWxlIHR5cGVzLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbW9kdWxlIHR5cGVzCi0JICovCi0JcHVibGljIElNb2R1bGVUeXBlW10gZ2V0TW9kdWxlVHlwZXMoKSB7Ci0JCWlmIChtb2R1bGVUeXBlcyA9PSBudWxsKQotCQkJbW9kdWxlVHlwZXMgPSBTZXJ2ZXJQbHVnaW4uZ2V0TW9kdWxlVHlwZXMoZWxlbWVudC5nZXRDaGlsZHJlbigibW9kdWxlVHlwZSIpKTsKLQkJCi0JCUlNb2R1bGVUeXBlW10gbXQgPSBuZXcgSU1vZHVsZVR5cGVbbW9kdWxlVHlwZXMuc2l6ZSgpXTsKLQkJbW9kdWxlVHlwZXMudG9BcnJheShtdCk7Ci0JCXJldHVybiBtdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtb2R1bGVzIGZhY3RvcnkgcHJvZHVjZXMgcHJvamVjdCBtb2R1bGVzLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9qZWN0TW9kdWxlRmFjdG9yeSgpIHsKLQkJcmV0dXJuICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJwcm9qZWN0cyIpKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSNnZXREZWxlZ2F0ZSgpCi0JICovCi0JcHVibGljIE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSBnZXREZWxlZ2F0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJZGVsZWdhdGUgPSAoTW9kdWxlRmFjdG9yeURlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQkJSW50ZXJuYWxJbml0aWFsaXplci5pbml0aWFsaXplTW9kdWxlRmFjdG9yeURlbGVnYXRlKGRlbGVnYXRlLCB0aGlzLCBtb25pdG9yKTsKLQkJCQlpZiAoVHJhY2UuUEVSRk9STUFOQ0UpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1BFUkZPUk1BTkNFLAotCQkJCQkJCSJNb2R1bGVGYWN0b3J5LmdldERlbGVnYXRlKCk6IDwiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkgKyAiPiAiICsgZ2V0SWQoKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCB0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVGYWN0b3J5RGVsZWdhdGUjZ2V0TW9kdWxlcygpCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKCkgewotCQlyZXR1cm4gZ2V0TW9kdWxlcyhudWxsKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlRmFjdG9yeURlbGVnYXRlI2dldE1vZHVsZXMoKQotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gZ2V0RGVsZWdhdGUobW9uaXRvcikuZ2V0TW9kdWxlcygpOwotCQkJaWYgKGhhc0ludmFsaWRNb2R1bGVzKG1vZHVsZXMpKQotCQkJCW1vZHVsZXMgPSBmaWx0ZXIobW9kdWxlcyk7Ci0JCQlyZXR1cm4gbW9kdWxlczsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgdCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IElNb2R1bGVbMF07Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlRmFjdG9yeURlbGVnYXRlI2dldE1vZHVsZXMoSVByb2plY3QpCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBnZXREZWxlZ2F0ZShtb25pdG9yKS5nZXRNb2R1bGVzKHByb2plY3QpOwotCQkJaWYgKGhhc0ludmFsaWRNb2R1bGVzKG1vZHVsZXMpKQotCQkJCW1vZHVsZXMgPSBmaWx0ZXIobW9kdWxlcyk7Ci0JCQlyZXR1cm4gbW9kdWxlczsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgdCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IElNb2R1bGVbMF07Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBleHByZXNzaW9uIHRoYXQgcmVwcmVzZW50cyB0aGUgZW5hYmxlbWVudCBsb2dpYyBmb3IgdGhlCi0JICogY29udGV4dHVhbCBwcm9qZWN0IG9mIHRoaXMgbW9kdWxlIGZhY3RvcnkgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKiBAcmV0dXJuIGFuIGV2YWx1YXRhYmxlIGV4cHJlc3Npb24gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBjYW4ndCBiZQotCSAqICBjb252ZXJ0ZWQuIFJlYXNvbnMgaW5jbHVkZTogKGEpIG5vIGhhbmRsZXIgaXMgYXZhaWxhYmxlIHRvCi0JICogIGNvcGUgd2l0aCBhIGNlcnRhaW4gY29uZmlndXJhdGlvbiBlbGVtZW50IG9yIChiKSB0aGUgWE1MCi0JICogIGV4cHJlc3Npb24gdHJlZSBpcyBtYWxmb3JtZWQuCi0JICovCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gZ2V0Q29udGV4dHVhbExhdW5jaEVuYWJsZW1lbnRFeHByZXNzaW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZkNvbnRleHR1YWxMYXVuY2hFeHByID09IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gZWxlbWVudC5nZXRDaGlsZHJlbihFeHByZXNzaW9uVGFnTmFtZXMuRU5BQkxFTUVOVCk7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZW5hYmxlbWVudCA9IChlbGVtZW50cyAhPSBudWxsICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApID8gZWxlbWVudHNbMF0gOiBudWxsOyAKLQotCQkJaWYgKGVuYWJsZW1lbnQgIT0gbnVsbCkKLQkJCQlmQ29udGV4dHVhbExhdW5jaEV4cHIgPSBFeHByZXNzaW9uQ29udmVydGVyLmdldERlZmF1bHQoKS5wZXJmb3JtKGVuYWJsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBmQ29udGV4dHVhbExhdW5jaEV4cHI7Ci0JfQotCQotCS8qKgotCSAqIEV2YWx1YXRlIHRoZSBnaXZlbiBleHByZXNzaW9uIHdpdGhpbiB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgcmV0dXJuCi0JICogdGhlIHJlc3VsdC4gUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiByZXN1bHQgaXMgZWl0aGVyIFRSVUUgb3IgTk9UX0xPQURFRC4KLQkgKiBUaGlzIGFsbG93cyBvcHRpbWlzdGljIGluY2x1c2lvbiBiZWZvcmUgcGx1Z2lucyBhcmUgbG9hZGVkLgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZXhwIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBleHAgdGhlIGVuYWJsZW1lbnQgZXhwcmVzc2lvbiB0byBldmFsdWF0ZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IG9mIHRoZSBldmFsdWF0aW9uLiAKLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGV2YWxFbmFibGVtZW50RXhwcmVzc2lvbihJRXZhbHVhdGlvbkNvbnRleHQgY29udGV4dCwgRXhwcmVzc2lvbiBleHApIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgY3VycmVudCBiZWhhdmlvdXIsIGlmIHRoZSBleHAgPT0gbnVsbCB3ZSByZXR1cm4gdHJ1ZS4gTWVhbmluZyB0aGF0IHRoZSBmYWN0b3J5IGRvZXNuJ3QKLQkJLy8gaW1wbGVtZW50IGFuIGV4cHJlc3Npb24gYW5kIHNob3VsZCBiZSBlbmFibGVkIGZvciBhbGwgY2FzZXMuCi0JCXJldHVybiAoZXhwICE9IG51bGwpID8gKChleHAuZXZhbHVhdGUoY29udGV4dCkpICE9IEV2YWx1YXRpb25SZXN1bHQuRkFMU0UpIDogdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJSUV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgRXZhbHVhdGlvbkNvbnRleHQobnVsbCwgcHJvamVjdCk7Ci0JCQljb250ZXh0LmFkZFZhcmlhYmxlKCJwcm9qZWN0IiwgcHJvamVjdCk7Ci0JCQkKLQkJCXJldHVybiBldmFsRW5hYmxlbWVudEV4cHJlc3Npb24oY29udGV4dCwgZ2V0Q29udGV4dHVhbExhdW5jaEVuYWJsZW1lbnRFeHByZXNzaW9uKCkpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCB0KTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVGYWN0b3J5RGVsZWdhdGUjZmluZE1vZHVsZShTdHJpbmcpCi0JICovCi0JcHVibGljIElNb2R1bGUgZmluZE1vZHVsZShTdHJpbmcgaWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJSU1vZHVsZSBtb2R1bGUgPSBnZXREZWxlZ2F0ZShtb25pdG9yKS5maW5kTW9kdWxlKGlkKTsKLQkJCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCQotCQkJZ2V0TW9kdWxlVHlwZXMoKTsKLQkJCWlmICghbW9kdWxlVHlwZXMuY29udGFpbnMobW9kdWxlLmdldE1vZHVsZVR5cGUoKSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJCXJldHVybiBtb2R1bGU7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIHQpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzSW52YWxpZE1vZHVsZXMoSU1vZHVsZVtdIG1vZHVsZXMpIHsKLQkJaWYgKG1vZHVsZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWdldE1vZHVsZVR5cGVzKCk7Ci0JCQotCQlpbnQgc2l6ZSA9IG1vZHVsZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKCFtb2R1bGVUeXBlcy5jb250YWlucyhtb2R1bGVzW2ldLmdldE1vZHVsZVR5cGUoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgSU1vZHVsZVtdIGZpbHRlcihJTW9kdWxlW10gbW9kdWxlcykgewotCQlpZiAobW9kdWxlcyA9PSBudWxsKQotCQkJcmV0dXJuIG1vZHVsZXM7Ci0JCQotCQlnZXRNb2R1bGVUeXBlcygpOwotCQlMaXN0PElNb2R1bGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7Ci0JCQotCQlpbnQgc2l6ZSA9IG1vZHVsZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSU1vZHVsZSBtID0gbW9kdWxlc1tpXTsKLQkJCWlmIChtb2R1bGVUeXBlcy5jb250YWlucyhtLmdldE1vZHVsZVR5cGUoKSkpCi0JCQkJbGlzdC5hZGQobSk7Ci0JCQllbHNlIGlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJJbnZhbGlkIG1vZHVsZSByZXR1cm5lZCBmcm9tIGZhY3RvcnksIGlnbm9yZWQ6ICIgKyBtKTsKLQkJCX0KLQkJfQotCQkKLQkJSU1vZHVsZVtdIG0gPSBuZXcgSU1vZHVsZVtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShtKTsKLQkJcmV0dXJuIG07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiTW9kdWxlRmFjdG9yeVsiICsgZ2V0SWQoKSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlRmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjEzZDkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0vKioKLSAqIEBkZXByZWNhdGVkIHVzZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Nb2R1bGVGaWxlIGluc3RlYWQKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZUZpbGUgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Nb2R1bGVGaWxlIHsKLQlwdWJsaWMgTW9kdWxlRmlsZShJRmlsZSBmaWxlLCBTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCkgewotCQlzdXBlcihmaWxlLCBuYW1lLCBwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgTW9kdWxlRmlsZShTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCwgbG9uZyBzdGFtcCkgewotCQlzdXBlcihuYW1lLCBwYXRoLCBzdGFtcCk7Ci0JfQotCi0JcHVibGljIE1vZHVsZUZpbGUoRmlsZSBmaWxlLCBTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCkgewotCQlzdXBlcihmaWxlLCBuYW1lLCBwYXRoKTsKLQl9Ci0KLQkvKgotCSAqIEBkZXByZWNhdGVkIHVzZSBhbm90aGVyIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIE1vZHVsZUZpbGUoSUZpbGUgZmlsZSwgU3RyaW5nIG5hbWUsIElQYXRoIHBhdGgsIGxvbmcgc3RhbXApIHsKLQkJc3VwZXIoZmlsZSwgbmFtZSwgcGF0aCwgc3RhbXApOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVGb2xkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUZvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGY3YWY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUZvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotLyoqCi0gKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuTW9kdWxlRm9sZGVyIGluc3RlYWQKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZUZvbGRlciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLk1vZHVsZUZvbGRlciB7Ci0JcHVibGljIE1vZHVsZUZvbGRlcihJQ29udGFpbmVyIGNvbnRhaW5lciwgU3RyaW5nIG5hbWUsIElQYXRoIHBhdGgpIHsKLQkJc3VwZXIoY29udGFpbmVyLCBuYW1lLCBwYXRoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlS2luZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlS2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGJiZGI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZUtpbmQgewotCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0JcHVibGljIE1vZHVsZUtpbmQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaWQgPSBjZS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCXRoaXMubmFtZSA9IGNlLmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCX0KLQotCXB1YmxpYyBNb2R1bGVLaW5kKFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiTW9kdWxlVHlwZVsiICsgaWQgKyAiLCAiICsgbmFtZSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmQ0MjM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZVByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLS8qKgotICogSGVscGVyIGNsYXNzIHRoYXQgc3RvcmVzIHByZWZlcmVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBzZXJ2ZXIgdG9vbHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVQcm9wZXJ0aWVzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX0RBVEFfRklMRSA9ICJtb2R1bGVzLnhtbCI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIE1vZHVsZVByb3BlcnRpZXMgaW5zdGFuY2U7Ci0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFN0cmluZz4gbW9kdWxlczsKLQotCS8qKgotCSAqIE1vZHVsZVByb3BlcnRpZXMgY29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIE1vZHVsZVByb3BlcnRpZXMoKSB7Ci0JCXN1cGVyKCk7Ci0JCWxvYWQoKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0YXRpYyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc3RhdGljIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVQcm9wZXJ0aWVzIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCW5ldyBNb2R1bGVQcm9wZXJ0aWVzKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBkYXRhLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkKCkgewotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiTG9hZGluZyBtb2R1bGUgaW5mbyIpOwotCQl9Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoTU9EVUxFX0RBVEFfRklMRSkudG9PU1N0cmluZygpOwotCQltb2R1bGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCWlmICghKG5ldyBGaWxlKGZpbGVuYW1lKS5leGlzdHMoKSkpCi0JCQlyZXR1cm47Ci0JCQotCQl0cnkgewotCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oZmlsZW5hbWUpOwotCQkJCi0JCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbigibW9kdWxlIik7Ci0JCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTdHJpbmcgbW9kdWxlSWQgPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoIm1vZHVsZUlkIik7Ci0JCQkJU3RyaW5nIHNlcnZlcklkID0gY2hpbGRyZW5baV0uZ2V0U3RyaW5nKCJzZXJ2ZXJJZCIpOwotCQkJCW1vZHVsZXMucHV0KG1vZHVsZUlkLCBzZXJ2ZXJJZCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgc2VydmVycyIsIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoTU9EVUxFX0RBVEFfRklMRSkudG9PU1N0cmluZygpOwotCQkKLQkJdHJ5IHsKLQkJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJtb2R1bGVzIik7Ci0JCQkKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kdWxlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBtb2R1bGVJZCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlTdHJpbmcgc2VydmVySWQgPSBtb2R1bGVzLmdldChtb2R1bGVJZCk7Ci0JCQkJCi0JCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJtb2R1bGUiKTsKLQkJCQljaGlsZC5wdXRTdHJpbmcoIm1vZHVsZUlkIiwgbW9kdWxlSWQpOwotCQkJCWNoaWxkLnB1dFN0cmluZygic2VydmVySWQiLCBzZXJ2ZXJJZCk7Ci0JCQl9Ci0JCQkKLQkJCW1lbWVudG8uc2F2ZVRvRmlsZShmaWxlbmFtZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIHNlcnZlcnMiLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBTZXJ2ZXJDb3JlI2dldERlZmF1bHRTZXJ2ZXIoSU1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgSVNlcnZlciBnZXREZWZhdWx0U2VydmVyKElNb2R1bGUgbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCVN0cmluZyBzZXJ2ZXJJZCA9IG1vZHVsZXMuZ2V0KG1vZHVsZS5nZXRJZCgpKTsKLQkJaWYgKHNlcnZlcklkID09IG51bGwgfHwgc2VydmVySWQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2VydmVySWQpOwotCQkKLQkJLy8gaW4gdGhlIGNhc2UgdGhhdCB0aGUgcHJlZmVycmVkIHNlcnZlciBkb2Vzbid0IGV4aXN0cyBpbiB0aGUgd3JrcyByZXNldCB0aGUgYXR0cmlidXRlCi0JCWlmIChzZXJ2ZXIgPT0gbnVsbCl7Ci0JCQltb2R1bGVzLnJlbW92ZShtb2R1bGUuZ2V0SWQoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBzZXJ2ZXI7IAotCX0KLQotCS8qCi0JICogQHNlZSBTZXJ2ZXJDb3JlI3NldERlZmF1bHRTZXJ2ZXIoSU1vZHVsZSwgSVNlcnZlciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0U2VydmVyKElNb2R1bGUgbW9kdWxlLCBJU2VydmVyIHNlcnZlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCVN0cmluZyBuZXdTZXJ2ZXJJZCA9IG51bGw7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCW5ld1NlcnZlcklkID0gc2VydmVyLmdldElkKCk7Ci0JCQotCQlTdHJpbmcgc2VydmVySWQgPSBtb2R1bGVzLmdldChtb2R1bGUuZ2V0SWQoKSk7Ci0JCWlmIChzZXJ2ZXJJZCA9PSBudWxsICYmIG5ld1NlcnZlcklkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChzZXJ2ZXJJZCAhPSBudWxsICYmIHNlcnZlcklkLmVxdWFscyhuZXdTZXJ2ZXJJZCkpCi0JCQlyZXR1cm47Ci0JCQotCQltb2R1bGVzLnB1dChtb2R1bGUuZ2V0SWQoKSwgbmV3U2VydmVySWQpOwotCQlzYXZlKG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiTW9kdWxlUHJvcGVydGllc1tdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlUHVibGlzaEluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZVB1Ymxpc2hJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MGUwODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlUHVibGlzaEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5EYXRhSW5wdXQ7Ci1pbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0OwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Nb2R1bGVGb2xkZXI7Ci0vKioKLSAqIFB1Ymxpc2ggaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgbW9kdWxlIG9uIGEgc3BlY2lmaWMgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlUHVibGlzaEluZm8gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIElNb2R1bGVSZXNvdXJjZVtdIEVNUFRZX01PRFVMRV9SRVNPVVJDRSA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBFTVBUWV9NT0RVTEVfUkVTT1VSQ0VfREVMVEEgPSBuZXcgSU1vZHVsZVJlc291cmNlRGVsdGFbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9JRCA9ICJtb2R1bGUtaWRzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1RZUEVfSUQgPSAibW9kdWxlLXR5cGUtaWQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfVFlQRV9WRVJTSU9OID0gIm1vZHVsZS10eXBlLXZlcnNpb24iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFNUCA9ICJzdGFtcCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEUgPSAiZmlsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTERFUiA9ICJmb2xkZXIiOwotCi0JcHJpdmF0ZSBTdHJpbmcgbW9kdWxlSWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcyA9IEVNUFRZX01PRFVMRV9SRVNPVVJDRTsKLQlwcml2YXRlIElNb2R1bGVUeXBlIG1vZHVsZVR5cGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXNlQ2FjaGU7Ci0JcHJpdmF0ZSBJTW9kdWxlUmVzb3VyY2VbXSBjdXJyZW50UmVzb3VyY2VzID0gbnVsbDsKLQlwcml2YXRlIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZGVsdGEgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBoYXNEZWx0YTsKLQotCS8qKgotCSAqIE1vZHVsZVB1Ymxpc2hJbmZvIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGVJZCBhIG1vZHVsZSBpZAotCSAqIEBwYXJhbSBuYW1lIHRoZSBtb2R1bGUncyBuYW1lCi0JICogQHBhcmFtIG1vZHVsZVR5cGUgdGhlIG1vZHVsZSB0eXBlCi0JICovCi0JcHVibGljIE1vZHVsZVB1Ymxpc2hJbmZvKFN0cmluZyBtb2R1bGVJZCwgU3RyaW5nIG5hbWUsIElNb2R1bGVUeXBlIG1vZHVsZVR5cGUpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLm1vZHVsZUlkID0gbW9kdWxlSWQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubW9kdWxlVHlwZSA9IG1vZHVsZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogTW9kdWxlUHVibGlzaEluZm8gY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIG1lbWVudG8gYSBtZW1lbnRvCi0JICovCi0JcHVibGljIE1vZHVsZVB1Ymxpc2hJbmZvKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJc3VwZXIoKTsKLQkJCi0JCWxvYWQobWVtZW50byk7Ci0JfQotCi0JLyoqCi0JICogTW9kdWxlUHVibGlzaEluZm8gY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGluIGFuIGlucHV0IHN0cmVhbQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGxvYWQgZmFpbHMKLQkgKi8KLQlwdWJsaWMgTW9kdWxlUHVibGlzaEluZm8oRGF0YUlucHV0IGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdXBlcigpOwotCQkKLQkJbG9hZChpbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNb2R1bGVJZCgpIHsKLQkJcmV0dXJuIG1vZHVsZUlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIElNb2R1bGVUeXBlIGdldE1vZHVsZVR5cGUoKSB7Ci0JCXJldHVybiBtb2R1bGVUeXBlOwotCX0KLQotCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBnZXRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VzKElNb2R1bGVSZXNvdXJjZVtdIHJlcykgewotCQlyZXNvdXJjZXMgPSByZXM7Ci0JfQotCi0JLyoqCi0JICogVXNlZCBvbmx5IGZvciByZWFkaW5nIGZyb20gV1RQIDEueCB3b3Jrc3BhY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWQoSU1lbWVudG8gbWVtZW50bykgewotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiTG9hZGluZyBtb2R1bGUgcHVibGlzaCBpbmZvIGZvcjogIiArIG1lbWVudG8pOwotCQl9Ci0JCQotCQl0cnkgewotCQkJbW9kdWxlSWQgPSBtZW1lbnRvLmdldFN0cmluZyhNT0RVTEVfSUQpOwotCQkJbmFtZSA9IG1lbWVudG8uZ2V0U3RyaW5nKE5BTUUpOwotCQkJU3RyaW5nIG10ID0gbWVtZW50by5nZXRTdHJpbmcoTU9EVUxFX1RZUEVfSUQpOwotCQkJU3RyaW5nIG12ID0gbWVtZW50by5nZXRTdHJpbmcoTU9EVUxFX1RZUEVfVkVSU0lPTik7Ci0JCQlpZiAobXQgIT0gbnVsbCAmJiBtdC5sZW5ndGgoKSA+IDApCi0JCQkJbW9kdWxlVHlwZSA9IE1vZHVsZVR5cGUuZ2V0TW9kdWxlVHlwZShtdCwgbXYpOwotCQkJCi0JCQlyZXNvdXJjZXMgPSBsb2FkUmVzb3VyY2UobWVtZW50bywgbmV3IFBhdGgoIiIpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBtb2R1bGUgcHVibGlzaCBpbmZvIGluZm9ybWF0aW9uIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2VkIG9ubHkgZm9yIHJlYWRpbmcgZnJvbSBXVFAgMS54IHdvcmtzcGFjZXMuCi0JICovCi0JcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZVtdIGxvYWRSZXNvdXJjZShJTWVtZW50byBtZW1lbnRvLCBJUGF0aCBwYXRoKSB7Ci0JCWlmIChtZW1lbnRvID09IG51bGwpCi0JCQlyZXR1cm4gRU1QVFlfTU9EVUxFX1JFU09VUkNFOwotCQkKLQkJTGlzdDxJTW9kdWxlUmVzb3VyY2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGVSZXNvdXJjZT4oMTApOwotCQkKLQkJLy8gbG9hZCBmaWxlcwotCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbihGSUxFKTsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZTIgPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoTkFNRSk7Ci0JCQkJbG9uZyBzdGFtcCA9IExvbmcucGFyc2VMb25nKGNoaWxkcmVuW2ldLmdldFN0cmluZyhTVEFNUCkpOwotCQkJCU1vZHVsZUZpbGUgZmlsZSA9IG5ldyBNb2R1bGVGaWxlKG5hbWUyLCBwYXRoLCBzdGFtcCk7Ci0JCQkJbGlzdC5hZGQoZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGxvYWQgZm9sZGVycwotCQljaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oRk9MREVSKTsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZTIgPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoTkFNRSk7Ci0JCQkJTW9kdWxlRm9sZGVyIGZvbGRlciA9IG5ldyBNb2R1bGVGb2xkZXIobnVsbCwgbmFtZTIsIHBhdGgpOwotCQkJCWZvbGRlci5zZXRNZW1iZXJzKGxvYWRSZXNvdXJjZShjaGlsZHJlbltpXSwgcGF0aC5hcHBlbmQobmFtZTIpKSk7Ci0JCQkJbGlzdC5hZGQoZm9sZGVyKTsKLQkJCX0KLQkJfQotCQkKLQkJSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzMiA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmVzb3VyY2VzMik7Ci0JCXJldHVybiByZXNvdXJjZXMyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWQoRGF0YUlucHV0IGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJMb2FkaW5nIG1vZHVsZSBwdWJsaXNoIGluZm8iKTsKLQkJfQotCQkKLQkJbW9kdWxlSWQgPSBpbi5yZWFkVVRGKCk7Ci0JCWJ5dGUgYiA9IGluLnJlYWRCeXRlKCk7IC8vIDg/Ci0JCQotCQlpZiAoKGIgJiAxKSAhPSAwKQotCQkJbmFtZSA9IGluLnJlYWRVVEYoKTsKLQkJZWxzZQotCQkJbmFtZSA9IG51bGw7Ci0JCQotCQlpZiAoKGIgJiAyKSAhPSAwKSB7Ci0JCQlTdHJpbmcgbXQgPSBpbi5yZWFkVVRGKCk7Ci0JCQlTdHJpbmcgbXYgPSBpbi5yZWFkVVRGKCk7Ci0JCQlpZiAobXQgIT0gbnVsbCAmJiBtdC5sZW5ndGgoKSA+IDApCi0JCQkJbW9kdWxlVHlwZSA9IE1vZHVsZVR5cGUuZ2V0TW9kdWxlVHlwZShtdCwgbXYpOwotCQl9IGVsc2UKLQkJCW1vZHVsZVR5cGUgPSBudWxsOwotCQkKLQkJcmVzb3VyY2VzID0gbG9hZFJlc291cmNlKGluLCBuZXcgUGF0aCgiIikpOwotCX0KLQotCXByaXZhdGUgSU1vZHVsZVJlc291cmNlW10gbG9hZFJlc291cmNlKERhdGFJbnB1dCBpbiwgSVBhdGggcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHNpemUgPSBpbi5yZWFkSW50KCk7Ci0JCWlmIChzaXplID4gMTAwMDAwMCkKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRm9sZGVyIGNhcGFjaXR5IGxpbWl0IHJlYWNoZWQiKTsKLQkJSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzMiA9IG5ldyBJTW9kdWxlUmVzb3VyY2Vbc2l6ZV07Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJYnl0ZSBiID0gaW4ucmVhZEJ5dGUoKTsKLQkJCWlmIChiID09IDApIHsKLQkJCQlTdHJpbmcgbmFtZTIgPSBpbi5yZWFkVVRGKCk7Ci0JCQkJbG9uZyBzdGFtcCA9IGluLnJlYWRMb25nKCk7Ci0JCQkJcmVzb3VyY2VzMltpXSA9IG5ldyBNb2R1bGVGaWxlKG5hbWUyLCBwYXRoLCBzdGFtcCk7Ci0JCQl9IGVsc2UgaWYgKGIgPT0gMSkgewotCQkJCVN0cmluZyBuYW1lMiA9IGluLnJlYWRVVEYoKTsKLQkJCQlNb2R1bGVGb2xkZXIgZm9sZGVyID0gbmV3IE1vZHVsZUZvbGRlcihudWxsLCBuYW1lMiwgcGF0aCk7Ci0JCQkJZm9sZGVyLnNldE1lbWJlcnMobG9hZFJlc291cmNlKGluLCBwYXRoLmFwcGVuZChuYW1lMikpKTsKLQkJCQlyZXNvdXJjZXMyW2ldID0gZm9sZGVyOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmVzb3VyY2VzMjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKERhdGFPdXRwdXQgb3V0KSB7Ci0JCXRyeSB7Ci0JCQlvdXQud3JpdGVVVEYobW9kdWxlSWQpOwotCQkJYnl0ZSBiID0gMDsKLQkJCWlmIChuYW1lICE9IG51bGwpCi0JCQkJYiB8PSAxOwotCQkJaWYgKG1vZHVsZVR5cGUgIT0gbnVsbCkKLQkJCQliIHw9IDI7Ci0JCQlvdXQud3JpdGVCeXRlKGIpOwotCQkJCi0JCQlpZiAobmFtZSAhPSBudWxsKQotCQkJCW91dC53cml0ZVVURihuYW1lKTsKLQkJCQotCQkJaWYgKG1vZHVsZVR5cGUgIT0gbnVsbCkgewotCQkJCW91dC53cml0ZVVURihtb2R1bGVUeXBlLmdldElkKCkpOwotCQkJCW91dC53cml0ZVVURihtb2R1bGVUeXBlLmdldFZlcnNpb24oKSk7Ci0JCQl9Ci0JCQlzYXZlUmVzb3VyY2Uob3V0LCByZXNvdXJjZXMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBtb2R1bGUgcHVibGlzaCBpbmZvIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlUmVzb3VyY2UoRGF0YU91dHB1dCBvdXQsIElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlczIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChyZXNvdXJjZXMyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBzaXplID0gcmVzb3VyY2VzMi5sZW5ndGg7Ci0JCW91dC53cml0ZUludChzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChyZXNvdXJjZXMyW2ldIGluc3RhbmNlb2YgSU1vZHVsZUZpbGUpIHsKLQkJCQlJTW9kdWxlRmlsZSBmaWxlID0gKElNb2R1bGVGaWxlKSByZXNvdXJjZXMyW2ldOwotCQkJCW91dC53cml0ZUJ5dGUoMCk7Ci0JCQkJb3V0LndyaXRlVVRGKGZpbGUuZ2V0TmFtZSgpKTsKLQkJCQlvdXQud3JpdGVMb25nKGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSk7Ci0JCQl9IGVsc2UgewotCQkJCUlNb2R1bGVGb2xkZXIgZm9sZGVyID0gKElNb2R1bGVGb2xkZXIpIHJlc291cmNlczJbaV07Ci0JCQkJb3V0LndyaXRlQnl0ZSgxKTsKLQkJCQlvdXQud3JpdGVVVEYoZm9sZGVyLmdldE5hbWUoKSk7Ci0JCQkJSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzMyA9IGZvbGRlci5tZW1iZXJzKCk7Ci0JCQkJc2F2ZVJlc291cmNlKG91dCwgcmVzb3VyY2VzMyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdGFydCB1c2luZyB0aGUgbW9kdWxlIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0YXJ0Q2FjaGluZygpIHsKLQkJdXNlQ2FjaGUgPSB0cnVlOwotCQljdXJyZW50UmVzb3VyY2VzID0gbnVsbDsKLQkJZGVsdGEgPSBudWxsOwotCQloYXNEZWx0YSA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEZpbGwgdGhlIG1vZHVsZSBjYWNoZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpbGxDYWNoZShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmICghdXNlQ2FjaGUpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoY3VycmVudFJlc291cmNlcyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJdHJ5IHsKLQkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJSU1vZHVsZSBtID0gbW9kdWxlW21vZHVsZS5sZW5ndGggLSAxXTsKLQkJCU1vZHVsZURlbGVnYXRlIHBtID0gKE1vZHVsZURlbGVnYXRlKSBtLmxvYWRBZGFwdGVyKE1vZHVsZURlbGVnYXRlLmNsYXNzLCBudWxsKTsKLQkJCWlmIChwbSA9PSBudWxsIHx8IChtLmdldFByb2plY3QoKSAhPSBudWxsICYmICFtLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkpCi0JCQkJY3VycmVudFJlc291cmNlcyA9IEVNUFRZX01PRFVMRV9SRVNPVVJDRTsKLQkJCWVsc2UKLQkJCQljdXJyZW50UmVzb3VyY2VzID0gcG0ubWVtYmVycygpOwotCQkJCi0JCQlkZWx0YSA9IFNlcnZlclB1Ymxpc2hJbmZvLmdldERlbHRhKHJlc291cmNlcywgY3VycmVudFJlc291cmNlcyk7Ci0JCQloYXNEZWx0YSA9IChkZWx0YSAhPSBudWxsICYmIGRlbHRhLmxlbmd0aCA+IDApOwotCQkJaWYgKFRyYWNlLlBFUkZPUk1BTkNFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1BFUkZPUk1BTkNFLAotCQkJCQkJIkZpbGxpbmcgcHVibGlzaCBjYWNoZSBmb3IgIiArIG0uZ2V0TmFtZSgpICsgIjogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkNvdWxkbid0IGZpbGwgcHVibGlzaCBjYWNoZSBmb3IgIiArIG1vZHVsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQlkZWx0YSA9IEVNUFRZX01PRFVMRV9SRVNPVVJDRV9ERUxUQTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckNhY2hlKCkgewotCQl1c2VDYWNoZSA9IGZhbHNlOwotCQljdXJyZW50UmVzb3VyY2VzID0gbnVsbDsKLQkJZGVsdGEgPSBudWxsOwotCQloYXNEZWx0YSA9IGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBnZXRNb2R1bGVSZXNvdXJjZXMoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gRU1QVFlfTU9EVUxFX1JFU09VUkNFOwotCQkKLQkJaWYgKHVzZUNhY2hlKSB7Ci0JCQlmaWxsQ2FjaGUobW9kdWxlKTsKLQkJCXJldHVybiBjdXJyZW50UmVzb3VyY2VzOwotCQl9Ci0JCQotCQlpbnQgc2l6ZSA9IG1vZHVsZS5sZW5ndGg7Ci0JCUlNb2R1bGUgbSA9IG1vZHVsZVtzaXplIC0gMV07Ci0JCU1vZHVsZURlbGVnYXRlIHBtID0gKE1vZHVsZURlbGVnYXRlKSBtLmxvYWRBZGFwdGVyKE1vZHVsZURlbGVnYXRlLmNsYXNzLCBudWxsKTsKLQkJaWYgKHBtID09IG51bGwgfHwgKG0uZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgIW0uZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKSkKLQkJCXJldHVybiBFTVBUWV9NT0RVTEVfUkVTT1VSQ0U7Ci0JCQotCQl0cnkgewotCQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlJTW9kdWxlUmVzb3VyY2VbXSB4ID0gcG0ubWVtYmVycygpOwotCQkJaWYgKFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpCi0JCQkJcHJpbnRNb2R1bGUoeCwicmVzb3VyY2VzOiAiKTsKLQkJCQotCQkJaWYgKFRyYWNlLlBFUkZPUk1BTkNFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1BFUkZPUk1BTkNFLCAiVGltZSB0byBnZXQgbWVtYmVycygpIGZvciAiICsgbW9kdWxlW3NpemUgLSAxXS5nZXROYW1lKCkgKyAiOiAiCi0JCQkJCQkrIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpKTsKLQkJCX0KLQkJCXJldHVybiB4OwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiUG9zc2libGUgZmFpbHVyZSBpbiBnZXRNb2R1bGVSZXNvdXJjZXMiLCBjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX01PRFVMRV9SRVNPVVJDRTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByaW50TW9kdWxlKElNb2R1bGVSZXNvdXJjZVtdIHIsIFN0cmluZyBzKSB7Ci0JCWZvciAoSU1vZHVsZVJlc291cmNlIG1yciA6IHIpIHsKLQkJCXByaW50TW9kdWxlKG1yciwgcyArICIgICIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50TW9kdWxlKElNb2R1bGVSZXNvdXJjZSByLCBTdHJpbmcgcykgewotCQlpZiAoVHJhY2UuUkVTT1VSQ0VTKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfUkVTT1VSQ0VTLCBzICsgci5nZXROYW1lKCkpOwotCQl9Ci0JCWlmIChyIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikgewotCQkJSU1vZHVsZUZvbGRlciBtZiA9IChJTW9kdWxlRm9sZGVyKSByOwotCQkJSU1vZHVsZVJlc291cmNlW10gbXIgPSBtZi5tZW1iZXJzKCk7Ci0JCQlmb3IgKElNb2R1bGVSZXNvdXJjZSBtcnIgOiBtcikgewotCQkJCXByaW50TW9kdWxlKG1yciwgcyArICIgICIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZ2V0RGVsdGEoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gRU1QVFlfTU9EVUxFX1JFU09VUkNFX0RFTFRBOwotCQkKLQkJaWYgKHVzZUNhY2hlKSB7Ci0JCQlmaWxsQ2FjaGUobW9kdWxlKTsKLQkJCXJldHVybiBkZWx0YTsKLQkJfQotCQkKLQkJSU1vZHVsZSBtID0gbW9kdWxlW21vZHVsZS5sZW5ndGggLSAxXTsKLQkJTW9kdWxlRGVsZWdhdGUgcG0gPSAoTW9kdWxlRGVsZWdhdGUpIG0ubG9hZEFkYXB0ZXIoTW9kdWxlRGVsZWdhdGUuY2xhc3MsIG51bGwpOwotCQlpZiAocG0gPT0gbnVsbCB8fCAobS5nZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiAhbS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpKQotCQkJcmV0dXJuIEVNUFRZX01PRFVMRV9SRVNPVVJDRV9ERUxUQTsKLQkJCi0JCUlNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlczIgPSBudWxsOwotCQl0cnkgewotCQkJcmVzb3VyY2VzMiA9IHBtLm1lbWJlcnMoKTsKLQkJCXByaW50TW9kdWxlKHJlc291cmNlczIsICJkZWx0YToiKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIlBvc3NpYmxlIGZhaWx1cmUgaW4gZ2V0RGVsdGEiLCBjZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlc291cmNlczIgPT0gbnVsbCkKLQkJCXJlc291cmNlczIgPSBFTVBUWV9NT0RVTEVfUkVTT1VSQ0U7Ci0JCXJldHVybiBTZXJ2ZXJQdWJsaXNoSW5mby5nZXREZWx0YShnZXRSZXNvdXJjZXMoKSwgcmVzb3VyY2VzMik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzRGVsdGEoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAodXNlQ2FjaGUpIHsKLQkJCWZpbGxDYWNoZShtb2R1bGUpOwotCQkJcmV0dXJuIGhhc0RlbHRhOwotCQl9Ci0JCQotCQlJTW9kdWxlIG0gPSBtb2R1bGVbbW9kdWxlLmxlbmd0aCAtIDFdOwotCQlNb2R1bGVEZWxlZ2F0ZSBwbSA9IChNb2R1bGVEZWxlZ2F0ZSkgbS5sb2FkQWRhcHRlcihNb2R1bGVEZWxlZ2F0ZS5jbGFzcywgbnVsbCk7Ci0JCUlNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlczIgPSBudWxsOwotCQlpZiAocG0gPT0gbnVsbCB8fCAobS5nZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiAhbS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJdHJ5IHsKLQkJCXJlc291cmNlczIgPSBwbS5tZW1iZXJzKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJQb3NzaWJsZSBmYWlsdXJlIGluIGhhc0RlbHRhIiwgY2UpOwotCQkJfQotCQl9Ci0JCWlmIChyZXNvdXJjZXMyID09IG51bGwpCi0JCQlyZXNvdXJjZXMyID0gRU1QVFlfTU9EVUxFX1JFU09VUkNFOwotCQlyZXR1cm4gU2VydmVyUHVibGlzaEluZm8uaGFzRGVsdGEoZ2V0UmVzb3VyY2VzKCksIHJlc291cmNlczIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZpbGwoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAodXNlQ2FjaGUpIHsKLQkJCWZpbGxDYWNoZShtb2R1bGUpOwotCQkJc2V0UmVzb3VyY2VzKGN1cnJlbnRSZXNvdXJjZXMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJTW9kdWxlIG0gPSBtb2R1bGVbbW9kdWxlLmxlbmd0aCAtIDFdOwotCQlNb2R1bGVEZWxlZ2F0ZSBwbSA9IChNb2R1bGVEZWxlZ2F0ZSkgbS5sb2FkQWRhcHRlcihNb2R1bGVEZWxlZ2F0ZS5jbGFzcywgbnVsbCk7Ci0JCWlmIChwbSA9PSBudWxsIHx8IChtLmdldFByb2plY3QoKSAhPSBudWxsICYmICFtLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkpIHsKLQkJCXNldFJlc291cmNlcyhFTVBUWV9NT0RVTEVfUkVTT1VSQ0UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl0cnkgewotCQkJc2V0UmVzb3VyY2VzKHBtLm1lbWJlcnMoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJQb3NzaWJsZSBmYWlsdXJlIGluIGZpbGwiLCBjZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBkZWxldGVkIG1vZHVsZSB0aGF0IHJlcHJlc2VudHMgdGhpcyBtb2R1bGUuCi0JICogCi0JICogQHJldHVybiBhIG1vZHVsZQotCSAqLwotCXByb3RlY3RlZCBJTW9kdWxlIGdldERlbGV0ZWRNb2R1bGUoKSB7Ci0JCVN0cmluZyBpZCA9IG1vZHVsZUlkOwotCQlpbnQgaW5kZXggPSBpZC5sYXN0SW5kZXhPZigiIyIpOwotCQlpZiAoaW5kZXggPiAwKQotCQkJaWQgPSBpZC5zdWJzdHJpbmcoaW5kZXgrMSk7Ci0JCXJldHVybiBuZXcgRGVsZXRlZE1vZHVsZShpZCwgbmFtZSwgbW9kdWxlVHlwZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJNb2R1bGVQdWJsaXNoSW5mbyBbIiArIG1vZHVsZUlkICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVSZXNvdXJjZURlbHRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVSZXNvdXJjZURlbHRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YzQwYjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlUmVzb3VyY2VEZWx0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2VEZWx0YTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVSZXNvdXJjZURlbHRhIGltcGxlbWVudHMgSU1vZHVsZVJlc291cmNlRGVsdGEgewotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2UgcmVzb3VyY2U7Ci0JcHJvdGVjdGVkIGludCBraW5kOwotCQotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGNoaWxkcmVuOwotCi0JcHVibGljIE1vZHVsZVJlc291cmNlRGVsdGEoSU1vZHVsZVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCkgewotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0JCXRoaXMua2luZCA9IGtpbmQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENoaWxkcmVuKElNb2R1bGVSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4pIHsKLQkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2UjZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkgewotCQlyZXR1cm4gcmVzb3VyY2UuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZURlbHRhI2dldE1vZHVsZVJlc291cmNlKCkKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVJlc291cmNlIGdldE1vZHVsZVJlc291cmNlKCkgewotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZURlbHRhI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIGtpbmQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZURlbHRhI2dldEFmZmVjdGVkQ2hpbGRyZW4oKQotCSAqLwotCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGdldEFmZmVjdGVkQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIk1vZHVsZVJlc291cmNlRGVsdGEgWyIgKyByZXNvdXJjZSArICIsICIgKyBraW5kICsgIl0iOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0cmFjZShTdHJpbmcgaW5kZW50KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihpbmRlbnQgKyB0b1N0cmluZygpKTsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkoKE1vZHVsZVJlc291cmNlRGVsdGEpY2hpbGRyZW5baV0pLnRyYWNlKGluZGVudCArICIgICIpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5M2MxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVR5cGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlVHlwZSBpbXBsZW1lbnRzIElNb2R1bGVUeXBlIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGlkOwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbjsKLQotCS8vCWNhY2hlZCBjb3B5IG9mIGFsbCBtb2R1bGUga2luZHMKLQlwcml2YXRlIHN0YXRpYyBMaXN0PE1vZHVsZUtpbmQ+IG1vZHVsZUtpbmRzOwotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxNb2R1bGVUeXBlPiBtb2R1bGVUeXBlczsKLQotCXB1YmxpYyBNb2R1bGVUeXBlKFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCU1vZHVsZUtpbmQgbXQgPSBmaW5kTW9kdWxlVHlwZShpZCk7Ci0JCWlmIChtdCAhPSBudWxsKQotCQkJcmV0dXJuIG10LmdldE5hbWUoKTsKLQkJcmV0dXJuIE1lc3NhZ2VzLm1vZHVsZVR5cGVVbmtub3duOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gaWQgYW5kIHZlcnNpb24sIG9yIGNyZWF0ZSBhIG5ldyBvbmUgaWYKLQkgKiBub25lIGFscmVhZHkgZXhpc3RzLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgbW9kdWxlIHR5cGUgaWQKLQkgKiBAcGFyYW0gdmVyc2lvbiB0aGUgbW9kdWxlIHR5cGUgdmVyc2lvbgotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSB0eXBlCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgTW9kdWxlVHlwZSBnZXRNb2R1bGVUeXBlKFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24pIHsKLQkJaWYgKG1vZHVsZVR5cGVzID09IG51bGwpCi0JCQltb2R1bGVUeXBlcyA9IG5ldyBBcnJheUxpc3Q8TW9kdWxlVHlwZT4oKTsKLQkJCi0JCS8vIGxvb2sgZm9yIGFuIGV4aXN0aW5nIG9uZSBmaXJzdAotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZVR5cGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1vZHVsZVR5cGUgbXQgPSAoTW9kdWxlVHlwZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKChpZCA9PSBudWxsICYmIG10LmlkID09IG51bGwpIHx8IChpZCAhPSBudWxsICYmIGlkLmVxdWFscyhtdC5pZCkpKSB7Ci0JCQkJaWYgKCh2ZXJzaW9uID09IG51bGwgJiYgbXQudmVyc2lvbiA9PSBudWxsKSB8fCAodmVyc2lvbiAhPSBudWxsICYmIHZlcnNpb24uZXF1YWxzKG10LnZlcnNpb24pKSkKLQkJCQkJcmV0dXJuIG10OwotCQkJfQotCQl9Ci0JCQotCQkvLyBvdGhlcndpc2UgY3JlYXRlIG9uZQotCQlNb2R1bGVUeXBlIG10ID0gbmV3IE1vZHVsZVR5cGUoaWQsIHZlcnNpb24pOwotCQltb2R1bGVUeXBlcy5hZGQobXQpOwotCQlyZXR1cm4gbXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24KLQkgKiBtb2R1bGUgdHlwZXMgZm9yIHRoZSBvbmUgYSBtYXRjaGluZwotCSAqIG1vZHVsZSB0eXBlIGlkICh7QGxpbmsgTW9kdWxlVHlwZSNnZXRJZCgpfSkuIFRoZSBpZCBtYXkgbm90IGJlIG51bGwuCi0JICoKLQkgKiBAcGFyYW0gaWQgdGhlIG1vZHVsZSB0eXBlIGlkCi0JICogQHJldHVybiB0aGUgbW9kdWxlIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIG1vZHVsZSB0eXBlCi0JICogd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNb2R1bGVLaW5kIGZpbmRNb2R1bGVUeXBlKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotCQlpZiAobW9kdWxlS2luZHMgPT0gbnVsbCkKLQkJCWxvYWRNb2R1bGVUeXBlcygpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVLaW5kcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNb2R1bGVLaW5kIG1vZHVsZVR5cGUgPSAoTW9kdWxlS2luZCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGlkLmVxdWFscyhtb2R1bGVUeXBlLmdldElkKCkpKQotCQkJCXJldHVybiBtb2R1bGVUeXBlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIG1vZHVsZSB0eXBlcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkTW9kdWxlVHlwZXMoKSB7Ci0JCWlmIChtb2R1bGVLaW5kcyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRVhURU5TSU9OX1BPSU5ULCAiLT4tIExvYWRpbmcgLm1vZHVsZVR5cGVzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJfQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAibW9kdWxlVHlwZXMiKTsKLQotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJbW9kdWxlS2luZHMgPSBuZXcgQXJyYXlMaXN0PE1vZHVsZUtpbmQ+KHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlNb2R1bGVLaW5kIG1vZHVsZVR5cGUgPSBuZXcgTW9kdWxlS2luZChjZltpXSk7Ci0JCQkJbW9kdWxlS2luZHMuYWRkKG1vZHVsZVR5cGUpOwotCQkJCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0VYVEVOU0lPTl9QT0lOVCwgIiAgTG9hZGVkIG1vZHVsZVR5cGU6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBtb2R1bGVUeXBlOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5tb2R1bGVUeXBlcyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgaGFzaCA9IDE3OwotCQlpZiAoaWQgIT0gbnVsbCkKLQkJCWhhc2ggKz0gaWQuaGFzaENvZGUoKTsKLQkJaWYgKHZlcnNpb24gIT0gbnVsbCkKLQkJCWhhc2ggKz0gdmVyc2lvbi5oYXNoQ29kZSgpOwotCQlyZXR1cm4gaGFzaDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IHRoaXMpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWlmICghKG9iaiBpbnN0YW5jZW9mIE1vZHVsZVR5cGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJTW9kdWxlVHlwZSBtdCA9IChNb2R1bGVUeXBlKSBvYmo7Ci0JCWlmICghU2VydmVyUGx1Z2luLm1hdGNoZXMoaWQsIG10LmlkKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmICghU2VydmVyUGx1Z2luLm1hdGNoZXModmVyc2lvbiwgbXQudmVyc2lvbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIk1vZHVsZVR5cGVbIiArIGlkICsgIiwgIiArIHZlcnNpb24gKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHJvZ3Jlc3NVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMTBkMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHJvZ3Jlc3NVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotLyoqCi0gKiBQcm9ncmVzcyBNb25pdG9yIHV0aWxpdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9ncmVzc1V0aWwgewotCS8qKgotCSAqIFByb2dyZXNzVXRpbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgUHJvZ3Jlc3NVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZhbGlkIHByb2dyZXNzIG1vbml0b3IuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0TW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlCi0JICogY3VycmVudCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKiBAcGFyYW0gdGlja3MgaW50Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRTdWJNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRpY2tzKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlCi0JICogY3VycmVudCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHBhcmFtIHRpY2tzIHRoZSBudW1iZXIgb2YgdGlja3MKLQkgKiBAcGFyYW0gc3R5bGUgYSBzdHlsZQotCSAqIEByZXR1cm4gYSBwcm9ncmVzcyBtb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFN1Yk1vbml0b3JGb3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgdGlja3MsIGludCBzdHlsZSkgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWlmIChtb25pdG9yIGluc3RhbmNlb2YgTnVsbFByb2dyZXNzTW9uaXRvcikKLQkJCXJldHVybiBtb25pdG9yOwotCQlyZXR1cm4gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCB0aWNrcywgc3R5bGUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Qcm9qZWN0UHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHJvamVjdFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZiYWE0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Qcm9qZWN0UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLS8qKgotICogSGVscGVyIGNsYXNzIHRoYXQgc3RvcmVzIHByZWZlcmVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBzZXJ2ZXIgdG9vbHMuCi0gKiAKLSAqIFRoaXMgY2xhc3MgY3VycmVudGx5IGFsd2F5cyByZWFkcyBmcm9tIGRpc2suIEl0IHNob3VsZCBjYWNoZSB0aGUgZmlsZQotICogYW5kIGhhdmUgYSByZXNvdXJjZSBsaXN0ZW5lci4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RQcm9wZXJ0aWVzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9GT0xERVIgPSAiLnNldHRpbmdzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9GSUxFID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5wcmVmcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9QUk9KRUNUX1BSRUYgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmlzU2VydmVyUHJvamVjdCI7Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQotCXByb3RlY3RlZCBib29sZWFuIHNlcnZlclByb2plY3QgPSBmYWxzZTsKLQotCS8qKgotCSAqIFByb2plY3RQcm9wZXJ0aWVzIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAotCSAqLwotCXB1YmxpYyBQcm9qZWN0UHJvcGVydGllcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgcHJlZmVyZW5jZXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcmVmZXJlbmNlcygpIHsKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIkxvYWRpbmcgcHJvamVjdCBwcmVmZXJlbmNlczogIiArIHByb2plY3QpOwotCQl9Ci0JCQotCQlpZiAoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGb2xkZXIoUFJFRkVSRU5DRV9GT0xERVIpLmdldEZpbGUoUFJFRkVSRU5DRV9GSUxFKTsKLQkJCWlmIChmaWxlID09IG51bGwgfHwgIWZpbGUuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlwLmxvYWQoaW4pOwotCQkJCi0JCQlTdHJpbmcgcyA9IHAuZ2V0UHJvcGVydHkoU0VSVkVSX1BST0pFQ1RfUFJFRik7Ci0JCQlpZiAocyAhPSBudWxsICYmICJ0cnVlIi5lcXVhbHMocykpCi0JCQkJc2VydmVyUHJvamVjdCA9IHRydWU7Ci0JCQllbHNlCi0JCQkJc2VydmVyUHJvamVjdCA9IGZhbHNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZCBub3QgbG9hZCBwcmVmZXJlbmNlcyIsIGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZVByZWZlcmVuY2VzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocHJvamVjdCA9PSBudWxsIHx8ICFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuOwotCQkKLQkJSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihQUkVGRVJFTkNFX0ZPTERFUik7Ci0JCWlmICghZm9sZGVyLmV4aXN0cygpKQotCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBtb25pdG9yKTsKLQkJCi0JCUlGaWxlIGZpbGUgPSBwcm9qZWN0LmdldEZvbGRlcihQUkVGRVJFTkNFX0ZPTERFUikuZ2V0RmlsZShQUkVGRVJFTkNFX0ZJTEUpOwotCQkKLQkJaWYgKGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5pc1JlYWRPbmx5KCkpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChuZXcgSUZpbGVbXSB7IGZpbGUgfSwgbnVsbCk7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCQkvLyBkaWRuJ3Qgd29yayBvciBub3QgdW5kZXIgc291cmNlIGNvbnRyb2wKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9Ci0JCQotCQlQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwotCQlwLnB1dCgiZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uIiwgIjEiKTsKLQkJaWYgKHNlcnZlclByb2plY3QpCi0JCQlwLnB1dChTRVJWRVJfUFJPSkVDVF9QUkVGLCAidHJ1ZSIpOwotCQllbHNlCi0JCQlwLnB1dChTRVJWRVJfUFJPSkVDVF9QUkVGLCAiZmFsc2UiKTsKLQkJCi0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlwLnN0b3JlKG91dCwgbnVsbCk7Ci0JCQotCQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0LnRvQnl0ZUFycmF5KCkpOwotCQkJCi0JCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQlmaWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBtb25pdG9yKTsKLQkJCWVsc2UKLQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgcnVudGltZSB0YXJnZXQgdHlwZSBmb3IgdGhlIGdpdmVuIHByb2plY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgcnVudGltZSB0YXJnZXQKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWUgZ2V0UnVudGltZVRhcmdldCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHByb2plY3QgY2FuIGNvbnRhaW4gc2VydmVyIGFydGlmYWN0cywgYW5kCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcHJvamVjdCBjYW4gY29udGFpbiBzZXJ2ZXIgYXJ0aWZhY3RzLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXJQcm9qZWN0KCkgewotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHNlcnZlclByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIHRoZSBwcm9qZWN0IGNhbiBjb250YWluIHNlcnZlciByZXNvdXJjZXMuCi0JICogCi0JICogQHBhcmFtIGIgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gYWxsb3cgdGhlIHByb2plY3QgdG8gY29udGFpbiBzZXJ2ZXIKLQkgKiAgICByZXNvdXJjZXMsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxsb3cgdGhlIHByb2plY3QgdG8gY29udGFpbgotCSAqICAgIHNlcnZlcnMKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBzZXR0aW5nIHRoZSBzZXJ2ZXIgcHJvamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlclByb2plY3QoYm9vbGVhbiBiLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0JCXNlcnZlclByb2plY3QgPSBiOwotCQlzYXZlUHJlZmVyZW5jZXMobW9uaXRvcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJQcm9qZWN0UHJvcGVydGllc1siICsgcHJvamVjdCArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHVibGlzaENvbnRyb2xsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNzQ5YzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHVibGlzaENvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUHVibGlzaENvbnRyb2xsZXJEZWxlZ2F0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoQ29udHJvbGxlciB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIFB1Ymxpc2hDb250cm9sbGVyRGVsZWdhdGUgZGVsZWdhdGU7Ci0KLQkvKioKLQkgKiBQdWJsaXNoZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudCAKLQkgKi8KLQlwdWJsaWMgUHVibGlzaENvbnRyb2xsZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImRlc2NyaXB0aW9uIik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVJZHMoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gU2VydmVyUGx1Z2luLnRva2VuaXplKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlSWRzIiksICIsIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzVHlwZShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIFNlcnZlclBsdWdpbi5jb250YWlucyhnZXRUeXBlSWRzKCksIGlkKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVB1Ymxpc2hlciNnZXREZWxlZ2F0ZSgpCi0JICovCi0JcHVibGljIFB1Ymxpc2hDb250cm9sbGVyRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB7Ci0JCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCWRlbGVnYXRlID0gKFB1Ymxpc2hDb250cm9sbGVyRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCQlpZiAoVHJhY2UuUEVSRk9STUFOQ0UpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1BFUkZPUk1BTkNFLCAiUHVibGlzaFRhc2suZ2V0RGVsZWdhdGUoKTogPCIKLQkJCQkJCQkrIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpICsgIj4gIiArIGdldElkKCkpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSIgKyB0b1N0cmluZygpLCB0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaFJlcXVpcmVkKElTZXJ2ZXIgc2VydmVyLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQl0cnkgewotCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJUYXNrLmluaXQgIiArIHRoaXMpOwotCQkJfQotCQkJcmV0dXJuIGdldERlbGVnYXRlKCkuaXNQdWJsaXNoUmVxdWlyZWQoc2VydmVyLCBkZWx0YSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBhIHN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUHVibGlzaENvbnRyb2xsZXJbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9QdWJsaXNoSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDUxOGE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0vKioKLSAqIEhlbHBlciB0byBvYnRhaW4gYW5kIHN0b3JlIHRoZSBnbG9iYWwgcHVibGlzaCBpbmZvcm1hdGlvbi4KLSAqICh3aGF0IGZpbGVzIHdlcmUgcHVibGlzaGVkIGFuZCB3aGVuKSBEZWxlZ2F0ZXMgdG8gUHVibGlzaFN0YXRlCi0gKiBmb3IgYWxsIHNlcnZlciBzcGVjaWZpYyBwdWJsaXNoaW5nIGluZm9ybWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaEluZm8gewotCXByb3RlY3RlZCBzdGF0aWMgUHVibGlzaEluZm8gaW5zdGFuY2U7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0RJUiA9ICJwdWJsaXNoIjsKLQotCS8vIG1hcCBvZiBzZXJ2ZXIgaWRzIHRvIFN0cmluZ3Mgb2YgZmlsZW5hbWUgY29udGFpbmluZyBwdWJsaXNoIGRhdGEKLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgU3RyaW5nPiBzZXJ2ZXJJZFRvUGF0aDsKLQotCS8vIG1hcCBvZiBsb2FkZWQgc2VydmVySWRzIHRvIHB1Ymxpc2ggaW5mbwotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBTZXJ2ZXJQdWJsaXNoSW5mbz4gc2VydmVySWRUb1B1Ymxpc2hJbmZvOwotCi0JLyoqCi0JICogUHVibGlzaEluZm8gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFB1Ymxpc2hJbmZvKCkgewotCQlzdXBlcigpOwotCQotCQlzZXJ2ZXJJZFRvUGF0aCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQlzZXJ2ZXJJZFRvUHVibGlzaEluZm8gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlcnZlclB1Ymxpc2hJbmZvPigpOwotCQlsb2FkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwdWJsaXNoIGluZm8uCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUHVibGlzaEluZm8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFB1Ymxpc2hJbmZvIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChQVUJMSVNIX0RJUikgewotCQkJCWluc3RhbmNlID0gbmV3IFB1Ymxpc2hJbmZvKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHVibGlzaCBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5QdWJsaXNoU3RhdGUKLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHVibGljIFNlcnZlclB1Ymxpc2hJbmZvIGdldFNlcnZlclB1Ymxpc2hJbmZvKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCS8vIGhhdmUgd2UgdHJpZWQgbG9hZGluZyB5ZXQ/Ci0JCVN0cmluZyBzZXJ2ZXJJZCA9IHNlcnZlci5nZXRJZCgpOwotCQlpZiAoc2VydmVySWRUb1BhdGguY29udGFpbnNLZXkoc2VydmVySWQpKSB7Ci0JCQlpZiAoc2VydmVySWRUb1B1Ymxpc2hJbmZvLmNvbnRhaW5zS2V5KHNlcnZlcklkKSkKLQkJCQlyZXR1cm4gc2VydmVySWRUb1B1Ymxpc2hJbmZvLmdldChzZXJ2ZXJJZCk7Ci0JCQkKLQkJCS8vIGZvcmNlIC5kYXQgZXh0ZW5zaW9uCi0JCQlTdHJpbmcgcGFydGlhbFBhdGggPSBzZXJ2ZXJJZFRvUGF0aC5nZXQoc2VydmVySWQpOwotCQkJcGFydGlhbFBhdGggPSBwYXJ0aWFsUGF0aC5zdWJzdHJpbmcoMCwgcGFydGlhbFBhdGgubGVuZ3RoKCkgLSAzKSArICJkYXQiOwotCQkJSVBhdGggcGF0aCA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoUFVCTElTSF9ESVIpLmFwcGVuZChwYXJ0aWFsUGF0aCk7Ci0JCQlTZXJ2ZXJQdWJsaXNoSW5mbyBzcGkgPSBuZXcgU2VydmVyUHVibGlzaEluZm8ocGF0aCk7Ci0JCQlzZXJ2ZXJJZFRvUHVibGlzaEluZm8ucHV0KHNlcnZlcklkLCBzcGkpOwotCQkJcmV0dXJuIHNwaTsKLQkJfQotCQkKLQkJLy8gZmlyc3QgdGltZSBzZXJ2ZXIgaXMgYmVpbmcgdXNlZAotCQlJUGF0aCBwYXRoID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChQVUJMSVNIX0RJUik7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgudG9PU1N0cmluZygpKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJZmlsZS5ta2RpcigpOwotCQkKLQkJZmlsZSA9IG51bGw7Ci0JCWludCBpID0gMDsKLQkJU3RyaW5nIHBhcnRpYWxQYXRoID0gbnVsbDsKLQkJU2VydmVyUHVibGlzaEluZm8gc3BpID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChQVUJMSVNIX0RJUikgewotCQkJd2hpbGUgKGZpbGUgPT0gbnVsbCB8fCBmaWxlLmV4aXN0cygpKSB7Ci0JCQkJcGFydGlhbFBhdGggPSAicHVibGlzaCIgKyBpICsgIi5kYXQiOwotCQkJCXBhdGggPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKFBVQkxJU0hfRElSKS5hcHBlbmQocGFydGlhbFBhdGgpOwotCQkJCWlmIChzZXJ2ZXJJZFRvUGF0aC5nZXQocGFydGlhbFBhdGgpID09IG51bGwpCi0JCQkJCWZpbGUgPSBuZXcgRmlsZShwYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCQkJaSsrOwotCQkJfQotCQkJCi0JCQlzcGkgPSBuZXcgU2VydmVyUHVibGlzaEluZm8ocGF0aCk7Ci0JCQlzZXJ2ZXJJZFRvUGF0aC5wdXQoc2VydmVySWQsIHBhcnRpYWxQYXRoKTsKLQkJCXNlcnZlcklkVG9QdWJsaXNoSW5mby5wdXQoc2VydmVySWQsIHNwaSk7Ci0JCQlzYXZlKCk7Ci0JCX0KLQkJcmV0dXJuIHNwaTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNlcnZlciBwdWJsaXNoIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZXJ2ZXJQdWJsaXNoSW5mbyhJU2VydmVyIHNlcnZlcikgewotCQlJUGF0aCBwYXRoID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChQVUJMSVNIX0RJUik7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgudG9PU1N0cmluZygpKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQkKLQkJU3RyaW5nIHNlcnZlcklkID0gc2VydmVyLmdldElkKCk7Ci0JCVN0cmluZyBwYXRoMiA9IHNlcnZlcklkVG9QYXRoLmdldChzZXJ2ZXJJZCk7Ci0JCXN5bmNocm9uaXplZCAoUFVCTElTSF9ESVIpIHsKLQkJCXNlcnZlcklkVG9QYXRoLnJlbW92ZShzZXJ2ZXJJZCk7Ci0JCQlzZXJ2ZXJJZFRvUHVibGlzaEluZm8ucmVtb3ZlKHNlcnZlcklkKTsKLQkJCXNhdmUoKTsKLQkJfQotCQlpZiAocGF0aDIgIT0gbnVsbCkgewotCQkJcGF0aC5hcHBlbmQocGF0aDIpLnRvRmlsZSgpLmRlbGV0ZSgpOwotCQkJcGF0aDIgPSBwYXRoMi5zdWJzdHJpbmcoMCwgcGF0aDIubGVuZ3RoKCkgLSAzKSArICJ4bWwiOwotCQkJcGF0aC5hcHBlbmQocGF0aDIpLnRvRmlsZSgpLmRlbGV0ZSgpOwotCQkJcGF0aDIgPSBwYXRoMi5zdWJzdHJpbmcoMCwgcGF0aDIubGVuZ3RoKCkgLSAzKSArICJkYXQiOwotCQkJcGF0aC5hcHBlbmQocGF0aDIpLnRvRmlsZSgpLmRlbGV0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZCgpIHsKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIkxvYWRpbmcgcHVibGlzaCBpbmZvIik7Ci0JCX0KLQkJU3RyaW5nIGZpbGVuYW1lID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZCgicHVibGlzaC54bWwiKS50b09TU3RyaW5nKCk7Ci0JCQotCQl0cnkgewotCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oZmlsZW5hbWUpOwotCQkJCi0JCQlJTWVtZW50b1tdIHNlcnZlckNoaWxkID0gbWVtZW50by5nZXRDaGlsZHJlbigic2VydmVyIik7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlckNoaWxkLmxlbmd0aDsKLQkJCXNlcnZlcklkVG9QYXRoID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KHNpemUgKyAyKTsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTdHJpbmcgaWQgPSBzZXJ2ZXJDaGlsZFtpXS5nZXRTdHJpbmcoImlkIik7Ci0JCQkJU3RyaW5nIHBhcnRpYWxQYXRoID0gc2VydmVyQ2hpbGRbaV0uZ2V0U3RyaW5nKCJwYXRoIik7Ci0JCQkJc2VydmVySWRUb1BhdGgucHV0KGlkLCBwYXJ0aWFsUGF0aCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgZ2xvYmFsIHB1Ymxpc2ggaW5mbyIsIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZSgpIHsKLQkJU3RyaW5nIGZpbGVuYW1lID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZCgicHVibGlzaC54bWwiKS50b09TU3RyaW5nKCk7Ci0JCQotCQl0cnkgewotCQkJWE1MTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QoInB1Ymxpc2gtaW5mbyIpOwotCQkJCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZlcklkVG9QYXRoLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIHNlcnZlcklkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCVN0cmluZyBwYXJ0aWFsUGF0aCA9IHNlcnZlcklkVG9QYXRoLmdldChzZXJ2ZXJJZCk7Ci0JCQkJCi0JCQkJSU1lbWVudG8gc2VydmVyID0gbWVtZW50by5jcmVhdGVDaGlsZCgic2VydmVyIik7Ci0JCQkJc2VydmVyLnB1dFN0cmluZygiaWQiLCBzZXJ2ZXJJZCk7Ci0JCQkJc2VydmVyLnB1dFN0cmluZygicGF0aCIsIHBhcnRpYWxQYXRoKTsKLQkJCX0KLQkJCQotCQkJbWVtZW50by5zYXZlVG9GaWxlKGZpbGVuYW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgZ2xvYmFsIHB1Ymxpc2ggaW5mbyIsIGUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHVibGlzaFNlcnZlckpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHVibGlzaFNlcnZlckpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2RiZGViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hTZXJ2ZXJKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0vKioKLSAqIEpvYiB0byBwdWJsaXNoIHRvIGEgcGFydGljdWxhciBzZXJ2ZXIuCi0gKiAKLSAqIEBkZXByZWNhdGVkIC0gdXNlIEFQSSBkaXJlY3RseSwgaXQgd2lsbCBraWNrIG9mZiBqb2JzIGFzIHJlcXVpcmVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoU2VydmVySm9iIGV4dGVuZHMgQ2hhaW5lZEpvYiB7Ci0JcHJvdGVjdGVkIGludCBraW5kOwotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrOwotCXByb3RlY3RlZCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlczsKLQlwcm90ZWN0ZWQgSUFkYXB0YWJsZSBpbmZvOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHB1Ymxpc2hpbmcgam9iLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlciB0byBwdWJsaXNoIHRvCi0JICogQHBhcmFtIGtpbmQgdGhlIGtpbmQgb2YgcHVibGlzaAotCSAqIEBwYXJhbSBpbmZvIHRoZSBJQWRhcHRhYmxlIChvciA8Y29kZT5udWxsPC9jb2RlPikgcHJvdmlkZWQgYnkgdGhlCi0JICogICAgY2FsbGVyIGluIG9yZGVyIHRvIHN1cHBseSBVSSBpbmZvcm1hdGlvbiBmb3IgcHJvbXB0aW5nIHRoZQotCSAqICAgIHVzZXIgaWYgbmVjZXNzYXJ5LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAotCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpdCBzaG91bGQgbWluaW1hbGx5IGNvbnRhaW4gYW4gYWRhcHRlcgotCSAqICAgIGZvciB0aGUgU2hlbGwgY2xhc3MuCi0JICovCi0JcHVibGljIFB1Ymxpc2hTZXJ2ZXJKb2IoSVNlcnZlciBzZXJ2ZXIsIGludCBraW5kLCBJQWRhcHRhYmxlIGluZm8pIHsKLQkJdGhpcyhzZXJ2ZXIsIGtpbmQsIG51bGwsIGluZm8pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBwdWJsaXNoaW5nIGpvYi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgdG8gcHVibGlzaCB0bwotCSAqIEBwYXJhbSBraW5kIHRoZSBraW5kIG9mIHB1Ymxpc2gKLQkgKiBAcGFyYW0gbW9kdWxlcyBhIGxpc3Qgb2YgbW9kdWxlcyB0byBwdWJsaXNoLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotCSAqICAgIHB1Ymxpc2ggYWxsIG1vZHVsZXMKLQkgKiBAcGFyYW0gaW5mbyB0aGUgSUFkYXB0YWJsZSAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHByb3ZpZGVkIGJ5IHRoZQotCSAqICAgIGNhbGxlciBpbiBvcmRlciB0byBzdXBwbHkgVUkgaW5mb3JtYXRpb24gZm9yIHByb21wdGluZyB0aGUKLQkgKiAgICB1c2VyIGlmIG5lY2Vzc2FyeS4gV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBub3QKLQkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiwgaXQgc2hvdWxkIG1pbmltYWxseSBjb250YWluIGFuIGFkYXB0ZXIKLQkgKiAgICBmb3IgdGhlIFNoZWxsIGNsYXNzLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoU2VydmVySm9iKElTZXJ2ZXIgc2VydmVyLCBpbnQga2luZCwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZXMsIElBZGFwdGFibGUgaW5mbykgewotCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy5wdWJsaXNoaW5nLCBzZXJ2ZXIuZ2V0TmFtZSgpKSwgc2VydmVyKTsKLQkJdGhpcy5raW5kID0ga2luZDsKLQkJdGhpcy5tb2R1bGVzID0gbW9kdWxlczsKLQkJdGhpcy5pbmZvID0gaW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcHVibGlzaGluZyBqb2IuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRvIHB1Ymxpc2ggdG8KLQkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiBwdWJsaXNoCi0JICogQHBhcmFtIGNoZWNrIHRvIGNoZWNrIGlmIGF1dG8tcHVibGlzaGluZyBpcyBhbHJlYWR5IGNvdmVyaW5nIHRoZSBwdWJsaXNoCi0JICovCi0JcHVibGljIFB1Ymxpc2hTZXJ2ZXJKb2IoSVNlcnZlciBzZXJ2ZXIsIGludCBraW5kLCBib29sZWFuIGNoZWNrKSB7Ci0JCXRoaXMoc2VydmVyLCBraW5kLCBudWxsLCBudWxsKTsKLQkJdGhpcy5jaGVjayA9IGNoZWNrOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBwdWJsaXNoaW5nIGpvYi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgdG8gcHVibGlzaCB0bwotCSAqIEBkZXByZWNhdGVkIHVzZSBvbmUgb2YgdGhlIG90aGVyIGNvbnN0cnVjdG9ycyBpbnN0ZWFkCi0JICovCi0JcHVibGljIFB1Ymxpc2hTZXJ2ZXJKb2IoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJdGhpcyhzZXJ2ZXIsIElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2IjcnVuKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvL2lmICghZ2V0U2VydmVyKCkuc2hvdWxkUHVibGlzaCgpKQotCQkvLwlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCi0JCWlmIChjaGVjayAmJiAhU2VydmVyQ29yZS5pc0F1dG9QdWJsaXNoaW5nKCkpIHsKLQkJCS8vIGRvbid0IHJ1biBpZiB3ZSdyZSBhdXRvLXB1Ymxpc2hpbmcgYW5kIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgcHVibGlzaC4KLQkJCS8vIGNhbid0IGV4ZWN1dGUgdGhpcyBjb2RlIGluIHNob3VsZFJ1bigpIGJlY2F1c2UgaXQgd2lsbCBjYW5jZWwgdGhlIGpvYgotCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgaW1tZWRpYXRlbHkKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQkKLQkJZmluYWwgSVN0YXR1c1tdIHN0YXR1cyA9IG5ldyBJU3RhdHVzWzFdOwotCQlnZXRTZXJ2ZXIoKS5wdWJsaXNoKGtpbmQsIG1vZHVsZXMsIGluZm8sIG5ldyBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvbmUoSVN0YXR1cyByZXN1bHQpIHsKLQkJCQlzdGF0dXNbMF0gPSByZXN1bHQ7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJd2hpbGUgKHN0YXR1c1swXSA9PSBudWxsICYgIW1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCQlpZiAoc3RhdHVzWzBdICE9IG51bGwpCi0JCQlyZXR1cm4gc3RhdHVzWzBdOwotCQkKLQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9QdWJsaXNoVGFzay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHVibGlzaFRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljMjliMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9QdWJsaXNoVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hUYXNrRGVsZWdhdGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaFRhc2sgaW1wbGVtZW50cyBJUHVibGlzaFRhc2sgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBQdWJsaXNoVGFza0RlbGVnYXRlIGRlbGVnYXRlOwotCi0JLyoqCi0JICogUHVibGlzaFRhc2sgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudCAKLQkgKi8KLQlwdWJsaWMgUHVibGlzaFRhc2soSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVJZHMoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gU2VydmVyUGx1Z2luLnRva2VuaXplKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlSWRzIiksICIsIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzVHlwZShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIFNlcnZlclBsdWdpbi5jb250YWlucyhnZXRUeXBlSWRzKCksIGlkKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVB1Ymxpc2hUYXNrI2dldERlbGVnYXRlKCkKLQkgKi8KLQlwdWJsaWMgUHVibGlzaFRhc2tEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJZGVsZWdhdGUgPSAoUHVibGlzaFRhc2tEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJCWlmIChUcmFjZS5QRVJGT1JNQU5DRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfUEVSRk9STUFOQ0UsICJQdWJsaXNoVGFzay5nZXREZWxlZ2F0ZSgpOiA8IgotCQkJCQkJCSsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkgKyAiPiAiICsgZ2V0SWQoKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlIiArIHRvU3RyaW5nKCksIHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcGVyYXRpb25bXSBnZXRUYXNrcyhJU2VydmVyIHNlcnZlciwgTGlzdCBtb2R1bGVzKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIlRhc2suaW5pdCAiICsgdGhpcyk7Ci0JCQl9Ci0JCQlQdWJsaXNoT3BlcmF0aW9uW10gcG8gPSBnZXREZWxlZ2F0ZSgpLmdldFRhc2tzKHNlcnZlciwgbW9kdWxlcyk7Ci0JCQlpZiAocG8gIT0gbnVsbCkKLQkJCQlyZXR1cm4gcG87Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgUHVibGlzaE9wZXJhdGlvblswXTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUKLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wZXJhdGlvbltdIGdldFRhc2tzKElTZXJ2ZXIgc2VydmVyLCBpbnQga2luZCwgTGlzdCBtb2R1bGVzLCBMaXN0IGtpbmRMaXN0KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIlRhc2suaW5pdCAiICsgdGhpcyk7Ci0JCQl9Ci0JCQlQdWJsaXNoT3BlcmF0aW9uW10gcG8gPSBnZXREZWxlZ2F0ZSgpLmdldFRhc2tzKHNlcnZlciwga2luZCwgbW9kdWxlcywga2luZExpc3QpOwotCQkJaWYgKHBvICE9IG51bGwpCi0JCQkJcmV0dXJuIHBvOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IFB1Ymxpc2hPcGVyYXRpb25bMF07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUHVibGlzaFRhc2tbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHVibGlzaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMmI4MmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHVibGlzaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5QdWJsaXNoZXJEZWxlZ2F0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoZXIgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBQdWJsaXNoZXJEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQlwcml2YXRlIGJvb2xlYW4gbW9kaWZ5TW9kdWxlcyA9IGZhbHNlOwotCi0JLyoqCi0JICogUHVibGlzaGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQgCi0JICovCi0JcHVibGljIFB1Ymxpc2hlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qCi0JICogQHNlZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZUlkcygpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBTZXJ2ZXJQbHVnaW4udG9rZW5pemUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGVJZHMiKSwgIiwiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNUeXBlKFN0cmluZyBpZCkgewotCQlyZXR1cm4gU2VydmVyUGx1Z2luLmNvbnRhaW5zKGdldFR5cGVJZHMoKSwgaWQpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHVibGlzaGVyI2dldERlbGVnYXRlKCkKLQkgKi8KLQlwdWJsaWMgUHVibGlzaGVyRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB7Ci0JCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCWRlbGVnYXRlID0gKFB1Ymxpc2hlckRlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQkJaWYgKFRyYWNlLlBFUkZPUk1BTkNFKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19QRVJGT1JNQU5DRSwgIlB1Ymxpc2hUYXNrLmdldERlbGVnYXRlKCk6IDwiCi0JCQkJCQkJKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSArICI+ICIgKyBnZXRJZCgpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUiICsgdG9TdHJpbmcoKSwgdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIG9yaWdpbmFsIHtAbGluayBJU2NoZWR1bGluZ1J1bGV9IGJlIGNoYW5nZWQgd2l0aCB0aGUgbmV3IHtAbGluayBJU2NoZWR1bGluZ1J1bGV9PwotCSAqIAotCSAqIEBwYXJhbSBvcmlnaW5hbFJ1bGUKLQkgKiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCB7QGxpbmsgSVNjaGVkdWxpbmdSdWxlfQotCSAqIEBwYXJhbSBuZXdSdWxlCi0JICogICAgICAgICAgICBUaGUgbmV3IHtAbGluayBJU2NoZWR1bGluZ1J1bGV9Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbmV3IHNjaGVkdWxpbmcgcnVsZSBzaG91bGQgYmUgYXBwbGllZDsgT3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hhbmdlU2NoZWR1bGluZ1J1bGUoSVNjaGVkdWxpbmdSdWxlIG9yaWdpbmFsUnVsZSwgSVNjaGVkdWxpbmdSdWxlIG5ld1J1bGUpIHsKLQotCQlib29sZWFuIGNoYW5nZVJ1bGUgPSBmYWxzZTsKLQkJaWYgKChvcmlnaW5hbFJ1bGUgPT0gbnVsbCkgJiYgKG5ld1J1bGUgPT0gbnVsbCkpIHsKLQkJCS8vIG5vIG5lZWQgdG8gY2hhbmdlIHJ1bGVzIGlmIHRoZXkncmUgYm90aCBudWxsCi0JCQljaGFuZ2VSdWxlID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSBpZigob3JpZ2luYWxSdWxlID09IG51bGwpICYmIChuZXdSdWxlICE9IG51bGwpKSB7Ci0JCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgbm8gcnVsZSBhbmQgYSBuZXcgbm90LW51bGwgcnVsZSB3YW50cyB0byBiZSBhZGRlZCAKLQkJCWNoYW5nZVJ1bGUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYoKG9yaWdpbmFsUnVsZSAhPSBudWxsKSAmJiAobmV3UnVsZSA9PSBudWxsKSkgewotCQkJLy8gdGhlcmUgaXMgY3VycmVudGx5IGEgcnVsZSBhbmQgYSBuZXcgbnVsbCBydWxlIHdhbnRzIHRvIGJlIGFwcGxpZWQKLQkJCWNoYW5nZVJ1bGUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYoKG9yaWdpbmFsUnVsZSAhPSBudWxsKSAmJiAobmV3UnVsZSAhPSBudWxsKSkgewotCQkJLy8gdGhlcmUgaXMgY3VycmVudGx5IGEgcnVsZSBhbmQgYSBuZXcgbm90LW51bGwgcnVsZSB3YW50cyB0byBiZSBhcHBsaWVkLgotCQkJY2hhbmdlUnVsZSA9ICFvcmlnaW5hbFJ1bGUuZXF1YWxzKG5ld1J1bGUpOwotCQl9Ci0JCXJldHVybiBjaGFuZ2VSdWxlOwotCX0KLQotCS8qKgotCSAqIHJlYnVpbGQgdGhlIGNhY2hlIGZvciB0aGUgbW9kdWxlcyBpbnZvbHZlZCB3aXRoIHRoaXMgdGFzay4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVidWlsZE1vZHVsZUNhY2hlKCkgewotCi0JCS8vIHJlc2V0IHRoZSBwdWJsaXNoaW5nIGNhY2hlIGZvciB0aGUgbW9kdWxlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgdGFzay4KLQkJU2VydmVyIHNlcnZlciA9IChTZXJ2ZXIpIGdldERlbGVnYXRlKCkuZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJLy8gbWFrZSBzdXJlIHRoZSByaWdodCBzZXJ2ZXIgaXMgdXNlZC4KLQkJCWlmKHNlcnZlci5pc1dvcmtpbmdDb3B5KCkpIHsKLQkJCQlJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHkgPSAoSVNlcnZlcldvcmtpbmdDb3B5KXNlcnZlcjsKLQkJCQlzZXJ2ZXIgPSAoU2VydmVyKSB3b3JraW5nQ29weS5nZXRPcmlnaW5hbCgpOwotCQkJfQotCQkJZmluYWwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZUxpc3QgPSBnZXREZWxlZ2F0ZSgpLmdldE1vZGlmaWVkTW9kdWxlcygpOwotCQkJaWYgKG1vZHVsZUxpc3QgIT0gbnVsbCkgewotCQkJCWZpbmFsIEl0ZXJhdG9yPElNb2R1bGVbXT4gbW9kdWxlSXRlcmF0b3IgPSBtb2R1bGVMaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKG1vZHVsZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlJTW9kdWxlW10gbW9kdWxlID0gbW9kdWxlSXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCQkJCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAicmVidWlsZGluZyBjYWNoZSBmb3IgbW9kdWxlOiAiCi0JCQkJCQkJCQkrIG1vZHVsZVttb2R1bGUubGVuZ3RoIC0gMV0pOwotCQkJCQkJfQotCQkJCQkJc2VydmVyLmdldFNlcnZlclB1Ymxpc2hJbmZvKCkucmVidWlsZENhY2hlKG1vZHVsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiVGFzay5pbml0ICIgKyB0aGlzKTsKLQkJfQotCQlJU2NoZWR1bGluZ1J1bGUgZGVsZWdhdGVQdWJsaXNoZXJSdWxlID0gbnVsbDsKLQkJZmluYWwgSVNjaGVkdWxpbmdSdWxlIG9yaWdpbmFsUHVibGlzaGVyUnVsZSA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkuY3VycmVudFJ1bGUoKTsKLQkJSVN0YXR1cyByZXN1bHRTdGF0dXMgPSBudWxsOwotCQlib29sZWFuIGNoYW5nZVNjaGVkdWxpbmdSdWxlcyA9IGZhbHNlOwotCQl0cnkgewotCQkJZGVsZWdhdGVQdWJsaXNoZXJSdWxlID0gZ2V0RGVsZWdhdGUoKS5nZXRSdWxlKCk7Ci0JCQljaGFuZ2VTY2hlZHVsaW5nUnVsZXMgPSB0aGlzLmNoYW5nZVNjaGVkdWxpbmdSdWxlKG9yaWdpbmFsUHVibGlzaGVyUnVsZSwgZGVsZWdhdGVQdWJsaXNoZXJSdWxlKTsKLQkJCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiQ2hhbmdlIHRoZSBzY2hlZHVsaW5nIHJ1bGUgdG8gZXhlY3V0ZSBkZWxlZ2F0ZTogIgotCQkJCQkJKyBjaGFuZ2VTY2hlZHVsaW5nUnVsZXMpOwotCQkJfQotCQkJaWYgKGNoYW5nZVNjaGVkdWxpbmdSdWxlcykgewotCQkJCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIkVuZGluZyB0aGUgY3VycmVudCBzY2hlZHVsaW5nIHJ1bGUgIiArIG9yaWdpbmFsUHVibGlzaGVyUnVsZSk7Ci0JCQkJfQotCQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuZW5kUnVsZShvcmlnaW5hbFB1Ymxpc2hlclJ1bGUpOwotCQkJCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIkJlZ2lubmluZyB0aGUgbmV3IHNjaGVkdWxpbmcgcnVsZTogIiArIGRlbGVnYXRlUHVibGlzaGVyUnVsZSk7Ci0JCQkJfQotCQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuYmVnaW5SdWxlKGRlbGVnYXRlUHVibGlzaGVyUnVsZSwgbW9uaXRvcik7Ci0JCQl9Ci0JCQlyZXN1bHRTdGF0dXMgPSBnZXREZWxlZ2F0ZSgpLmV4ZWN1dGUoa2luZCwgbW9uaXRvciwgaW5mbyk7Ci0JCQl0aGlzLm1vZGlmeU1vZHVsZXMgPSBnZXREZWxlZ2F0ZSgpLmlzTW9kaWZ5TW9kdWxlcygpOwotCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJUaGUgcHVibGlzaGVyIGRlbGVnYXRlIHN0YXRlZCB0aGF0IGl0IG1vZGlmaWVkIG1vZHVsZXM6ICIKLQkJCQkJCSsgdGhpcy5tb2RpZnlNb2R1bGVzKTsKLQkJCX0KLQkJCWlmKHRoaXMubW9kaWZ5TW9kdWxlcykgewotCQkJCXRoaXMucmVidWlsZE1vZHVsZUNhY2hlKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJfQotCQkJcmVzdWx0U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAiRXJyb3IgaW4gZGVsZWdhdGUiLCBlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChjaGFuZ2VTY2hlZHVsaW5nUnVsZXMpIHsKLQkJCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJSZXNldGluZyB0aGUgc2NoZWR1bGluZyBydWxlcy4uLiBlbmRpbmc6ICIKLQkJCQkJCQkrIGRlbGVnYXRlUHVibGlzaGVyUnVsZSk7Ci0JCQkJfQotCQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuZW5kUnVsZShkZWxlZ2F0ZVB1Ymxpc2hlclJ1bGUpOwotCQkJCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIlJlc2V0aW5nIHRoZSBzY2hlZHVsaW5nIHJ1bGVzLi4uIGJlZ2lubmluZzogIgotCQkJCQkJCSsgb3JpZ2luYWxQdWJsaXNoZXJSdWxlKTsKLQkJCQl9Ci0JCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5iZWdpblJ1bGUob3JpZ2luYWxQdWJsaXNoZXJSdWxlLCBtb25pdG9yKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0U3RhdHVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhc2tNb2RlbChUYXNrTW9kZWwgdGFza01vZGVsKSB7Ci0JCXRyeSB7Ci0JCQlnZXREZWxlZ2F0ZSgpLnNldFRhc2tNb2RlbCh0YXNrTW9kZWwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFjY2Vzc29yIHRvIGZpbmQgb3V0IGlmIHRoaXMgcHVibGlzaGVyIG1vZGlmaWVkIGFueSBtb2R1bGVzIHRoYXQgYXJlIHB1Ymxpc2hlZCBvbiB0aGUgc2VydmVyLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHB1Ymxpc2hlciBtb2RpZmllZCB0aGUgY29udGVudHMgb2YgYW55IG1vZHVsZXMgdGhhdCBhcmUgcHVibGlzaGVkIG9uIHRoZSBzZXJ2ZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RpZnlNb2R1bGVzKCkgewotCi0JCXJldHVybiB0aGlzLm1vZGlmeU1vZHVsZXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJQdWJsaXNoZXJbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1Jlc291cmNlTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUmVzb3VyY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMzU4MjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUmVzb3VyY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Qcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlOwotLyoqCi0gKiBSZXNvdXJjZU1hbmFnZXIgaGFuZGxlcyB0aGUgbWFwcGluZ3MgYmV0d2VlbiByZXNvdXJjZXMKLSAqIGFuZCBzZXJ2ZXJzIG9yIHNlcnZlciBjb25maWd1cmF0aW9ucywgYW5kIGNyZWF0ZXMKLSAqIG5vdGlmaWNhdGlvbiBvZiBzZXJ2ZXJzIG9yIHNlcnZlciBjb25maWd1cmF0aW9ucwotICogYmVpbmcgYWRkZWQgYW5kIHJlbW92ZWQuCi0gKiAKLSAqIDxwPlNlcnZlcnMgYW5kIHNlcnZlciBjb25maWd1cmF0aW9ucyBtYXkgYmUgYSBzaW5nbGUKLSAqIHJlc291cmNlLCBvciB0aGV5IG1heSBiZSBhIGZvbGRlciB0aGF0IGNvbnRhaW5zIGEgZ3JvdXAKLSAqIG9mIGZpbGVzLiBGb2xkZXItcmVzb3VyY2UgbWF5IG5vdCBjb250YWluIG90aGVyIHNlcnZlcnMKLSAqIG9yIGNvbmZpZ3VyYXRpb25zLjwvcD4KLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlTWFuYWdlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9EQVRBX0ZJTEUgPSAic2VydmVycy54bWwiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBFVkVOVF9BRERFRCA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBFVkVOVF9DSEFOR0VEID0gMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEVWRU5UX1JFTU9WRUQgPSAyOwotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VNYW5hZ2VyIGluc3RhbmNlID0gbmV3IFJlc291cmNlTWFuYWdlcigpOwotCi0JLy8gY3VycmVudGx5IGFjdGl2ZSBydW50aW1lcyBhbmQgc2VydmVycwotCXByb3RlY3RlZCBMaXN0PElSdW50aW1lPiBydW50aW1lczsKLQlwcm90ZWN0ZWQgTGlzdDxJU2VydmVyPiBzZXJ2ZXJzOwotCi0JLy8gbGlmZWN5Y2xlIGxpc3RlbmVycwotCXByb3RlY3RlZCBMaXN0PElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXI+IHJ1bnRpbWVMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXI+KDMpOwotCXByb3RlY3RlZCBMaXN0PElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcj4gc2VydmVyTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXI+KDMpOwotCi0JLy8gY2FjaGUgZm9yIGRpc3Bvc2luZyBzZXJ2ZXJzICYgcnVudGltZXMKLQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGFjdGl2ZUJ1bmRsZXM7Ci0KLQkvLyByZXNvdXJjZSBjaGFuZ2UgbGlzdGVuZXJzCi0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotCXByaXZhdGUgUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcGNsOwotCXByb3RlY3RlZCBib29sZWFuIGlnbm9yZVByZWZlcmVuY2VDaGFuZ2VzID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBtb2R1bGVTZXJ2ZXJFdmVudEhhbmRsZXJzOwotCXByb3RlY3RlZCBMaXN0IG1vZHVsZVNlcnZlckV2ZW50SGFuZGxlckluZGV4ZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaW5pdGlhbGl6aW5nOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0PFN0cmluZz4gc2VydmVyUHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMik7Ci0KLQkvKioKLQkgKiBTZXJ2ZXIgcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyLgotCSAqIAotCSAqIFJlc291cmNlIGxpc3RlbmVyIC0gdHJhY2tzIGNoYW5nZXMgb24gc2VydmVyIHJlc291cmNlcyBzbyB0aGF0Ci0JICogd2UgY2FuIHJlbG9hZC9kcm9wIHNlcnZlciBpbnN0YW5jZXMgYW5kIGNvbmZpZ3VyYXRpb25zIHRoYXQKLQkgKiBtYXkgY2hhbmdlIG91dHNpZGUgb2Ygb3VyIGNvbnRyb2wuCi0JICogTGlzdGVucyBmb3IgdHdvIHR5cGVzIG9mIGNoYW5nZXM6Ci0JICogMS4gU2VydmVycyBvciBjb25maWd1cmF0aW9ucyBiZWluZyBhZGRlZCBvciByZW1vdmVkCi0JICogICAgZnJvbSB0aGVpciByZXNwZWN0aXZlIGZvbGRlcnMuIChpbiB0aGUgZnV0dXJlLCBpbmNsdWRpbmcKLQkgKiAgICB0aGUgYWRkaXRpb24gb3IgcmVtb3ZhbCBvZiBhIGZ1bGwgc2VydmVyIHByb2plY3QsIHdoaWNoCi0JICogICAgd2UgY3VycmVudGx5IGNhbid0IGxpc3RlbiBmb3IgYmVjYXVzZSB0aGVyZSBpcyBubyBuYXR1cmUKLQkgKiAgICBhdHRhY2hlZCB0byB0aGUgcHJvamVjdCBhdCB0aGlzIHBvaW50IC0gT1RJIGRlZmVjdCkKLQkgKiAyLiBQcm9qZWN0cyBiZWluZyBkZWxldGVkLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBTZXJ2ZXJSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCQkvKioKLQkJICogQ3JlYXRlIGEgbmV3IFNlcnZlclJlc291cmNlQ2hhbmdlTGlzdGVuZXIuCi0JCSAqLwotCQlwdWJsaWMgU2VydmVyUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogTGlzdGVuIGZvciBwcm9qZWN0cyBiZWluZyBhZGRlZCBvciByZW1vdmVkIGFuZCBhY3QgYWNjb3JkaW5nbHkuCi0JCSAqIAotCQkgKiBAcGFyYW0gZXZlbnQgYSByZXNvdXJjZSBjaGFuZ2UgZXZlbnQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChmaW5hbCBJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQkvLyBpZ25vcmUgY2xlYW4gYnVpbGRzCi0JCQlpZiAoZXZlbnQuZ2V0QnVpbGRLaW5kKCkgPT0gSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCWlmIChUcmFjZS5SRVNPVVJDRVMpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfUkVTT1VSQ0VTLCAiLT4tIFNlcnZlclJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzcG9uZGluZyB0byByZXNvdXJjZSBjaGFuZ2U6ICIKLQkJCQkJCSsgZXZlbnQuZ2V0VHlwZSgpICsgIiAtPi0iKTsKLQkJCX0KLQkJCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGNoaWxkcmVuW2ldLmdldFJlc291cmNlKCk7Ci0JCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJCXByb2plY3RDaGFuZ2VkKChJUHJvamVjdCkgcmVzb3VyY2UsIGNoaWxkcmVuW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gc2VhcmNoIGZvciBjaGFuZ2VzIHRvIGFueSBwcm9qZWN0IHVzaW5nIGEgdmlzaXRvcgotCQkJdHJ5IHsKLQkJCQlkZWx0YS5hY2NlcHQobmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgdmlzaXRvckRlbHRhKSB7Ci0JCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSB2aXNpdG9yRGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQotCQkJCQkJLy8gb25seSByZXNwb25kIHRvIHByb2plY3QgY2hhbmdlcwotCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCQkJCXB1Ymxpc2hIYW5kbGVQcm9qZWN0Q2hhbmdlKHZpc2l0b3JEZWx0YSwgZXZlbnQpOwotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIHJlc3BvbmRpbmcgdG8gcmVzb3VyY2UgY2hhbmdlIiwgZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoVHJhY2UuUkVTT1VSQ0VTKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1JFU09VUkNFUywKLQkJCQkJCSItPC0gRG9uZSBTZXJ2ZXJSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc3BvbmRpbmcgdG8gcmVzb3VyY2UgY2hhbmdlIC08LSIpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlYWN0IHRvIGEgY2hhbmdlIHdpdGhpbiBhIHBvc3NpYmxlIHNlcnZlciBwcm9qZWN0LgotCQkgKgotCQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKLQkJICogQHBhcmFtIGRlbHRhIGEgcmVzb3VyY2UgZGVsdGEKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHByb2plY3RDaGFuZ2VkKElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9qZWN0LmdldE5hbWUoKTsKLQkJCWlmICghU2VydmVyUGx1Z2luLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLmlzU2VydmVyUHJvamVjdCgpKSB7Ci0JCQkJaWYgKCFzZXJ2ZXJQcm9qZWN0cy5jb250YWlucyhwcm9qZWN0TmFtZSkpIHsKLQkJCQkJaWYgKFRyYWNlLlJFU09VUkNFUykgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1JFU09VUkNFUywgIk5vdCBhIHNlcnZlciBwcm9qZWN0OiAiICsgcHJvamVjdC5nZXROYW1lKCkpOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJc2VydmVyUHJvamVjdHMucmVtb3ZlKHByb2plY3ROYW1lKTsKLQkJCX0gZWxzZSBpZiAoIXNlcnZlclByb2plY3RzLmNvbnRhaW5zKHByb2plY3ROYW1lKSkKLQkJCQlzZXJ2ZXJQcm9qZWN0cy5hZGQocHJvamVjdE5hbWUpOwotCQkJCi0JCQlJUmVzb3VyY2VEZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJCi0JCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSVJlc291cmNlRGVsdGEgY2hpbGQgPSBjaGlsZHJlbltpXTsKLQkJCQkKLQkJCQkvLyBsb29rIGZvciBzZXJ2ZXJzIGFuZCBzZXJ2ZXIgY29uZmlndXJhdGlvbnMKLQkJCQl0cnkgewotCQkJCQljaGlsZC5hY2NlcHQobmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLQkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhMikgewotCQkJCQkJCXJldHVybiBoYW5kbGVSZXNvdXJjZURlbHRhKGRlbHRhMik7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciByZXNwb25kaW5nIHRvIHJlc291cmNlIGNoYW5nZSIsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2Fubm90IGRpcmVjdGx5IGNyZWF0ZSBhIFJlc291cmNlTWFuYWdlci4gVXNlCi0JICogU2VydmVyc0NvcmUuZ2V0UmVzb3VyY2VNYW5hZ2VyKCkuCi0JICovCi0JcHJpdmF0ZSBSZXNvdXJjZU1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc2VydmVyIHN0YXJ0dXAgZXh0ZW5zaW9uIHBvaW50cy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBleGVjdXRlU3RhcnR1cHMoKSB7Ci0JCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICItPi0gTG9hZGluZyAuc3RhcnR1cCBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCX0KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgImludGVybmFsU3RhcnR1cCIpOwotCQkKLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCUlTdGFydHVwIHN0YXJ0dXAgPSAoSVN0YXJ0dXApIGNmW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RhcnR1cC5zdGFydHVwKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJTdGFydHVwIGZhaWxlZCIgKyBzdGFydHVwLnRvU3RyaW5nKCksIGV4KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBzdGFydHVwOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVNlcnZlclBsdWdpbi5sb2dFeHRlbnNpb25GYWlsdXJlKGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5zdGFydHVwIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBpbml0KCkgewotCQlpZiAoaW5pdGlhbGl6ZWQgfHwgaW5pdGlhbGl6aW5nKQotCQkJcmV0dXJuOwotCQkKLQkJaW5pdGlhbGl6aW5nID0gdHJ1ZTsKLQkJCi0JCS8vIHNlZSB3aG8ncyB0cmlnZ2VyaW5nIEFQSSBzdGFydHVwCi0JCS8qdHJ5IHsKLQkJCXRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0qLwotCQkKLQkJc2VydmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlcnZlcj4oKTsKLQkJYWN0aXZlQnVuZGxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkKLQkJbG9hZFJ1bnRpbWVzTGlzdCgpOwotCQlsb2FkU2VydmVyc0xpc3QoKTsKLQkJCi0JCWV4ZWN1dGVTdGFydHVwcygpOwotCQkKLQkJcGNsID0gbmV3IFByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJlZmVyZW5jZXMuUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChpZ25vcmVQcmVmZXJlbmNlQ2hhbmdlcykKLQkJCQkJcmV0dXJuOwotCQkJCVN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkJaWYgKHByb3BlcnR5LmVxdWFscygicnVudGltZXMiKSkgewotCQkJCQlsb2FkUnVudGltZXNMaXN0KCk7Ci0JCQkJCXNhdmVSdW50aW1lc0xpc3QoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotCQlTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocGNsKTsKLQkJCi0JCXJlc29sdmVTZXJ2ZXJzKCk7Ci0JCQotCQkvLyBrZWVwIHRyYWNrIG9mIGZ1dHVyZSBjaGFuZ2VzIHRvIHRoZSBmaWxlIHN5c3RlbQotCQlyZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IFNlcnZlclJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9CVUlMRCB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUpOwotCQkKLQkJaWYgKFRyYWNlLkZJTkVSKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVIsICJMb2FkaW5nIHdvcmtzcGFjZSBzZXJ2ZXJzIGFuZCBzZXJ2ZXIgY29uZmlndXJhdGlvbnMiKTsKLQkJfQotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlpZiAocHJvamVjdHMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBwcm9qZWN0cy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChTZXJ2ZXJQbHVnaW4uZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdHNbaV0pLmlzU2VydmVyUHJvamVjdCgpKSB7Ci0JCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IHByb2plY3RzW2ldLmdldE5hbWUoKTsKLQkJCQkJaWYgKCFzZXJ2ZXJQcm9qZWN0cy5jb250YWlucyhwcm9qZWN0TmFtZSkpCi0JCQkJCQlzZXJ2ZXJQcm9qZWN0cy5hZGQocHJvamVjdE5hbWUpOwotCQkJCQlsb2FkRnJvbVByb2plY3QocHJvamVjdHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJYWRkU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoU2VydmVyTGlzdGVuZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQotCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBhbGwgb2YgdGhlIHNlcnZlcnMgYW5kIHNlcnZlciBjb25maWd1cmF0aW9ucyBmcm9tIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBsb2FkRnJvbVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoVHJhY2UuRklORVIpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FUiwgIkluaXRpYWwgc2VydmVyIHJlc291cmNlIGxvYWQgZm9yICIgKyBwcm9qZWN0LmdldE5hbWUoKSwgbnVsbCk7Ci0JCX0KLQkJZmluYWwgUmVzb3VyY2VNYW5hZ2VyIHJtID0gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCQotCQl0cnkgewotCQkJcHJvamVjdC5hY2NlcHQobmV3IElSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgewotCQkJCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmCi0JCQkJCQlTZXJ2ZXIuRklMRV9FWFRFTlNJT04uZXF1YWxzKGdldEZpbGVFeHRlbnNpb24ocHJveHkuZ2V0TmFtZSgpKSkpIHsKLQkJCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlybS5oYW5kbGVOZXdGaWxlKGZpbGUsIG51bGwpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBkdXJpbmcgaW5pdGlhbCBzZXJ2ZXIgcmVzb3VyY2UgbG9hZCIsIGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSwgMCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkNvdWxkIG5vdCBsb2FkIHNlcnZlciBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oU3RyaW5nIG5hbWUpIHsKLQkJaW50IGluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGluZGV4ID09IChuYW1lLmxlbmd0aCgpIC0gMSkpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJdHJ5IHsKLQkJCWluc3RhbmNlLnNodXRkb3duSW1wbCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBkdXJpbmcgc2h1dGRvd24iLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQWN0aXZlQnVuZGxlKFN0cmluZyBidW5kbGVJZCkgewotCQlpZiAoYWN0aXZlQnVuZGxlcyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYWN0aXZlQnVuZGxlcy5jb250YWlucyhidW5kbGVJZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2h1dGRvd25CdW5kbGUoU3RyaW5nIGlkKSB7Ci0JCWlmICghaW5pdGlhbGl6ZWQpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBkaXNwb3NlIHNlcnZlcnMKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlciBzZXJ2ZXIgPSAoU2VydmVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IChTZXJ2ZXJUeXBlKSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpOwotCQkJCWlmIChzZXJ2ZXJUeXBlICE9IG51bGwgJiYgaWQuZXF1YWxzKHNlcnZlclR5cGUuZ2V0TmFtZXNwYWNlKCkpKSB7Ci0JCQkJCS8vc2VydmVyLnN0b3AodHJ1ZSk7Ci0JCQkJCXNlcnZlci5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkVycm9yIGRpc3Bvc2luZyBzZXJ2ZXIiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGRpc3Bvc2UgcnVudGltZXMKLQkJaXRlcmF0b3IgPSBydW50aW1lcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlSdW50aW1lIHJ1bnRpbWUgPSAoUnVudGltZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IChSdW50aW1lVHlwZSkgcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotCQkJCWlmIChydW50aW1lVHlwZSAhPSBudWxsICYmIGlkICE9IG51bGwgJiYgaWQuZXF1YWxzKHJ1bnRpbWVUeXBlLmdldE5hbWVzcGFjZSgpKSkgewotCQkJCQlydW50aW1lLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiRXJyb3IgZGlzcG9zaW5nIHNlcnZlciIsIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0cnkgewotCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2h1dGRvd25JbXBsKCkgewotCQlpZighaW5pdGlhbGl6ZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlpZiAod29ya3NwYWNlICE9IG51bGwgJiYgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQl3b3Jrc3BhY2UucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCi0JCWlmIChwY2wgIT0gbnVsbCkgewotCQkJU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHBjbCk7Ci0JCX0KLQkJCi0JCXJlbW92ZVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKFNlcnZlckxpc3RlbmVyLmdldEluc3RhbmNlKCkpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYWRkUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKFRyYWNlLkxJU1RFTkVSUykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0xJU1RFTkVSUywgIkFkZGluZyBydW50aW1lIGxpZmVjeWNsZSBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHRvICIgKyB0aGlzKTsKLQkJfQotCQkKLQkJc3luY2hyb25pemVkIChydW50aW1lTGlzdGVuZXJzKSB7Ci0JCQlydW50aW1lTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKFRyYWNlLkxJU1RFTkVSUykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0xJU1RFTkVSUywgIlJlbW92aW5nIHJ1bnRpbWUgbGlmZWN5Y2xlIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgZnJvbSAiICsgdGhpcyk7Ci0JCX0KLQkJCi0JCXN5bmNocm9uaXplZCAocnVudGltZUxpc3RlbmVycykgewotCQkJcnVudGltZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKFRyYWNlLkxJU1RFTkVSUykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0xJU1RFTkVSUywgIkFkZGluZyBzZXJ2ZXIgbGlmZWN5Y2xlIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgdG8gIiArIHRoaXMpOwotCQl9Ci0JCQotCQlzeW5jaHJvbml6ZWQgKHNlcnZlckxpc3RlbmVycykgewotCQkJc2VydmVyTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChUcmFjZS5MSVNURU5FUlMpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19MSVNURU5FUlMsICJSZW1vdmluZyBzZXJ2ZXIgbGlmZWN5Y2xlIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgZnJvbSAiICsgdGhpcyk7Ci0JCX0KLQkJCi0JCXN5bmNocm9uaXplZCAoc2VydmVyTGlzdGVuZXJzKSB7Ci0JCQlzZXJ2ZXJMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlcmVnaXN0ZXIgYW4gZXhpc3RpbmcgcnVudGltZS4KLQkgKgotCSAqIEBwYXJhbSBydW50aW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlcmVnaXN0ZXJSdW50aW1lKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChUcmFjZS5SRVNPVVJDRVMpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19SRVNPVVJDRVMsICJEZXJlZ2lzdGVyaW5nIHJ1bnRpbWU6ICIgKyBydW50aW1lLmdldE5hbWUoKSk7Ci0JCX0KLQkJCi0JCXJ1bnRpbWVzLnJlbW92ZShydW50aW1lKTsKLQkJZmlyZVJ1bnRpbWVFdmVudChydW50aW1lLCBFVkVOVF9SRU1PVkVEKTsKLQkJKChSdW50aW1lKXJ1bnRpbWUpLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXJlZ2lzdGVyIGFuIGV4aXN0aW5nIHNlcnZlciByZXNvdXJjZS4KLQkgKgotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGVyZWdpc3RlclNlcnZlcihJU2VydmVyIHNlcnZlcikgewotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoVHJhY2UuUkVTT1VSQ0VTKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfUkVTT1VSQ0VTLCAiRGVyZWdpc3RlcmluZyBzZXJ2ZXI6ICIgKyBzZXJ2ZXIuZ2V0TmFtZSgpKTsKLQkJfQotCQkKLQkJKChTZXJ2ZXIpIHNlcnZlcikuZGVsZXRlTWV0YWRhdGEoKTsKLQkJCi0JCXNlcnZlcnMucmVtb3ZlKHNlcnZlcik7Ci0JCWZpcmVTZXJ2ZXJFdmVudChzZXJ2ZXIsIEVWRU5UX1JFTU9WRUQpOwotCQkoKFNlcnZlcilzZXJ2ZXIpLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlIGEgcnVudGltZSBldmVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlyZVJ1bnRpbWVFdmVudChmaW5hbCBJUnVudGltZSBydW50aW1lLCBieXRlIGIpIHsKLQkJaWYgKFRyYWNlLkxJU1RFTkVSUykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0xJU1RFTkVSUywgIi0+LSBGaXJpbmcgcnVudGltZSBldmVudDogIiArIHJ1bnRpbWUuZ2V0TmFtZSgpICsgIiAtPi0iKTsKLQkJfQotCQkKLQkJaWYgKHJ1bnRpbWVMaXN0ZW5lcnMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQkKLQkJTGlzdDxJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyPiBjbG9uZSA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcj4oKTsKLQkJY2xvbmUuYWRkQWxsKHJ1bnRpbWVMaXN0ZW5lcnMpOwotCQlmb3IgKElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgc3JsIDogY2xvbmUpIHsKLQkJCWlmIChUcmFjZS5MSVNURU5FUlMpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfTElTVEVORVJTLCAiICBGaXJpbmcgcnVudGltZSBldmVudCB0byAiICsgc3JsKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJaWYgKGIgPT0gRVZFTlRfQURERUQpCi0JCQkJCXNybC5ydW50aW1lQWRkZWQocnVudGltZSk7Ci0JCQkJZWxzZSBpZiAoYiA9PSBFVkVOVF9DSEFOR0VEKQotCQkJCQlzcmwucnVudGltZUNoYW5nZWQocnVudGltZSk7Ci0JCQkJZWxzZQotCQkJCQlzcmwucnVudGltZVJlbW92ZWQocnVudGltZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIiAgRXJyb3IgZmlyaW5nIHJ1bnRpbWUgZXZlbnQgdG8gIiArIHNybCwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChUcmFjZS5MSVNURU5FUlMpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19MSVNURU5FUlMsICItPC0gRG9uZSBmaXJpbmcgcnVudGltZSBldmVudCAtPC0iKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpcmUgYSBzZXJ2ZXIgZXZlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpcmVTZXJ2ZXJFdmVudChmaW5hbCBJU2VydmVyIHNlcnZlciwgYnl0ZSBiKSB7Ci0JCWlmIChUcmFjZS5MSVNURU5FUlMpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19MSVNURU5FUlMsICItPi0gRmlyaW5nIHNlcnZlciBldmVudDogIiArIHNlcnZlci5nZXROYW1lKCkgKyAiIC0+LSIpOwotCQl9Ci0JCQotCQlpZiAoc2VydmVyTGlzdGVuZXJzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJCi0JCUxpc3Q8SVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyPiBjbG9uZSA9IG5ldyBBcnJheUxpc3Q8SVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyPigpOwotCQljbG9uZS5hZGRBbGwoc2VydmVyTGlzdGVuZXJzKTsKLQkJZm9yIChJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIgc3JsIDogY2xvbmUpIHsKLQkJCWlmIChUcmFjZS5MSVNURU5FUlMpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfTElTVEVORVJTLCAiICBGaXJpbmcgc2VydmVyIGV2ZW50IHRvICIgKyBzcmwpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlpZiAoYiA9PSBFVkVOVF9BRERFRCkKLQkJCQkJc3JsLnNlcnZlckFkZGVkKHNlcnZlcik7Ci0JCQkJZWxzZSBpZiAoYiA9PSBFVkVOVF9DSEFOR0VEKQotCQkJCQlzcmwuc2VydmVyQ2hhbmdlZChzZXJ2ZXIpOwotCQkJCWVsc2UKLQkJCQkJc3JsLnNlcnZlclJlbW92ZWQoc2VydmVyKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiICBFcnJvciBmaXJpbmcgc2VydmVyIGV2ZW50IHRvICIgKyBzcmwsIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoVHJhY2UuTElTVEVORVJTKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfTElTVEVORVJTLCAiLTwtIERvbmUgZmlyaW5nIHNlcnZlciBldmVudCAtPC0iKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVSdW50aW1lc0xpc3QoKSB7Ci0JCXRyeSB7Ci0JCQlpZ25vcmVQcmVmZXJlbmNlQ2hhbmdlcyA9IHRydWU7Ci0JCQlYTUxNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgicnVudGltZXMiKTsKLQkJCQotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBydW50aW1lcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVJ1bnRpbWUgcnVudGltZSA9IChSdW50aW1lKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCi0JCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJydW50aW1lIik7Ci0JCQkJcnVudGltZS5zYXZlKGNoaWxkKTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIHhtbFN0cmluZyA9IG1lbWVudG8uc2F2ZVRvU3RyaW5nKCk7Ci0JCQlQcmVmZXJlbmNlcyBwcmVmcyA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQlwcmVmcy5zZXRWYWx1ZSgicnVudGltZXMiLCB4bWxTdHJpbmcpOwotCQkJU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIHJ1bnRpbWVzIiwgZSk7Ci0JCQl9Ci0JCX0KLQkJaWdub3JlUHJlZmVyZW5jZUNoYW5nZXMgPSBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZVNlcnZlcnNMaXN0KCkgewotCQlTdHJpbmcgZmlsZW5hbWUgPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKFNFUlZFUl9EQVRBX0ZJTEUpLnRvT1NTdHJpbmcoKTsKLQkJCi0JCXRyeSB7Ci0JCQlYTUxNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgic2VydmVycyIpOwotCQkJCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZlcnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlTZXJ2ZXIgc2VydmVyID0gKFNlcnZlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQotCQkJCWlmIChzZXJ2ZXIuZ2V0RmlsZSgpID09IG51bGwpIHsKLQkJCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJzZXJ2ZXIiKTsKLQkJCQkJc2VydmVyLnNhdmUoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJbWVtZW50by5zYXZlVG9GaWxlKGZpbGVuYW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgc2VydmVycyIsIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZFJ1bnRpbWVzTGlzdCgpIHsKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIkxvYWRpbmcgcnVudGltZSBpbmZvIik7Ci0JCX0KLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgeG1sU3RyaW5nID0gcHJlZnMuZ2V0U3RyaW5nKCJydW50aW1lcyIpOwotCQkKLQkJcnVudGltZXMgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lPigpOwotCQlpZiAoeG1sU3RyaW5nICE9IG51bGwgJiYgeG1sU3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJdHJ5IHsKLQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHJpbmcuZ2V0Qnl0ZXMoIlVURi04IikpOwotCQkJCUlNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGluKTsKLQkJCQkKLQkJCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbigicnVudGltZSIpOwotCQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCVJ1bnRpbWUgcnVudGltZSA9IG5ldyBSdW50aW1lKG51bGwpOwotCQkJCQlydW50aW1lLmxvYWRGcm9tTWVtZW50byhjaGlsZHJlbltpXSwgbnVsbCk7Ci0JCQkJCXJ1bnRpbWVzLmFkZChydW50aW1lKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgcnVudGltZXMiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkU2VydmVyc0xpc3QoKSB7Ci0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJMb2FkaW5nIHNlcnZlciBpbmZvIik7Ci0JCX0KLQkJU3RyaW5nIGZpbGVuYW1lID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChTRVJWRVJfREFUQV9GSUxFKS50b09TU3RyaW5nKCk7Ci0JCQotCQl0cnkgewotCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oZmlsZW5hbWUpOwotCQkJCi0JCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbigic2VydmVyIik7Ci0JCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTZXJ2ZXIgc2VydmVyID0gbmV3IFNlcnZlcihudWxsKTsKLQkJCQlzZXJ2ZXIubG9hZEZyb21NZW1lbnRvKGNoaWxkcmVuW2ldLCBudWxsKTsKLQkJCQlzZXJ2ZXJzLmFkZChzZXJ2ZXIpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIHNlcnZlcnMiLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFJ1bnRpbWUoSVJ1bnRpbWUgcnVudGltZSkgewotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKCFpbml0aWFsaXplZCkKLQkJCWluaXQoKTsKLQkJCi0JCWlmICghcnVudGltZXMuY29udGFpbnMocnVudGltZSkpCi0JCQlyZWdpc3RlclJ1bnRpbWUocnVudGltZSk7Ci0JCWVsc2UKLQkJCWZpcmVSdW50aW1lRXZlbnQocnVudGltZSwgRVZFTlRfQ0hBTkdFRCk7Ci0JCXNhdmVSdW50aW1lc0xpc3QoKTsKLQkJcmVzb2x2ZVNlcnZlcnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSdW50aW1lKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJaWYgKCFpbml0aWFsaXplZCkKLQkJCWluaXQoKTsKLQkJCi0JCWlmIChydW50aW1lcy5jb250YWlucyhydW50aW1lKSkgewotCQkJZGVyZWdpc3RlclJ1bnRpbWUocnVudGltZSk7Ci0JCQlzYXZlUnVudGltZXNMaXN0KCk7Ci0JCQlyZXNvbHZlU2VydmVycygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VydmVyKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmICghaW5pdGlhbGl6ZWQpCi0JCQlpbml0KCk7Ci0JCQotCQlpZiAoIXNlcnZlcnMuY29udGFpbnMoc2VydmVyKSkKLQkJCXJlZ2lzdGVyU2VydmVyKHNlcnZlcik7Ci0JCWVsc2UKLQkJCWZpcmVTZXJ2ZXJFdmVudChzZXJ2ZXIsIEVWRU5UX0NIQU5HRUQpOwotCQlzYXZlU2VydmVyc0xpc3QoKTsKLQkJcmVzb2x2ZVNlcnZlcnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKCFpbml0aWFsaXplZCkKLQkJCWluaXQoKTsKLQkJCi0JCWlmIChzZXJ2ZXJzLmNvbnRhaW5zKHNlcnZlcikpIHsKLQkJCWRlcmVnaXN0ZXJTZXJ2ZXIoc2VydmVyKTsKLQkJCXNhdmVTZXJ2ZXJzTGlzdCgpOwotCQkJcmVzb2x2ZVNlcnZlcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHJ1bnRpbWVzLgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBydW50aW1lcwotCSAqLwotCXB1YmxpYyBJUnVudGltZVtdIGdldFJ1bnRpbWVzKCkgewotCQlpZiAoIWluaXRpYWxpemVkKQotCQkJaW5pdCgpOwotCQkKLQkJTGlzdDxJUnVudGltZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWU+KHJ1bnRpbWVzKTsKLQkJCi0JCUlSdW50aW1lW10gciA9IG5ldyBJUnVudGltZVtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYSBydW50aW1lIGlkCi0JICogQHJldHVybiBJUnVudGltZQotCSAqLwotCXB1YmxpYyBJUnVudGltZSBnZXRSdW50aW1lKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCWlmICghaW5pdGlhbGl6ZWQpCi0JCQlpbml0KCk7Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IHJ1bnRpbWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChydW50aW1lLmdldElkKCkuZXF1YWxzKGlkKSkKLQkJCQlyZXR1cm4gcnVudGltZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvbHZlUnVudGltZXMoKSB7Ci0JCWlmICghaW5pdGlhbGl6ZWQpCi0JCQlpbml0KCk7Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IHJ1bnRpbWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVJ1bnRpbWUgcnVudGltZSA9IChSdW50aW1lKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlydW50aW1lLnJlc29sdmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc29sdmVTZXJ2ZXJzKCkgewotCQlpZiAoIWluaXRpYWxpemVkKQotCQkJaW5pdCgpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlciBzZXJ2ZXIgPSAoU2VydmVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlzZXJ2ZXIucmVzb2x2ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGFsbCBzZXJ2ZXJzLgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGFsbCBzZXJ2ZXJzCi0JICovCi0JcHVibGljIElTZXJ2ZXJbXSBnZXRTZXJ2ZXJzKCkgewotCQlpZiAoIWluaXRpYWxpemVkKQotCQkJaW5pdCgpOwotCQkKLQkJSVNlcnZlcltdIHNlcnZlcnMyID0gbmV3IElTZXJ2ZXJbc2VydmVycy5zaXplKCldOwotCQlzZXJ2ZXJzLnRvQXJyYXkoc2VydmVyczIpOwotCQkKLQkJcmV0dXJuIHNlcnZlcnMyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYSBzZXJ2ZXIgaWQKLQkgKiBAcmV0dXJuIGEgc2VydmVyCi0JICovCi0JcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKFN0cmluZyBpZCkgewotCQlpZiAoIWluaXRpYWxpemVkKQotCQkJaW5pdCgpOwotCQkKLQkJaWYgKGlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2ZXIgc2VydmVyID0gKFNlcnZlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGlkLmVxdWFscyhzZXJ2ZXIuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIHNlcnZlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlc291cmNlIGNoYW5nZSB3YXMgaGFuZGxlZC4KLQkgKgotCSAqIEBwYXJhbSBkZWx0YSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZVJlc291cmNlRGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZTIgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkKLQkJLy8gaWdub3JlIG1hcmtlcnMKLQkJaWYgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiAoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSAhPSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKFRyYWNlLlJFU09VUkNFUykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1JFU09VUkNFUywgIlJlc291cmNlIGNoYW5nZWQ6ICIgKyByZXNvdXJjZTIgKyAiICIgKyBraW5kKTsKLQkJfQotCQkKLQkJaWYgKHJlc291cmNlMiBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTI7Ci0JCQlpZiAoU2VydmVyLkZJTEVfRVhURU5TSU9OLmVxdWFscyhmaWxlLmdldEZpbGVFeHRlbnNpb24oKSkpIHsKLQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBudWxsOwotCQkJCWlmICgoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9GUk9NKSAhPSAwIHx8IChmbGFncyAmIElSZXNvdXJjZURlbHRhLk1PVkVEX1RPKSAhPSAwKQotCQkJCQloYW5kbGVNb3ZlZEZpbGUoZmlsZSwgZGVsdGEsIG1vbml0b3IpOwotCQkJCWVsc2UgaWYgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQURERUQpCi0JCQkJCWhhbmRsZU5ld0ZpbGUoZmlsZSwgbW9uaXRvcik7Ci0JCQkJZWxzZSBpZiAoa2luZCA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKQotCQkJCQloYW5kbGVSZW1vdmVkRmlsZShmaWxlKTsKLQkJCQllbHNlCi0JCQkJCWhhbmRsZUNoYW5nZWRGaWxlKGZpbGUsIG1vbml0b3IpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUlGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpIHJlc291cmNlMjsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKS5oYXNTZXJ2ZXJDb25maWd1cmF0aW9uKCkgJiYgZm9sZGVyLmVxdWFscyhzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpKQotCQkJCQkmJiBzZXJ2ZXIuZ2V0QWRhcHRlcihTZXJ2ZXJEZWxlZ2F0ZS5jbGFzcykgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCSgoU2VydmVyKXNlcnZlcikuZ2V0RGVsZWdhdGUobnVsbCkuY29uZmlndXJhdGlvbkNoYW5nZWQoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJTZXJ2ZXIgZmFpbGVkIG9uIGNvbmZpZ3VyYXRpb24gY2hhbmdlIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIElTZXJ2ZXIgbG9hZFNlcnZlcihJRmlsZSBmaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU2VydmVyIHNlcnZlciA9IG5ldyBTZXJ2ZXIoZmlsZSk7Ci0JCXNlcnZlci5sb2FkRnJvbUZpbGUobW9uaXRvcik7Ci0JCXJldHVybiBzZXJ2ZXI7Ci0JfQotCi0JLyoqCi0JICogVHJpZXMgdG8gbG9hZCBhIG5ldyBzZXJ2ZXIgcmVzb3VyY2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBsb2FkIGFuZCByZWdpc3RlciB3ZXJlIHN1Y2Nlc3NmdWwuCi0JICoKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlTmV3RmlsZShJRmlsZSBmaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKFRyYWNlLlJFU09VUkNFUykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1JFU09VUkNFUywgImhhbmRsZU5ld0ZpbGU6ICIgKyBmaWxlKTsKLQkJfQotCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAyMDAwKTsKLQkJCi0JCS8vIHRyeSBsb2FkaW5nIGEgc2VydmVyCi0JCWlmIChmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoU2VydmVyLkZJTEVfRVhURU5TSU9OKSkgewotCQkJdHJ5IHsKLQkJCQlJU2VydmVyIHNlcnZlciA9IGxvYWRTZXJ2ZXIoZmlsZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwMCkpOwotCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJCQlpZiAoZ2V0U2VydmVyKHNlcnZlci5nZXRJZCgpKSA9PSBudWxsKQotCQkJCQkJYWRkU2VydmVyKHNlcnZlcik7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGxvYWRpbmcgc2VydmVyIiwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQltb25pdG9yLmRvbmUoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRyaWVzIHRvIGxvYWQgYSBuZXcgc2VydmVyIHJlc291cmNlIGZyb20gdGhlIGdpdmVuIHJlc291cmNlLgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbG9hZCBhbmQgcmVnaXN0ZXIgd2VyZSBzdWNjZXNzZnVsLgotCSAqCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYW5kbGVNb3ZlZEZpbGUoSUZpbGUgZmlsZSwgSVJlc291cmNlRGVsdGEgZGVsdGEsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoVHJhY2UuUkVTT1VSQ0VTKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfUkVTT1VSQ0VTLCAiaGFuZGxlTW92ZWRGaWxlOiAiICsgZmlsZSk7Ci0JCX0KLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMjAwMCk7Ci0JCQotCQlJUGF0aCBmcm9tUGF0aCA9IGRlbHRhLmdldE1vdmVkRnJvbVBhdGgoKTsKLQkJaWYgKGZyb21QYXRoICE9IG51bGwpIHsKLQkJCUlGaWxlIGZyb21GaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZyb21QYXRoKTsKLQkJCWlmIChTZXJ2ZXJQbHVnaW4uZ2V0UHJvamVjdFByb3BlcnRpZXMoZnJvbUZpbGUuZ2V0UHJvamVjdCgpKS5pc1NlcnZlclByb2plY3QoKSkgewotCQkJCVNlcnZlciBzZXJ2ZXIgPSAoU2VydmVyKSBmaW5kU2VydmVyKGZyb21GaWxlKTsKLQkJCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJCXNlcnZlci5maWxlID0gZmlsZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaGFuZGxlTmV3RmlsZShmaWxlLCBtb25pdG9yKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUlQYXRoIHRvUGF0aCA9IGRlbHRhLmdldE1vdmVkVG9QYXRoKCk7Ci0JCQlJRmlsZSB0b0ZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUodG9QYXRoKTsKLQkJCWlmIChTZXJ2ZXJQbHVnaW4uZ2V0UHJvamVjdFByb3BlcnRpZXModG9GaWxlLmdldFByb2plY3QoKSkuaXNTZXJ2ZXJQcm9qZWN0KCkpIHsKLQkJCQlTZXJ2ZXIgc2VydmVyID0gKFNlcnZlcikgZmluZFNlcnZlcihmaWxlKTsKLQkJCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJCXNlcnZlci5maWxlID0gdG9GaWxlOwotCQkJfSBlbHNlIHsKLQkJCQloYW5kbGVSZW1vdmVkRmlsZShmaWxlKTsKLQkJCX0KLQkJfQotCQkKLQkJbW9uaXRvci5kb25lKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgdGhhdCBjYW1lIGZyb20gdGhlIGdpdmVuIGZpbGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24KLQkgKiBzZXJ2ZXJzICh7QGxpbmsgI2dldFNlcnZlcnMoKX0pIGZvciB0aGUgb25lIHdpdGggYSBtYXRjaGluZwotCSAqIGxvY2F0aW9uICh7QGxpbmsgU2VydmVyI2dldEZpbGUoKX0pLiBUaGUgZmlsZSBtYXkgbm90IGJlIG51bGwuCi0JICoKLQkgKiBAcGFyYW0gZmlsZSBhIHNlcnZlciBmaWxlCi0JICogQHJldHVybiB0aGUgc2VydmVyIGluc3RhbmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKLQkgKiAgICB0aGVyZSBpcyBubyBzZXJ2ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBJU2VydmVyIGZpbmRTZXJ2ZXIoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKGZpbGUuZXF1YWxzKCgoU2VydmVyKXNlcnZlcnNbaV0pLmdldEZpbGUoKSkpCi0JCQkJCXJldHVybiBzZXJ2ZXJzW2ldOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRyaWVzIHRvIGhhbmRsZSBhIHJlc291cmNlIGNoYW5nZS4gUmV0dXJucyB0cnVlIGlmIHRoZSByZWxvYWQKLQkgKiB3YXMgc3VjY2Vzc2Z1bC4KLQkgKgotCSAqIEBwYXJhbSBmaWxlIGEgZmlsZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhbmRsZUNoYW5nZWRGaWxlKElGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoVHJhY2UuUkVTT1VSQ0VTKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfUkVTT1VSQ0VTLCAiaGFuZGxlQ2hhbmdlZEZpbGU6ICIgKyBmaWxlKTsKLQkJfQotCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxMDAwKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQotCQlJU2VydmVyIHNlcnZlciA9IGZpbmRTZXJ2ZXIoZmlsZSk7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJZm91bmQgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQlpZiAoVHJhY2UuUkVTT1VSQ0VTKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19SRVNPVVJDRVMsICJSZWxvYWRpbmcgc2VydmVyOiAiICsgc2VydmVyKTsKLQkJCQl9Ci0JCQkJKChTZXJ2ZXIpIHNlcnZlcikubG9hZEZyb21GaWxlKG1vbml0b3IpOwotCQkJCWZpcmVTZXJ2ZXJFdmVudChzZXJ2ZXIsIEVWRU5UX0NIQU5HRUQpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciByZWxvYWRpbmcgc2VydmVyICIgKyBzZXJ2ZXIuZ2V0TmFtZSgpICsgIiBmcm9tICIgKyBmaWxlLCBlKTsKLQkJCQl9Ci0JCQkJcmVtb3ZlU2VydmVyKHNlcnZlcik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoVHJhY2UuUkVTT1VSQ0VTKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfUkVTT1VSQ0VTLCAiTm8gc2VydmVyIGZvdW5kIGF0OiAiICsgZmlsZSk7Ci0JCX0KLQkJCi0JCW1vbml0b3IuZG9uZSgpOwotCQlyZXR1cm4gZm91bmQ7Ci0JfQotCi0JLyoqCi0JICogVHJpZXMgdG8gcmVtb3ZlIGEgY3VycmVudCByZXNvdXJjZS4gUmV0dXJucyB0cnVlIGlmIHRoZQotCSAqIGRlcmVnaXN0ZXJpbmcgd2FzIHN1Y2Nlc3NmdWwuCi0JICoKLQkgKiBAcGFyYW0gZmlsZSBhIGZpbGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFuZGxlUmVtb3ZlZEZpbGUoSUZpbGUgZmlsZSkgewotCQlpZiAoVHJhY2UuUkVTT1VSQ0VTKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfUkVTT1VSQ0VTLCAiaGFuZGxlUmVtb3ZlZEZpbGU6ICIgKyBmaWxlKTsKLQkJfQotCQkKLQkJSVNlcnZlciBzZXJ2ZXIgPSBmaW5kU2VydmVyKGZpbGUpOwotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCXJlbW92ZVNlcnZlcihzZXJ2ZXIpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmIChUcmFjZS5SRVNPVVJDRVMpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19SRVNPVVJDRVMsICJObyBzZXJ2ZXIgZm91bmQgYXQ6ICIgKyBmaWxlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQSBwcm9qZWN0IGhhcyBjaGFuZ2VkLiBJZiB0aGlzIGlzIGFuIGFkZCBvciByZW1vdmUsIGNoZWNrCi0JICogdG8gc2VlIGlmIGl0IGlzIHBhcnQgb2YgYSBjdXJyZW50IHNlcnZlciBjb25maWd1cmF0aW9uLgotCSAqCi0JICogQHBhcmFtIGRlbHRhIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVibGlzaEhhbmRsZVByb2plY3RDaGFuZ2UoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJcHVibGlzaEhhbmRsZVByb2plY3RDaGFuZ2UoZGVsdGEsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBBIHByb2plY3QgaGFzIGNoYW5nZWQuIElmIHRoaXMgaXMgYW4gYWRkIG9yIHJlbW92ZSwgY2hlY2sKLQkgKiB0byBzZWUgaWYgaXQgaXMgcGFydCBvZiBhIGN1cnJlbnQgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gZGVsdGEgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEKLQkgKiBAcGFyYW0gYnVpbGRFdmVudCB3aGV0aGVyIHRoaXMgZXZlbnQgd2FzIGEgYnVpbGQgZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoSGFuZGxlUHJvamVjdENoYW5nZShJUmVzb3VyY2VEZWx0YSBkZWx0YSwgSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIj4gcHVibGlzaEhhbmRsZVByb2plY3RDaGFuZ2UgIiArIGRlbHRhLmdldFJlc291cmNlKCkpOwotCQl9Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJSVNlcnZlcltdIHNlcnZlcnMyID0gZ2V0UHVibGlzaFJlcXVpcmVkU2VydmVycyhkZWx0YSk7Ci0JCQotCQkvLyBwcm9jZXNzIG1vZHVsZSBjaGFuZ2VzCi0JCVByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUuaGFuZGxlR2xvYmFsUHJvamVjdENoYW5nZShwcm9qZWN0LCBkZWx0YSk7Ci0JCQotCQlJTW9kdWxlW10gbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhwcm9qZWN0KTsKLQkJaWYgKG1vZHVsZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICItIHB1Ymxpc2hIYW5kbGVQcm9qZWN0Q2hhbmdlIik7Ci0JCX0KLQotCQlpbnQgc2l6ZSA9IG1vZHVsZXMubGVuZ3RoOwotCQlpbnQgc2l6ZTIgPSBzZXJ2ZXJzMi5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQlpZiAoc2VydmVyczJbal0uZ2V0QWRhcHRlcihTZXJ2ZXJEZWxlZ2F0ZS5jbGFzcykgIT0gbnVsbCkKLQkJCQkJKChTZXJ2ZXIpIHNlcnZlcnMyW2pdKS5oYW5kbGVNb2R1bGVQcm9qZWN0Q2hhbmdlKG1vZHVsZXNbaV0sIGV2ZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiPCBwdWJsaXNoSGFuZGxlUHJvamVjdENoYW5nZSIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJU2VydmVyW10gZ2V0UHVibGlzaFJlcXVpcmVkU2VydmVycyhJUmVzb3VyY2VEZWx0YSBkZWx0YSl7CQkKLQkJLy8gVGhlIGxpc3Qgb2Ygc2VydmVycyB0aGF0IHdpbGwgcmVxdWlyZSBwdWJsaXNoCi0JCWZpbmFsIExpc3Q8SVNlcnZlcj4gc2VydmVyczIgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXI+KCk7Ci0KLQkJLy8gd3Jrc1NlcnZlcnMgPSBXb3Jrc3BhY2VzIFNlcnZlcnMKLQkJZmluYWwgSVNlcnZlcltdIHdya3NTZXJ2ZXJzID0gIGdldFNlcnZlcnMoKTsKLQotCQl0cnkgewotCQkJZGVsdGEuYWNjZXB0KG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCS8vIHNlcnZlcnMyIGlzIHRoZSBzYW1lIHNpemUgYXMgdGhlIGxpc3Qgb2Ygc2VydmVycyBpbiB0aGUgd29ya3NwYWNlLCBhbGwgc2VydmVycyByZXF1aXJlIAotCQkJCQkvLyBwdWJsaXNoaW5nLiBFeGl0IHRoZSB2aXNpdG9yCi0JCQkJCWlmIChzZXJ2ZXJzMi5zaXplKCkgPT0gd3Jrc1NlcnZlcnMubGVuZ3RoKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkvLyBoYXMgdGhpcyBkZWx0YVJlc291cmNlIGJlZW4gY2hhbmdlZD8KLQkJCQkJaWYgKGRlbHRhMi5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuTk9fQ0hBTkdFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkKLQkJCQkJaWYgKGRlbHRhMi5nZXRSZXNvdXJjZSgpIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCWlmIChkZWx0YTIuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQKLQkJCQkJCQkmJiAoZGVsdGEyLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSA9PSAwCi0JCQkJCQkJJiYgKGRlbHRhMi5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpID09IDAKLQkJCQkJCQkmJiAoZGVsdGEyLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5TWU5DKSA9PSAwKXsKLQkJCQkJCQkvLyB0aGlzIHJlc291cmNlIGlzIGVmZmVjdGl2ZWx5IGEgbm8gY2hhbmdlCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBUaGlzIGlzIGEgY2hhbmdlZCBmaWxlLiAKLQkJCQkJCS8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgc2VydmVycyBmb3IgZWFjaCBjaGFuZ2VkIHJlc291cmNlLCBpZiB0aGUgc2VydmVyIG5lZWRzIHB1Ymxpc2hpbmcgCi0JCQkJCQkvLyBmb3Igb25lIHNpbmdsZSByZXNvdXJjZSBhbmQgdGhlIHNlcnZlciBpcyBub3Qgb24gdGhlIGxpc3Qoc2VydmVyczIpIHRoZW4gYWRkIGl0LCBhcyBpdCAKLQkJCQkJCS8vIHdpbGwgcmVxdWlyZSBwdWJsaXNoaW5nCi0JCQkJCQlmb3IgKElTZXJ2ZXIgc2VydmVyOndya3NTZXJ2ZXJzKXsKLQkJCQkJCQlpZiAoU2VydmVyQ29yZS5pc1B1Ymxpc2hSZXF1aXJlZChzZXJ2ZXIsZGVsdGEyKSl7Ci0JCQkJCQkJCWlmICghc2VydmVyczIuY29udGFpbnMoc2VydmVyKSkKLQkJCQkJCQkJCXNlcnZlcnMyLmFkZChzZXJ2ZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQkvLyBUaGlzIGlzIGEgY2hhbmdlZCBmb2xkZXIsIHNvIHZpc2l0IHRoZSBjaGlsZCBlbGVtZW50cy4KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkvL1RyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkRlbHRhIGNvbnRhaW5zIGNoYW5nZTogIiArIHQuYik7Ci0JCXJldHVybiBzZXJ2ZXJzMi50b0FycmF5KG5ldyBJU2VydmVyWzBdKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhdCBsZWFzdCBvbmUgZmlsZSBpbiB0aGUgZGVsdGEgaXMgY2hhbmdlZCwKLQkgKiBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEgYSByZXNvdXJjZSBkZWx0YQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3Qgb25lIGZpbGUgaW4gdGhlIGRlbHRhIGlzIGNoYW5nZWQsCi0JICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsdGFDb250YWluc0NoYW5nZWRGaWxlcyhJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlmaW5hbCBib29sZWFuW10gYiA9IG5ldyBib29sZWFuWzFdOwotCQl0cnkgewotCQkJZGVsdGEuYWNjZXB0KG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCWlmIChiWzBdKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkvL1RyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgZGVsdGEyLmdldFJlc291cmNlKCkgKyAiICAiICsgZGVsdGEyLmdldEtpbmQoKSArICIgIiArIGRlbHRhMi5nZXRGbGFncygpKTsKLQkJCQkJaWYgKGRlbHRhMi5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuTk9fQ0hBTkdFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlpZiAoZGVsdGEyLmdldFJlc291cmNlKCkgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQkJaWYgKGRlbHRhMi5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRAotCQkJCQkJCSYmIChkZWx0YTIuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQpID09IDAKLQkJCQkJCQkmJiAoZGVsdGEyLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgPT0gMAotCQkJCQkJCSYmIChkZWx0YTIuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLlNZTkMpID09IDApCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkvL2lmIChkZWx0YTIuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsgLy8gJiYgZGVsdGEyLmdldEFmZmVjdGVkQ2hpbGRyZW4oKS5sZW5ndGggPT0gMCkgewotCQkJCQkJYlswXSA9IHRydWU7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJLy9yZXR1cm4gdHJ1ZTsKLQkJCQkJCS8vfQotCQkJCQl9Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJLy9UcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJEZWx0YSBjb250YWlucyBjaGFuZ2U6ICIgKyB0LmIpOwotCQlyZXR1cm4gYlswXTsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgYSBuZXcgcnVudGltZS4KLQkgKgotCSAqIEBwYXJhbSBydW50aW1lIGEgcnVudGltZQotCSAqLwotCXByaXZhdGUgdm9pZCByZWdpc3RlclJ1bnRpbWUoSVJ1bnRpbWUgcnVudGltZSkgewotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKFRyYWNlLlJFU09VUkNFUykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1JFU09VUkNFUywgIlJlZ2lzdGVyaW5nIHJ1bnRpbWU6ICIgKyBydW50aW1lLmdldE5hbWUoKSk7Ci0JCX0KLQkJCi0JCXJ1bnRpbWVzLmFkZChydW50aW1lKTsKLQkJZmlyZVJ1bnRpbWVFdmVudChydW50aW1lLCBFVkVOVF9BRERFRCk7Ci0JCQotCQlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IChSdW50aW1lVHlwZSkgcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotCQlTdHJpbmcgYnVuZGxlSWQgPSBydW50aW1lVHlwZS5nZXROYW1lc3BhY2UoKTsKLQkJaWYgKGFjdGl2ZUJ1bmRsZXMgIT0gbnVsbCAmJiAhYWN0aXZlQnVuZGxlcy5jb250YWlucyhidW5kbGVJZCkpCi0JCQlhY3RpdmVCdW5kbGVzLmFkZChidW5kbGVJZCk7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIGEgbmV3IHNlcnZlci4KLQkgKgotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJTZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKFRyYWNlLlJFU09VUkNFUykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1JFU09VUkNFUywgIlJlZ2lzdGVyaW5nIHNlcnZlcjogIiArIHNlcnZlci5nZXROYW1lKCkpOwotCQl9Ci0JCQotCQlzZXJ2ZXJzLmFkZChzZXJ2ZXIpOwotCQlmaXJlU2VydmVyRXZlbnQoc2VydmVyLCBFVkVOVF9BRERFRCk7Ci0JCQotCQlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSAoU2VydmVyVHlwZSkgc2VydmVyLmdldFNlcnZlclR5cGUoKTsKLQkJaWYgKHNlcnZlclR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGJ1bmRsZUlkID0gc2VydmVyVHlwZS5nZXROYW1lc3BhY2UoKTsKLQkJCWlmIChhY3RpdmVCdW5kbGVzICE9IG51bGwgJiYgIWFjdGl2ZUJ1bmRsZXMuY29udGFpbnMoYnVuZGxlSWQpKQotCQkJCWFjdGl2ZUJ1bmRsZXMuYWRkKGJ1bmRsZUlkKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiU2VydmVyIHJlc291cmNlIG1hbmFnZXIiOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SZXN0YXJ0U2VydmVySm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SZXN0YXJ0U2VydmVySm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZTE2Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUmVzdGFydFNlcnZlckpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0vKioKLSAqIEEgam9iIGZvciByZXN0YXJ0aW5nIGEgc2VydmVyLgotICogCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBBUEkgZGlyZWN0bHksIGl0IHdpbGwga2ljayBvZmYgam9icyBhcyByZXF1aXJlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzdGFydFNlcnZlckpvYiBleHRlbmRzIENoYWluZWRKb2IgewotCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Jlc3RhcnRDb21wbGV0ZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgSVN0YXR1cyByZXN1bHRTdGF0dXM7Ci0KLQlwdWJsaWMgUmVzdGFydFNlcnZlckpvYihJU2VydmVyIHNlcnZlciwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJc3VwZXIoTkxTLmJpbmQoTWVzc2FnZXMuam9iUmVzdGFydGluZywgc2VydmVyLmdldE5hbWUoKSksIHNlcnZlcik7Ci0JCXRoaXMubGF1bmNoTW9kZSA9IGxhdW5jaE1vZGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5qb2JzLkludGVybmFsSm9iI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZpbmFsIElTdGF0dXNbXSBzdGF0dXMgPSBuZXcgSVN0YXR1c1sxXTsKLQkJZ2V0U2VydmVyKCkucmVzdGFydChsYXVuY2hNb2RlLCBuZXcgSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb25lKElTdGF0dXMgcmVzdWx0KSB7Ci0JCQkJc3RhdHVzWzBdID0gcmVzdWx0OwotCQkJfQotCQl9KTsKLQkJCi0JCXdoaWxlIChzdGF0dXNbMF0gPT0gbnVsbCAmICFtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0YXR1c1swXTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMTk3YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSW50ZXJuYWxJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZURlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWUgZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgSVJ1bnRpbWUgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUlVOVElNRV9UWVBFX0lEID0gInJ1bnRpbWUtdHlwZS1pZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9MT0NBVElPTiA9ICJsb2NhdGlvbiI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9URVNUX0VOVklST05NRU5UID0gInRlc3QtZW52aXJvbm1lbnQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfU1RVQiA9ICJzdHViIjsKLQotCXByb3RlY3RlZCBJUnVudGltZVR5cGUgcnVudGltZVR5cGU7Ci0JcHJvdGVjdGVkIFJ1bnRpbWVEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBydW50aW1lLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICovCi0JcHVibGljIFJ1bnRpbWUoSUZpbGUgZmlsZSkgewotCQlzdXBlcihmaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSBydW50aW1lVHlwZQotCSAqLwotCXB1YmxpYyBSdW50aW1lKElGaWxlIGZpbGUsIFN0cmluZyBpZCwgSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKSB7Ci0JCXN1cGVyKGZpbGUsIGlkKTsKLQkJdGhpcy5ydW50aW1lVHlwZSA9IHJ1bnRpbWVUeXBlOwotCQltYXAucHV0KFBST1BfTkFNRSwgcnVudGltZVR5cGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW50aW1lI2dldFJ1bnRpbWVUeXBlKCkKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVUeXBlIGdldFJ1bnRpbWVUeXBlKCkgewotCQlyZXR1cm4gcnVudGltZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUnVudGltZSN2YWxpZGF0ZShJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKG1vbml0b3IpLnZhbGlkYXRlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTZXJ2ZXJQbHVnaW4ubG9nRXh0ZW5zaW9uRmFpbHVyZSh0b1N0cmluZygpLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFJ1bnRpbWVEZWxlZ2F0ZSBnZXREZWxlZ2F0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGU7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCWRlbGVnYXRlID0gKChSdW50aW1lVHlwZSkgcnVudGltZVR5cGUpLmNyZWF0ZVJ1bnRpbWVEZWxlZ2F0ZSgpOwotCQkJCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkKLQkJCQkJCUludGVybmFsSW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZVJ1bnRpbWVEZWxlZ2F0ZShkZWxlZ2F0ZSwgdGhpcywgbW9uaXRvcik7Ci0JCQkJCWlmIChUcmFjZS5QRVJGT1JNQU5DRSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1BFUkZPUk1BTkNFLCAiUnVudGltZS5nZXREZWxlZ2F0ZSgpOiA8IgotCQkJCQkJCQkrIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpICsgIj4gIiArIGdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCQlTZXJ2ZXJQbHVnaW4ubG9nRXh0ZW5zaW9uRmFpbHVyZSh0b1N0cmluZygpLCB0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5kaXNwb3NlKCk7Ci0JCQlkZWxlZ2F0ZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW50aW1lI2NyZWF0ZVdvcmtpbmdDb3B5KCkKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVXb3JraW5nQ29weSBjcmVhdGVXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIG5ldyBSdW50aW1lV29ya2luZ0NvcHkodGhpcyk7IAotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWUjaXNXb3JraW5nQ29weSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWUjZ2V0TG9jYXRpb24oKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvbigpIHsKLQkJU3RyaW5nIHRlbXAgPSBnZXRBdHRyaWJ1dGUoUFJPUF9MT0NBVElPTiwgKFN0cmluZyludWxsKTsKLQkJaWYgKHRlbXAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IFBhdGgodGVtcCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUZyb21NZXRhZGF0YSgpIHsKLQkJUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlUnVudGltZSh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlVG9NZXRhZGF0YShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc3VwZXIuc2F2ZVRvTWV0YWRhdGEobW9uaXRvcik7Ci0JCVJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFJ1bnRpbWUodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRYTUxSb290KCkgewotCQlyZXR1cm4gInJ1bnRpbWUiOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVGVzdEVudmlyb25tZW50KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfVEVTVF9FTlZJUk9OTUVOVCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWUjaXNTdHViKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N0dWIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9TVFVCLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWwoUnVudGltZVdvcmtpbmdDb3B5IHdjKSB7Ci0JCW1hcCA9IHdjLm1hcDsKLQkJcnVudGltZVR5cGUgPSB3Yy5ydW50aW1lVHlwZTsKLQkJZmlsZSA9IHdjLmZpbGU7Ci0JCWRlbGVnYXRlID0gd2MuZGVsZWdhdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZFN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJcmVzb2x2ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc29sdmUoKSB7Ci0JCVN0cmluZyBydW50aW1lVHlwZUlkID0gZ2V0QXR0cmlidXRlKFBST1BfUlVOVElNRV9UWVBFX0lELCAoU3RyaW5nKSBudWxsKTsKLQkJaWYgKHJ1bnRpbWVUeXBlSWQgIT0gbnVsbCkKLQkJCXJ1bnRpbWVUeXBlID0gU2VydmVyQ29yZS5maW5kUnVudGltZVR5cGUocnVudGltZVR5cGVJZCk7Ci0JCWVsc2UKLQkJCXJ1bnRpbWVUeXBlID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQlpZiAocnVudGltZVR5cGUgIT0gbnVsbCkKLQkJCW1lbWVudG8ucHV0U3RyaW5nKFBST1BfUlVOVElNRV9UWVBFX0lELCBydW50aW1lVHlwZS5nZXRJZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIFJ1bnRpbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJUnVudGltZSBydW50aW1lID0gKFJ1bnRpbWUpIG9iajsKLQkJcmV0dXJuIHJ1bnRpbWUuZ2V0SWQoKS5lcXVhbHMoZ2V0SWQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUnVudGltZSNnZXRBZGFwdGVyKENsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKGRlbGVnYXRlKSkKLQkJCQlyZXR1cm4gZGVsZWdhdGU7Ci0JCX0KLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW50aW1lI2xvYWRBZGFwdGVyKENsYXNzLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBPYmplY3QgbG9hZEFkYXB0ZXIoQ2xhc3MgYWRhcHRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldERlbGVnYXRlKG1vbml0b3IpOwotCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKGRlbGVnYXRlKSkKLQkJCXJldHVybiBkZWxlZ2F0ZTsKLQkKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkubG9hZEFkYXB0ZXIodGhpcywgYWRhcHRlci5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlJ1bnRpbWVbIiArIGdldElkKCkgKyAiLCAiICsgZ2V0TmFtZSgpICsgIiwgIiArIGdldExvY2F0aW9uKCkgKyAiLCAiICsgZ2V0UnVudGltZVR5cGUoKSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUxvY2F0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYTE0YzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZUxvY2F0b3JEZWxlZ2F0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lTG9jYXRvciBpbXBsZW1lbnRzIElSdW50aW1lTG9jYXRvciB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIFJ1bnRpbWVMb2NhdG9yRGVsZWdhdGUgZGVsZWdhdGU7Ci0KLQlwdWJsaWMgUnVudGltZUxvY2F0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVJZHMoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gU2VydmVyUGx1Z2luLnRva2VuaXplKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlSWRzIiksICIsIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzVHlwZShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIFNlcnZlclBsdWdpbi5jb250YWlucyhnZXRUeXBlSWRzKCksIGlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUnVudGltZUxvY2F0b3JEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsZWdhdGUgPSAoUnVudGltZUxvY2F0b3JEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCB0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQotCS8qCi0JICogQHNlZSBJUnVudGltZUxvY2F0b3Ijc2VhcmNoRm9yUnVudGltZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlYXJjaEZvclJ1bnRpbWVzKElQYXRoIHBhdGgsIGZpbmFsIElSdW50aW1lU2VhcmNoTGlzdGVuZXIgZm91bmQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJLy9nZXREZWxlZ2F0ZSgpLnNlYXJjaEZvclJ1bnRpbWVzKHBhdGgsIGZvdW5kLCBtb25pdG9yKTsKLQkJCWdldERlbGVnYXRlKCkuc2VhcmNoRm9yUnVudGltZXMocGF0aCwgbmV3IFJ1bnRpbWVMb2NhdG9yRGVsZWdhdGUuSVJ1bnRpbWVTZWFyY2hMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW50aW1lRm91bmQoSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lKSB7Ci0JCQkJCWZvdW5kLnJ1bnRpbWVGb3VuZChydW50aW1lKTsKLQkJCQl9Ci0JCQl9LCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlJ1bnRpbWVMb2NhdG9yWyIgKyBnZXRJZCgpICsgIl0iOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmExZWU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lRGVsZWdhdGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZVR5cGUgaW1wbGVtZW50cyBJUnVudGltZVR5cGUgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBMaXN0PElNb2R1bGVUeXBlPiBtb2R1bGVUeXBlczsKLQotCXB1YmxpYyBSdW50aW1lVHlwZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImRlc2NyaXB0aW9uIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZlbmRvcigpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyB2ZW5kb3IgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgidmVuZG9yIik7Ci0JCQlpZiAodmVuZG9yICE9IG51bGwpCi0JCQkJcmV0dXJuIHZlbmRvcjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBNZXNzYWdlcy5kZWZhdWx0VmVuZG9yOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgdmVyc2lvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ2ZXJzaW9uIik7Ci0JCQlpZiAodmVyc2lvbiAhPSBudWxsKQotCQkJCXJldHVybiB2ZXJzaW9uOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIE1lc3NhZ2VzLmRlZmF1bHRWZXJzaW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjZXRSdW50aW1lQ29tcG9uZW50KCkgewotCQl0cnkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJmYWNldFJ1bnRpbWVDb21wb25lbnQiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGYWNldFJ1bnRpbWVWZXJzaW9uKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJmYWNldFJ1bnRpbWVWZXJzaW9uIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBSdW50aW1lRGVsZWdhdGUgY3JlYXRlUnVudGltZURlbGVnYXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIChSdW50aW1lRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdXBwb3J0ZWQgbW9kdWxlIHR5cGVzLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbW9kdWxlIHR5cGVzCi0JICovCi0JcHVibGljIElNb2R1bGVUeXBlW10gZ2V0TW9kdWxlVHlwZXMoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAobW9kdWxlVHlwZXMgPT0gbnVsbCkKLQkJCQlsb2FkTW9kdWxlVHlwZXMoKTsKLQkKLQkJCUlNb2R1bGVUeXBlW10gbXQgPSBuZXcgSU1vZHVsZVR5cGVbbW9kdWxlVHlwZXMuc2l6ZSgpXTsKLQkJCW1vZHVsZVR5cGVzLnRvQXJyYXkobXQpOwotCQkJcmV0dXJuIG10OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ldyBJTW9kdWxlVHlwZVswXTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2FkTW9kdWxlVHlwZXMoKXsKLQkJbW9kdWxlVHlwZXMgPSBTZXJ2ZXJQbHVnaW4uZ2V0TW9kdWxlVHlwZXMoZWxlbWVudC5nZXRDaGlsZHJlbigibW9kdWxlVHlwZSIpKTsKLQkJU2VydmVyUGx1Z2luLmxvYWRSdW50aW1lTW9kdWxlVHlwZXModGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgYSBMb29zZSBNb2R1bGVUeXBlIHRvIHRoaXMgcnVudGltZSAgCi0JICogQHBhcmFtIG1vZHVsZVR5cGUKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlIG1vZHVsZVR5cGUgaXMgbnVsbCBvciBpZiBhbHJlYWR5IGFkZGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTW9kdWxlVHlwZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2ZlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbnsKLQkJaWYgKGNmZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIjxudWxsPiBtb2R1bGVUeXBlIikpOwotCQkKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IFtdIGNoaWxkcyA9IGNmZS5nZXRDaGlsZHJlbigibW9kdWxlVHlwZSIpOwotCQlpZiAoY2hpbGRzLmxlbmd0aCA8IDEpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwiTm8gbW9kdWxlVHlwZSBmb3VuZCBmb3IgcnVudGltZSIpKTsKLQkJCi0JCUxpc3Q8SU1vZHVsZVR5cGU+IGV4dHJhTW9kdWxlVHlwZXMgPSBTZXJ2ZXJQbHVnaW4uZ2V0TW9kdWxlVHlwZXMoY2hpbGRzKTsKLQkJbW9kdWxlVHlwZXMuYWRkQWxsKGV4dHJhTW9kdWxlVHlwZXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkNyZWF0ZSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBhID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7Ci0JCQlyZXR1cm4gYSAhPSBudWxsICYmIGEubGVuZ3RoKCkgPiAwOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIElSdW50aW1lV29ya2luZ0NvcHkgY3JlYXRlUnVudGltZShTdHJpbmcgaWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlSdW50aW1lV29ya2luZ0NvcHkgcndjID0gbmV3IFJ1bnRpbWVXb3JraW5nQ29weShudWxsLCBpZCwgdGhpcyk7Ci0JCXJ3Yy5zZXREZWZhdWx0cyhtb25pdG9yKTsKLQkJcmV0dXJuIHJ3YzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQllbGVtZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlJ1bnRpbWVUeXBlWyIgKyBnZXRJZCgpICsgIiwgIiArIGdldE5hbWUoKSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZVdvcmtpbmdDb3B5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lV29ya2luZ0NvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3OTdlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSW50ZXJuYWxJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZURlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVXb3JraW5nQ29weSBleHRlbmRzIFJ1bnRpbWUgaW1wbGVtZW50cyBJUnVudGltZVdvcmtpbmdDb3B5IHsKLQlwcm90ZWN0ZWQgUnVudGltZSBydW50aW1lOwotCXByb3RlY3RlZCBXb3JraW5nQ29weUhlbHBlciB3Y2g7Ci0JCi0JcHJvdGVjdGVkIFJ1bnRpbWVEZWxlZ2F0ZSB3b3JraW5nQ29weURlbGVnYXRlOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHJ1bnRpbWUgd29ya2luZyBjb3B5IGZyb20gZXhpc3RpbmcgcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZQotCSAqLwotCXB1YmxpYyBSdW50aW1lV29ya2luZ0NvcHkoUnVudGltZSBydW50aW1lKSB7Ci0JCXN1cGVyKHJ1bnRpbWUuZ2V0RmlsZSgpKTsKLQkJdGhpcy5ydW50aW1lID0gcnVudGltZTsKLQkJCi0JCXJ1bnRpbWVUeXBlID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotCQkKLQkJbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KHJ1bnRpbWUubWFwKTsKLQkJd2NoID0gbmV3IFdvcmtpbmdDb3B5SGVscGVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBydW50aW1lIHdvcmtpbmcgY29weSBmb3IgYSBuZXcgcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSBydW50aW1lVHlwZQotCSAqLwotCXB1YmxpYyBSdW50aW1lV29ya2luZ0NvcHkoSUZpbGUgZmlsZSwgU3RyaW5nIGlkLCBJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKLQkJc3VwZXIoZmlsZSwgaWQsIHJ1bnRpbWVUeXBlKTsKLQkJd2NoID0gbmV3IFdvcmtpbmdDb3B5SGVscGVyKHRoaXMpOwotCQl3Y2guc2V0RGlydHkodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUnVudGltZSNpc1dvcmtpbmdDb3B5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW50aW1lI2NyZWF0ZVdvcmtpbmdDb3B5KCkKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVXb3JraW5nQ29weSBjcmVhdGVXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBpbnQgdmFsdWUpIHsKLQkJd2NoLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgTGlzdDxTdHJpbmc+IHZhbHVlKSB7Ci0JCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgTWFwIHZhbHVlKSB7Ci0JCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWVXb3JraW5nQ29weSNzZXROYW1lKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXdjaC5zZXROYW1lKG5hbWUpOwotCQlib29sZWFuIHNldCA9IGdldEF0dHJpYnV0ZShQUk9QX0lEX1NFVCwgZmFsc2UpOwotCQlpZiAocnVudGltZSA9PSBudWxsICYmICFzZXQpCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9JRCwgbmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGVzdEVudmlyb25tZW50KGJvb2xlYW4gYikgewotCQlzZXRBdHRyaWJ1dGUoUFJPUF9URVNUX0VOVklST05NRU5ULCBiKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW50aW1lV29ya2luZ0NvcHkjc2V0U3R1Yihib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0dWIoYm9vbGVhbiBiKSB7Ci0JCXNldEF0dHJpYnV0ZShQUk9QX1NUVUIsIGIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWVXb3JraW5nQ29weSNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gd2NoLmlzRGlydHkoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJUnVudGltZVdvcmtpbmdDb3B5I2dldE9yaWdpbmFsKCkKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWUgZ2V0T3JpZ2luYWwoKSB7Ci0JCXJldHVybiBydW50aW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWVXb3JraW5nQ29weSNzZXRSZWFkT25seShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gYikgewotCQl3Y2guc2V0TG9ja2VkKGIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByaXZhdGUoYm9vbGVhbiBiKSB7Ci0JCXdjaC5zZXRQcml2YXRlKGIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWVXb3JraW5nQ29weSNzZXRMb2NhdGlvbihJUGF0aCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihJUGF0aCBwYXRoKSB7Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9MT0NBVElPTiwgKFN0cmluZyludWxsKTsKLQkJZWxzZQotCQkJc2V0QXR0cmlidXRlKFBST1BfTE9DQVRJT04sIHBhdGgudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUnVudGltZVdvcmtpbmdDb3B5I3NhdmUoYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWUgc2F2ZShib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuc2F2aW5nVGFzaywgZ2V0TmFtZSgpKSk7Ci0JCQotCQlpZiAoIWZvcmNlICYmIGdldE9yaWdpbmFsKCkgIT0gbnVsbCkKLQkJCXdjaC52YWxpZGF0ZVRpbWVzdGFtcCgoKFJ1bnRpbWUpIGdldE9yaWdpbmFsKCkpLmdldFRpbWVzdGFtcCgpKTsKLQkJCi0JCWludCB0aW1lc3RhbXAgPSBnZXRUaW1lc3RhbXAoKTsKLQkJbWFwLnB1dChQUk9QX1RJTUVTVEFNUCwgSW50ZWdlci50b1N0cmluZyh0aW1lc3RhbXArMSkpOwotCQkKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXJ1bnRpbWUgPSBuZXcgUnVudGltZShmaWxlKTsKLQkJCi0JCVN0cmluZyBvbGRJZCA9IGdldElkKCk7Ci0JCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQlib29sZWFuIHNldCA9IGdldEF0dHJpYnV0ZShQUk9QX0lEX1NFVCwgZmFsc2UpOwotCQlpZiAoIW9sZElkLmVxdWFscyhuYW1lKSAmJiAhc2V0KSB7Ci0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9JRCwgbmFtZSk7Ci0JCX0gZWxzZQotCQkJb2xkSWQgPSBudWxsOwotCQkKLQkJcnVudGltZS5zZXRJbnRlcm5hbCh0aGlzKTsKLQkJcnVudGltZS5zYXZlVG9NZXRhZGF0YShtb25pdG9yKTsKLQkJd2NoLnNldERpcnR5KGZhbHNlKTsKLQkJCi0JCXJldHVybiBydW50aW1lOwotCX0KLQotCXByb3RlY3RlZCBSdW50aW1lRGVsZWdhdGUgZ2V0V29ya2luZ0NvcHlEZWxlZ2F0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHdvcmtpbmdDb3B5RGVsZWdhdGUgIT0gbnVsbCkKLQkJCXJldHVybiB3b3JraW5nQ29weURlbGVnYXRlOwotCQkKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAod29ya2luZ0NvcHlEZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCXdvcmtpbmdDb3B5RGVsZWdhdGUgPSAoKFJ1bnRpbWVUeXBlKSBydW50aW1lVHlwZSkuY3JlYXRlUnVudGltZURlbGVnYXRlKCk7Ci0JCQkJCUludGVybmFsSW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZVJ1bnRpbWVEZWxlZ2F0ZSh3b3JraW5nQ29weURlbGVnYXRlLCB0aGlzLCBtb25pdG9yKTsKLQkJCQkJaWYgKFRyYWNlLlBFUkZPUk1BTkNFKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfUEVSRk9STUFOQ0UsICJSdW50aW1lV29ya2luZ0NvcHkuZ2V0V29ya2luZ0NvcHlEZWxlZ2F0ZSgpOiA8IgotCQkJCQkJCQkrIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpICsgIj4gIiArIGdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdvcmtpbmdDb3B5RGVsZWdhdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAod29ya2luZ0NvcHlEZWxlZ2F0ZSAhPSBudWxsKQotCQkJd29ya2luZ0NvcHlEZWxlZ2F0ZS5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgc2VydmVyLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyIGNhbm5vdCBiZSBudWxsIik7Ci0JCXdjaC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBzZXJ2ZXIuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGlzdGVuZXIgY2Fubm90IGJlIG51bGwiKTsKLQkJd2NoLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBGaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgYSBwcm9wZXJ0eSBuYW1lCi0JICogQHBhcmFtIG9sZFZhbHVlIHRoZSBvbGQgdmFsdWUKLQkgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXdjaC5maXJlUHJvcGVydHlDaGFuZ2VFdmVudChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgZGVmYXVsdHMgZm9yIHRoaXMgcnVudGltZSwgaW5jbHVkaW5nIHRoZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgbnVsbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJU2VydmVyVXRpbC5zZXRSdW50aW1lRGVmYXVsdE5hbWUodGhpcyk7Ci0JCQlnZXRXb3JraW5nQ29weURlbGVnYXRlKG1vbml0b3IpLnNldERlZmF1bHRzKG1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHNldERlZmF1bHRzKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NhdmVFZGl0b3JQcm9tcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2F2ZUVkaXRvclByb21wdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNDU4NDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2F2ZUVkaXRvclByb21wdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLS8qKgotICogPHA+Ci0gKiBTYXZlRWRpdG9yUHJvbXB0ZXIgaXMgdGhlIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSAuc2F2ZUVkaXRvclByb21wdGVyIGV4dGVuc2lvbiAKLSAqIHBvaW50LiBUaGlzIGNsYXNzIGlzIHVzZWQgZm9yIHByb21wdGluZyB0byB0aGUgdXNlciB0byBzYXZlIGFsbCB0aGUgZWRpdG9ycy4gVGhlIGNsYXNzIAotICogdHJhbnNmZXIgdGhlIGNvbnRyb2wgZnJvbSB0aGUgbm9uLXVpIGNvZGUgdG8gdGhlIFVJIGNvZGUgdmlhIGFuIHRoZSBleHRlbnNpb24gcG9pbnQKLSAqIDwvcD4KLSAqIDxiPlRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIGFkb3B0ZXJzLjwvYj4gCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNhdmVFZGl0b3JQcm9tcHRlciB7Ci0JCi0JLyoqCi0JICogTW92ZSB0aGUgY29udHJvbCB0byB0aGUgVUkgYW5kIHNhdmUgYWxsIHRoZSBlZGl0b3JzIGFjY29yZGluZyB0byA8Y29kZT5vcmcuZWNsaXBzZS5kZWJ1Zy5pbnRlcm5hbC51aS5JSW50ZXJuYWxEZWJ1Z1VJQ29uc3RhbnRzLlBSRUZfU0FWRV9ESVJUWV9FRElUT1JTX0JFRk9SRV9MQVVOQ0g8L2NvZGU+ICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQWxsRWRpdG9ycygpewotCQkvLyBub3RoaW5nIHRvIGRvLCBzaG91bGQgYmUgaW1wbGVtZW50ZWQJCQotCX0KLQlwdWJsaWMgdm9pZCBzZXREZWJ1Z05ldmVyU2F2ZSgpewotCQkvLyBub3RoaW5nIHRvIGRvLCBzaG91bGQgYmUgaW1wbGVtZW50ZWQJCQotCX0KLQlwdWJsaWMgdm9pZCBzZXREZWJ1Z09yaWdpbmFsVmFsdWUoKXsKLQkJLy8gbm90aGluZyB0byBkbywgc2hvdWxkIGJlIGltcGxlbWVudGVkCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTA0NmJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLio7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXIgZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgSVNlcnZlciB7Ci0JLyoqCi0JICogU2VydmVyIGlkIGF0dHJpYnV0ZSAodmFsdWUgInNlcnZlci1pZCIpIG9mIGxhdW5jaCBjb25maWd1cmF0aW9ucy4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHRhZyBhIGxhdW5jaCBjb25maWd1cmF0aW9uIHdpdGggdGhlCi0JICogaWQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2VydmVyLgotCSAqIAotCSAqIEBzZWUgSUxhdW5jaENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NFUlZFUl9JRCA9ICJzZXJ2ZXItaWQiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gRU1QVFlfTElTVCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigwKTsKLQotCS8qKgotCSAqIEZpbGUgZXh0ZW5zaW9uICh2YWx1ZSAic2VydmVyIikgZm9yIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YKLQkgKiBzZXJ2ZXIgaW5zdGFuY2VzLgotCSAqIDxwPgotCSAqIFtpc3N1ZTogV2hhdCBpcyByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGlzIGZpbGUgZXh0ZW5zaW9uIGFuZAotCSAqIHRoZSBmaWxlIHBhc3NlZCB0byBJU2VydmVyVHlwZS5jcmVhdGUoLi4uKSBvciByZXR1cm5lZCBieQotCSAqIElTZXJ2ZXIuZ2V0RmlsZSgpPyBUaGF0IGlzLCBhcmUgc2VydmVyIGZpbGVzIGV4cGVjdGVkIHRvIGVuZAotCSAqIGluICIuc2VydmVyIiwgb3IgaXMgdGhpcyBqdXN0IGEgZGVmYXVsdD8gSWYgdGhlIGZvcm1lcgotCSAqIChhcyBJIHN1c3BlY3QpLCB0aGVuIElTZXJ2ZXJUeXBlLmNyZWF0ZSBuZWVkcyB0byBzYXkgc28sCi0JICogYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgZW5mb3JjZSB0aGUgcmVzdHJpY3Rpb24uXQotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0VYVEVOU0lPTiA9ICJzZXJ2ZXIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19QVUJMSVNIX0RJU0FCTEUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fUFVCTElTSF9SRVNPVVJDRSA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19QVUJMSVNIX0JVSUxEID0gMzsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQVUJMSVNIX0FVVE9fU1RSSU5HID0gImF1dG8iOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQVUJMSVNIX0NMRUFOX1NUUklORyA9ICJjbGVhbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBVQkxJU0hfRlVMTF9TVFJJTkcgPSAiZnVsbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBVQkxJU0hfSU5DUkVNRU5UQUxfU1RSSU5HID0gImluY3JlbWVudGFsIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUFVCTElTSF9VTktPV04gPSAidW5rb3duIjsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0hPU1ROQU1FID0gImhvc3RuYW1lIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfSUQgPSAic2VydmVyLWlkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX0lEID0gInJ1bnRpbWUtaWQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fSUQgPSAiY29uZmlndXJhdGlvbi1pZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX0xJU1QgPSAibW9kdWxlcyI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9ESVNBQkxFRF9QRVJGRVJSRURfVEFTS1MgPSAiZGlzYWJsZWQtcHJlZmVycmVkLXB1Ymxpc2gtdGFza3MiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRU5BQkxFRF9PUFRJT05BTF9UQVNLUyA9ICJlbmFibGVkLW9wdGlvbmFsLXB1Ymxpc2gtdGFza3MiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUFVCTElTSEVSUyA9ICJwdWJsaXNoZXJzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0FVVE9fUFVCTElTSF9USU1FID0gImF1dG8tcHVibGlzaC10aW1lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0FVVE9fUFVCTElTSF9TRVRUSU5HID0gImF1dG8tcHVibGlzaC1zZXR0aW5nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1NUQVJUX1RJTUVPVVQgPSAic3RhcnQtdGltZW91dCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9TVE9QX1RJTUVPVVQgPSAic3RvcC10aW1lb3V0IjsJCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXJbXSBJTlZBTElEX0NIQVJTID0gbmV3IGNoYXJbXSB7J1xcJywgJy8nLCAnOicsICcqJywgJz8nLCAnIicsICc8JywgJz4nLCAnfCcsICdcMCcsICdAJywgJyYnfTsKLQotCXByb3RlY3RlZCBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlOwotCXByb3RlY3RlZCBTZXJ2ZXJEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQlwcm90ZWN0ZWQgU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUgYmVoYXZpb3VyRGVsZWdhdGU7Ci0KLQlwcm90ZWN0ZWQgSVJ1bnRpbWUgcnVudGltZTsKLQlwcm90ZWN0ZWQgSUZvbGRlciBjb25maWd1cmF0aW9uOwotCi0JLy8gdGhlIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IGFyZSB0byBiZSBwdWJsaXNoZWQgdG8gdGhlIHNlcnZlcgotCXByb3RlY3RlZCBMaXN0PElNb2R1bGU+IG1vZHVsZXM7Ci0JCi0JLyoqIEEgbG9jayB0aGF0IGlzIHVzZWQgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIG1vZHVsZXMuICovCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtb2R1bGVzTG9jayA9IG5ldyBPYmplY3QoKTsKLQotCS8vIHRoZSBsaXN0IG9mIGV4dGVybmFsIG1vZHVsZXMKLQlwcm90ZWN0ZWQgTGlzdDxJTW9kdWxlPiBleHRlcm5hbE1vZHVsZXM7Ci0KLQkvLyB0cmFuc2llbnQgZmllbGRzCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBTdHJpbmcgbW9kZSA9IElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFOwotCXByb3RlY3RlZCB0cmFuc2llbnQgaW50IHNlcnZlclN0YXRlID0gU1RBVEVfVU5LTk9XTjsKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IGludCBzZXJ2ZXJTeW5jU3RhdGU7Ci0JcHJvdGVjdGVkIHRyYW5zaWVudCBib29sZWFuIHNlcnZlclJlc3RhcnROZWVkZWQ7Ci0KLQlwcm90ZWN0ZWQgdHJhbnNpZW50IE1hcDxTdHJpbmcsIEludGVnZXI+IG1vZHVsZVN0YXRlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotCXByb3RlY3RlZCB0cmFuc2llbnQgTWFwPFN0cmluZywgSW50ZWdlcj4gbW9kdWxlUHVibGlzaFN0YXRlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotCXByb3RlY3RlZCB0cmFuc2llbnQgTWFwPFN0cmluZywgQm9vbGVhbj4gbW9kdWxlUmVzdGFydFN0YXRlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPigpOwotCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBJU3RhdHVzIHNlcnZlclN0YXR1czsKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IE1hcDxTdHJpbmcsIElTdGF0dXM+IG1vZHVsZVN0YXR1cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVN0YXR1cz4oKTsKLQotCXByb3RlY3RlZCB0cmFuc2llbnQgU2VydmVyUHVibGlzaEluZm8gcHVibGlzaEluZm87Ci0JcHJvdGVjdGVkIHRyYW5zaWVudCBBdXRvUHVibGlzaFRocmVhZCBhdXRvUHVibGlzaFRocmVhZDsKLQotCS8qKgotCSAqIFRoZSBtb3N0IHJlY2VudCBsYXVuY2ggdXNlZCB0byBzdGFydCB0aGUgc2VydmVyLgotCSAqLwotCXByb3RlY3RlZCB0cmFuc2llbnQgSUxhdW5jaCBsYXVuY2g7Ci0KLS8qCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHN0YXRlU3RyaW5ncyA9IG5ldyBTdHJpbmdbXSB7Ci0JCSJ1bmtub3duIiwgInN0YXJ0aW5nIiwgInN0YXJ0ZWQiLCAic3RhcnRlZF9kZWJ1ZyIsCi0JCSJzdG9wcGluZyIsICJzdG9wcGVkIiwgInN0YXJ0ZWRfdW5zdXBwb3J0ZWQiLCAic3RhcnRlZF9wcm9maWxlIgotCX07Ki8KLQotCS8vIHB1Ymxpc2ggbGlzdGVuZXJzCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBMaXN0PElQdWJsaXNoTGlzdGVuZXI+IHB1Ymxpc2hMaXN0ZW5lcnM7Ci0KLQkvLyBzZXJ2ZXIgbGlzdGVuZXJzCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBTZXJ2ZXJOb3RpZmljYXRpb25NYW5hZ2VyIG5vdGlmaWNhdGlvbk1hbmFnZXI7Ci0KLQlwdWJsaWMgY2xhc3MgQXV0b1B1Ymxpc2hUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotCQlwdWJsaWMgYm9vbGVhbiBzdG9wOwotCQlwdWJsaWMgaW50IHRpbWUgPSAwOwotCi0JCXB1YmxpYyBBdXRvUHVibGlzaFRocmVhZCgpIHsKLQkJCXN1cGVyKCJBdXRvbWF0aWMgUHVibGlzaGluZyIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJBdXRvLXB1Ymxpc2ggdGhyZWFkIHN0YXJ0aW5nIGZvciAiICsgU2VydmVyLnRoaXMgKyAiIC0gIiArIHRpbWUgKyAicyIpOwotCQkJfQotCQkJaWYgKHN0b3ApCi0JCQkJcmV0dXJuOwotCQkJCi0JCQl0cnkgewotCQkJCXNsZWVwKHRpbWUgKiAxMDAwKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQkKLQkJCWlmIChzdG9wKQotCQkJCXJldHVybjsKLQkJCQotCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJBdXRvLXB1Ymxpc2ggdGhyZWFkIHB1Ymxpc2hpbmcgIiArIFNlcnZlci50aGlzKTsKLQkJCX0KLQkJCQotCQkJaWYgKGdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKQotCQkJCXJldHVybjsKLQkJCQotCQkJcHVibGlzaChJU2VydmVyLlBVQkxJU0hfQVVUTywgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGFic3RyYWN0IGNsYXNzIFNlcnZlckpvYiBleHRlbmRzIEpvYiB7Ci0JCXB1YmxpYyBTZXJ2ZXJKb2IoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJCXJldHVybiBTZXJ2ZXJVdGlsLlNFUlZFUl9KT0JfRkFNSUxZLmVxdWFscyhmYW1pbHkpOwotCQl9Ci0JCi0JCXB1YmxpYyBJU2VydmVyIGdldFNlcnZlcigpIHsKLQkJCXJldHVybiBTZXJ2ZXIudGhpczsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBSZXNvdXJjZUNoYW5nZUpvYiBleHRlbmRzIFNlcnZlckpvYiB7Ci0JCXByaXZhdGUgSU1vZHVsZSBtb2R1bGU7Ci0JCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQkJcHVibGljIFJlc291cmNlQ2hhbmdlSm9iKElNb2R1bGUgbW9kdWxlKSB7Ci0JCQl0aGlzKG1vZHVsZSwgbnVsbCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBSZXNvdXJjZUNoYW5nZUpvYihJTW9kdWxlIG1vZHVsZSwgSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKE5MUy5iaW5kKE1lc3NhZ2VzLmpvYlVwZGF0ZVNlcnZlciwgU2VydmVyLnRoaXMuZ2V0TmFtZSgpKSk7Ci0JCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJCXRoaXMuZXZlbnQgPSBldmVudDsKLQkJCQotCQkJaWYgKG1vZHVsZS5nZXRQcm9qZWN0KCkgPT0gbnVsbCkKLQkJCQlzZXRSdWxlKFNlcnZlci50aGlzKTsKLQkJCWVsc2UgewotCQkJCUlTY2hlZHVsaW5nUnVsZVtdIHJ1bGVzID0gbmV3IElTY2hlZHVsaW5nUnVsZVsyXTsKLQkJCQlJUmVzb3VyY2VSdWxlRmFjdG9yeSBydWxlRmFjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpOwotCQkJCXJ1bGVzWzBdID0gcnVsZUZhY3RvcnkuY3JlYXRlUnVsZShtb2R1bGUuZ2V0UHJvamVjdCgpKTsKLQkJCQlydWxlc1sxXSA9IFNlcnZlci50aGlzOwotCQkJCXNldFJ1bGUoTXVsdGlSdWxlLmNvbWJpbmUocnVsZXMpKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBJTW9kdWxlIGdldE1vZHVsZSgpIHsKLQkJCXJldHVybiBtb2R1bGU7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlmaW5hbCBib29sZWFuW10gY2hhbmdlZCA9IG5ldyBib29sZWFuWzFdOwotCQkJZmluYWwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZXMyID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlW10+KCk7Ci0JCQkKLQkJCS8vIGNyZWF0ZSB0aGUgdmlzaXRvciB0aGF0IHdpbGwgcmVzZXQgdGhlIG1vZHVsZSBwdWJsaXNoIHN0YXRlIGZsYWcKLQkJCUlNb2R1bGVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSU1vZHVsZVZpc2l0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSU1vZHVsZVtdIG1vZHVsZTIpIHsKLQkJCQkJbW9kdWxlczIuYWRkKG1vZHVsZTIpOwotCQkJCQkKLQkJCQkJaW50IHNpemUgPSBtb2R1bGUyLmxlbmd0aDsKLQkJCQkJSU1vZHVsZSBtID0gbW9kdWxlMltzaXplIC0gMV07Ci0JCQkJCWlmIChtLmdldFByb2plY3QoKSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQotCQkJCQlpZiAoZ2V0TW9kdWxlKCkuZXF1YWxzKG0pKSB7Ci0JCQkJCQlpZiAoaGFzUHVibGlzaGVkUmVzb3VyY2VEZWx0YShtb2R1bGUyKSkgewotCQkJCQkJCWNoYW5nZWRbMF0gPSB0cnVlOwotCQkJCQkJCWludCBuZXdTdGF0ZSA9IGdldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUyKSA9PSBJU2VydmVyLlBVQkxJU0hfU1RBVEVfRlVMTCA/IElTZXJ2ZXIuUFVCTElTSF9TVEFURV9GVUxMIDogSVNlcnZlci5QVUJMSVNIX1NUQVRFX0lOQ1JFTUVOVEFMOwotCQkJCQkJCXNldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUyLCBuZXdTdGF0ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfTsKLQkJCQotCQkJLy8gcnVuIHRoZSB2aXNpdG9yCi0JCQl2aXNpdCh2aXNpdG9yLCBudWxsKTsKLQkJCQotCQkJaWYgKGdldFNlcnZlclB1Ymxpc2hJbmZvKCkuaGFzU3RydWN0dXJlQ2hhbmdlZChtb2R1bGVzMikpIHsKLQkJCQlpbnQgbmV3U3RhdGUgPSBnZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKSA9PSBJU2VydmVyLlBVQkxJU0hfU1RBVEVfRlVMTCA/IElTZXJ2ZXIuUFVCTElTSF9TVEFURV9GVUxMIDogSVNlcnZlci5QVUJMSVNIX1NUQVRFX0lOQ1JFTUVOVEFMOwotCQkJCXNldFNlcnZlclB1Ymxpc2hTdGF0ZShuZXdTdGF0ZSk7Ci0JCQkJY2hhbmdlZFswXSA9IHRydWU7Ci0JCQl9Ci0JCQkKLQkJCWlmICghY2hhbmdlZFswXSkKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQotCQkJaWYgKGdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEICYmIGJlaGF2aW91ckRlbGVnYXRlICE9IG51bGwpCi0JCQkJYmVoYXZpb3VyRGVsZWdhdGUuaGFuZGxlUmVzb3VyY2VDaGFuZ2UoKTsKLQkJCQotCQkJaWYgKGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKQotCQkJCWF1dG9QdWJsaXNoKGV2ZW50KTsKLQkJCQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgZmluYWwgY2xhc3MgUHVibGlzaEpvYiBleHRlbmRzIFNlcnZlckpvYiB7Ci0JCXByaXZhdGUgZmluYWwgaW50IGtpbmQ7Ci0JCXByaXZhdGUgZmluYWwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZXM0OwotCQlwcml2YXRlIGZpbmFsIElBZGFwdGFibGUgaW5mbzsKLQkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHN0YXJ0OwotCi0JCS8qKgotCQkgKiBDcmVhdGUgYSBuZXcgcHVibGlzaGluZyBqb2IuCi0JCSAqIAotCQkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiBwdWJsaXNoCi0JCSAqIEBwYXJhbSBtb2R1bGVzNCBhIGxpc3Qgb2YgbW9kdWxlcyB0byBwdWJsaXNoLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotCQkgKiAgICBwdWJsaXNoIGFsbCBtb2R1bGVzCi0JCSAqIEBwYXJhbSBzdGFydCB0cnVlIGlmIHdlIG5lZWQgdG8gc3RhcnQgdGhlIHNlcnZlciBmaXJzdAotCQkgKiBAcGFyYW0gaW5mbyB0aGUgSUFkYXB0YWJsZSAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHByb3ZpZGVkIGJ5IHRoZQotCQkgKiAgICBjYWxsZXIgaW4gb3JkZXIgdG8gc3VwcGx5IFVJIGluZm9ybWF0aW9uIGZvciBwcm9tcHRpbmcgdGhlCi0JCSAqICAgIHVzZXIgaWYgbmVjZXNzYXJ5LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAotCQkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiwgaXQgc2hvdWxkIG1pbmltYWxseSBjb250YWluIGFuIGFkYXB0ZXIKLQkJICogICAgZm9yIHRoZSBTaGVsbCBjbGFzcy4KLQkJICovCi0JCXB1YmxpYyBQdWJsaXNoSm9iKGludCBraW5kLCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlczQsIGJvb2xlYW4gc3RhcnQsIElBZGFwdGFibGUgaW5mbykgewotCQkJc3VwZXIoTkxTLmJpbmQoTWVzc2FnZXMucHVibGlzaGluZywgU2VydmVyLnRoaXMuZ2V0TmFtZSgpKSk7Ci0JCQl0aGlzLmtpbmQgPSBraW5kOwotCQkJdGhpcy5tb2R1bGVzNCA9IG1vZHVsZXM0OwotCQkJdGhpcy5zdGFydCA9IHN0YXJ0OwotCQkJdGhpcy5pbmZvID0gaW5mbzsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcHJvamVjdHMgdGhhdCByZXF1aXJlcyB0byBiZSBsb2NrZWQgZHVyaW5nIGEgcHVibGlzaC4KLQkJICogQHJldHVybiB0aGUgbGlzdCBvZiBwcm9qZWN0cwotCQkgKi8KLQkJQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQotCQlMaXN0PElQcm9qZWN0PiBnZXRQcm9qZWN0UHVibGlzaExvY2tMaXN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJZmluYWwgTGlzdDxJUHJvamVjdD4gcHJvamVjdFB1Ymxpc2hMb2NrTGlzdCA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3Q+KCk7Ci0JCQkKLQkJCUlNb2R1bGVbXSBjdXJNb2R1bGVzID0gZ2V0TW9kdWxlcygpOwotCQkJLy8gQ2hlY2sgZW1wdHkgbW9kdWxlIGxpc3Qgc2luY2UgdGhlIHZpc2l0TW9kdWxlIGRvZXMgbm90IGhhbmRsZSB0aGF0IHByb3Blcmx5LgotCQkJaWYgKGN1ck1vZHVsZXMgIT0gbnVsbCAmJiBjdXJNb2R1bGVzLmxlbmd0aCA+IDApIHsKLQkJCQlmb3IgKElNb2R1bGUgY3VyTW9kdWxlOiBjdXJNb2R1bGVzKSB7Ci0JCQkJCS8vIEdldCBhbGwgdGhlIGFmZmVjdGVkIHByb2plY3RzIGR1cmluZyB0aGUgcHVibGlzaC4KLQkJCQkJdmlzaXRNb2R1bGUobmV3IElNb2R1bGVbXSB7IGN1ck1vZHVsZSB9LCBuZXcgSU1vZHVsZVZpc2l0b3IoKXsKLQkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElNb2R1bGVbXSBtb2R1bGVzMikgewotCQkJCQkJCWZvciAoSU1vZHVsZSBjdXJNb2R1bGUyIDogbW9kdWxlczIpIHsKLQkJCQkJCQkJSVByb2plY3QgY3VyUHJvamVjdCA9IGN1ck1vZHVsZTIuZ2V0UHJvamVjdCgpOwotCQkJCQkJCQlpZiAoY3VyUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAoIXByb2plY3RQdWJsaXNoTG9ja0xpc3QuY29udGFpbnMoY3VyUHJvamVjdCkpIHsKLQkJCQkJCQkJCQlwcm9qZWN0UHVibGlzaExvY2tMaXN0LmFkZChjdXJQcm9qZWN0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfX0sIG1vbml0b3IpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBwcm9qZWN0UHVibGlzaExvY2tMaXN0OwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJaWYgKHN0YXJ0KSB7Ci0JCQkJdHJ5ewotCQkJCQkvLyAyMzcyMjIgLSBBcHBseSB0aGUgcnVsZXMgb25seSB3aGVuIHRoZSBqb2IgaGFzIHN0YXJ0ZWQKLQkJCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5iZWdpblJ1bGUoU2VydmVyLnRoaXMsIG1vbml0b3IpOwotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IHN0YXJ0SW1wbChJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSwgbW9uaXRvcik7Ci0JCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQl9Ci0JCQkJZmluYWxseXsKLQkJCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5lbmRSdWxlKFNlcnZlci50aGlzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCVNlcnZlckRlbGVnYXRlIGN1ckRlbGVnYXRlID0gZ2V0RGVsZWdhdGUobW9uaXRvcik7Ci0JCQlJU2NoZWR1bGluZ1J1bGVbXSBwdWJsaXNoU2NoZWR1bGVSdWxlcyA9IG51bGw7Ci0JCQlpZiAoY3VyRGVsZWdhdGUgIT0gbnVsbCAmJiBjdXJEZWxlZ2F0ZS5pc1VzZVByb2plY3RTcGVjaWZpY1NjaGVkdWxpbmdSdWxlT25QdWJsaXNoKCkpIHsKLQkJCQkvLyAyODg4NjMgLSBsb2NrIG9ubHkgYWZmZWN0ZWQgcHJvamVjdHMgZHVyaW5nIHB1Ymxpc2gKLQkJCQkvLyBGaW5kIG91dCBhbGwgdGhlIHByb2plY3RzIHRoYXQgY29udGFpbnMgbW9kdWxlcyBhZGRlZCB0byB0aGlzIHNlcnZlciBmb3Igd29ya3NwYWNlIGxvY2suCi0JCQkJTGlzdDxJUHJvamVjdD4gY3VyUHJvamVjdFB1Ymxpc2hMb2NrTGlzdCA9IGdldFByb2plY3RQdWJsaXNoTG9ja0xpc3QobW9uaXRvcik7Ci0JCQkJCi0JCQkJcHVibGlzaFNjaGVkdWxlUnVsZXMgPSBuZXcgSVNjaGVkdWxpbmdSdWxlW2N1clByb2plY3RQdWJsaXNoTG9ja0xpc3Quc2l6ZSgpKzFdOwotCQkJCUlSZXNvdXJjZVJ1bGVGYWN0b3J5IHJ1bGVGYWN0b3J5ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCk7Ci0JCQkJcHVibGlzaFNjaGVkdWxlUnVsZXNbMF0gPSBTZXJ2ZXIudGhpczsKLQkJCQlpbnQgaT0xOwotCQkJCWZvciAoSVByb2plY3QgY3VyUHJvaiA6IGN1clByb2plY3RQdWJsaXNoTG9ja0xpc3QpIHsKLQkJCQkJcHVibGlzaFNjaGVkdWxlUnVsZXNbaSsrXSA9IHJ1bGVGYWN0b3J5Lm1vZGlmeVJ1bGUoY3VyUHJvaik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyAxMDIyMjcgLSBsb2NrIGVudGlyZSB3b3Jrc3BhY2UgZHVyaW5nIHB1Ymxpc2gKLQkJCQlwdWJsaXNoU2NoZWR1bGVSdWxlcyA9IG5ldyBJU2NoZWR1bGluZ1J1bGVbXSB7Ci0JCQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCBTZXJ2ZXIudGhpcwotCQkJCX07Ci0JCQl9Ci0JCQlJU2NoZWR1bGluZ1J1bGUgcHVibGlzaFJ1bGUgPSBNdWx0aVJ1bGUuY29tYmluZShwdWJsaXNoU2NoZWR1bGVSdWxlcyk7Ci0JCQkKLQkJCXRyeXsKLQkJCQkvLyAyMzcyMjIgLSBBcHBseSB0aGUgcnVsZXMgb25seSB3aGVuIHRoZSBqb2IgaGFzIHN0YXJ0ZWQKLQkJCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmJlZ2luUnVsZShwdWJsaXNoUnVsZSwgbW9uaXRvcik7CQotCQkJCXJldHVybiBwdWJsaXNoSW1wbChraW5kLCBtb2R1bGVzNCwgaW5mbywgbW9uaXRvcik7Ci0JCQl9IGZpbmFsbHkgewotCQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuZW5kUnVsZShwdWJsaXNoUnVsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgU3RhcnRKb2IgZXh0ZW5kcyBTZXJ2ZXJKb2IgewotCQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgUFVCTElTSF9OT05FID0gMDsKLQkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIFBVQkxJU0hfQkVGT1JFID0gMTsKLQkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIFBVQkxJU0hfQUZURVIgPSAyOwotCi0JCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZTsKLQotCQlwdWJsaWMgU3RhcnRKb2IoU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJCXN1cGVyKE5MUy5iaW5kKE1lc3NhZ2VzLmpvYlN0YXJ0aW5nLCBTZXJ2ZXIudGhpcy5nZXROYW1lKCkpKTsKLQkJCXRoaXMubGF1bmNoTW9kZSA9IGxhdW5jaE1vZGU7Ci0JCQkKLQkJCXNldFJ1bGUoU2VydmVyLnRoaXMpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJSVN0YXR1cyBzdGF0ID0gc3RhcnRJbXBsKGxhdW5jaE1vZGUsIG1vbml0b3IpOwotCQkJcmV0dXJuIHN0YXQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgUmVzdGFydEpvYiBleHRlbmRzIFNlcnZlckpvYiB7Ci0JCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZTsKLQotCQlwdWJsaWMgUmVzdGFydEpvYihTdHJpbmcgbGF1bmNoTW9kZSkgewotCQkJc3VwZXIoTkxTLmJpbmQoTWVzc2FnZXMuam9iUmVzdGFydGluZywgU2VydmVyLnRoaXMuZ2V0TmFtZSgpKSk7Ci0JCQl0aGlzLmxhdW5jaE1vZGUgPSBsYXVuY2hNb2RlOwotCQkJc2V0UnVsZShTZXJ2ZXIudGhpcyk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlyZXR1cm4gcmVzdGFydEltcGwobGF1bmNoTW9kZSwgbW9uaXRvcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgU3RvcEpvYiBleHRlbmRzIFNlcnZlckpvYiB7Ci0JCXByb3RlY3RlZCBib29sZWFuIGZvcmNlOwotCi0JCXB1YmxpYyBTdG9wSm9iKGJvb2xlYW4gZm9yY2UpIHsKLQkJCXN1cGVyKE5MUy5iaW5kKE1lc3NhZ2VzLmpvYlN0b3BwaW5nLCBTZXJ2ZXIudGhpcy5nZXROYW1lKCkpKTsKLQkJCXNldFJ1bGUoU2VydmVyLnRoaXMpOwotCQkJdGhpcy5mb3JjZSA9IGZvcmNlOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJcmV0dXJuIHN0b3BJbXBsKGZvcmNlLCBtb25pdG9yKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8UHVibGlzaE9wZXJhdGlvbj4gUFVCTElTSF9PUEVSQVRJT05fQ09NUEFSVE9SID0gbmV3IENvbXBhcmF0b3I8UHVibGlzaE9wZXJhdGlvbj4oKSB7Ci0gICAgICBwdWJsaWMgaW50IGNvbXBhcmUoUHVibGlzaE9wZXJhdGlvbiBsZWZ0T3AsIFB1Ymxpc2hPcGVyYXRpb24gcmlnaHRPcCkgewotICAgICAgICAgIFB1Ymxpc2hPcGVyYXRpb24gbGVmdCA9IGxlZnRPcDsKLSAgICAgICAgICBQdWJsaXNoT3BlcmF0aW9uIHJpZ2h0ID0gcmlnaHRPcDsKLSAgICAgICAgICBpZiAobGVmdC5nZXRPcmRlcigpID4gcmlnaHQuZ2V0T3JkZXIoKSkKLSAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgaWYgKGxlZnQuZ2V0T3JkZXIoKSA8IHJpZ2h0LmdldE9yZGVyKCkpCi0gICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLQl9OwotCi0JLy8gd29ya2luZyBjb3B5LCBsb2FkZWQgcmVzb3VyY2UKLQlwdWJsaWMgU2VydmVyKElGaWxlIGZpbGUpIHsKLQkJc3VwZXIoZmlsZSk7Ci0JCW1hcC5wdXQoUFJPUF9IT1NUTkFNRSwgImxvY2FsaG9zdCIpOwotCX0KLQotCS8vIGNyZWF0aW9uICh3b3JraW5nIGNvcHkpCi0JcHVibGljIFNlcnZlcihTdHJpbmcgaWQsIElGaWxlIGZpbGUsIElSdW50aW1lIHJ1bnRpbWUsIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUpIHsKLQkJc3VwZXIoZmlsZSwgaWQpOwotCQl0aGlzLnJ1bnRpbWUgPSBydW50aW1lOwotCQl0aGlzLnNlcnZlclR5cGUgPSBzZXJ2ZXJUeXBlOwotCQltYXAucHV0KCJzZXJ2ZXItdHlwZS1pZCIsIHNlcnZlclR5cGUuZ2V0SWQoKSk7Ci0JCW1hcC5wdXQoUFJPUF9IT1NUTkFNRSwgImxvY2FsaG9zdCIpOwotCQltYXAucHV0KFBST1BfU1RBUlRfVElNRU9VVCwgKChTZXJ2ZXJUeXBlKXNlcnZlclR5cGUpLmdldFN0YXJ0VGltZW91dCgpLzEwMDAgKyAiIik7Ci0JCW1hcC5wdXQoUFJPUF9TVE9QX1RJTUVPVVQsICgoU2VydmVyVHlwZSlzZXJ2ZXJUeXBlKS5nZXRTdG9wVGltZW91dCgpLzEwMDAgKyAiIik7Ci0JCWlmIChydW50aW1lICE9IG51bGwgJiYgcnVudGltZS5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwpIHsKLQkJCVN0cmluZyBuYW1lID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldE5hbWUoKTsKLQkJCW1hcC5wdXQoUFJPUF9OQU1FLCBuYW1lKTsKLQkJfQotCQlzZXJ2ZXJTdGF0ZSA9ICgoU2VydmVyVHlwZSlzZXJ2ZXJUeXBlKS5nZXRJbml0aWFsU3RhdGUoKTsKLQl9Ci0JCi0JcHVibGljIElTZXJ2ZXJUeXBlIGdldFNlcnZlclR5cGUoKSB7Ci0JCXJldHVybiBzZXJ2ZXJUeXBlOwotCX0KLQkKLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGNyZWF0ZVdvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gbmV3IFNlcnZlcldvcmtpbmdDb3B5KHRoaXMpOyAKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlRnJvbUZpbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmRlbGV0ZUZyb21GaWxlKCk7Ci0JCVJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZVNlcnZlcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVGcm9tTWV0YWRhdGEoKSB7Ci0JCVJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZVNlcnZlcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmRvU2F2ZShtb25pdG9yKTsKLQkJZmlyZVNlcnZlckNoYW5nZUV2ZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVRvRmlsZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2F2ZVRvRmlsZShtb25pdG9yKTsKLQkJUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkU2VydmVyKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVUb01ldGFkYXRhKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzdXBlci5zYXZlVG9NZXRhZGF0YShtb25pdG9yKTsKLQkJUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkU2VydmVyKHRoaXMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyQXR0cmlidXRlcyNnZXRSdW50aW1lKCkKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWUgZ2V0UnVudGltZSgpIHsKLQkJcmV0dXJuIHJ1bnRpbWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSdW50aW1lSWQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUlVOVElNRV9JRCwgKFN0cmluZykgbnVsbCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJBdHRyaWJ1dGVzI2dldFNlcnZlckNvbmZpZ3VyYXRpb24oKQotCSAqLwotCXB1YmxpYyBJRm9sZGVyIGdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBjb25maWd1cmF0aW9uOwotCX0KLQotCXByb3RlY3RlZCBTZXJ2ZXJEZWxlZ2F0ZSBnZXREZWxlZ2F0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwgfHwgc2VydmVyVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGRlbGVnYXRlOwotCQkKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQlkZWxlZ2F0ZSA9ICgoU2VydmVyVHlwZSkgc2VydmVyVHlwZSkuY3JlYXRlU2VydmVyRGVsZWdhdGUoKTsKLQkJCQkJaWYgKGRlbGVnYXRlICE9IG51bGwpCi0JCQkJCQlJbnRlcm5hbEluaXRpYWxpemVyLmluaXRpYWxpemVTZXJ2ZXJEZWxlZ2F0ZShkZWxlZ2F0ZSwgU2VydmVyLnRoaXMsIG1vbml0b3IpOwotCQkJCQlpZiAoVHJhY2UuUEVSRk9STUFOQ0UpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19QRVJGT1JNQU5DRSwgIlNlcnZlci5nZXREZWxlZ2F0ZSgpOiA8IgotCQkJCQkJCQkrIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpICsgIj4gIiArIGdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJCVNlcnZlclBsdWdpbi5sb2dFeHRlbnNpb25GYWlsdXJlKHRvU3RyaW5nKCksIHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi0JcHJvdGVjdGVkIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlIGdldEJlaGF2aW91ckRlbGVnYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoYmVoYXZpb3VyRGVsZWdhdGUgIT0gbnVsbCB8fCBzZXJ2ZXJUeXBlID09IG51bGwpCi0JCQlyZXR1cm4gYmVoYXZpb3VyRGVsZWdhdGU7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKG1vZHVsZVN0YXRlKSB7Ci0JCQlpZiAoYmVoYXZpb3VyRGVsZWdhdGUgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQliZWhhdmlvdXJEZWxlZ2F0ZSA9ICgoU2VydmVyVHlwZSkgc2VydmVyVHlwZSkuY3JlYXRlU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUoKTsKLQkJCQkJaWYgKGJlaGF2aW91ckRlbGVnYXRlICE9IG51bGwpCi0JCQkJCQlJbnRlcm5hbEluaXRpYWxpemVyLmluaXRpYWxpemVTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZShiZWhhdmlvdXJEZWxlZ2F0ZSwgU2VydmVyLnRoaXMsIG1vbml0b3IpOwotCQkJCQlpZiAoVHJhY2UuUEVSRk9STUFOQ0UpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19QRVJGT1JNQU5DRSwKLQkJCQkJCQkJIlNlcnZlci5nZXRCZWhhdmlvdXJEZWxlZ2F0ZSgpOiA8IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpICsgIj4gIgotCQkJCQkJCQkJCSsgZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotCQkJCQl9Ci0KLQkJCQkJLy8gcHVibGlzaCBvbmx5IGlmIHRoZSBzZXJ2ZXIgaXMgc3RhcnRlZCBidXQgcmVzcGVjdCBTZXJ2ZXIgPiBMYXVuY2hpbmcgPiBQUkVGX0FVVE9fUFVCTElTSAotCQkJCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQgJiYgU2VydmVyQ29yZS5pc0F1dG9QdWJsaXNoaW5nKCkpCi0JCQkJCQlhdXRvUHVibGlzaCgpOwotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJCVNlcnZlclBsdWdpbi5sb2dFeHRlbnNpb25GYWlsdXJlKHRvU3RyaW5nKCksIHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYmVoYXZpb3VyRGVsZWdhdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLmRpc3Bvc2UoKTsKLQkJCWRlbGVnYXRlID0gbnVsbDsKLQkJfQotCQlpZiAoYmVoYXZpb3VyRGVsZWdhdGUgIT0gbnVsbCkgewotCQkJYmVoYXZpb3VyRGVsZWdhdGUuZGlzcG9zZSgpOwotCQkJYmVoYXZpb3VyRGVsZWdhdGUgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIb3N0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfSE9TVE5BTUUsICJsb2NhbGhvc3QiKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEF1dG9QdWJsaXNoVGltZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX0FVVE9fUFVCTElTSF9USU1FLCAxNSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRBdXRvUHVibGlzaFNldHRpbmcoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9BVVRPX1BVQkxJU0hfU0VUVElORywgQVVUT19QVUJMSVNIX1JFU09VUkNFKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0VGltZW91dCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX1NUQVJUX1RJTUVPVVQsICgoU2VydmVyVHlwZSlnZXRTZXJ2ZXJUeXBlKCkpLmdldFN0YXJ0VGltZW91dCgpLzEwMDApOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RvcFRpbWVvdXQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9TVE9QX1RJTUVPVVQsICgoU2VydmVyVHlwZSlnZXRTZXJ2ZXJUeXBlKCkpLmdldFN0b3BUaW1lb3V0KCkvMTAwMCk7Ci0JfQotCi0JLyoqCi0gICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBpZCAoU3RyaW5nKSBvZiBwcmVmZXJyZWQgcHVibGlzaCBvcGVyYXRpb25zIHRoYXQgd2lsbCBub3QgYmUgcnVuCi0gICAgKiBkdXJpbmcgcHVibGlzaC4KLSAgICAqIAotICAgICogQHJldHVybiBhIGxpc3Qgb2YgcHVibGlzaCBvcGVyYXRpb24gaWRzCi0gICAgKi8KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldERpc2FibGVkUHJlZmVycmVkUHVibGlzaE9wZXJhdGlvbklkcygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX0RJU0FCTEVEX1BFUkZFUlJFRF9UQVNLUywgRU1QVFlfTElTVCk7CQkKLQl9Ci0KLQkvKioKLSAgICAqIFJldHVybnMgYSBsaXN0IG9mIGlkIChTdHJpbmcpIG9mIG9wdGlvbmFsIHB1Ymxpc2ggb3BlcmF0aW9ucyB0aGF0IGFyZSBlbmFibGVkIHRvIAotICAgICogYmUgcnVuIGR1cmluZyBwdWJsaXNoLgotICAgICogCi0gICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBwdWJsaXNoIG9wZXJhdGlvbiBpZHMKLSAgICAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RW5hYmxlZE9wdGlvbmFsUHVibGlzaE9wZXJhdGlvbklkcygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX0VOQUJMRURfT1BUSU9OQUxfVEFTS1MsIEVNUFRZX0xJU1QpOwotCX0KLQotCS8qKgotICAgICogUmV0dXJucyBhIGxpc3Qgb2YgaWQgKFN0cmluZykgb2YgcHVibGlzaGVycyBhbmQgc3RhdGUgKHRydWUgb3IgZmFsc2UpLgotICAgICogCi0gICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBwdWJsaXNoZXJzCi0gICAgKi8KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFB1Ymxpc2hlcklkcygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX1BVQkxJU0hFUlMsIEVNUFRZX0xJU1QpOwkJCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoZXJFbmFibGVkKFB1Ymxpc2hlciBwdWIpIHsKLQkJaWYgKHB1YiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJLy8gY2hlY2sgZm9yIGV4aXN0aW5nIGVuYWJsZW1lbnQKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBnZXRBdHRyaWJ1dGUoUFJPUF9QVUJMSVNIRVJTLCBFTVBUWV9MSVNUKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBpZCA9IGl0ZXIubmV4dCgpOwotCQkJaW50IGluZCA9IGlkLmluZGV4T2YoIjoiKTsKLQkJCWJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOwotCQkJaWYgKCJ0cnVlIi5lcXVhbHMoaWQuc3Vic3RyaW5nKGluZCsxKSkpCi0JCQkJZW5hYmxlZCA9IHRydWU7Ci0JCQlpZCA9IGlkLnN1YnN0cmluZygwLCBpbmQpOwotCQkJaWYgKHB1Yi5nZXRJZCgpLmVxdWFscyhpZCkpCi0JCQkJcmV0dXJuIGVuYWJsZWQ7Ci0JCX0KLQkJCi0JCS8vIG90aGVyd2lzZSB1c2UgdGhlIGRlZmF1bHQgZW5hYmxlbWVudAotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzZXJ2ZXIuIChzZWUgU0VSVkVSX1hYWCBjb25zdGFudHMpCi0JICoKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2VydmVyU3RhdGUoKSB7Ci0JCXJldHVybiBzZXJ2ZXJTdGF0ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1vZGUoKSB7Ci0JCXJldHVybiBtb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZlclN0YXRlKGludCBzdGF0ZSkgewotCQlpZiAoc3RhdGUgPT0gc2VydmVyU3RhdGUpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBlbnN1cmUgdGhhdCBhbnkgc2VydmVyIG1vbml0b3JzIGFyZSBzdGFydGVkCi0JCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpCi0JCQlTZXJ2ZXJNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCQkKLQkJdGhpcy5zZXJ2ZXJTdGF0ZSA9IHN0YXRlOwotCQlmaXJlU2VydmVyU3RhdGVDaGFuZ2VFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRvIHRoaXMgc2VydmVyLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIubW9kZWwuSVNlcnZlckxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VydmVyTGlzdGVuZXIoSVNlcnZlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIik7Ci0JCWlmIChUcmFjZS5MSVNURU5FUlMpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19MSVNURU5FUlMsICJBZGRpbmcgc2VydmVyIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgdG8gIiArIHRoaXMpOwotCQl9Ci0JCWdldFNlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIoKS5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdG8gdGhpcyBzZXJ2ZXIgd2l0aCB0aGUgZ2l2ZW4gZXZlbnQgbWFzay4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLm1vZGVsLklTZXJ2ZXJMaXN0ZW5lcgotCSAqIEBwYXJhbSBldmVudE1hc2sgdG8gbGltaXQgbGlzdGVuaW5nIHRvIGNlcnRhaW4gdHlwZXMgb2YgZXZlbnRzCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VydmVyTGlzdGVuZXIoSVNlcnZlckxpc3RlbmVyIGxpc3RlbmVyLCBpbnQgZXZlbnRNYXNrKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIik7Ci0JCWlmIChUcmFjZS5MSVNURU5FUlMpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19MSVNURU5FUlMsICJBZGRpbmcgc2VydmVyIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgdG8gIiArIHRoaXMKLQkJCQkJKyAiIHdpdGggZXZlbnRNYXNrICIgKyBldmVudE1hc2spOwotCQl9Ci0JCWdldFNlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIoKS5hZGRMaXN0ZW5lcihsaXN0ZW5lciwgZXZlbnRNYXNrKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciBmcm9tIHRoaXMgc2VydmVyLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIubW9kZWwuSVNlcnZlckxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VydmVyTGlzdGVuZXIoSVNlcnZlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIik7Ci0JCWlmIChUcmFjZS5MSVNURU5FUlMpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19MSVNURU5FUlMsICJSZW1vdmluZyBzZXJ2ZXIgbGlzdGVuZXIgIiArIGxpc3RlbmVyICsgIiBmcm9tICIgKyB0aGlzKTsKLQkJfQotCQlnZXRTZXJ2ZXJOb3RpZmljYXRpb25NYW5hZ2VyKCkucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEZpcmUgYSBzZXJ2ZXIgbGlzdGVuZXIgcmVzdGFydCBzdGF0ZSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVJlc3RhcnRTdGF0ZUNoYW5nZUV2ZW50KCkgewotCQlpZiAoVHJhY2UuTElTVEVORVJTKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfTElTVEVORVJTLCAiLT4tIEZpcmluZyBzZXJ2ZXIgcmVzdGFydCBjaGFuZ2UgZXZlbnQ6ICIgKyBnZXROYW1lKCkgKyAiIC0+LSIpOwotCQl9Ci0JCQotCQlpZiAobm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsIHx8IG5vdGlmaWNhdGlvbk1hbmFnZXIuaGFzTm9MaXN0ZW5lcnMoKSkKLQkJCXJldHVybjsKLQkJCi0JCW5vdGlmaWNhdGlvbk1hbmFnZXIuYnJvYWRjYXN0Q2hhbmdlKAotCQkJbmV3IFNlcnZlckV2ZW50KFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UgfCBTZXJ2ZXJFdmVudC5SRVNUQVJUX1NUQVRFX0NIQU5HRSwgdGhpcywgZ2V0U2VydmVyU3RhdGUoKSwgCi0JCQkJZ2V0U2VydmVyUHVibGlzaFN0YXRlKCksIGdldFNlcnZlclJlc3RhcnRTdGF0ZSgpKSk7Ci0JfQotCQotCS8qKgotCSAqIEZpcmUgYSBzZXJ2ZXIgbGlzdGVuZXIgc2VydmVyIHN0YXR1cyBjaGFuZ2UgZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlU2VydmVyU3RhdHVzQ2hhbmdlRXZlbnQoKSB7Ci0JCWlmIChUcmFjZS5MSVNURU5FUlMpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19MSVNURU5FUlMsICItPi0gRmlyaW5nIHNlcnZlciBzdGF0dXMgY2hhbmdlIGV2ZW50OiAiICsgZ2V0TmFtZSgpICsgIiwgIgotCQkJCQkrIGdldFNlcnZlclN0YXR1cygpICsgIiAtPi0iKTsKLQkJfQotCQkKLQkJaWYgKG5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCB8fCBub3RpZmljYXRpb25NYW5hZ2VyLmhhc05vTGlzdGVuZXJzKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlub3RpZmljYXRpb25NYW5hZ2VyLmJyb2FkY2FzdENoYW5nZSgKLQkJCW5ldyBTZXJ2ZXJFdmVudChTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFIHwgU2VydmVyRXZlbnQuU1RBVFVTX0NIQU5HRSwgdGhpcywgZ2V0U2VydmVyU3RhdGUoKSwgCi0JCQkJZ2V0U2VydmVyUHVibGlzaFN0YXRlKCksIGdldFNlcnZlclJlc3RhcnRTdGF0ZSgpLCBnZXRTZXJ2ZXJTdGF0dXMoKSkpOwotCX0KLQotCS8qKgotCSAqIEZpcmUgYSBzZXJ2ZXIgbGlzdGVuZXIgc3RhdGUgY2hhbmdlIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVTZXJ2ZXJTdGF0ZUNoYW5nZUV2ZW50KCkgewotCQlpZiAoVHJhY2UuTElTVEVORVJTKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfTElTVEVORVJTLCAiLT4tIEZpcmluZyBzZXJ2ZXIgc3RhdGUgY2hhbmdlIGV2ZW50OiAiICsgZ2V0TmFtZSgpICsgIiwgIgotCQkJCQkrIGdldFNlcnZlclN0YXRlKCkgKyAiIC0+LSIpOwotCQl9Ci0JCQotCQlpZiAobm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsIHx8IG5vdGlmaWNhdGlvbk1hbmFnZXIuaGFzTm9MaXN0ZW5lcnMoKSkKLQkJCXJldHVybjsKLQkJCi0JCW5vdGlmaWNhdGlvbk1hbmFnZXIuYnJvYWRjYXN0Q2hhbmdlKAotCQkJbmV3IFNlcnZlckV2ZW50KFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UgfCBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UsIHRoaXMsIGdldFNlcnZlclN0YXRlKCksIAotCQkJCWdldFNlcnZlclB1Ymxpc2hTdGF0ZSgpLCBnZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoKSkpOwotCX0KLQotCS8qKgotCSAqIEZpcmUgYSBzZXJ2ZXIgbGlzdGVuZXIgY2hhbmdlIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVTZXJ2ZXJDaGFuZ2VFdmVudCgpIHsKLQkJaWYgKFRyYWNlLkxJU1RFTkVSUykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0xJU1RFTkVSUywgIi0+LSBGaXJpbmcgc2VydmVyIGNoYW5nZSBldmVudDogIiArIGdldE5hbWUoKSArICIsICIKLQkJCQkJKyBnZXRTZXJ2ZXJTdGF0ZSgpICsgIiAtPi0iKTsKLQkJfQotCQkKLQkJaWYgKG5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCB8fCBub3RpZmljYXRpb25NYW5hZ2VyLmhhc05vTGlzdGVuZXJzKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlub3RpZmljYXRpb25NYW5hZ2VyLmJyb2FkY2FzdENoYW5nZSgKLQkJCW5ldyBTZXJ2ZXJFdmVudChTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFLCB0aGlzLCBnZXRTZXJ2ZXJTdGF0ZSgpLCAKLQkJCQlnZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKSwgZ2V0U2VydmVyUmVzdGFydFN0YXRlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlIGEgc2VydmVyIGxpc3RlbmVyIG1vZHVsZSBzdGF0ZSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZU1vZHVsZVN0YXRlQ2hhbmdlRXZlbnQoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAoVHJhY2UuTElTVEVORVJTKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfTElTVEVORVJTLCAiLT4tIEZpcmluZyBtb2R1bGUgc3RhdGUgY2hhbmdlIGV2ZW50OiAiICsgZ2V0TmFtZSgpICsgIiwgIgotCQkJCQkrIGdldFNlcnZlclN0YXRlKCkgKyAiIC0+LSIpOwotCQl9Ci0JCQotCQlpZiAobm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsIHx8IG5vdGlmaWNhdGlvbk1hbmFnZXIuaGFzTm9MaXN0ZW5lcnMoKSkKLQkJCXJldHVybjsKLQkJCi0JCW5vdGlmaWNhdGlvbk1hbmFnZXIuYnJvYWRjYXN0Q2hhbmdlKAotCQkJbmV3IFNlcnZlckV2ZW50KFNlcnZlckV2ZW50Lk1PRFVMRV9DSEFOR0UgfCBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UsIHRoaXMsIG1vZHVsZSwgZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSwgCi0JCQkJZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSksIGdldE1vZHVsZVJlc3RhcnRTdGF0ZShtb2R1bGUpKSk7Ci0JfQotCQotCi0JLyoqCi0JICogRmlyZSBhIHNlcnZlciBsaXN0ZW5lciBtb2R1bGUgc3RhdHVzIGNoYW5nZSBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTW9kdWxlU3RhdHVzQ2hhbmdlRXZlbnQoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAoVHJhY2UuTElTVEVORVJTKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfTElTVEVORVJTLCAiLT4tIEZpcmluZyBtb2R1bGUgc3RhdHVzIGNoYW5nZSBldmVudDogIiArIGdldE5hbWUoKSArICIsICIKLQkJCQkJKyBnZXRNb2R1bGVTdGF0dXMobW9kdWxlKSArICIgLT4tIik7Ci0JCX0KLQkJCi0JCWlmIChub3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwgfHwgbm90aWZpY2F0aW9uTWFuYWdlci5oYXNOb0xpc3RlbmVycygpKQotCQkJcmV0dXJuOwotCQkKLQkJbm90aWZpY2F0aW9uTWFuYWdlci5icm9hZGNhc3RDaGFuZ2UoCi0JCQluZXcgU2VydmVyRXZlbnQoU2VydmVyRXZlbnQuTU9EVUxFX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRVU19DSEFOR0UsIHRoaXMsIG1vZHVsZSwgZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSwgCi0JCQkJZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSksIGdldE1vZHVsZVJlc3RhcnRTdGF0ZShtb2R1bGUpLCBnZXRNb2R1bGVTdGF0dXMobW9kdWxlKSkpOwotCX0KLQotCS8qKgotCSAqIEZpcmUgYSBzZXJ2ZXIgbGlzdGVuZXIgbW9kdWxlIHB1Ymxpc2ggc3RhdGUgY2hhbmdlIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2R1bGVQdWJsaXNoU3RhdGVDaGFuZ2VFdmVudChJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChUcmFjZS5MSVNURU5FUlMpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19MSVNURU5FUlMsICItPi0gRmlyaW5nIG1vZHVsZSBwdWJsaXNoIHN0YXRlIGNoYW5nZSBldmVudDogIiArIGdldE5hbWUoKSArICIsICIKLQkJCQkJKyBnZXRTZXJ2ZXJTdGF0ZSgpICsgIiAtPi0iKTsKLQkJfQotCQkKLQkJaWYgKG5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCB8fCBub3RpZmljYXRpb25NYW5hZ2VyLmhhc05vTGlzdGVuZXJzKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlub3RpZmljYXRpb25NYW5hZ2VyLmJyb2FkY2FzdENoYW5nZSgKLQkJCW5ldyBTZXJ2ZXJFdmVudChTZXJ2ZXJFdmVudC5NT0RVTEVfQ0hBTkdFIHwgU2VydmVyRXZlbnQuUFVCTElTSF9TVEFURV9DSEFOR0UsIHRoaXMsIG1vZHVsZSwgZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSwgCi0JCQkJZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSksIGdldE1vZHVsZVJlc3RhcnRTdGF0ZShtb2R1bGUpKSk7Ci0JfQotCi0JLyoqCi0JICogRmlyZSBhIHNlcnZlciBsaXN0ZW5lciBtb2R1bGUgc3RhdGUgY2hhbmdlIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2R1bGVSZXN0YXJ0Q2hhbmdlRXZlbnQoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAoVHJhY2UuTElTVEVORVJTKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfTElTVEVORVJTLCAiLT4tIEZpcmluZyBtb2R1bGUgcmVzdGFydCBjaGFuZ2UgZXZlbnQ6ICIgKyBnZXROYW1lKCkgKyAiLCAiCi0JCQkJCSsgZ2V0U2VydmVyU3RhdGUoKSArICIgLT4tIik7Ci0JCX0KLQkJCi0JCWlmIChub3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwgfHwgbm90aWZpY2F0aW9uTWFuYWdlci5oYXNOb0xpc3RlbmVycygpKQotCQkJcmV0dXJuOwotCQkKLQkJbm90aWZpY2F0aW9uTWFuYWdlci5icm9hZGNhc3RDaGFuZ2UoCi0JCQluZXcgU2VydmVyRXZlbnQoU2VydmVyRXZlbnQuTU9EVUxFX0NIQU5HRSB8IFNlcnZlckV2ZW50LlJFU1RBUlRfU1RBVEVfQ0hBTkdFLCB0aGlzLCBtb2R1bGUsIGdldE1vZHVsZVN0YXRlKG1vZHVsZSksIAotCQkJCWdldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUpLCBnZXRNb2R1bGVSZXN0YXJ0U3RhdGUobW9kdWxlKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZGUoU3RyaW5nIG0pIHsKLQkJaWYgKG0gPT0gbW9kZSkKLQkJCXJldHVybjsKLQotCQl0aGlzLm1vZGUgPSBtOwotCQlmaXJlU2VydmVyU3RhdGVDaGFuZ2VFdmVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZHVsZVN0YXRlKElNb2R1bGVbXSBtb2R1bGUsIGludCBzdGF0ZSkgewotCQlpZiAobW9kdWxlID09IG51bGwgfHwgbW9kdWxlLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0JCWludCBvbGRTdGF0ZSA9IGdldE1vZHVsZVN0YXRlKG1vZHVsZSk7Ci0JCWlmIChvbGRTdGF0ZSA9PSBzdGF0ZSkKLQkJCXJldHVybjsKLQkJCi0JCUludGVnZXIgaW4gPSBuZXcgSW50ZWdlcihzdGF0ZSk7Ci0JCW1vZHVsZVN0YXRlLnB1dChnZXRLZXkobW9kdWxlKSwgaW4pOwotCQlmaXJlTW9kdWxlU3RhdGVDaGFuZ2VFdmVudChtb2R1bGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZHVsZVB1Ymxpc2hTdGF0ZShJTW9kdWxlW10gbW9kdWxlLCBpbnQgc3RhdGUpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5sZW5ndGggPT0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSIpOwotCQlpbnQgb2xkU3RhdGUgPSBnZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlKTsKLQkJaWYgKG9sZFN0YXRlID09IHN0YXRlKQotCQkJcmV0dXJuOwotCQkKLQkJSW50ZWdlciBpbiA9IG5ldyBJbnRlZ2VyKHN0YXRlKTsKLQkJaWYgKHN0YXRlID09IC0xKQotCQkJbW9kdWxlUHVibGlzaFN0YXRlLnJlbW92ZShnZXRLZXkobW9kdWxlKSk7Ci0JCW1vZHVsZVB1Ymxpc2hTdGF0ZS5wdXQoZ2V0S2V5KG1vZHVsZSksIGluKTsKLQkJZmlyZU1vZHVsZVB1Ymxpc2hTdGF0ZUNoYW5nZUV2ZW50KG1vZHVsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlUmVzdGFydFN0YXRlKElNb2R1bGVbXSBtb2R1bGUsIGJvb2xlYW4gcikgewotCQlpZiAobW9kdWxlID09IG51bGwgfHwgbW9kdWxlLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0JCWJvb2xlYW4gb2xkU3RhdGUgPSBnZXRNb2R1bGVSZXN0YXJ0U3RhdGUobW9kdWxlKTsKLQkJaWYgKG9sZFN0YXRlID09IHIpCi0JCQlyZXR1cm47Ci0JCQotCQlCb29sZWFuIGIgPSBuZXcgQm9vbGVhbihyKTsKLQkJbW9kdWxlUmVzdGFydFN0YXRlLnB1dChnZXRLZXkobW9kdWxlKSwgYik7Ci0JCWZpcmVNb2R1bGVSZXN0YXJ0Q2hhbmdlRXZlbnQobW9kdWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbE1vZHVsZXMoSU1vZHVsZVtdIG1vZHVsZXMpIHsKLQkJZXh0ZXJuYWxNb2R1bGVzID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IG1vZHVsZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJZXh0ZXJuYWxNb2R1bGVzLmFkZChtb2R1bGVzW2ldKTsKLQkJfQotCX0KLQotCXB1YmxpYyBMaXN0PElNb2R1bGU+IGdldEV4dGVybmFsTW9kdWxlcygpIHsKLQkJcmV0dXJuIGV4dGVybmFsTW9kdWxlczsKLSAJfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTW9kdWxlUHJvamVjdENoYW5nZShJTW9kdWxlIG1vZHVsZSkgewotCQloYW5kbGVNb2R1bGVQcm9qZWN0Q2hhbmdlKG1vZHVsZSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTW9kdWxlUHJvamVjdENoYW5nZShJTW9kdWxlIG1vZHVsZSwgSVJlc291cmNlQ2hhbmdlRXZlbnQgYnVpbGRFdmVudCkgewotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiPiBoYW5kbGVEZXBsb3lhYmxlUHJvamVjdENoYW5nZSgpICIgKyB0aGlzICsgIiAiICsgbW9kdWxlKTsKLQkJfQotCQkKLQkJaWYgKCFpc01vZHVsZURlcGxveWVkKG1vZHVsZSkpewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBjaGVjayBmb3IgZHVwbGljYXRlIGpvYnMgYWxyZWFkeSB3YWl0aW5nIGFuZCBkb24ndCBjcmVhdGUgYSBuZXcgb25lCi0JCUpvYltdIGpvYnMgPSBKb2IuZ2V0Sm9iTWFuYWdlcigpLmZpbmQoU2VydmVyVXRpbC5TRVJWRVJfSk9CX0ZBTUlMWSk7Ci0JCWlmIChqb2JzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gam9icy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChqb2JzW2ldIGluc3RhbmNlb2YgUmVzb3VyY2VDaGFuZ2VKb2IpIHsKLQkJCQkJUmVzb3VyY2VDaGFuZ2VKb2IgcmNqID0gKFJlc291cmNlQ2hhbmdlSm9iKSBqb2JzW2ldOwotCQkJCQlpZiAocmNqLmdldFNlcnZlcigpLmVxdWFscyh0aGlzKSAmJiByY2ouZ2V0TW9kdWxlKCkuZXF1YWxzKG1vZHVsZSkgJiYgcmNqLmdldFN0YXRlKCkgPT0gSm9iLldBSVRJTkcpCi0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlSZXNvdXJjZUNoYW5nZUpvYiBqb2IgPSBuZXcgUmVzb3VyY2VDaGFuZ2VKb2IobW9kdWxlLCBidWlsZEV2ZW50KTsKLQkJam9iLnNldFN5c3RlbSh0cnVlKTsKLQkJam9iLnNldFByaW9yaXR5KEpvYi5CVUlMRCk7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCQkKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIjwgaGFuZGxlRGVwbG95YWJsZVByb2plY3RDaGFuZ2UoKSIpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzTW9kdWxlRGVwbG95ZWQoZmluYWwgSU1vZHVsZSByZXF1ZXN0ZWRNb2R1bGUpewotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiPiBpc01vZHVsZURlcGxveWVkKCkiKTsKLQkJfQotCi0JCS8vIG5vIG1vZHVsZXMgYXJlIGRlcGxveWVkCi0JCWlmIChnZXRNb2R1bGVzKCkubGVuZ3RoIDwgMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWJvb2xlYW4gZGVwbG95ZWQgPSBmYWxzZTsKLQkJCi0JCXN5bmNocm9uaXplZCAobW9kdWxlc0xvY2spewotCQkJLy8gc2hhbGxvdyBzZWFyY2g6IGNoZWNrIGZvciByb290IG1vZHVsZXMgZmlyc3QKLQkJCWlmIChtb2R1bGVzICE9IG51bGwpewotCQkJCWRlcGxveWVkID0gbW9kdWxlcy5jb250YWlucyhyZXF1ZXN0ZWRNb2R1bGUpOwotCQkJCi0JCQkJaWYoIWRlcGxveWVkKXsKLQkJCQkJLy8gZGVlcCBzZWFyY2g6IGxvb2sgaW50byBhbGwgdGhlIGNoaWxkIG1vZHVsZXMKLQkJCQkJSXRlcmF0b3I8SU1vZHVsZT4gaXRyID0gbW9kdWxlcy5pdGVyYXRvcigpOwotCQkJCQl3aGlsZShpdHIuaGFzTmV4dCgpICYmICFkZXBsb3llZCl7Ci0JCQkJCQlJTW9kdWxlW10gbSA9IG5ldyBJTW9kdWxlW10ge2l0ci5uZXh0KCl9OwotCQkJCQkJZGVwbG95ZWQgPSAhdmlzaXRNb2R1bGUobSwgbmV3IElNb2R1bGVWaXNpdG9yKCl7Ci0JCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSU1vZHVsZVtdIG1vZHVsZXMyKSB7Ci0JCQkJCQkJCWZvciAoaW50IGkgPTA7aTw9bW9kdWxlczIubGVuZ3RoLTE7aSsrKXsKLQkJCQkJCQkJCWlmIChtb2R1bGVzMltpXS5lcXVhbHMocmVxdWVzdGVkTW9kdWxlKSkKLQkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9fSwgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICI8IGlzTW9kdWxlRGVwbG95ZWQoKSBkZXBsb3llZD0iICsgZGVwbG95ZWQpOwotCQl9Ci0JCXJldHVybiBkZXBsb3llZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9wQXV0b1B1Ymxpc2goKSB7Ci0JCWlmIChhdXRvUHVibGlzaFRocmVhZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJYXV0b1B1Ymxpc2hUaHJlYWQuc3RvcCA9IHRydWU7Ci0JCWF1dG9QdWJsaXNoVGhyZWFkLmludGVycnVwdCgpOwotCQlhdXRvUHVibGlzaFRocmVhZCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVzZXQgYXV0b21hdGljIHB1Ymxpc2ggdGhyZWFkIGlmIGl0IGlzIHJ1bm5pbmcgYW5kIHN0YXJ0IGEgbmV3Ci0JICogdGhyZWFkIGlmIGF1dG9tYXRpYyBwdWJsaXNoaW5nIGlzIGN1cnJlbnRseSBlbmFibGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGF1dG9QdWJsaXNoKCkgewotCQlhdXRvUHVibGlzaChudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYXV0b1B1Ymxpc2goSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJc3RvcEF1dG9QdWJsaXNoKCk7Ci0JCWJvb2xlYW4gYnVpbGRPY2N1cnJlZCA9IGV2ZW50ICE9IG51bGwgJiYgZGlkQnVpbGRPY2N1cihldmVudCk7Ci0JCWJvb2xlYW4gcHJvamVjdENsb3NlZE9yRGVsZXRlZCA9IGV2ZW50ICE9IG51bGwgJiYgaXNQcm9qZWN0Q2xvc2VPckRlbGV0ZUV2ZW50KGV2ZW50KTsKLQkJCi0JCWlmIChnZXRBdXRvUHVibGlzaFNldHRpbmcoKSA9PSBBVVRPX1BVQkxJU0hfRElTQUJMRSkKLQkJCXJldHVybjsKLQkJCi0JCWlmKCAoZ2V0QXV0b1B1Ymxpc2hTZXR0aW5nKCkgPT0gQVVUT19QVUJMSVNIX0JVSUxEKSAmJiAKLQkJCQkhYnVpbGRPY2N1cnJlZCAmJiAhcHJvamVjdENsb3NlZE9yRGVsZXRlZCkKLQkJCXJldHVybjsKLQkJCi0JCWludCB0aW1lID0gZ2V0QXV0b1B1Ymxpc2hUaW1lKCk7Ci0JCWlmICh0aW1lID49IDApIHsKLQkJCWF1dG9QdWJsaXNoVGhyZWFkID0gbmV3IEF1dG9QdWJsaXNoVGhyZWFkKCk7Ci0JCQlhdXRvUHVibGlzaFRocmVhZC50aW1lID0gdGltZTsKLQkJCWF1dG9QdWJsaXNoVGhyZWFkLnNldFByaW9yaXR5KFRocmVhZC5NSU5fUFJJT1JJVFkgKyAxKTsKLQkJCWF1dG9QdWJsaXNoVGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJCWF1dG9QdWJsaXNoVGhyZWFkLnN0YXJ0KCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzUHJvamVjdENsb3NlT3JEZWxldGVFdmVudChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlpbnQga2luZCA9IGV2ZW50LmdldFR5cGUoKTsKLQkJaWYoIChraW5kICYgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFKSA+IDAgfHwgCi0JCQkJKGtpbmQgJiBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFKSA+IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZGlkQnVpbGRPY2N1cihJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlpbnQga2luZCA9IGV2ZW50LmdldEJ1aWxkS2luZCgpOwotCQlmaW5hbCBib29sZWFuIGV2ZW50T2NjdXJyZWQgPSAKLQkJCSAgIChraW5kID09IEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQpIHx8IAotCQkJICAgKGtpbmQgPT0gSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxEKSB8fCAKLQkJCSAgICgoa2luZCA9PSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkFVVE9fQlVJTEQgJiYgCi0JCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5pc0F1dG9CdWlsZGluZygpKSk7Ci0JCXJldHVybiBldmVudE9jY3VycmVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IG5vdGlmaWNhdGlvbiBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5vdGlmaWNhdGlvbiBtYW5hZ2VyCi0JICovCi0JcHJpdmF0ZSBTZXJ2ZXJOb3RpZmljYXRpb25NYW5hZ2VyIGdldFNlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIoKSB7Ci0JCWlmIChub3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwpCi0JCQlub3RpZmljYXRpb25NYW5hZ2VyID0gbmV3IFNlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIoKTsKLQkJCi0JCXJldHVybiBub3RpZmljYXRpb25NYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlcidzIHB1Ymxpc2ggc3luYyBzdGF0ZS4KLQkgKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKSB7Ci0JCXJldHVybiBzZXJ2ZXJTeW5jU3RhdGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VydmVyJ3MgcHVibGlzaCBzeW5jIHN0YXRlLgotCSAqCi0JICogQHBhcmFtIHN0YXRlIGludAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlclB1Ymxpc2hTdGF0ZShpbnQgc3RhdGUpIHsKLQkJaWYgKHN0YXRlID09IHNlcnZlclN5bmNTdGF0ZSkKLQkJCXJldHVybjsKLQkJc2VydmVyU3luY1N0YXRlID0gc3RhdGU7Ci0JCWZpcmVQdWJsaXNoU3RhdGVDaGFuZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgcHVibGlzaCBsaXN0ZW5lciB0byB0aGlzIHNlcnZlci4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIHB1Ymxpc2ggbGlzdGVuZXIKLQkgKiBAc2VlICNyZW1vdmVQdWJsaXNoTGlzdGVuZXIoSVB1Ymxpc2hMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQdWJsaXNoTGlzdGVuZXIoSVB1Ymxpc2hMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyIGNhbm5vdCBiZSBudWxsIik7Ci0JCWlmIChUcmFjZS5MSVNURU5FUlMpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19MSVNURU5FUlMsICJBZGRpbmcgcHVibGlzaCBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHRvICIgKyB0aGlzKTsKLQkJfQotCQkKLQkJaWYgKHB1Ymxpc2hMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXB1Ymxpc2hMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElQdWJsaXNoTGlzdGVuZXI+KCk7Ci0JCXB1Ymxpc2hMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgcHVibGlzaCBsaXN0ZW5lciBmcm9tIHRoaXMgc2VydmVyLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBwdWJsaXNoIGxpc3RlbmVyCi0JICogQHNlZSAjYWRkUHVibGlzaExpc3RlbmVyKElQdWJsaXNoTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHVibGlzaExpc3RlbmVyKElQdWJsaXNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMaXN0ZW5lciBjYW5ub3QgYmUgbnVsbCIpOwotCQlpZiAoVHJhY2UuTElTVEVORVJTKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfTElTVEVORVJTLCAiUmVtb3ZpbmcgcHVibGlzaCBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIGZyb20gIiArIHRoaXMpOwotCQl9Ci0KLQkJaWYgKHB1Ymxpc2hMaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCXB1Ymxpc2hMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogRmlyZSBhIHB1Ymxpc2ggc3RhcnQgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVB1Ymxpc2hTdGFydGVkKCkgewotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiLT4tIEZpcmluZyBwdWJsaXNoIHN0YXJ0ZWQgZXZlbnQgLT4tIik7Ci0JCX0KLQkKLQkJaWYgKHB1Ymxpc2hMaXN0ZW5lcnMgPT0gbnVsbCB8fCBwdWJsaXNoTGlzdGVuZXJzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQotCQlpbnQgc2l6ZSA9IHB1Ymxpc2hMaXN0ZW5lcnMuc2l6ZSgpOwotCQlJUHVibGlzaExpc3RlbmVyW10gc3JsID0gbmV3IElQdWJsaXNoTGlzdGVuZXJbc2l6ZV07Ci0JCXB1Ymxpc2hMaXN0ZW5lcnMudG9BcnJheShzcmwpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIiAgRmlyaW5nIHB1Ymxpc2ggc3RhcnRlZCBldmVudCB0byAiICsgc3JsW2ldKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJc3JsW2ldLnB1Ymxpc2hTdGFydGVkKHRoaXMpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICIgIEVycm9yIGZpcmluZyBwdWJsaXNoIHN0YXJ0ZWQgZXZlbnQgdG8gIiArIHNybFtpXSwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIi08LSBEb25lIGZpcmluZyBwdWJsaXNoIHN0YXJ0ZWQgZXZlbnQgLTwtIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaXJlIGEgcHVibGlzaCBzdG9wIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHN0YXR1cyBwdWJsaXNoaW5nIHN0YXR1cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQdWJsaXNoRmluaXNoZWQoSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIi0+LSBGaXJpbmcgcHVibGlzaGluZyBmaW5pc2hlZCBldmVudDogIiArIHN0YXR1cyArICIgLT4tIik7Ci0JCX0KLQkKLQkJaWYgKHB1Ymxpc2hMaXN0ZW5lcnMgPT0gbnVsbCB8fCBwdWJsaXNoTGlzdGVuZXJzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQotCQlpbnQgc2l6ZSA9IHB1Ymxpc2hMaXN0ZW5lcnMuc2l6ZSgpOwotCQlJUHVibGlzaExpc3RlbmVyW10gc3JsID0gbmV3IElQdWJsaXNoTGlzdGVuZXJbc2l6ZV07Ci0JCXB1Ymxpc2hMaXN0ZW5lcnMudG9BcnJheShzcmwpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIiAgRmlyaW5nIHB1Ymxpc2hpbmcgZmluaXNoZWQgZXZlbnQgdG8gIiArIHNybFtpXSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCXNybFtpXS5wdWJsaXNoRmluaXNoZWQodGhpcywgc3RhdHVzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiICBFcnJvciBmaXJpbmcgcHVibGlzaGluZyBmaW5pc2hlZCBldmVudCB0byAiICsgc3JsW2ldLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiLTwtIERvbmUgZmlyaW5nIHB1Ymxpc2hpbmcgZmluaXNoZWQgZXZlbnQgLTwtIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaXJlIGEgcHVibGlzaCBzdGF0ZSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVB1Ymxpc2hTdGF0ZUNoYW5nZSgpIHsKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIi0+LSBGaXJpbmcgcHVibGlzaCBzdGF0ZSBjaGFuZ2UgZXZlbnQgLT4tIik7Ci0JCX0KLQkJCi0JCWlmIChub3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwgfHwgbm90aWZpY2F0aW9uTWFuYWdlci5oYXNOb0xpc3RlbmVycygpKQotCQkJcmV0dXJuOwotCQkKLQkJbm90aWZpY2F0aW9uTWFuYWdlci5icm9hZGNhc3RDaGFuZ2UoCi0JCQluZXcgU2VydmVyRXZlbnQoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlBVQkxJU0hfU1RBVEVfQ0hBTkdFLCB0aGlzLCBnZXRTZXJ2ZXJTdGF0ZSgpLCAKLQkJCQkJZ2V0U2VydmVyUHVibGlzaFN0YXRlKCksIGdldFNlcnZlclJlc3RhcnRTdGF0ZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogRmlyZSBhIHB1Ymxpc2ggc3RhdGUgY2hhbmdlIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQdWJsaXNoU3RhdGVDaGFuZ2UoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiLT4tIEZpcmluZyBwdWJsaXNoIHN0YXRlIGNoYW5nZSBldmVudDogIiArIG1vZHVsZSArICIgLT4tIik7Ci0JCX0KLQkKLQkJaWYgKG5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCB8fCBub3RpZmljYXRpb25NYW5hZ2VyLmhhc05vTGlzdGVuZXJzKCkpCi0JCQlyZXR1cm47Ci0JCi0JCW5vdGlmaWNhdGlvbk1hbmFnZXIuYnJvYWRjYXN0Q2hhbmdlKAotCQkJbmV3IFNlcnZlckV2ZW50KFNlcnZlckV2ZW50Lk1PRFVMRV9DSEFOR0UgfCBTZXJ2ZXJFdmVudC5QVUJMSVNIX1NUQVRFX0NIQU5HRSwgdGhpcywgbW9kdWxlLCBnZXRNb2R1bGVTdGF0ZShtb2R1bGUpLCAKLQkJCQlnZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlKSwgZ2V0TW9kdWxlUmVzdGFydFN0YXRlKG1vZHVsZSkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciBpcyBpbiBhIHN0YXRlIHRoYXQgaXQgY2FuCi0JICogYmUgcHVibGlzaGVkIHRvLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuUHVibGlzaCgpIHsKLQkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JNaXNzaW5nQWRhcHRlciwgbnVsbCk7Ci0JCQotCQkvLyBjYW4ndCBwdWJsaXNoIGlmIHRoZSBzZXJ2ZXIgaXMgc3RhcnRpbmcgb3Igc3RvcHBpbmcKLQkJaW50IHN0YXRlID0gZ2V0U2VydmVyU3RhdGUoKTsKLQkJaWYgKHN0YXRlID09IFNUQVRFX1NUQVJUSU5HIHx8IHN0YXRlID09IFNUQVRFX1NUT1BQSU5HKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoU3RhcnRpbmcsIG51bGwpOwotCQkKLQkJLy8gY2FuJ3QgcHVibGlzaCBpZiB0aGVyZSBpcyBubyBjb25maWd1cmF0aW9uCi0JCWlmIChnZXRTZXJ2ZXJUeXBlKCkuaGFzU2VydmVyQ29uZmlndXJhdGlvbigpICYmIGNvbmZpZ3VyYXRpb24gPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUHVibGlzaE5vQ29uZmlndXJhdGlvbiwgbnVsbCk7Ci0JCQotCQlpZiAoZ2V0QmVoYXZpb3VyRGVsZWdhdGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRCZWhhdmlvdXJEZWxlZ2F0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKS5jYW5QdWJsaXNoKCk7Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciBzaG91bGQgYmUgcHVibGlzaGVkIHRvLiBUaGlzIGlzIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gdGhlIHNlcnZlcgotCSAqIGNhbiBiZSBwdWJsaXNoZWQgdG8gYW5kIHRoZSBzZXJ2ZXIncyBwdWJsaXNoIHN0YXRlIG9yIGFueSBtb2R1bGUncyBwdWJsaXNoIHN0YXRlIGlzIG5vdAotCSAqIFBVQkxJU0hfU1RBVEVfTk9ORS4gCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkUHVibGlzaCgpIHsKLQkJaWYgKCFjYW5QdWJsaXNoKCkuaXNPSygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKGdldFNlcnZlclB1Ymxpc2hTdGF0ZSgpICE9IFBVQkxJU0hfU1RBVEVfTk9ORSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJZmluYWwgYm9vbGVhbltdIHB1Ymxpc2ggPSBuZXcgYm9vbGVhblsxXTsKLQkJCi0JCXZpc2l0KG5ldyBJTW9kdWxlVmlzaXRvcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJCQlpZiAoZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSkgIT0gUFVCTElTSF9TVEFURV9OT05FKSB7Ci0JCQkJCXB1Ymxpc2hbMF0gPSB0cnVlOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9LCBudWxsKTsKLQkJCi0JCXJldHVybiBwdWJsaXNoWzBdOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaFVua25vd24oKSB7Ci0JCWlmIChnZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKSAhPSBQVUJMSVNIX1NUQVRFX1VOS05PV04pCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlmaW5hbCBib29sZWFuW10gcHVibGlzaCA9IG5ldyBib29sZWFuWzFdOwotCQlwdWJsaXNoWzBdID0gdHJ1ZTsKLQkJCi0JCXZpc2l0KG5ldyBJTW9kdWxlVmlzaXRvcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJCQlpZiAoZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSkgIT0gUFVCTElTSF9TVEFURV9VTktOT1dOKSB7Ci0JCQkJCXB1Ymxpc2hbMF0gPSBmYWxzZTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gcHVibGlzaFswXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciBzaG91bGQgYmUgcmVzdGFydGVkLiBUaGlzIGlzIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gdGhlIHNlcnZlcgotCSAqIGNhbiBiZSByZXN0YXJ0ZWQgYW5kIHRoZSBzZXJ2ZXIncyByZXN0YXJ0IHN0YXRlIG9yIGFueSBtb2R1bGUncyByZXN0YXJ0IHN0YXRlcyBpcyBub3QKLQkgKiBmYWxzZS4gCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkUmVzdGFydCgpIHsKLQkJaWYgKCFjYW5QdWJsaXNoKCkuaXNPSygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKGdldFNlcnZlclJlc3RhcnRTdGF0ZSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlmaW5hbCBib29sZWFuW10gcHVibGlzaCA9IG5ldyBib29sZWFuWzFdOwotCQkKLQkJdmlzaXQobmV3IElNb2R1bGVWaXNpdG9yKCkgewotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSU1vZHVsZVtdIG1vZHVsZSkgewotCQkJCWlmIChnZXRNb2R1bGVSZXN0YXJ0U3RhdGUobW9kdWxlKSkgewotCQkJCQlwdWJsaXNoWzBdID0gdHJ1ZTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gcHVibGlzaFswXTsKLQl9Ci0KLQlwdWJsaWMgU2VydmVyUHVibGlzaEluZm8gZ2V0U2VydmVyUHVibGlzaEluZm8oKSB7Ci0JCWlmIChwdWJsaXNoSW5mbyA9PSBudWxsKSB7Ci0JCQlwdWJsaXNoSW5mbyA9IFB1Ymxpc2hJbmZvLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUHVibGlzaEluZm8odGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHB1Ymxpc2hJbmZvOwotCX0KLQotCS8qCi0JICogUHVibGlzaCB0byB0aGUgc2VydmVyIHVzaW5nIHRoZSBwcm9ncmVzcyBtb25pdG9yLiBUaGUgcmVzdWx0IG9mIHRoZQotCSAqIHB1Ymxpc2ggb3BlcmF0aW9uIGlzIHJldHVybmVkIGFzIGFuIElTdGF0dXMuCi0JICovCi0JcHVibGljIElTdGF0dXMgcHVibGlzaChpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChnZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yTWlzc2luZ0FkYXB0ZXIsIG51bGwpOwotCQkKLQkJLy8gY2hlY2sgd2hhdCBpcyBvdXQgb2Ygc3luYyBhbmQgcHVibGlzaAotCQlpZiAoZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSAmJiBjb25maWd1cmF0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvck5vQ29uZmlndXJhdGlvbiwgbnVsbCk7Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhhdCB0aGUgZGVsZWdhdGUgaXMgbG9hZGVkIGFuZCB0aGUgc2VydmVyIHN0YXRlIGlzIGNvcnJlY3QKLQkJbG9hZEFkYXB0ZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuY2xhc3MsIG1vbml0b3IpOwotCQkKLQkJaWYgKCgoU2VydmVyVHlwZSlnZXRTZXJ2ZXJUeXBlKCkpLnN0YXJ0QmVmb3JlUHVibGlzaCgpICYmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gc3RhcnRJbXBsKElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBtb25pdG9yKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJCi0JCXJldHVybiBwdWJsaXNoSW1wbChraW5kLCBudWxsLCBudWxsLCBtb25pdG9yKTsKLQl9Ci0KLQkvKgotCSAqIFB1Ymxpc2ggdGhlIGdpdmVuIG1vZHVsZXMgdG8gdGhlIHNlcnZlci4KLQkgKiBUT0RPOiBJbXBsZW1lbnRhdGlvbiBvZiBwdWJsaXNoaW5nIGluZGl2aWR1YWwgbW9kdWxlcyEKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdWJsaXNoKGZpbmFsIGludCBraW5kLCBmaW5hbCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlczIsIGZpbmFsIElBZGFwdGFibGUgaW5mbywgZmluYWwgSU9wZXJhdGlvbkxpc3RlbmVyIG9wTGlzdGVuZXIpIHsKLQkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKSB7Ci0JCQlpZiAob3BMaXN0ZW5lciAhPSBudWxsKQotCQkJCW9wTGlzdGVuZXIuZG9uZShuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yTWlzc2luZ0FkYXB0ZXIsIG51bGwpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gY2hlY2sgd2hhdCBpcyBvdXQgb2Ygc3luYyBhbmQgcHVibGlzaAotCQlpZiAoZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSAmJiBjb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCWlmIChvcExpc3RlbmVyICE9IG51bGwpCi0JCQkJb3BMaXN0ZW5lci5kb25lKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JOb0NvbmZpZ3VyYXRpb24sIG51bGwpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGRlbGVnYXRlIGlzIGxvYWRlZCBhbmQgdGhlIHNlcnZlciBzdGF0ZSBpcyBjb3JyZWN0Ci0JCWxvYWRBZGFwdGVyKFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmNsYXNzLCBudWxsKTsKLQkJCi0JCWJvb2xlYW4gc3RhcnQgPSBmYWxzZTsKLQkJaWYgKCgoU2VydmVyVHlwZSlnZXRTZXJ2ZXJUeXBlKCkpLnN0YXJ0QmVmb3JlUHVibGlzaCgpICYmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkpCi0JCQlzdGFydCA9IHRydWU7Ci0JCQotCQlQdWJsaXNoSm9iIHB1Ymxpc2hKb2IgPSBuZXcgUHVibGlzaEpvYihraW5kLCBtb2R1bGVzMiwgc3RhcnQsIGluZm8pOwotCQlpZiAob3BMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlwdWJsaXNoSm9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCW9wTGlzdGVuZXIuZG9uZShldmVudC5nZXRSZXN1bHQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJCi0JCS8vIHRvIG1ha2UgdGhlIHB1Ymxpc2hpbmcgZGlhbG9nIGFwcGVhciwgcmVxdWlyZSBhZGFwdGFibGUgdG8gY292ZXJ0IFN0cmluZy5jbGFzcwotCQkvLyBpbnRvICJ1c2VyIiBzdHJpbmcuIGEgYml0IG9mIGEga2x1ZGdlLCBidXQgd29ya3MgZmluZSBmb3Igbm93Ci0JCWlmIChpbmZvICE9IG51bGwgJiYgInVzZXIiLmVxdWFscyhpbmZvLmdldEFkYXB0ZXIoU3RyaW5nLmNsYXNzKSkpCi0JCQlwdWJsaXNoSm9iLnNldFVzZXIodHJ1ZSk7Ci0JCXB1Ymxpc2hKb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwdWJsaXNoIHRhc2tzIHRoYXQgaGF2ZSBiZWVuIHRhcmdldGVkIHRvIHRoaXMgc2VydmVyLgotCSAqIFRoZXNlIHRhc2tzIHNob3VsZCBiZSBydW4gZHVyaW5nIHB1Ymxpc2hpbmcgYW5kIHdpbGwgYmUgaW5pdGlhbGl6ZWQKLQkgKiB3aXRoIGEgdGFzayBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0ga2luZCBvbmUgb2YgdGhlIElTZXJ2ZXIuUFVCTElTSF9YWCBjb25zdGFudHMKLQkgKiBAcGFyYW0gbW9kdWxlTGlzdCBhIGxpc3Qgb2YgbW9kdWxlcwotCSAqIEBwYXJhbSBraW5kTGlzdCBvbmUgb2YgdGhlIElTZXJ2ZXIgcHVibGlzaCBjaGFuZ2UgY29uc3RhbnRzCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIElPcHRpb25hbFRhc2tzCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcGVyYXRpb25bXSBnZXRUYXNrcyhpbnQga2luZCwgTGlzdCBtb2R1bGVMaXN0LCBMaXN0IGtpbmRMaXN0KSB7Ci0JCUxpc3Q8UHVibGlzaE9wZXJhdGlvbj4gdGFza3MgPSBuZXcgQXJyYXlMaXN0PFB1Ymxpc2hPcGVyYXRpb24+KCk7Ci0JCQotCQlTdHJpbmcgc2VydmVyVHlwZUlkID0gZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0JCQotCQlJUHVibGlzaFRhc2tbXSBwdWJsaXNoVGFza3MgPSBTZXJ2ZXJQbHVnaW4uZ2V0UHVibGlzaFRhc2tzKCk7Ci0JCWlmIChwdWJsaXNoVGFza3MgIT0gbnVsbCkgewotCQkJTGlzdCBlbmFibGVkVGFza3MgPSBnZXRFbmFibGVkT3B0aW9uYWxQdWJsaXNoT3BlcmF0aW9uSWRzKCk7Ci0JCQlMaXN0IGRpc2FibGVkVGFza3MgPSBnZXREaXNhYmxlZFByZWZlcnJlZFB1Ymxpc2hPcGVyYXRpb25JZHMoKTsKLQkJCQotCQkJVGFza01vZGVsIHRhc2tNb2RlbCA9IG5ldyBUYXNrTW9kZWwoKTsKLQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSLCB0aGlzKTsKLQkJCQotCQkJaW50IHNpemUgPSBwdWJsaXNoVGFza3MubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJUHVibGlzaFRhc2sgdGFzayA9IHB1Ymxpc2hUYXNrc1tpXTsKLQkJCQlpZiAodGFzay5zdXBwb3J0c1R5cGUoc2VydmVyVHlwZUlkKSkgewotCQkJCQlQdWJsaXNoT3BlcmF0aW9uW10gdGFza3MyID0gdGFzay5nZXRUYXNrcyh0aGlzLCBraW5kLCBtb2R1bGVMaXN0LCBraW5kTGlzdCk7Ci0JCQkJCWlmICh0YXNrczIgIT0gbnVsbCkgewotCQkJCQkJaW50IHNpemUyID0gdGFza3MyLmxlbmd0aDsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQkJCWlmICh0YXNrczJbal0uZ2V0S2luZCgpID09IFB1Ymxpc2hPcGVyYXRpb24uUkVRVUlSRUQpIHsKLQkJCQkJCQkJdGFza3MuYWRkKHRhc2tzMltqXSk7Ci0JCQkJCQkJCXRhc2tzMltqXS5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKLQkJCQkJCQl9IGVsc2UgaWYgKHRhc2tzMltqXS5nZXRLaW5kKCkgPT0gUHVibGlzaE9wZXJhdGlvbi5QUkVGRVJSRUQpIHsKLQkJCQkJCQkJU3RyaW5nIG9wSWQgPSBnZXRQdWJsaXNoT3BlcmF0aW9uSWQodGFza3MyW2pdKTsKLQkJCQkJCQkJaWYgKCFkaXNhYmxlZFRhc2tzLmNvbnRhaW5zKG9wSWQpKSB7Ci0JCQkJCQkJCQl0YXNrcy5hZGQodGFza3MyW2pdKTsKLQkJCQkJCQkJCXRhc2tzMltqXS5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSBpZiAodGFza3MyW2pdLmdldEtpbmQoKSA9PSBQdWJsaXNoT3BlcmF0aW9uLk9QVElPTkFMKSB7Ci0JCQkJCQkJCVN0cmluZyBvcElkID0gZ2V0UHVibGlzaE9wZXJhdGlvbklkKHRhc2tzMltqXSk7Ci0JCQkJCQkJCWlmIChlbmFibGVkVGFza3MuY29udGFpbnMob3BJZCkpIHsKLQkJCQkJCQkJCXRhc2tzLmFkZCh0YXNrczJbal0pOwotCQkJCQkJCQkJdGFza3MyW2pdLnNldFRhc2tNb2RlbCh0YXNrTW9kZWwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlDb2xsZWN0aW9ucy5zb3J0KHRhc2tzLCBQVUJMSVNIX09QRVJBVElPTl9DT01QQVJUT1IpOwotCQkKLQkJcmV0dXJuIHRhc2tzLnRvQXJyYXkobmV3IFB1Ymxpc2hPcGVyYXRpb25bdGFza3Muc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIHB1Ymxpc2hlcnMgdGhhdCBhcmUgYXZhaWxhYmxlIHdpdGggdGhpcyBzZXJ2ZXIsCi0JICogd2hldGhlciBvciBub3QgdGhleSBhcmUgY3VycmVudGx5IGVuYWJsZWQuCi0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIFB1Ymxpc2hlcnMKLQkgKi8KLQlwdWJsaWMgUHVibGlzaGVyW10gZ2V0QWxsUHVibGlzaGVycygpIHsKLQkJTGlzdDxQdWJsaXNoZXI+IHB1YnMgPSBuZXcgQXJyYXlMaXN0PFB1Ymxpc2hlcj4oKTsKLQkJCi0JCVN0cmluZyBzZXJ2ZXJUeXBlSWQgPSBnZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLQkJCi0JCVRhc2tNb2RlbCB0YXNrTW9kZWwgPSBuZXcgVGFza01vZGVsKCk7Ci0JCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSLCB0aGlzKTsKLQkJCi0JCVB1Ymxpc2hlcltdIHB1Ymxpc2hlcnMgPSBTZXJ2ZXJQbHVnaW4uZ2V0UHVibGlzaGVycygpOwotCQlpZiAocHVibGlzaGVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHB1Ymxpc2hlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlQdWJsaXNoZXIgcHViID0gcHVibGlzaGVyc1tpXTsKLQkJCQlpZiAocHViLnN1cHBvcnRzVHlwZShzZXJ2ZXJUeXBlSWQpKSB7Ci0JCQkJCXB1Yi5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKLQkJCQkJcHVicy5hZGQocHViKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwdWJzLnRvQXJyYXkobmV3IFB1Ymxpc2hlcltwdWJzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHB1Ymxpc2hlcnMgdGhhdCBoYXZlIGJlZW4gdGFyZ2V0ZWQgdG8gdGhpcyBzZXJ2ZXIgYW5kCi0JICogYXJlIGVuYWJsZWQuCi0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIFB1Ymxpc2hlcnMKLQkgKi8KLQlwdWJsaWMgUHVibGlzaGVyW10gZ2V0RW5hYmxlZFB1Ymxpc2hlcnMoKSB7Ci0JCUxpc3Q8UHVibGlzaGVyPiBwdWJzID0gbmV3IEFycmF5TGlzdDxQdWJsaXNoZXI+KCk7Ci0JCQotCQlTdHJpbmcgc2VydmVyVHlwZUlkID0gZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0JCQotCQlUYXNrTW9kZWwgdGFza01vZGVsID0gbmV3IFRhc2tNb2RlbCgpOwotCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUiwgdGhpcyk7Ci0JCQotCQlQdWJsaXNoZXJbXSBwdWJsaXNoZXJzID0gU2VydmVyUGx1Z2luLmdldFB1Ymxpc2hlcnMoKTsKLQkJaWYgKHB1Ymxpc2hlcnMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBwdWJsaXNoZXJzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJUHVibGlzaGVyIHB1YiA9IHB1Ymxpc2hlcnNbaV07Ci0JCQkJaWYgKHB1Yi5zdXBwb3J0c1R5cGUoc2VydmVyVHlwZUlkKSAmJiBpc1B1Ymxpc2hlckVuYWJsZWQocHViKSkgewotCQkJCQlwdWIuc2V0VGFza01vZGVsKHRhc2tNb2RlbCk7Ci0JCQkJCXB1YnMuYWRkKHB1Yik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcHVicy50b0FycmF5KG5ldyBQdWJsaXNoZXJbcHVicy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBwdWJsaXNoIHRhc2tzIHRoYXQgaGF2ZSBiZWVuIHRhcmdldGVkIHRvIHRoaXMgc2VydmVyIHR5cGUuCi0JICogVGhlIHRhc2tzIHdpbGwgbm90IGJlIGluaXRpYWxpemVkIHdpdGggYSB0YXNrIG1vZGVsLiAKLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlTGlzdCBhIGxpc3Qgb2YgbW9kdWxlcwotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcHVibGlzaCBvcGVyYXRpb25zCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcGVyYXRpb25bXSBnZXRBbGxUYXNrcyhMaXN0IG1vZHVsZUxpc3QpIHsKLQkJU3RyaW5nIHNlcnZlclR5cGVJZCA9IGdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotCQlpZiAoc2VydmVyVHlwZUlkID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFB1Ymxpc2hPcGVyYXRpb25bMF07Ci0JCQotCQlMaXN0PFB1Ymxpc2hPcGVyYXRpb24+IHRhc2tzID0gbmV3IEFycmF5TGlzdDxQdWJsaXNoT3BlcmF0aW9uPigpOwotCQkKLQkJSVB1Ymxpc2hUYXNrW10gcHVibGlzaFRhc2tzID0gU2VydmVyUGx1Z2luLmdldFB1Ymxpc2hUYXNrcygpOwotCQlpZiAocHVibGlzaFRhc2tzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcHVibGlzaFRhc2tzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSVB1Ymxpc2hUYXNrIHRhc2sgPSBwdWJsaXNoVGFza3NbaV07Ci0JCQkJaWYgKHRhc2suc3VwcG9ydHNUeXBlKHNlcnZlclR5cGVJZCkpIHsKLQkJCQkJUHVibGlzaE9wZXJhdGlvbltdIHRhc2tzMiA9IHRhc2suZ2V0VGFza3ModGhpcywgbW9kdWxlTGlzdCk7Ci0JCQkJCXRhc2tzLmFkZEFsbChBcnJheXMuYXNMaXN0KHRhc2tzMikpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJQ29sbGVjdGlvbnMuc29ydCh0YXNrcywgUFVCTElTSF9PUEVSQVRJT05fQ09NUEFSVE9SKTsKLQkJCi0JCXJldHVybiB0YXNrcy50b0FycmF5KG5ldyBQdWJsaXNoT3BlcmF0aW9uW3Rhc2tzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaE9wZXJhdGlvbklkKFB1Ymxpc2hPcGVyYXRpb24gb3ApIHsKLQkJcmV0dXJuIGdldElkKCkrInwiK29wLmdldExhYmVsKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3QgY29udGFpbmluZyBtb2R1bGUgYXJyYXlzIG9mIGV2ZXJ5IG1vZHVsZSBvbiB0aGUKLQkgKiBzZXJ2ZXIuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgSU1vZHVsZVtdCi0JICovCi0JcHVibGljIExpc3Q8SU1vZHVsZVtdPiBnZXRBbGxNb2R1bGVzKCkgewotCQlmaW5hbCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZVtdPigpOwotCQkKLQkJSU1vZHVsZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJTW9kdWxlVmlzaXRvcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJCQlpZiAoIW1vZHVsZUxpc3QuY29udGFpbnMobW9kdWxlKSkKLQkJCQkJbW9kdWxlTGlzdC5hZGQobW9kdWxlKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfTsKLQkJCi0JCXZpc2l0KHZpc2l0b3IsIG51bGwpOwotCQkKLQkJcmV0dXJuIG1vZHVsZUxpc3Q7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHB1Ymxpc2hlZC4KLQkgKiAKLQkgKiBAc2VlIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmdldFB1Ymxpc2hlZFJlc291cmNlcyhJTW9kdWxlW10pCi0JICovCi0JcHVibGljIElNb2R1bGVSZXNvdXJjZVtdIGdldFJlc291cmNlcyhJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCB8fCBtb2R1bGUubGVuZ3RoID09IDApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkiKTsKLQkJcmV0dXJuIGdldFNlcnZlclB1Ymxpc2hJbmZvKCkuZ2V0UmVzb3VyY2VzKG1vZHVsZSk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHB1Ymxpc2hlZC4KLQkgKiAKLQkgKiBAc2VlIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmdldFB1Ymxpc2hlZFJlc291cmNlcyhJTW9kdWxlW10pCi0JICovCi0JcHVibGljIElNb2R1bGVSZXNvdXJjZVtdIGdldFB1Ymxpc2hlZFJlc291cmNlcyhJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCB8fCBtb2R1bGUubGVuZ3RoID09IDApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkiKTsKLQkJcmV0dXJuIGdldFNlcnZlclB1Ymxpc2hJbmZvKCkuZ2V0TW9kdWxlUHVibGlzaEluZm8obW9kdWxlKS5nZXRSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIGRlbHRhIG9mIHRoZSBjdXJyZW50IG1vZHVsZSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4KLQkgKiBwdWJsaXNoZWQgY29tcGFyZWQgdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1vZHVsZS4KLQkgKiAKLQkgKiBAc2VlIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEoSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwgfHwgbW9kdWxlLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0JCXJldHVybiBnZXRTZXJ2ZXJQdWJsaXNoSW5mbygpLmdldERlbHRhKG1vZHVsZSk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBkZWx0YSBvZiB0aGUgY3VycmVudCBtb2R1bGUgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuCi0JICogcHVibGlzaGVkIGNvbXBhcmVkIHRvIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtb2R1bGUuCi0JICogCi0JICogQHNlZSBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5nZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKElNb2R1bGVbXSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQdWJsaXNoZWRSZXNvdXJjZURlbHRhKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5sZW5ndGggPT0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSIpOwotCQlyZXR1cm4gZ2V0U2VydmVyUHVibGlzaEluZm8oKS5oYXNEZWx0YShtb2R1bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVNlcnZlciNnZXRBZGFwdGVyKENsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKGRlbGVnYXRlKSkKLQkJCQlyZXR1cm4gZGVsZWdhdGU7Ci0JCX0KLQkJaWYgKGJlaGF2aW91ckRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWlmIChhZGFwdGVyLmlzSW5zdGFuY2UoYmVoYXZpb3VyRGVsZWdhdGUpKQotCQkJCXJldHVybiBiZWhhdmlvdXJEZWxlZ2F0ZTsKLQkJfQotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVNlcnZlciNsb2FkQWRhcHRlcihDbGFzcywgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGxvYWRBZGFwdGVyKENsYXNzIGFkYXB0ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlnZXREZWxlZ2F0ZShtb25pdG9yKTsKLQkJaWYgKGFkYXB0ZXIuaXNJbnN0YW5jZShkZWxlZ2F0ZSkpCi0JCQlyZXR1cm4gZGVsZWdhdGU7Ci0JCQotCQlnZXRCZWhhdmlvdXJEZWxlZ2F0ZShtb25pdG9yKTsKLQkJaWYgKGFkYXB0ZXIuaXNJbnN0YW5jZShiZWhhdmlvdXJEZWxlZ2F0ZSkpCi0JCQlyZXR1cm4gYmVoYXZpb3VyRGVsZWdhdGU7Ci0JCQotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5sb2FkQWRhcHRlcih0aGlzLCBhZGFwdGVyLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbgotCSAqIGJlIHN0YXJ0ZWQsIGFuZCBzdXBwb3J0cyB0aGUgZ2l2ZW4gbW9kZS4KLQkgKgotCSAqIEBwYXJhbSBtb2RlMgotCSAqIEByZXR1cm4gc3RhdHVzCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuU3RhcnQoU3RyaW5nIG1vZGUyKSB7Ci0JCWlmIChnZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yTWlzc2luZ0FkYXB0ZXIsIG51bGwpOwotCQkKLQkJaW50IHN0YXRlID0gZ2V0U2VydmVyU3RhdGUoKTsKLQkJaWYgKHN0YXRlICE9IFNUQVRFX1NUT1BQRUQgJiYgc3RhdGUgIT0gU1RBVEVfVU5LTk9XTikKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmNhblN0YXJ0RXJyb3JTdGF0ZSwgbnVsbCk7Ci0JCQotCQlpZiAoIWdldFNlcnZlclR5cGUoKS5zdXBwb3J0c0xhdW5jaE1vZGUobW9kZTIpKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JMYXVuY2hNb2RlLCBudWxsKTsKLQkJCi0JCWlmIChnZXRCZWhhdmlvdXJEZWxlZ2F0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldEJlaGF2aW91ckRlbGVnYXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpLmNhblN0YXJ0KG1vZGUyKTsKLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJTGF1bmNoIGdldExhdW5jaCgpIHsKLQkJaWYgKGxhdW5jaCAhPSBudWxsICYmICFsYXVuY2guaXNUZXJtaW5hdGVkKCkpCi0JCQlyZXR1cm4gbGF1bmNoOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGF1bmNoKElMYXVuY2ggbGF1bmNoKSB7Ci0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJzZXRMYXVuY2goKSAiICsgbGF1bmNoKTsKLQkJfQotCQl0aGlzLmxhdW5jaCA9IGxhdW5jaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXR1cExhdW5jaENvbmZpZ3VyYXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3b3JraW5nQ29weSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlnZXRCZWhhdmlvdXJEZWxlZ2F0ZShtb25pdG9yKS5zZXR1cExhdW5jaENvbmZpZ3VyYXRpb24od29ya2luZ0NvcHksIG1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHNldHVwTGF1bmNoQ29uZmlndXJhdGlvbigpICIgKyB0b1N0cmluZygpLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgc2VydmVyLiBJZiBvbmUgZG9lcyBub3QgZXhpc3QsIGl0Ci0JICogd2lsbCBiZSBjcmVhdGVkIGlmICJjcmVhdGUiIGlzIHRydWUsIGFuZCBvdGhlcndpc2Ugd2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogV2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBzZXJ2ZXIgdHlwZSBoYXMgbm8gYXNzb2NpYXRlZCBsYXVuY2gKLQkgKiBjb25maWd1cmF0aW9uIHR5cGUgKGkuZS4gdGhlIHNlcnZlciBjYW5ub3QgYmUgc3RhcnRlZCkuCi0JICogCi0JICogQHBhcmFtIGNyZWF0ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIG5ldyBsYXVuY2ggY29uZmlndXJhdGlvbiBzaG91bGQgYmUKLQkgKiAgICBjcmVhdGVkIGlmIHRoZXJlIGFyZSBub25lIGFscmVhZHkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIHdhcyBubwotCSAqICAgIGV4aXN0aW5nIGxhdW5jaCBjb25maWd1cmF0aW9uIGFuZCA8Y29kZT5jcmVhdGU8L2NvZGU+IHdhcyBmYWxzZQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRMYXVuY2hDb25maWd1cmF0aW9uKGJvb2xlYW4gY3JlYXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgbGF1bmNoQ29uZmlnVHlwZSA9ICgoU2VydmVyVHlwZSkgZ2V0U2VydmVyVHlwZSgpKS5nZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZSgpOwotCQlpZiAobGF1bmNoQ29uZmlnVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJTGF1bmNoTWFuYWdlciBsYXVuY2hNYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBsYXVuY2hDb25maWdzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWxhdW5jaENvbmZpZ3MgPSBsYXVuY2hNYW5hZ2VyLmdldExhdW5jaENvbmZpZ3VyYXRpb25zKGxhdW5jaENvbmZpZ1R5cGUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCQotCQlpZiAobGF1bmNoQ29uZmlncyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGxhdW5jaENvbmZpZ3MubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgc2VydmVySWQgPSBsYXVuY2hDb25maWdzW2ldLmdldEF0dHJpYnV0ZShTRVJWRVJfSUQsIChTdHJpbmcpIG51bGwpOwotCQkJCQlpZiAoZ2V0SWQoKS5lcXVhbHMoc2VydmVySWQpKSB7Ci0JCQkJCQlmaW5hbCBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gbGF1bmNoQ29uZmlnc1tpXS5nZXRXb3JraW5nQ29weSgpOwotCQkJCQkJc2V0dXBMYXVuY2hDb25maWd1cmF0aW9uKHdjLCBtb25pdG9yKTsKLQkJCQkJCWlmICh3Yy5pc0RpcnR5KCkpIHsKLQkJCQkJCQlmaW5hbCBJTGF1bmNoQ29uZmlndXJhdGlvbltdIGxjID0gbmV3IElMYXVuY2hDb25maWd1cmF0aW9uWzFdOwotCQkJCQkJCUpvYiBqb2IgPSBuZXcgSm9iKCJTYXZpbmcgbGF1bmNoIGNvbmZpZ3VyYXRpb24iKSB7Ci0JCQkJCQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IyKSB7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCWxjWzBdID0gd2MuZG9TYXZlKCk7Ci0JCQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgY29uZmlndXJpbmcgbGF1bmNoIiwgY2UpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJCQl9Ci0JCQkJCQkJfTsKLQkJCQkJCQlqb2Iuc2V0U3lzdGVtKHRydWUpOwotCQkJCQkJCWpvYi5zY2hlZHVsZSgpOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWpvYi5qb2luKCk7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGNvbmZpZ3VyaW5nIGxhdW5jaCIsIGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChqb2IuZ2V0U3RhdGUoKSAhPSBKb2IuTk9ORSkgewotCQkJCQkJCQlqb2IuY2FuY2VsKCk7Ci0JCQkJCQkJCWxjWzBdID0gd2MuZG9TYXZlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCXJldHVybiBsY1swXTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBsYXVuY2hDb25maWdzW2ldOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjb25maWd1cmluZyBsYXVuY2giLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKCFjcmVhdGUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCS8vIGNyZWF0ZSBhIG5ldyBsYXVuY2ggY29uZmlndXJhdGlvbgotCQlTdHJpbmcgbGF1bmNoTmFtZSA9IGdldFZhbGlkTGF1bmNoQ29uZmlndXJhdGlvbk5hbWUoZ2V0TmFtZSgpKTsKLQkJbGF1bmNoTmFtZSA9IGxhdW5jaE1hbmFnZXIuZ2VuZXJhdGVVbmlxdWVMYXVuY2hDb25maWd1cmF0aW9uTmFtZUZyb20obGF1bmNoTmFtZSk7IAotCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gbGF1bmNoQ29uZmlnVHlwZS5uZXdJbnN0YW5jZShudWxsLCBsYXVuY2hOYW1lKTsKLQkJd2Muc2V0QXR0cmlidXRlKFNFUlZFUl9JRCwgZ2V0SWQoKSk7Ci0JCXNldHVwTGF1bmNoQ29uZmlndXJhdGlvbih3YywgbW9uaXRvcik7Ci0JCXJldHVybiB3Yy5kb1NhdmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkTGF1bmNoQ29uZmlndXJhdGlvbk5hbWUoU3RyaW5nIHMpIHsKLQkJaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIjEiOwotCQlpbnQgc2l6ZSA9IElOVkFMSURfQ0hBUlMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcyA9IHMucmVwbGFjZShJTlZBTElEX0NIQVJTW2ldLCAnXycpOwotCQl9Ci0JCXJldHVybiBzOwotCX0KLQotCS8qKgotCSAqIENsZWFuIHVwIGFueSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZlciwgdHlwaWNhbGx5IGluIHByZXBhcmF0aW9uIGZvcgotCSAqIGRlbGV0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZU1ldGFkYXRhKCkgewotCQlkZWxldGVMYXVuY2hDb25maWd1cmF0aW9ucygpOwotCQlTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5yZW1vdmVUZW1wRGlyZWN0b3J5KGdldElkKCkpOwotCQlQdWJsaXNoSW5mby5nZXRJbnN0YW5jZSgpLnJlbW92ZVNlcnZlclB1Ymxpc2hJbmZvKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIENsZWFuIHVwIGFueSBvbGQgbGF1bmNoIGNvbmZpZ3VyYXRpb25zIHdpdGggdGhlIGN1cnJlbnQgc2VydmVyJ3MgaWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlTGF1bmNoQ29uZmlndXJhdGlvbnMoKSB7Ci0JCWlmIChnZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCUlMYXVuY2hNYW5hZ2VyIGxhdW5jaE1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgbGF1bmNoQ29uZmlnVHlwZSA9ICgoU2VydmVyVHlwZSkgZ2V0U2VydmVyVHlwZSgpKS5nZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZSgpOwotCQkKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbmZpZ3MgPSBsYXVuY2hNYW5hZ2VyLmdldExhdW5jaENvbmZpZ3VyYXRpb25zKGxhdW5jaENvbmZpZ1R5cGUpOwotCQkJaW50IHNpemUgPSBjb25maWdzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGdldElkKCkuZXF1YWxzKGNvbmZpZ3NbaV0uZ2V0QXR0cmlidXRlKFNFUlZFUl9JRCwgKFN0cmluZykgbnVsbCkpKQotCQkJCQkJY29uZmlnc1tpXS5kZWxldGUoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSVNlcnZlciNjYW5SZXN0YXJ0KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5SZXN0YXJ0KFN0cmluZyBtb2RlMikgewotCQlpZiAoZ2V0U2VydmVyVHlwZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvck1pc3NpbmdBZGFwdGVyLCBudWxsKTsKLQkJCi0JCWlmICghZ2V0U2VydmVyVHlwZSgpLnN1cHBvcnRzTGF1bmNoTW9kZShtb2RlMikpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckxhdW5jaE1vZGUsIG51bGwpOwotCQkKLQkJaWYgKGdldFNlcnZlclN0YXRlKCkgIT0gU1RBVEVfU1RBUlRFRCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUmVzdGFydE5vdFN0YXJ0ZWQsIG51bGwpOwotCQkKLQkJaWYgKGdldEJlaGF2aW91ckRlbGVnYXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0QmVoYXZpb3VyRGVsZWdhdGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSkuY2FuUmVzdGFydChtb2RlMik7Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJlc3RhcnQgc3RhdGUgb2YgdGhlIHNlcnZlci4gVGhpcwotCSAqIGltcGxlbWVudGF0aW9uIHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZSB3aGVuIHRoZSBzZXJ2ZXIKLQkgKiBpcyBzdG9wcGVkLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U2VydmVyUmVzdGFydFN0YXRlKCkgewotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBTVEFURV9TVE9QUEVEKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc2VydmVyUmVzdGFydE5lZWRlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzZXJ2ZXIgcmVzdGFydCBzdGF0ZS4KLQkgKgotCSAqIEBwYXJhbSBzdGF0ZSBib29sZWFuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFNlcnZlclJlc3RhcnRTdGF0ZShib29sZWFuIHN0YXRlKSB7Ci0JCWlmIChzdGF0ZSA9PSBzZXJ2ZXJSZXN0YXJ0TmVlZGVkKQotCQkJcmV0dXJuOwotCQlzZXJ2ZXJSZXN0YXJ0TmVlZGVkID0gc3RhdGU7Ci0JCWZpcmVSZXN0YXJ0U3RhdGVDaGFuZ2VFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVNlcnZlciNyZXN0YXJ0KFN0cmluZywgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0YXJ0KGZpbmFsIFN0cmluZyBtb2RlMiwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChnZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCB8fCBnZXRTZXJ2ZXJTdGF0ZSgpID09IFNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoZ2V0U2VydmVyVHlwZSgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBTVEFURV9TVE9QUEVEKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIlJlc3RhcnRpbmcgc2VydmVyOiAiICsgZ2V0TmFtZSgpKTsKLQkJfQotCQkKLQkJUmVzdGFydEpvYiByZXN0YXJ0Sm9iID0gbmV3IFJlc3RhcnRKb2IobW9kZTIpOwotCQlyZXN0YXJ0Sm9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbgotCSAqIGJlIHN0b3BwZWQuCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5TdG9wKCkgewotCQlpZiAoZ2V0U2VydmVyVHlwZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvck1pc3NpbmdBZGFwdGVyLCBudWxsKTsKLQkJCi0JCWlmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IFNUQVRFX1NUT1BQRUQgfHwgZ2V0U2VydmVyU3RhdGUoKSA9PSBTVEFURV9TVE9QUElORykKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yU3RvcEFscmVhZHlTdG9wcGVkLCBudWxsKTsKLQkJCi0JCWlmICghZ2V0U2VydmVyVHlwZSgpLnN1cHBvcnRzTGF1bmNoTW9kZShnZXRNb2RlKCkpKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JMYXVuY2hNb2RlLCBudWxsKTsKLQkJCi0JCWlmIChnZXRCZWhhdmlvdXJEZWxlZ2F0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldEJlaGF2aW91ckRlbGVnYXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpLmNhblN0b3AoKTsKLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVNlcnZlciNzdG9wKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChib29sZWFuIGZvcmNlKSB7Ci0JCWlmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IFNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm47Ci0JCQotCQlTdG9wSm9iIGpvYiA9IG5ldyBTdG9wSm9iKGZvcmNlKTsKLQkJam9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcHVibGlzaEJlZm9yZVN0YXJ0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgYm9vbGVhbiBzeW5jaHJvbm91cyl7Ci0KLQkJLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBwdWJsaXNoCi0JCWJ5dGUgcHViID0gU3RhcnRKb2IuUFVCTElTSF9OT05FOwotCQlpZiAoU2VydmVyQ29yZS5pc0F1dG9QdWJsaXNoaW5nKCkgJiYgc2hvdWxkUHVibGlzaCgpKSB7Ci0JCQlpZiAoKChTZXJ2ZXJUeXBlKWdldFNlcnZlclR5cGUoKSkuc3RhcnRCZWZvcmVQdWJsaXNoKCkpCi0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQlwdWIgPSBTdGFydEpvYi5QVUJMSVNIX0JFRk9SRTsKLQkJfQotCQkKLQkJZmluYWwgSVN0YXR1cyBbXSBwdWJTdGF0dXMgPSBuZXcgSVN0YXR1c1tde1N0YXR1cy5PS19TVEFUVVN9OwotCQkKLQkJLy8gcHVibGlzaCBiZWZvcmUgc3RhcnQKLQkJYnl0ZSBwdWJsaXNoID0gcHViOwotCQlpZiAocHVibGlzaCA9PSBTdGFydEpvYi5QVUJMSVNIX0JFRk9SRSkgewotCQkJUHVibGlzaEpvYiBwdWJKb2IgPSBuZXcgUHVibGlzaEpvYihJU2VydmVyLlBVQkxJU0hfSU5DUkVNRU5UQUwsIG51bGwsZmFsc2UsIG51bGwpOwotCQkJcHViSm9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCl7Ci0JCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBldmVudC5nZXRSZXN1bHQoKTsKLQkJCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQkJCQlwdWJTdGF0dXNbMF0gPSBzdGF0dXM7IAotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQkJCi0JCQlwdWJKb2Iuc2NoZWR1bGUoKTsKLQkJCQotCQkJdHJ5ewotCQkJCWlmIChzeW5jaHJvbm91cykKLQkJCQkJcHViSm9iLmpvaW4oKTsKLQkJCQkJCi0JCQl9Ci0JCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpewotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHViU3RhdHVzWzBdOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyBwdWJsaXNoQWZ0ZXJTdGFydChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGJvb2xlYW4gc3luY2hyb25vdXMsIGZpbmFsIElPcGVyYXRpb25MaXN0ZW5lciBvcCl7Ci0JCQotCQkvLyBjaGVjayBpZiB3ZSBuZWVkIHRvIHB1Ymxpc2gKLQkJYnl0ZSBwdWIgPSBTdGFydEpvYi5QVUJMSVNIX05PTkU7Ci0JCWlmIChTZXJ2ZXJDb3JlLmlzQXV0b1B1Ymxpc2hpbmcoKSAmJiBzaG91bGRQdWJsaXNoKCkpIHsKLQkJCWlmICgoKFNlcnZlclR5cGUpZ2V0U2VydmVyVHlwZSgpKS5zdGFydEJlZm9yZVB1Ymxpc2goKSkKLQkJCQlwdWIgPSBTdGFydEpvYi5QVUJMSVNIX0FGVEVSOwotCQkJZWxzZSB7Ci0JCQkJaWYob3AgIT0gbnVsbCkgewotCQkJCQlvcC5kb25lKFN0YXR1cy5PS19TVEFUVVMpOwotCQkJCX0KLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfQotCQkKLQkJZmluYWwgSVN0YXR1cyBbXSBwdWJTdGF0dXMgPSBuZXcgSVN0YXR1c1tde1N0YXR1cy5PS19TVEFUVVN9OwotCQkKLQkJLy8gcHVibGlzaCBhZnRlciBzdGFydAotCQlieXRlIHB1Ymxpc2ggPSBwdWI7Ci0JCWlmIChwdWJsaXNoID09IFN0YXJ0Sm9iLlBVQkxJU0hfQUZURVIpIHsKLQkJCVB1Ymxpc2hKb2IgcHViSm9iID0gbmV3IFB1Ymxpc2hKb2IoSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCBudWxsLGZhbHNlLCBudWxsKTsKLQkJCXB1YkpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpewotCQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gZXZlbnQuZ2V0UmVzdWx0KCk7Ci0JCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCQkJcHViU3RhdHVzWzBdID0gc3RhdHVzOyAKLQkJCQkJaWYgKG9wICE9IG51bGwpewotCQkJCQkJb3AuZG9uZShzdGF0dXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCQkKLQkJCXB1YkpvYi5zY2hlZHVsZSgpOwotCQkJCi0JCQl0cnl7Ci0JCQkJaWYgKHN5bmNocm9ub3VzKQotCQkJCQlwdWJKb2Iuam9pbigpOwotCQkJfQotCQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKXsKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHB1YlN0YXR1c1swXTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJU2VydmVyI3N0YXJ0KFN0cmluZywgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChTdHJpbmcgbW9kZTIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiU3RhcnRpbmcgc2VydmVyOiAiICsgdG9TdHJpbmcoKSArICIsIGxhdW5jaE1vZGU6ICIgKyBtb2RlMik7Ci0JCX0KLQkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGRlbGVnYXRlIGlzIGxvYWRlZCBhbmQgdGhlIHNlcnZlciBzdGF0ZSBpcyBjb3JyZWN0Ci0JCWxvYWRBZGFwdGVyKFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmNsYXNzLCBudWxsKTsKLQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gcHVibGlzaEJlZm9yZVN0YXJ0KG1vbml0b3IsZmFsc2UpOwotCQkKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpewotCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJGYWlsZWQgcHVibGlzaCBqb2IgZHVyaW5nIHN0YXJ0IHJvdXRpbmUiKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU3RhcnRKb2Igc3RhcnRKb2IgPSBuZXcgU3RhcnRKb2IobW9kZTIpOwotCQkvLyAyODc0NDIgLSBvbmx5IGRvIHB1Ymxpc2ggYWZ0ZXIgc3RhcnQgaWYgdGhlIHNlcnZlciBzdGFydCBpcyBzdWNjZXNzZnVsLgotCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IyID0gbW9uaXRvcjsgCi0JCXN0YXJ0Sm9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RhdHVzIHJlc3VsdFN0YXR1cyA9IGV2ZW50LmdldFJlc3VsdCgpOwotCQkJCWlmIChyZXN1bHRTdGF0dXMgIT0gbnVsbCAmJiByZXN1bHRTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7IAotCQkJCQlpZiAoVHJhY2UuSU5GTykgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0lORk8sCi0JCQkJCQkJCSJTa2lwcGluZyBhdXRvIHB1Ymxpc2ggYWZ0ZXIgc2VydmVyIHN0YXJ0IHNpbmNlIHRoZSBzZXJ2ZXIgc3RhcnQgZmFpbGVkLiIpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcHVibGlzaEFmdGVyU3RhcnQobW9uaXRvcjIsZmFsc2UsbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJc3RhcnRKb2Iuc2NoZWR1bGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJU2VydmVyI3N0YXJ0KFN0cmluZywgSU9wZXJhdGlvbkxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KFN0cmluZyBtb2RlMiwgZmluYWwgSU9wZXJhdGlvbkxpc3RlbmVyIG9wTGlzdGVuZXIpIHsKLQkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKSB7Ci0JCQlpZiAob3BMaXN0ZW5lciAhPSBudWxsKQotCQkJCW9wTGlzdGVuZXIuZG9uZShTdGF0dXMuT0tfU1RBVFVTKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGRlbGVnYXRlIGlzIGxvYWRlZCBhbmQgdGhlIHNlcnZlciBzdGF0ZSBpcyBjb3JyZWN0Ci0JCWxvYWRBZGFwdGVyKFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmNsYXNzLCBudWxsKTsKLQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gcHVibGlzaEJlZm9yZVN0YXJ0KG51bGwsZmFsc2UpOwotCQkKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpewotCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJGYWlsZWQgcHVibGlzaCBqb2IgZHVyaW5nIHN0YXJ0IHJvdXRpbmUiKTsKLQkJCX0KLQkJCWlmIChvcExpc3RlbmVyICE9IG51bGwpCi0JCQkJb3BMaXN0ZW5lci5kb25lKFN0YXR1cy5PS19TVEFUVVMpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gY2hlY2sgdGhlIHB1Ymxpc2ggZmxhZyAoYWdhaW4pIHRvIGRldGVybWluZSB3aGVuIHRvIGNhbGwgb3BMaXN0ZW5lci5kb25lIAotCQlieXRlIHB1YiA9IFN0YXJ0Sm9iLlBVQkxJU0hfTk9ORTsKLQkJaWYgKFNlcnZlckNvcmUuaXNBdXRvUHVibGlzaGluZygpICYmIHNob3VsZFB1Ymxpc2goKSkgewotCQkJaWYgKCgoU2VydmVyVHlwZSlnZXRTZXJ2ZXJUeXBlKCkpLnN0YXJ0QmVmb3JlUHVibGlzaCgpKQotCQkJCXB1YiA9IFN0YXJ0Sm9iLlBVQkxJU0hfQUZURVI7Ci0JCQllbHNlCi0JCQkJcHViID0gU3RhcnRKb2IuUFVCTElTSF9CRUZPUkU7Ci0JCX0KLQkJCi0JCWlmIChTZXJ2ZXJQbHVnaW4uaXNSdW5uaW5nR1VJTW9kZSgpKXsKLQkJCVNlcnZlclBsdWdpbi5nZXRTYXZlRWRpdG9ySGVscGVyKCkuc2F2ZUFsbEVkaXRvcnMoKTsKLQkJfQotCQkKLQkJU3RhcnRKb2Igc3RhcnRKb2IgPSBuZXcgU3RhcnRKb2IobW9kZTIpOwotCQlpZiAob3BMaXN0ZW5lciAhPSBudWxsICYmIHB1YiAhPSBTdGFydEpvYi5QVUJMSVNIX0FGVEVSKSB7Ci0JCQlzdGFydEpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlvcExpc3RlbmVyLmRvbmUoZXZlbnQuZ2V0UmVzdWx0KCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCS8vIDI4NzQ0MiAtIG9ubHkgZG8gcHVibGlzaCBhZnRlciBzdGFydCBpZiB0aGUgc2VydmVyIHN0YXJ0IGlzIHN1Y2Nlc3NmdWwuCi0JCWlmIChwdWIgPT0gU3RhcnRKb2IuUFVCTElTSF9BRlRFUikgewotCQkJc3RhcnRKb2IuYWRkSm9iQ2hhbmdlTGlzdGVuZXIobmV3IEpvYkNoYW5nZUFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJSVN0YXR1cyByZXN1bHRTdGF0dXMgPSBldmVudC5nZXRSZXN1bHQoKTsKLQkJCQkJaWYgKHJlc3VsdFN0YXR1cyAhPSBudWxsICYmIHJlc3VsdFN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsgCi0JCQkJCQkvLyBEbyBub3QgbGF1bmNoIHRoZSBwdWJsaXNoLgotCQkJCQkJaWYgKFRyYWNlLklORk8pIHsKLQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfSU5GTywKLQkJCQkJCQkJCSJTa2lwcGluZyBhdXRvIHB1Ymxpc2ggYWZ0ZXIgc2VydmVyIHN0YXJ0IHNpbmNlIHRoZSBzZXJ2ZXIgc3RhcnQgZmFpbGVkLiIpOwotCQkJCQkJfQotCQkJCQkJaWYgKG9wTGlzdGVuZXIgIT0gbnVsbCkKLQkJCQkJCQlvcExpc3RlbmVyLmRvbmUoU3RhdHVzLk9LX1NUQVRVUyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlwdWJsaXNoQWZ0ZXJTdGFydChudWxsLGZhbHNlLG9wTGlzdGVuZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJc3RhcnRKb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbm91c1N0YXJ0KFN0cmluZyBtb2RlMiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChnZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBkZWxlZ2F0ZSBpcyBsb2FkZWQgYW5kIHRoZSBzZXJ2ZXIgc3RhdGUgaXMgY29ycmVjdAotCQlsb2FkQWRhcHRlcihTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5jbGFzcywgbW9uaXRvcik7Ci0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IHB1Ymxpc2hCZWZvcmVTdGFydChtb25pdG9yLHRydWUpOwotCQkKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpewotCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJGYWlsZWQgcHVibGlzaCBqb2IgZHVyaW5nIHN0YXJ0IHJvdXRpbmUiKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU3RhcnRKb2Igc3RhcnRKb2IgPSBuZXcgU3RhcnRKb2IobW9kZTIpOwotCQkvLyAyODc0NDIgLSBvbmx5IGRvIHB1Ymxpc2ggYWZ0ZXIgc3RhcnQgaWYgdGhlIHNlcnZlciBzdGFydCBpcyBzdWNjZXNzZnVsLgotCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IyID0gbW9uaXRvcjsgCi0JCXN0YXJ0Sm9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RhdHVzIHJlc3VsdFN0YXR1cyA9IGV2ZW50LmdldFJlc3VsdCgpOwotCQkJCWlmIChyZXN1bHRTdGF0dXMgIT0gbnVsbCAmJiByZXN1bHRTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7IAotCQkJCQlpZiAoVHJhY2UuSU5GTykgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0lORk8sCi0JCQkJCQkJCSJTa2lwcGluZyBhdXRvIHB1Ymxpc2ggYWZ0ZXIgc2VydmVyIHN0YXJ0IHNpbmNlIHRoZSBzZXJ2ZXIgc3RhcnQgZmFpbGVkLiIpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcHVibGlzaEFmdGVyU3RhcnQobW9uaXRvcjIsdHJ1ZSxudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlzdGFydEpvYi5zY2hlZHVsZSgpOwotCQkKLQkJdHJ5IHsKLQkJCXN0YXJ0Sm9iLmpvaW4oKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkVycm9yIHdhaXRpbmcgZm9yIGpvYiIsIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTZXJ2ZXIjc3luY2hyb25vdXNSZXN0YXJ0KFN0cmluZywgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbm91c1Jlc3RhcnQoU3RyaW5nIG1vZGUyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3luY2hyb25vdXNTdG9wKHRydWUpOwotCQlzeW5jaHJvbm91c1N0YXJ0KG1vZGUyLCBtb25pdG9yKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNlcnZlciNyZXN0YXJ0KFN0cmluZywgSU9wZXJhdGlvbkxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RhcnQoU3RyaW5nIG1vZGUyLCBmaW5hbCBJT3BlcmF0aW9uTGlzdGVuZXIgb3BMaXN0ZW5lcikgewotCQlpZiAoZ2V0U2VydmVyVHlwZSgpID09IG51bGwpIHsKLQkJCWlmIChvcExpc3RlbmVyICE9IG51bGwpCi0JCQkJb3BMaXN0ZW5lci5kb25lKFN0YXR1cy5PS19TVEFUVVMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBTVEFURV9TVE9QUEVEKSB7Ci0JCQlpZiAob3BMaXN0ZW5lciAhPSBudWxsKQotCQkJCW9wTGlzdGVuZXIuZG9uZShTdGF0dXMuT0tfU1RBVFVTKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJUmVzdGFydEpvYiByZXN0YXJ0Sm9iID0gbmV3IFJlc3RhcnRKb2IobW9kZTIpOwotCQlpZiAob3BMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlyZXN0YXJ0Sm9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCW9wTGlzdGVuZXIuZG9uZShldmVudC5nZXRSZXN1bHQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcmVzdGFydEpvYi5zY2hlZHVsZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2VydmVyI3N0b3AoYm9vbGVhbiwgSU9wZXJhdGlvbkxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoYm9vbGVhbiBmb3JjZSwgZmluYWwgSU9wZXJhdGlvbkxpc3RlbmVyIG9wTGlzdGVuZXIpIHsKLQkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKSB7Ci0JCQlpZiAob3BMaXN0ZW5lciAhPSBudWxsKQotCQkJCW9wTGlzdGVuZXIuZG9uZShTdGF0dXMuT0tfU1RBVFVTKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7Ci0JCQlpZiAob3BMaXN0ZW5lciAhPSBudWxsKQotCQkJCW9wTGlzdGVuZXIuZG9uZShTdGF0dXMuT0tfU1RBVFVTKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU3RvcEpvYiBqb2IgPSBuZXcgU3RvcEpvYihmb3JjZSk7Ci0JCWlmIChvcExpc3RlbmVyICE9IG51bGwpIHsKLQkJCWpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlvcExpc3RlbmVyLmRvbmUoZXZlbnQuZ2V0UmVzdWx0KCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWpvYi5zY2hlZHVsZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2VydmVyI3N5bmNocm9ub3VzU3RvcCgpCi0JICovCi0JcHVibGljIHZvaWQgc3luY2hyb25vdXNTdG9wKGJvb2xlYW4gZm9yY2UpIHsKLQkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJcmV0dXJuOwotCQkKLQkJU3RvcEpvYiBqb2IgPSBuZXcgU3RvcEpvYihmb3JjZSk7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCQl0cnkgewotCQkJam9iLmpvaW4oKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkVycm9yIHdhaXRpbmcgZm9yIGpvYiIsIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBUcmlnZ2VyIGEgcmVzdGFydCBvZiB0aGUgZ2l2ZW4gbW9kdWxlIGFuZCB3YWl0IHVudGlsIGl0IGhhcyBmaW5pc2hlZCByZXN0YXJ0aW5nLgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZQotCSAqIEBwYXJhbSBtb25pdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbiAtIHRocm93biBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgdHJ5aW5nIHRvIHJlc3RhcnQgdGhlIG1vZHVsZQotCSAqCi0JcHVibGljIHZvaWQgc3luY2hyb25vdXNSZXN0YXJ0TW9kdWxlKGZpbmFsIElNb2R1bGVbXSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c01vZHVsZVJlc3RhcnQgMSIpOwotCi0JCWZpbmFsIE9iamVjdCBtdXRleCA9IG5ldyBPYmplY3QoKTsKLQkKLQkJLy8gYWRkIGxpc3RlbmVyIHRvIHRoZSBtb2R1bGUKLQkJSVNlcnZlckxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKLQkJCQlpbnQgZXZlbnRLaW5kID0gZXZlbnQuZ2V0S2luZCgpOwotCQkJCUlTZXJ2ZXIgc2VydmVyID0gZXZlbnQuZ2V0U2VydmVyKCk7Ci0JCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuTU9EVUxFX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKLQkJCQkJaW50IHN0YXRlID0gc2VydmVyLmdldE1vZHVsZVN0YXRlKG1vZHVsZSk7Ci0JCQkJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQgfHwgc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7Ci0JCQkJCQkvLyBub3RpZnkgd2FpdGVyCi0JCQkJCQlzeW5jaHJvbml6ZWQgKG11dGV4KSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNNb2R1bGVSZXN0YXJ0IG5vdGlmeSIpOwotCQkJCQkJCQltdXRleC5ub3RpZnlBbGwoKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBub3RpZnlpbmcgbW9kdWxlIHJlc3RhcnQiLCBlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWFkZFNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCi0JCS8vIG1ha2Ugc3VyZSBpdCB0aW1lcyBvdXQgYWZ0ZXIgMzBzCi0JCWNsYXNzIFRpbWVyIHsKLQkJCWJvb2xlYW4gdGltZW91dDsKLQkJCWJvb2xlYW4gYWxyZWFkeURvbmU7Ci0JCX0KLQkJZmluYWwgVGltZXIgdGltZXIgPSBuZXcgVGltZXIoKTsKLQkJCi0JCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgzMDAwMCk7Ci0JCQkJCWlmICghdGltZXIuYWxyZWFkeURvbmUpIHsKLQkJCQkJCXRpbWVyLnRpbWVvdXQgPSB0cnVlOwotCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgotCQkJCQkJc3luY2hyb25pemVkIChtdXRleCkgewotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzTW9kdWxlUmVzdGFydCBub3RpZnkgdGltZW91dCIpOwotCQkJCQkJCW11dGV4Lm5vdGlmeUFsbCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igbm90aWZ5aW5nIG1vZHVsZSByZXN0YXJ0IHRpbWVvdXQiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCXRocmVhZC5zdGFydCgpOwotCQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c01vZHVsZVJlc3RhcnQgMiIpOwotCQotCQkvLyByZXN0YXJ0IHRoZSBtb2R1bGUKLQkJdHJ5IHsKLQkJCWdldEJlaGF2aW91ckRlbGVnYXRlKG51bGwpLnJlc3RhcnRNb2R1bGUobW9kdWxlLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzTW9kdWxlUmVzdGFydCAzIik7Ci0JCi0JCS8vIHdhaXQgZm9yIGl0ISB3YWl0IGZvciBpdCEgLi4uCi0JCXN5bmNocm9uaXplZCAobXV0ZXgpIHsKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKCF0aW1lci50aW1lb3V0ICYmICEoZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQgfHwgZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpKQotCQkJCQltdXRleC53YWl0KCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHdhaXRpbmcgZm9yIHNlcnZlciBzdGFydCIsIGUpOwotCQkJfQotCQl9Ci0JCXJlbW92ZVNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRpbWVyLnRpbWVvdXQpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yTW9kdWxlUmVzdGFydEZhaWxlZCwgZ2V0TmFtZSgpKSwgbnVsbCkpOwotCQl0aW1lci5hbHJlYWR5RG9uZSA9IHRydWU7Ci0JCQotCQlpZiAoZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yTW9kdWxlUmVzdGFydEZhaWxlZCwgZ2V0TmFtZSgpKSwgbnVsbCkpOwotCQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c01vZHVsZVJlc3RhcnQgNCIpOwotCX0qLwotCi0JcHVibGljIElQYXRoIGdldFRlbXBEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRUZW1wRGlyZWN0b3J5KGdldElkKCkpOwotCX0KLQotCXB1YmxpYyBJUGF0aCBnZXRUZW1wRGlyZWN0b3J5KGJvb2xlYW4gcmVjeWNsZSkgewotCQlyZXR1cm4gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0VGVtcERpcmVjdG9yeShnZXRJZCgpLCByZWN5Y2xlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFhNTFJvb3QoKSB7Ci0JCXJldHVybiAic2VydmVyIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQlyZXNvbHZlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VyaWFsaXplKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJc2F2ZShtZW1lbnRvKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCWxvYWQobWVtZW50byk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZSgpIHsKLQkJSVNlcnZlclR5cGUgb2xkU2VydmVyVHlwZSA9IHNlcnZlclR5cGU7Ci0JCVN0cmluZyBzZXJ2ZXJUeXBlSWQgPSBnZXRBdHRyaWJ1dGUoInNlcnZlci10eXBlLWlkIiwgKFN0cmluZyludWxsKTsKLQkJaWYgKHNlcnZlclR5cGVJZCAhPSBudWxsKQotCQkJc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyVHlwZUlkKTsKLQkJZWxzZQotCQkJc2VydmVyVHlwZSA9IG51bGw7Ci0JCWlmIChzZXJ2ZXJUeXBlICE9IG51bGwgJiYgIXNlcnZlclR5cGUuZXF1YWxzKG9sZFNlcnZlclR5cGUpKQotCQkJc2VydmVyU3RhdGUgPSAoKFNlcnZlclR5cGUpc2VydmVyVHlwZSkuZ2V0SW5pdGlhbFN0YXRlKCk7Ci0JCQotCQlTdHJpbmcgcnVudGltZUlkID0gZ2V0QXR0cmlidXRlKFJVTlRJTUVfSUQsIChTdHJpbmcpbnVsbCk7Ci0JCWlmIChydW50aW1lSWQgIT0gbnVsbCkKLQkJCXJ1bnRpbWUgPSBTZXJ2ZXJDb3JlLmZpbmRSdW50aW1lKHJ1bnRpbWVJZCk7Ci0JCQotCQlTdHJpbmcgY29uZmlnUGF0aCA9IGdldEF0dHJpYnV0ZShDT05GSUdVUkFUSU9OX0lELCAoU3RyaW5nKW51bGwpOwotCQljb25maWd1cmF0aW9uID0gbnVsbDsKLQkJaWYgKGNvbmZpZ1BhdGggIT0gbnVsbCkKLQkJCWNvbmZpZ3VyYXRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihuZXcgUGF0aChjb25maWdQYXRoKSk7Ci0KLQkJLy8gZm9yIG1pZ3JhdGlvbiBmcm9tIFdUUCAyLjAgLT4gV1RQIDMuMAotCQlpbnQgYXV0b1B1YlNldHRpbmcgPSBnZXRBdHRyaWJ1dGUoUFJPUF9BVVRPX1BVQkxJU0hfU0VUVElORywgQVVUT19QVUJMSVNIX1JFU09VUkNFKTsKLQkJaWYgKGF1dG9QdWJTZXR0aW5nID09IDApCi0JCQltYXAucHV0KFBST1BfQVVUT19QVUJMSVNIX1NFVFRJTkcsIEFVVE9fUFVCTElTSF9SRVNPVVJDRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWwoU2VydmVyV29ya2luZ0NvcHkgd2MpIHsKLQkJbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KHdjLm1hcCk7Ci0JCWNvbmZpZ3VyYXRpb24gPSB3Yy5jb25maWd1cmF0aW9uOwotCQlydW50aW1lID0gd2MucnVudGltZTsKLQkJc2VydmVyU3luY1N0YXRlID0gd2Muc2VydmVyU3luY1N0YXRlOwotCQkvL3Jlc3RhcnROZWVkZWQgPSB3Yy5yZXN0YXJ0TmVlZGVkOwotCQlzZXJ2ZXJUeXBlID0gd2Muc2VydmVyVHlwZTsKLQkJc3luY2hyb25pemVkKG1vZHVsZXNMb2NrKXsKLQkJCW1vZHVsZXMgPSB3Yy5tb2R1bGVzOwotCQl9Ci0JCQotCQkvLyBjYW4gbmV2ZXIgbW9kaWZ5IHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyB2aWEgdGhlIHdvcmtpbmcgY29weQotCQkvL3NlcnZlclN0YXRlID0gd2Muc2VydmVyU3RhdGU7Ci0JCWRlbGVnYXRlID0gd2MuZGVsZWdhdGU7Ci0JCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCWlmIChzZXJ2ZXJUeXBlICE9IG51bGwpCi0JCQltZW1lbnRvLnB1dFN0cmluZygic2VydmVyLXR5cGUiLCBzZXJ2ZXJUeXBlLmdldElkKCkpOwotCQkKLQkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkKLQkJCW1lbWVudG8ucHV0U3RyaW5nKENPTkZJR1VSQVRJT05fSUQsIGNvbmZpZ3VyYXRpb24uZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJZWxzZQotCQkJbWVtZW50by5wdXRTdHJpbmcoQ09ORklHVVJBVElPTl9JRCwgbnVsbCk7Ci0JCQotCQlpZiAocnVudGltZSAhPSBudWxsKQotCQkJbWVtZW50by5wdXRTdHJpbmcoUlVOVElNRV9JRCwgcnVudGltZS5nZXRJZCgpKTsKLQkJZWxzZQotCQkJbWVtZW50by5wdXRTdHJpbmcoUlVOVElNRV9JRCwgbnVsbCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyI2Nhbk1vZGlmeU1vZHVsZShvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5Nb2RpZnlNb2R1bGVzKElNb2R1bGVbXSBhZGQsIElNb2R1bGVbXSByZW1vdmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoKGFkZCA9PSBudWxsIHx8IGFkZC5sZW5ndGggPT0gMCkgJiYgKHJlbW92ZSA9PSBudWxsIHx8IHJlbW92ZS5sZW5ndGggPT0gMCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBZGQgYW5kIHJlbW92ZSBjYW5ub3QgYm90aCBiZSBudWxsL2VtcHR5Iik7Ci0JCQotCQlpZiAoYWRkICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gYWRkLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCWlmIChhZGRbaV0gPT0gbnVsbCkKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGFkZCBudWxsIGVudHJpZXMiKTsKLQkJfQotCQkKLQkJaWYgKHJlbW92ZSAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHJlbW92ZS5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQlpZiAocmVtb3ZlW2ldID09IG51bGwpCi0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCByZW1vdmUgbnVsbCBlbnRyaWVzIik7Ci0JCX0KLQkJCi0JCWlmIChnZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yTWlzc2luZ0FkYXB0ZXIsIG51bGwpOwotCQkKLQkJaWYgKGFkZCAhPSBudWxsICYmIGFkZC5sZW5ndGggPiAwKSB7Ci0JCQlpbnQgc2l6ZSA9IGFkZC5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlNb2R1bGVUeXBlIG1vZHVsZVR5cGUgPSBhZGRbaV0uZ2V0TW9kdWxlVHlwZSgpOyAKLQkJCQlpZiAoIVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUoZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKSwgbW9kdWxlVHlwZSkpCi0JCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ2Fubm90QWRkTW9kdWxlLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IG1vZHVsZVR5cGUuZ2V0TmFtZSgpLCBtb2R1bGVUeXBlLmdldFZlcnNpb24oKSB9KSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUobW9uaXRvcikuY2FuTW9kaWZ5TW9kdWxlcyhhZGQsIHJlbW92ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTZXJ2ZXJQbHVnaW4ubG9nRXh0ZW5zaW9uRmFpbHVyZSh0b1N0cmluZygpLCBlKTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhck1vZHVsZUNhY2hlKCkgewotCQlzeW5jaHJvbml6ZWQgKG1vZHVsZXNMb2NrKXsKLQkJCW1vZHVsZXMgPSBudWxsOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIjZ2V0TW9kdWxlcygpCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKCkgewotCQlzeW5jaHJvbml6ZWQgKG1vZHVsZXNMb2NrKXsKLQkJCXJldHVybiBnZXRNb2R1bGVzV2l0aG91dExvY2soKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gZm9yIGdldE1vZHVsZXMgYnV0IHRoaXMgb25lIGRvZXMgbm90IGxvY2sgdGhlIG1vZHVsZXMgb2JqZWN0LiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGxvY2tpbmcgdGhlIG1vZHVsZXNMb2NrCi0JICogb2JqZWN0IHdoZW4gY2FsbGluZyB0aGlzIG1ldGhvZCBmb3IgdGhyZWFkIHNhZmUgaW1wbGVtZW50YXRpb24uCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlciNnZXRNb2R1bGVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSU1vZHVsZVtdIGdldE1vZHVsZXNXaXRob3V0TG9jaygpIHsKLQkJaWYgKG1vZHVsZXMgPT0gbnVsbCkgewotCQkJLy8gY29udmVydCBmcm9tIGF0dHJpYnV0ZQotCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBnZXRBdHRyaWJ1dGUoTU9EVUxFX0xJU1QsIChMaXN0PFN0cmluZz4pIG51bGwpOwotCQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCQlsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDEpOwotCQkJCi0JCQltb2R1bGVzID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPihsaXN0LnNpemUoKSArIDEpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIG1vZHVsZUlkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCVN0cmluZyBuYW1lID0gIjx1bmtub3duPiI7Ci0JCQkJaW50IGluZGV4ID0gbW9kdWxlSWQuaW5kZXhPZigiOjoiKTsKLQkJCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQkJCW5hbWUgPSBtb2R1bGVJZC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCQltb2R1bGVJZCA9IG1vZHVsZUlkLnN1YnN0cmluZyhpbmRleCsyKTsKLQkJCQl9Ci0JCQkJCi0JCQkJU3RyaW5nIG1vZHVsZVR5cGVJZCA9IG51bGw7Ci0JCQkJU3RyaW5nIG1vZHVsZVR5cGVWZXJzaW9uID0gbnVsbDsKLQkJCQlpbmRleCA9IG1vZHVsZUlkLmluZGV4T2YoIjo6Iik7Ci0JCQkJaWYgKGluZGV4ID4gMCkgewotCQkJCQlpbnQgaW5kZXgyID0gbW9kdWxlSWQuaW5kZXhPZigiOjoiLCBpbmRleCsxKTsKLQkJCQkJbW9kdWxlVHlwZUlkID0gbW9kdWxlSWQuc3Vic3RyaW5nKGluZGV4KzIsIGluZGV4Mik7Ci0JCQkJCW1vZHVsZVR5cGVWZXJzaW9uID0gbW9kdWxlSWQuc3Vic3RyaW5nKGluZGV4MisyKTsKLQkJCQkJbW9kdWxlSWQgPSBtb2R1bGVJZC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCX0KLQkJCQkKLQkJCQlJTW9kdWxlIG1vZHVsZSA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlKG1vZHVsZUlkKTsKLQkJCQlpZiAobW9kdWxlID09IG51bGwpIHsKLQkJCQkJSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSA9IG51bGw7Ci0JCQkJCWlmIChtb2R1bGVUeXBlSWQgIT0gbnVsbCkKLQkJCQkJCW1vZHVsZVR5cGUgPSBNb2R1bGVUeXBlLmdldE1vZHVsZVR5cGUobW9kdWxlVHlwZUlkLCBtb2R1bGVUeXBlVmVyc2lvbik7Ci0JCQkJCW1vZHVsZSA9IG5ldyBEZWxldGVkTW9kdWxlKG1vZHVsZUlkLCBuYW1lLCBtb2R1bGVUeXBlKTsKLQkJCQl9Ci0JCQkJbW9kdWxlcy5hZGQobW9kdWxlKTsKLQkJCX0KLQkJfQotCQkKLQkJTGlzdCBlbSA9IGdldEV4dGVybmFsTW9kdWxlcygpOwotCQlpZiAoZW0gPT0gbnVsbCB8fCBlbS5pc0VtcHR5KCkpIHsKLQkJCUlNb2R1bGVbXSBtb2R1bGVzMiA9IG5ldyBJTW9kdWxlW21vZHVsZXMuc2l6ZSgpXTsKLQkJCW1vZHVsZXMudG9BcnJheShtb2R1bGVzMik7Ci0JCQlyZXR1cm4gbW9kdWxlczI7Ci0JCX0KLQkJCi0JCUlNb2R1bGVbXSBtb2R1bGVzMiA9IG5ldyBJTW9kdWxlW21vZHVsZXMuc2l6ZSgpICsgZW0uc2l6ZSgpXTsKLQkJbW9kdWxlcy50b0FycmF5KG1vZHVsZXMyKTsKLQkJCi0JCU9iamVjdFtdIG9iaiA9IGVtLnRvQXJyYXkoKTsKLQkJU3lzdGVtLmFycmF5Y29weShvYmosIDAsIG1vZHVsZXMyLCBtb2R1bGVzLnNpemUoKSwgZW0uc2l6ZSgpKTsKLQkJCi0JCXJldHVybiBtb2R1bGVzMjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlciNnZXRNb2R1bGVTdGF0ZSgpCi0JICovCi0JcHVibGljIGludCBnZXRNb2R1bGVTdGF0ZShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCB8fCBtb2R1bGUubGVuZ3RoID09IDApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkiKTsKLQkJdHJ5IHsKLQkJCUludGVnZXIgaW4gPSBtb2R1bGVTdGF0ZS5nZXQoZ2V0S2V5KG1vZHVsZSkpOwotCQkJaWYgKGluICE9IG51bGwpCi0JCQkJcmV0dXJuIGluLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gU1RBVEVfVU5LTk9XTjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlciNnZXRNb2R1bGVTdGF0ZSgpCi0JICovCi0JcHVibGljIGludCBnZXRNb2R1bGVQdWJsaXNoU3RhdGUoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwgfHwgbW9kdWxlLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0JCXRyeSB7Ci0JCQlJbnRlZ2VyIGluID0gbW9kdWxlUHVibGlzaFN0YXRlLmdldChnZXRLZXkobW9kdWxlKSk7Ci0JCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQlyZXR1cm4gaW4uaW50VmFsdWUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBQVUJMSVNIX1NUQVRFX1VOS05PV047Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTZXJ2ZXIjZ2V0Q2hpbGRNb2R1bGUoSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0Q2hpbGRNb2R1bGVzKElNb2R1bGVbXSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9kdWxlID09IG51bGwgfHwgbW9kdWxlLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0JCXRyeSB7Ci0JCQlpbnQgaSA9IG1vZHVsZS5sZW5ndGggLSAxOwotCQkJaWYgKCFtb2R1bGVbaV0uaXNFeHRlcm5hbCgpICYmIChtb2R1bGVbaV0uZ2V0UHJvamVjdCgpID09IG51bGwgfHwgIW1vZHVsZVtpXS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpKQotCQkJCXJldHVybiBudWxsOwotCQkJCi0JCQlTZXJ2ZXJEZWxlZ2F0ZSBzZCA9IGdldERlbGVnYXRlKG1vbml0b3IpOwotCQkJaWYgKHNkID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlJTW9kdWxlW10gY2hpbGRyZW4gPSBzZC5nZXRDaGlsZE1vZHVsZXMobW9kdWxlKTsKLQkJCWlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA9PSAxICYmIGNoaWxkcmVuWzBdLmVxdWFscyhtb2R1bGVbbW9kdWxlLmxlbmd0aCAtIDFdKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVNlcnZlclBsdWdpbi5sb2dFeHRlbnNpb25GYWlsdXJlKHRvU3RyaW5nKCksIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNlcnZlciNnZXRSb290TW9kdWxlcyhJTW9kdWxlKQotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0Um9vdE1vZHVsZXMoSU1vZHVsZSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwiKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXREZWxlZ2F0ZShtb25pdG9yKS5nZXRSb290TW9kdWxlcyhtb2R1bGUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHNlKSB7Ci0JCQl0aHJvdyBzZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVNlcnZlclBsdWdpbi5sb2dFeHRlbnNpb25GYWlsdXJlKHRvU3RyaW5nKCksIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG1vZHVsZSBjYW4gYmUgcmVzdGFydGVkLgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBtb2R1bGUgY2FuIGJlCi0JICogICAgcmVzdGFydGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBkZXByZWNhdGVkIHVzZSBjYW5SZXN0YXJ0TW9kdWxlIG9yIGNhblB1Ymxpc2hNb2R1bGUKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5Db250cm9sTW9kdWxlKElNb2R1bGVbXSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewkJCi0JCXJldHVybiBjYW5SZXN0YXJ0TW9kdWxlKG1vZHVsZSxtb25pdG9yKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIjY2FuUmVzdGFydE1vZHVsZShvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVtdLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5SZXN0YXJ0TW9kdWxlKElNb2R1bGVbXSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9kdWxlID09IG51bGwgfHwgbW9kdWxlLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0JCXRyeSB7Ci0JCQlTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSBiZCA9IGdldEJlaGF2aW91ckRlbGVnYXRlKG1vbml0b3IpOwotCQkJaWYgKGJkID09IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JSZXN0YXJ0TW9kdWxlLCBudWxsKTsKLQkJCWJvb2xlYW4gYiA9IGJkLmNhblJlc3RhcnRNb2R1bGUobW9kdWxlKTsKLQkJCWlmIChiKQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU2VydmVyUGx1Z2luLmxvZ0V4dGVuc2lvbkZhaWx1cmUodG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JSZXN0YXJ0TW9kdWxlLCBudWxsKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIjY2FuUHVibGlzaE1vZHVsZShvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVtdLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5QdWJsaXNoTW9kdWxlKElNb2R1bGVbXSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9kdWxlID09IG51bGwgfHwgbW9kdWxlLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0JCXRyeSB7Ci0JCQlTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSBiZCA9IGdldEJlaGF2aW91ckRlbGVnYXRlKG1vbml0b3IpOwotCQkJaWYgKGJkID09IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoTW9kdWxlLCBudWxsKTsKLQkJCWJvb2xlYW4gYiA9IGJkLmNhblB1Ymxpc2hNb2R1bGUobW9kdWxlKTsKLQkJCWlmIChiKQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU2VydmVyUGx1Z2luLmxvZ0V4dGVuc2lvbkZhaWx1cmUodG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoTW9kdWxlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gbW9kdWxlIGlzIGluIHN5bmMgb24gdGhlIHNlcnZlci4gSXQgc2hvdWxkCi0JICogcmV0dXJuIHRydWUgaWYgdGhlIG1vZHVsZSBzaG91bGQgYmUgcmVzdGFydGVkIChpcyBvdXQgb2YKLQkgKiBzeW5jKSBvciBmYWxzZSBpZiB0aGUgbW9kdWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgcmVzdGFydGVkLgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE1vZHVsZVJlc3RhcnRTdGF0ZShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCB8fCBtb2R1bGUubGVuZ3RoID09IDApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkiKTsKLQkJdHJ5IHsKLQkJCUJvb2xlYW4gYiA9IG1vZHVsZVJlc3RhcnRTdGF0ZS5nZXQoZ2V0S2V5KG1vZHVsZSkpOwotCQkJaWYgKGIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYi5ib29sZWFuVmFsdWUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlhYnN0cmFjdCBjbGFzcyBPcGVyYXRpb25Db250ZXh0IHsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCXB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRpbWVvdXRNZXNzYWdlKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RmFpbHVyZU1lc3NhZ2UoKTsKLQl9Ci0JLyoqCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlIHRoYXQgdGhlIG9wZXJhdGlvbiBhcHBsaWVzIHRvLCBvciBudWxsIGZvciBhIHNlcnZlciBvcGVyYXRpb24KLQkgKiBAcGFyYW0gbW9uaXRvciBjYW5ub3QgYmUgbnVsbAotCSAqIEByZXR1cm4gdGhlIHN0YXR1cwotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bkFuZFdhaXQoZmluYWwgSU1vZHVsZVtdIG1vZHVsZSwgT3BlcmF0aW9uQ29udGV4dCBydW5uYWJsZSwgZmluYWwgaW50IG9wZXJhdGlvblRpbWVvdXQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmaW5hbCBib29sZWFuW10gbm90aWZpZWQgPSBuZXcgYm9vbGVhblsxXTsKLQkJSVNlcnZlckxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKLQkJCQlpbnQgZXZlbnRLaW5kID0gZXZlbnQuZ2V0S2luZCgpOwotCQkJCWlmICgoZXZlbnRLaW5kIHwgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSAhPSAwKSB7Ci0JCQkJCWlmICgobW9kdWxlID09IG51bGwgJiYgKGV2ZW50S2luZCB8IFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UpICE9IDApIHx8Ci0JCQkJCQkJKG1vZHVsZSAhPSBudWxsICYmIG1vZHVsZS5lcXVhbHMoZXZlbnQuZ2V0TW9kdWxlKCkpICYmIChldmVudEtpbmQgfCBTZXJ2ZXJFdmVudC5NT0RVTEVfQ0hBTkdFKSAhPSAwKSkgewotCQkJCQkJaW50IHN0YXRlID0gZ2V0U2VydmVyU3RhdGUoKTsKLQkJCQkJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQgfHwgc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7Ci0JCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgotCQkJCQkJCXN5bmNocm9uaXplZCAobm90aWZpZWQpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAicnVuQW5kV2FpdCBub3RpZnkiKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCW5vdGlmaWVkWzBdID0gdHJ1ZTsKLQkJCQkJCQkJCW5vdGlmaWVkLm5vdGlmeUFsbCgpOwotCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBub3RpZnlpbmcgcnVuQW5kV2FpdCIsIGUpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQkKLQkJY2xhc3MgVGltZXIgewotCQkJYm9vbGVhbiB0aW1lb3V0OwotCQkJYm9vbGVhbiBhbHJlYWR5RG9uZTsKLQkJfQotCQlmaW5hbCBUaW1lciB0aW1lciA9IG5ldyBUaW1lcigpOwotCQkKLQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yMiA9IG1vbml0b3I7Ci0JCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKCJTZXJ2ZXIgUnVuQW5kV2FpdCBUaW1lb3V0IikgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWludCB0b3RhbFRpbWVvdXQgPSBvcGVyYXRpb25UaW1lb3V0OwotCQkJCQlpZiAodG90YWxUaW1lb3V0IDwgMCkKLQkJCQkJCXRvdGFsVGltZW91dCA9IDE7Ci0JCQkJCWJvb2xlYW4gdXNlckNhbmNlbGxlZCA9IGZhbHNlOwotCQkJCQlpbnQgcmV0cnlQZXJpb2QgPSAxOwotCQkJCQl3aGlsZSAoIW5vdGlmaWVkWzBdICYmIHRvdGFsVGltZW91dCA+IDAgJiYgIXVzZXJDYW5jZWxsZWQgJiYgIXRpbWVyLmFscmVhZHlEb25lKSB7Ci0JCQkJCQkvLyBUaGUgb3BlcmF0aW9uVGltZW91dCBpcyBpbiBzZWNvbmRzLiAgVGhlcmVmb3JlLCBlYWNoIHJldHJ5IHBlcmlvZCBoYXZlIHRvIHdhaXQgZm9yIDEgc2VjLgotCQkJCQkJVGhyZWFkLnNsZWVwKHJldHJ5UGVyaW9kICogMTAwMCk7Ci0JCQkJCQlpZiAob3BlcmF0aW9uVGltZW91dCA+IDApCi0JCQkJCQkJdG90YWxUaW1lb3V0IC09IHJldHJ5UGVyaW9kOwotCQkJCQkJaWYgKCFub3RpZmllZFswXSAmJiAhdGltZXIuYWxyZWFkeURvbmUgJiYgbW9uaXRvcjIuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQkJLy8gdXNlciBjYW5jZWxlZAotCQkJCQkJCXVzZXJDYW5jZWxsZWQgPSB0cnVlOwotCQkJCQkJCWlmIChsYXVuY2ggIT0gbnVsbCAmJiAhbGF1bmNoLmlzVGVybWluYXRlZCgpKQotCQkJCQkJCQlsYXVuY2gudGVybWluYXRlKCk7Ly9UT0RPCi0JCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgotCQkJCQkJCXN5bmNocm9uaXplZCAobm90aWZpZWQpIHsKLQkJCQkJCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgInJ1bkFuZFdhaXQgdXNlciBjYW5jZWxsZWQiKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlub3RpZmllZFswXSA9IHRydWU7Ci0JCQkJCQkJCW5vdGlmaWVkLm5vdGlmeUFsbCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIXVzZXJDYW5jZWxsZWQgJiYgIXRpbWVyLmFscmVhZHlEb25lICYmICFub3RpZmllZFswXSkgewotCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgotCQkJCQkJc3luY2hyb25pemVkIChub3RpZmllZCkgewotCQkJCQkJCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgInJ1bkFuZFdhaXQgbm90aWZ5IHRpbWVvdXQiKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCF0aW1lci5hbHJlYWR5RG9uZSAmJiB0b3RhbFRpbWVvdXQgPD0gMCkKLQkJCQkJCQkJdGltZXIudGltZW91dCA9IHRydWU7Ci0JCQkJCQkJbm90aWZpZWRbMF0gPSB0cnVlOwotCQkJCQkJCW5vdGlmaWVkLm5vdGlmeUFsbCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIG5vdGlmeWluZyBydW5BbmRXYWl0IHRpbWVvdXQiLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCi0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJydW5BbmRXYWl0IDIiKTsKLQkJfQotCQotCQkvLyBkbyB0aGUgb3BlcmF0aW9uCi0JCXRyeSB7Ci0JCQlydW5uYWJsZS5ydW4obW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmVtb3ZlU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJdGltZXIuYWxyZWFkeURvbmUgPSB0cnVlOwotCQkJcmV0dXJuIGUuZ2V0U3RhdHVzKCk7Ci0JCX0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQl0aW1lci5hbHJlYWR5RG9uZSA9IHRydWU7Ci0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCX0KLQkJCi0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJydW5BbmRXYWl0IDMiKTsKLQkJfQotCQkKLQkJLy8gd2FpdCBmb3IgaXQhIHdhaXQgZm9yIGl0ISAuLi4KLQkJc3luY2hyb25pemVkIChub3RpZmllZCkgewotCQkJdHJ5IHsKLQkJCQl3aGlsZSAoIW5vdGlmaWVkWzBdICYmICFtb25pdG9yLmlzQ2FuY2VsZWQoKSAmJiAhdGltZXIudGltZW91dAotCQkJCQkJJiYgIShnZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCB8fCBnZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkpIHsKLQkJCQkJbm90aWZpZWQud2FpdCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3Igd2FpdGluZyBmb3Igb3BlcmF0aW9uIiwgZSk7Ci0JCQkJfQotCQkJfQotCQkJdGltZXIuYWxyZWFkeURvbmUgPSB0cnVlOwotCQl9Ci0JCXJlbW92ZVNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCi0JCWlmICh0aW1lci50aW1lb3V0KSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAxLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclN0YXJ0VGltZW91dCwgbmV3IFN0cmluZ1tdIHsgZ2V0TmFtZSgpLCAob3BlcmF0aW9uVGltZW91dCAvIDEwMDApICsgIiIgfSksIG51bGwpOwotCQl9Ci0JCQotCQlpZiAoIW1vbml0b3IuaXNDYW5jZWxlZCgpICYmIGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMiwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JTdGFydEZhaWxlZCwgZ2V0TmFtZSgpKSwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNlcnZlciNzdGFydE1vZHVsZShJTW9kdWxlW10sIElPcGVyYXRpb25MaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydE1vZHVsZShmaW5hbCBJTW9kdWxlW10gbW9kdWxlLCBmaW5hbCBJT3BlcmF0aW9uTGlzdGVuZXIgb3BMaXN0ZW5lcikgewotCQlpZiAobW9kdWxlID09IG51bGwgfHwgbW9kdWxlLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5IG9yIGVtcHR5Iik7Ci0JCQotCQlKb2IgbW9kdWxlSm9iID0gbmV3IFNlcnZlckpvYihOTFMuYmluZChNZXNzYWdlcy5qb2JTdGFydGluZywgbW9kdWxlWzBdLmdldE5hbWUoKSkpIHsKLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlyZXR1cm4gcnVuQW5kV2FpdChtb2R1bGUsIG5ldyBPcGVyYXRpb25Db250ZXh0KCkgewotCQkJCQlwdWJsaWMgU3RyaW5nIGdldEZhaWx1cmVNZXNzYWdlKCkgewotCQkJCQkJcmV0dXJuIE1lc3NhZ2VzLmVycm9yU3RhcnRGYWlsZWQ7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgU3RyaW5nIGdldFRpbWVvdXRNZXNzYWdlKCkgewotCQkJCQkJcmV0dXJuIE1lc3NhZ2VzLmVycm9yU3RhcnRUaW1lb3V0OwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZ2V0QmVoYXZpb3VyRGVsZWdhdGUobW9uaXRvcjIpLnN0YXJ0TW9kdWxlKG1vZHVsZSwgbW9uaXRvcjIpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHN0YXJ0TW9kdWxlKCkgIiArIHRvU3RyaW5nKCksCi0JCQkJCQkJCQkJZSk7Ci0JCQkJCQkJfQotCQkJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgZS5nZXRNZXNzYWdlKCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0sIGdldFN0YXJ0VGltZW91dCgpLCBtb25pdG9yKTsKLQkJCX0KLQkJfTsKLQkJaWYgKG9wTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJbW9kdWxlSm9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCW9wTGlzdGVuZXIuZG9uZShldmVudC5nZXRSZXN1bHQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJbW9kdWxlSm9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTZXJ2ZXIjc3RvcE1vZHVsZShJTW9kdWxlW10sIElPcGVyYXRpb25MaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wTW9kdWxlKGZpbmFsIElNb2R1bGVbXSBtb2R1bGUsIGZpbmFsIElPcGVyYXRpb25MaXN0ZW5lciBvcExpc3RlbmVyKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCB8fCBtb2R1bGUubGVuZ3RoID09IDApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkiKTsKLQkJCi0JCUpvYiBtb2R1bGVKb2IgPSBuZXcgU2VydmVySm9iKE5MUy5iaW5kKE1lc3NhZ2VzLmpvYlN0b3BwaW5nLCBtb2R1bGVbMF0uZ2V0TmFtZSgpKSkgewotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCXJldHVybiBydW5BbmRXYWl0KG1vZHVsZSwgbmV3IE9wZXJhdGlvbkNvbnRleHQoKSB7Ci0JCQkJCXB1YmxpYyBTdHJpbmcgZ2V0RmFpbHVyZU1lc3NhZ2UoKSB7Ci0JCQkJCQlyZXR1cm4gTWVzc2FnZXMuZXJyb3JTdG9wRmFpbGVkOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIFN0cmluZyBnZXRUaW1lb3V0TWVzc2FnZSgpIHsKLQkJCQkJCXJldHVybiBNZXNzYWdlcy5lcnJvclN0b3BGYWlsZWQ7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yMikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlnZXRCZWhhdmlvdXJEZWxlZ2F0ZShtb25pdG9yMikuc3RvcE1vZHVsZShtb2R1bGUsIG1vbml0b3IyKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSBzdG9wTW9kdWxlKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJCQkJCX0KLQkJCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIGUuZ2V0TWVzc2FnZSgpKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9LCBnZXRTdG9wVGltZW91dCgpLCBtb25pdG9yKTsKLQkJCX0KLQkJfTsKLQkJaWYgKG9wTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJbW9kdWxlSm9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCW9wTGlzdGVuZXIuZG9uZShldmVudC5nZXRSZXN1bHQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJbW9kdWxlSm9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTZXJ2ZXIjcmVzdGFydE1vZHVsZShJTW9kdWxlW10sIElPcGVyYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0YXJ0TW9kdWxlKGZpbmFsIElNb2R1bGVbXSBtb2R1bGUsIGZpbmFsIElPcGVyYXRpb25MaXN0ZW5lciBvcExpc3RlbmVyKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCB8fCBtb2R1bGUubGVuZ3RoID09IDApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkiKTsKLQkJCi0JCUpvYiBtb2R1bGVKb2IgPSBuZXcgU2VydmVySm9iKE5MUy5iaW5kKE1lc3NhZ2VzLmpvYlJlc3RhcnRpbmcsIG1vZHVsZVswXS5nZXROYW1lKCkpKSB7Ci0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJcmV0dXJuIHJ1bkFuZFdhaXQobW9kdWxlLCBuZXcgT3BlcmF0aW9uQ29udGV4dCgpIHsKLQkJCQkJcHVibGljIFN0cmluZyBnZXRGYWlsdXJlTWVzc2FnZSgpIHsKLQkJCQkJCXJldHVybiBNZXNzYWdlcy5lcnJvclJlc3RhcnRGYWlsZWQ7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgU3RyaW5nIGdldFRpbWVvdXRNZXNzYWdlKCkgewotCQkJCQkJcmV0dXJuIE1lc3NhZ2VzLmVycm9yUmVzdGFydFRpbWVvdXQ7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yMikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlnZXRCZWhhdmlvdXJEZWxlZ2F0ZShtb25pdG9yMikucmVzdGFydE1vZHVsZShtb2R1bGUsIG1vbml0b3IyKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLAotCQkJCQkJCQkJCSJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHJlc3RhcnRNb2R1bGUoKSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQkJCQkJfQotCQkJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgZS5nZXRNZXNzYWdlKCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0sIGdldFN0b3BUaW1lb3V0KCkgKyBnZXRTdGFydFRpbWVvdXQoKSwgbW9uaXRvcik7Ci0JCQl9Ci0JCX07Ci0JCWlmIChvcExpc3RlbmVyICE9IG51bGwpIHsKLQkJCW1vZHVsZUpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlvcExpc3RlbmVyLmRvbmUoZXZlbnQuZ2V0UmVzdWx0KCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCW1vZHVsZUpvYi5zY2hlZHVsZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgSVNlcnZlclBvcnRzIHRoYXQgdGhpcyBzZXJ2ZXIgaGFzLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIHNlcnZlcnMgcG9ydHMKLQkgKi8KLQlwdWJsaWMgU2VydmVyUG9ydFtdIGdldFNlcnZlclBvcnRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKG1vbml0b3IpLmdldFNlcnZlclBvcnRzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTZXJ2ZXJQbHVnaW4ubG9nRXh0ZW5zaW9uRmFpbHVyZSh0b1N0cmluZygpLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVmlzaXQgYWxsIHRoZSBtb2R1bGVzIGluIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgZ2l2ZW4gbW9kdWxlIHZpc2l0b3IuCi0JICogCi0JICogQHBhcmFtIHZpc2l0b3IgdGhlIHZpc2l0b3IKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICovCi0JcHVibGljIHZvaWQgdmlzaXQoSU1vZHVsZVZpc2l0b3IgdmlzaXRvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmICh2aXNpdG9yID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWaXNpdG9yIGNhbm5vdCBiZSBudWxsIik7Ci0JCQotCQlJTW9kdWxlW10gbW9kdWxlczIgPSBnZXRNb2R1bGVzKCk7Ci0JCWlmIChtb2R1bGVzMiAhPSBudWxsKSB7IAotCQkJaW50IHNpemUgPSBtb2R1bGVzMi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmICghdmlzaXRNb2R1bGUobmV3IElNb2R1bGVbXSB7IG1vZHVsZXMyW2ldIH0sIHZpc2l0b3IsIG1vbml0b3IpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgdG8ga2VlcCB2aXNpdGluZywgYW5kIGZhbHNlIHRvIHN0b3AuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2aXNpdE1vZHVsZShJTW9kdWxlW10gbW9kdWxlLCBJTW9kdWxlVmlzaXRvciB2aXNpdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlpZiAoIXZpc2l0b3IudmlzaXQobW9kdWxlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCUlNb2R1bGVbXSBjaGlsZHJlbiA9IGdldENoaWxkTW9kdWxlcyhtb2R1bGUsIG1vbml0b3IpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlNb2R1bGVbXSBtb2R1bGUyID0gbmV3IElNb2R1bGVbbW9kdWxlLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkobW9kdWxlLCAwLCBtb2R1bGUyLCAwLCBtb2R1bGUubGVuZ3RoKTsKLQkJCQltb2R1bGUyW21vZHVsZS5sZW5ndGhdID0gY2hpbGRyZW5baV07Ci0JCQkJCi0JCQkJaWYgKCF2aXNpdE1vZHVsZShtb2R1bGUyLCB2aXNpdG9yLCBtb25pdG9yKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEtleShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCi0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBtb2R1bGUubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlzYi5hcHBlbmQoIiMiKTsKLQkJCQlzYi5hcHBlbmQobW9kdWxlW2ldLmdldElkKCkpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVTdGF0dXMoSU1vZHVsZVtdIG1vZHVsZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5sZW5ndGggPT0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSIpOwotCQltb2R1bGVTdGF0dXMucHV0KGdldEtleShtb2R1bGUpLCBzdGF0dXMpOwotCQlmaXJlTW9kdWxlU3RhdHVzQ2hhbmdlRXZlbnQobW9kdWxlKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRNb2R1bGVTdGF0dXMoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwgfHwgbW9kdWxlLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbW9kdWxlU3RhdHVzLmdldChnZXRLZXkobW9kdWxlKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZlclN0YXR1cyhJU3RhdHVzIHN0YXR1cykgewotCQlzZXJ2ZXJTdGF0dXMgPSBzdGF0dXM7Ci0JCWZpcmVTZXJ2ZXJTdGF0dXNDaGFuZ2VFdmVudCgpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGdldFNlcnZlclN0YXR1cygpIHsKLQkJcmV0dXJuIHNlcnZlclN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBTd2l0Y2ggdGhlIHNlcnZlcidzIGxvY2F0aW9uIGJldHdlZW4gdGhlIHdvcmtzcGFjZSBhbmQgLm1ldGFkYXRhLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3dpdGNoTG9jYXRpb24oU2VydmVyIHNlcnZlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGaWxlIGZpbGUgPSBzZXJ2ZXIuZ2V0RmlsZSgpOwotCQlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCXNlcnZlci5kZWxldGUoKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IFNlcnZlclR5cGUuZ2V0U2VydmVyUHJvamVjdCgpOwotCQkJZmlsZSA9IFNlcnZlclV0aWwuZ2V0VW51c2VkU2VydmVyRmlsZShwcm9qZWN0LCB3Yyk7Ci0JCQl3Yy5zZXRGaWxlKGZpbGUpOwotCQkJc2VydmVyLmZpbGUgPSBmaWxlOwotCQl9IGVsc2UgewotCQkJd2Muc2V0RmlsZShudWxsKTsKLQkJCXNlcnZlci5maWxlID0gbnVsbDsKLQkJfQotCQl3Yy5zYXZlKHRydWUsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNlcnZlciAoc2VlIFNFUlZFUl9YWFggY29uc3RhbnRzKSBhZnRlcgotCSAqIHJlZnJlc2hpbmcgdGhlIHN0YXRlIG9mIHRoZSBzZXJ2ZXIuIFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIG1ldGhvZAotCSAqIGFuZCB0aGUgbWV0aG9kIHdpdGhvdXQgYSBwcm9ncmVzcyBtb25pdG9yIGlzIHRoYXQgdGhpcyBtZXRob2QgbWF5IGNhdXNlCi0JICogcGx1Z2luIGxvYWRpbmcgYW5kIG5vdCByZXR1cm4gaW1tZWRpYXRlbHkuIEhvd2V2ZXIsIHRoZSBzZXJ2ZXIgd2lsbCBhbHdheXMKLQkgKiBiZSB1cGRhdGVkIGFuZCBpbiBzeW5jLCBzbyB0aGUgSVNlcnZlci5TVEFURV9VTktOT1dOIHN0YXRlIHNob3VsZCBuZXZlciBiZQotCSAqIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybiB0aGUgc2VydmVyIHN0YXRlCi0JICovCi0JcHVibGljIGludCBnZXRTZXJ2ZXJTdGF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJbG9hZEFkYXB0ZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuY2xhc3MsIG1vbml0b3IpOwotCQlyZXR1cm4gZ2V0U2VydmVyU3RhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBwdWJsaXNoSW1wbChpbnQga2luZCwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZXM0LCBJQWRhcHRhYmxlIGluZm8sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiLS0+LS0gUHVibGlzaGluZyB0byBzZXJ2ZXI6ICIgKyBTZXJ2ZXIudGhpcy50b1N0cmluZygpICsgIiAtLT4tLSIpOwotCQl9Ci0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJTZXJ2ZXIucHVibGlzaEltcGwoKToga2luZD08IiArIGdldFB1Ymxpc2hLaW5kU3RyaW5nKGtpbmQpICsgIj4gbW9kdWxlcz0iCi0JCQkJCSsgbW9kdWxlczQpOwotCQl9Ci0JCQotCQlzdG9wQXV0b1B1Ymxpc2goKTsKLQkJCi0JCXRyeSB7Ci0JCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWZpcmVQdWJsaXNoU3RhcnRlZCgpOwotCQkJCi0JCQlnZXRTZXJ2ZXJQdWJsaXNoSW5mbygpLnN0YXJ0Q2FjaGluZygpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQkJdHJ5IHsKLQkJCQlnZXRCZWhhdmlvdXJEZWxlZ2F0ZShtb25pdG9yKS5wdWJsaXNoKGtpbmQsIG1vZHVsZXM0LCBtb25pdG9yLCBpbmZvKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkVycm9yIGR1cmluZyBwdWJsaXNoaW5nIiwgY2UpOwotCQkJCX0KLQkJCQlzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLQkJCX0KLQkJCQotCQkJZmluYWwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZXMyID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlW10+KCk7Ci0JCQl2aXNpdChuZXcgSU1vZHVsZVZpc2l0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSU1vZHVsZVtdIG1vZHVsZSkgewotCQkJCQlpZiAoZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSkgPT0gSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpCi0JCQkJCQlnZXRTZXJ2ZXJQdWJsaXNoSW5mbygpLmZpbGwobW9kdWxlKTsKLQkJCQkJCi0JCQkJCW1vZHVsZXMyLmFkZChtb2R1bGUpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9LCBtb25pdG9yKTsKLQkJCQotCQkJZ2V0U2VydmVyUHVibGlzaEluZm8oKS5yZW1vdmVEZWxldGVkTW9kdWxlUHVibGlzaEluZm8oU2VydmVyLnRoaXMsIG1vZHVsZXMyKTsKLQkJCWdldFNlcnZlclB1Ymxpc2hJbmZvKCkuY2xlYXJDYWNoZSgpOwotCQkJZ2V0U2VydmVyUHVibGlzaEluZm8oKS5zYXZlKCk7Ci0JCQkKLQkJCWZpcmVQdWJsaXNoRmluaXNoZWQoU3RhdHVzLk9LX1NUQVRVUyk7Ci0JCQlpZiAoVHJhY2UuUEVSRk9STUFOQ0UpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfUEVSRk9STUFOQ0UsICJTZXJ2ZXIucHVibGlzaEltcGwoKTogPCIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKQotCQkJCQkJKyAiPiAiICsgZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotCQkJfQotCQkJcmV0dXJuIHN0YXR1czsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSBwdWJsaXNoKCkgIiArIFNlcnZlci50aGlzLnRvU3RyaW5nKCksIGUpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoaW5nLCBlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHJlc3RhcnRJbXBsKFN0cmluZyBsYXVuY2hNb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIlJlc3RhcnRpbmcgc2VydmVyOiAiICsgZ2V0TmFtZSgpKTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJLy8gc3luY2hyb25vdXMgcmVzdGFydAotCQkJCXJlc3RhcnRJbXBsMihsYXVuY2hNb2RlLCBtb25pdG9yKTsKLQkJCQkKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlpZiAoY2UuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpICE9IC0xKSB7Ci0JCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHJlc3RhcnQoKSAiICsgU2VydmVyLnRoaXMudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNlLmdldFN0YXR1cygpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGlmIHJlc3RhcnQgaXMgbm90IGltcGxlbWVudGVkIGJ5IHRoZSBzZXJ2ZXIgYWRvcHRlcgotCQkJLy8gbGV0cyBwcm92aWRlIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotCQkJc3RvcChmYWxzZSk7Ci0JCQlzdGFydChsYXVuY2hNb2RlLCBtb25pdG9yKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciByZXN0YXJ0aW5nIHNlcnZlciIsIGUpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JTdGFydEZhaWxlZCwgZ2V0TmFtZSgpKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogU3luY2hyb25lb3VzIHJlc3RhcnQuIFRocm93cyBhIGNvcmUgZXhjZXB0aW9uIGluIGNhc2UgdGhlIHRoZSBhZG9wdGVyIGRvZXNuJ3QgaW1wbGVtZW50IHJlc3RhcnQgCi0JICogQHBhcmFtIGxhdW5jaE1vZGUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4gSVN0YXR1cyAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyByZXN0YXJ0SW1wbDIoU3RyaW5nIGxhdW5jaE1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb257Ci0JCWZpbmFsIGJvb2xlYW5bXSBub3RpZmllZCA9IG5ldyBib29sZWFuWzFdOwotCQkKLQkJLy8gYWRkIGxpc3RlbmVyIHRvIHRoZSBzZXJ2ZXIKLQkJSVNlcnZlckxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKLQkJCQlpbnQgZXZlbnRLaW5kID0gZXZlbnQuZ2V0S2luZCgpOwotCQkJCUlTZXJ2ZXIgc2VydmVyID0gZXZlbnQuZ2V0U2VydmVyKCk7Ci0JCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKLQkJCQkJaW50IHN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0JCQkJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKLQkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKLQkJCQkJCXN5bmNocm9uaXplZCAobm90aWZpZWQpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAic3luY2hyb25vdXNSZXN0YXJ0IG5vdGlmeSIpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCW5vdGlmaWVkWzBdID0gdHJ1ZTsKLQkJCQkJCQkJbm90aWZpZWQubm90aWZ5QWxsKCk7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIG5vdGlmeWluZyBzZXJ2ZXIgcmVzdGFydCIsIGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQlmaW5hbCBpbnQgcmVzdGFydFRpbWVvdXQgPSAoZ2V0U3RhcnRUaW1lb3V0KCkgKiAxMDAwKSArIChnZXRTdG9wVGltZW91dCgpICogMTAwMCk7Ci0JCWNsYXNzIFRpbWVyIHsKLQkJCWJvb2xlYW4gdGltZW91dDsKLQkJCWJvb2xlYW4gYWxyZWFkeURvbmU7Ci0JCX0KLQkJZmluYWwgVGltZXIgdGltZXIgPSBuZXcgVGltZXIoKTsKLQkJCi0JCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjIgPSBtb25pdG9yOwotCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgiU2VydmVyIFJlc3RhcnQgVGltZW91dCIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpbnQgdG90YWxUaW1lb3V0ID0gcmVzdGFydFRpbWVvdXQ7Ci0JCQkJCWlmICh0b3RhbFRpbWVvdXQgPCAwKQotCQkJCQkJdG90YWxUaW1lb3V0ID0gMTsKLQkJCQkJYm9vbGVhbiB1c2VyQ2FuY2VsbGVkID0gZmFsc2U7Ci0JCQkJCWludCByZXRyeVBlcmlvZCA9IDI1MDA7Ci0JCQkJCXdoaWxlICghbm90aWZpZWRbMF0gJiYgdG90YWxUaW1lb3V0ID4gMCAmJiAhdXNlckNhbmNlbGxlZCAmJiAhdGltZXIuYWxyZWFkeURvbmUpIHsKLQkJCQkJCVRocmVhZC5zbGVlcChyZXRyeVBlcmlvZCk7Ci0JCQkJCQlpZiAocmVzdGFydFRpbWVvdXQgPiAwKQotCQkJCQkJCXRvdGFsVGltZW91dCAtPSByZXRyeVBlcmlvZDsKLQkJCQkJCWlmICghbm90aWZpZWRbMF0gJiYgIXRpbWVyLmFscmVhZHlEb25lICYmIG1vbml0b3IyLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJCS8vIHVzZXIgY2FuY2VsZWQgLSBzZXQgdGhlIHNlcnZlciBzdGF0ZSB0byBzdG9wcGVkCi0JCQkJCQkJdXNlckNhbmNlbGxlZCA9IHRydWU7Ci0JCQkJCQkJaWYgKGxhdW5jaCAhPSBudWxsICYmICFsYXVuY2guaXNUZXJtaW5hdGVkKCkpCi0JCQkJCQkJCWxhdW5jaC50ZXJtaW5hdGUoKTsKLQkJCQkJCQkvLyBub3RpZnkgd2FpdGVyCi0JCQkJCQkJc3luY2hyb25pemVkIChub3RpZmllZCkgewotCQkJCQkJCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAic3luY2hyb25vdXNSZXN0YXJ0IHVzZXIgY2FuY2VsbGVkIik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJbm90aWZpZWRbMF0gPSB0cnVlOwotCQkJCQkJCQlub3RpZmllZC5ub3RpZnlBbGwoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCF1c2VyQ2FuY2VsbGVkICYmICF0aW1lci5hbHJlYWR5RG9uZSAmJiAhbm90aWZpZWRbMF0pIHsKLQkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKLQkJCQkJCXN5bmNocm9uaXplZCAobm90aWZpZWQpIHsKLQkJCQkJCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJzeW5jaHJvbm91c1Jlc3RhcnQgbm90aWZ5IHRpbWVvdXQiKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCF0aW1lci5hbHJlYWR5RG9uZSAmJiB0b3RhbFRpbWVvdXQgPD0gMCkKLQkJCQkJCQkJdGltZXIudGltZW91dCA9IHRydWU7Ci0JCQkJCQkJbm90aWZpZWRbMF0gPSB0cnVlOwotCQkJCQkJCW5vdGlmaWVkLm5vdGlmeUFsbCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIG5vdGlmeWluZyBzZXJ2ZXIgcmVzdGFydCB0aW1lb3V0IiwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCXRocmVhZC5zdGFydCgpOwotCQkKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgInN5bmNocm9ub3VzUmVzdGFydCAyIik7Ci0JCX0KLQkJCi0JCS8vIGNhbGwgdGhlIGRlbGVnYXRlIHJlc3RhcnQKLQkJdHJ5IHsKLQkJCWdldEJlaGF2aW91ckRlbGVnYXRlKG51bGwpLnJlc3RhcnQobGF1bmNoTW9kZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmVtb3ZlU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJdGltZXIuYWxyZWFkeURvbmUgPSB0cnVlOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQl0aW1lci5hbHJlYWR5RG9uZSA9IHRydWU7Ci0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCX0KLQkJCi0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJzeW5jaHJvbm91c1Jlc3RhcnQgMyIpOwotCQl9Ci0JCQotCQkvLyB3YWl0IGZvciBpdCEgd2FpdCBmb3IgaXQhIC4uLgotCQlzeW5jaHJvbml6ZWQgKG5vdGlmaWVkKSB7Ci0JCQl0cnkgewotCQkJCXdoaWxlICghbm90aWZpZWRbMF0gJiYgIW1vbml0b3IuaXNDYW5jZWxlZCgpICYmICF0aW1lci50aW1lb3V0Ci0JCQkJCQkmJiAhKGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKSkgewotCQkJCQlub3RpZmllZC53YWl0KCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciB3YWl0aW5nIGZvciBzZXJ2ZXIgcmVzdGFydCIsIGUpOwotCQkJCX0KLQkJCX0KLQkJCXRpbWVyLmFscmVhZHlEb25lID0gdHJ1ZTsKLQkJfQotCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQlpZiAodGltZXIudGltZW91dCkgewotCQkJc3RvcChmYWxzZSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclJlc3RhcnRUaW1lb3V0LCBuZXcgU3RyaW5nW10geyBnZXROYW1lKCksIChyZXN0YXJ0VGltZW91dCAvIDEwMDApICsgIiIgfSksIG51bGwpOwotCQl9Ci0JCQotCQlpZiAoIW1vbml0b3IuaXNDYW5jZWxlZCgpICYmIGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JSZXN0YXJ0RmFpbGVkLCBnZXROYW1lKCkpLCBudWxsKTsKLQkJCi0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJzeW5jaHJvbm91c1Jlc3RhcnQgNCIpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyBzdGFydEltcGwoU3RyaW5nIGxhdW5jaE1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmaW5hbCBib29sZWFuW10gbm90aWZpZWQgPSBuZXcgYm9vbGVhblsxXTsKLQkJCi0JCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCi0JCS8vIGFkZCBsaXN0ZW5lciB0byB0aGUgc2VydmVyCi0JCUlTZXJ2ZXJMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJU2VydmVyTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKFNlcnZlckV2ZW50IGV2ZW50KSB7Ci0JCQkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKLQkJCQlJU2VydmVyIHNlcnZlciA9IGV2ZW50LmdldFNlcnZlcigpOwotCQkJCWlmIChldmVudEtpbmQgPT0gKFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UgfCBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UpKSB7Ci0JCQkJCWludCBzdGF0ZSA9IHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpOwotCQkJCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEIHx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgewotCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgotCQkJCQkJc3luY2hyb25pemVkIChub3RpZmllZCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJzeW5jaHJvbm91c1N0YXJ0IG5vdGlmeSIpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCW5vdGlmaWVkWzBdID0gdHJ1ZTsKLQkJCQkJCQkJbm90aWZpZWQubm90aWZ5QWxsKCk7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIG5vdGlmeWluZyBzZXJ2ZXIgc3RhcnQiLCBlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJYWRkU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQkKLQkJZmluYWwgaW50IHNlcnZlclRpbWVvdXQgPSBnZXRTdGFydFRpbWVvdXQoKSAqIDEwMDA7Ci0JCWNsYXNzIFRpbWVyIHsKLQkJCWJvb2xlYW4gdGltZW91dDsKLQkJCWJvb2xlYW4gYWxyZWFkeURvbmU7Ci0JCX0KLQkJZmluYWwgVGltZXIgdGltZXIgPSBuZXcgVGltZXIoKTsKLQkJCi0JCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjIgPSBtb25pdG9yOwotCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgiU2VydmVyIFN0YXJ0IFRpbWVvdXQiKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW50IHRvdGFsVGltZW91dCA9IHNlcnZlclRpbWVvdXQ7Ci0JCQkJCWlmICh0b3RhbFRpbWVvdXQgPCAwKQotCQkJCQkJdG90YWxUaW1lb3V0ID0gMTsKLQkJCQkJYm9vbGVhbiB1c2VyQ2FuY2VsbGVkID0gZmFsc2U7Ci0JCQkJCWludCByZXRyeVBlcmlvZCA9IDEwMDA7Ci0JCQkJCXdoaWxlICghbm90aWZpZWRbMF0gJiYgdG90YWxUaW1lb3V0ID4gMCAmJiAhdXNlckNhbmNlbGxlZCAmJiAhdGltZXIuYWxyZWFkeURvbmUpIHsKLQkJCQkJCVRocmVhZC5zbGVlcChyZXRyeVBlcmlvZCk7Ci0JCQkJCQlpZiAoc2VydmVyVGltZW91dCA+IDApCi0JCQkJCQkJdG90YWxUaW1lb3V0IC09IHJldHJ5UGVyaW9kOwotCQkJCQkJaWYgKCFub3RpZmllZFswXSAmJiAhdGltZXIuYWxyZWFkeURvbmUgJiYgbW9uaXRvcjIuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQkJLy8gdXNlciBjYW5jZWxlZCAtIHNldCB0aGUgc2VydmVyIHN0YXRlIHRvIHN0b3BwZWQKLQkJCQkJCQl1c2VyQ2FuY2VsbGVkID0gdHJ1ZTsKLQkJCQkJCQlpZiAobGF1bmNoICE9IG51bGwgJiYgIWxhdW5jaC5pc1Rlcm1pbmF0ZWQoKSkKLQkJCQkJCQkJbGF1bmNoLnRlcm1pbmF0ZSgpOwotCQkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKLQkJCQkJCQlzeW5jaHJvbml6ZWQgKG5vdGlmaWVkKSB7Ci0JCQkJCQkJCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJzeW5jaHJvbm91c1N0YXJ0IHVzZXIgY2FuY2VsbGVkIik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJbm90aWZpZWRbMF0gPSB0cnVlOwotCQkJCQkJCQlub3RpZmllZC5ub3RpZnlBbGwoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCF1c2VyQ2FuY2VsbGVkICYmICF0aW1lci5hbHJlYWR5RG9uZSAmJiAhbm90aWZpZWRbMF0pIHsKLQkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKLQkJCQkJCXN5bmNocm9uaXplZCAobm90aWZpZWQpIHsKLQkJCQkJCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJzeW5jaHJvbm91c1N0YXJ0IG5vdGlmeSB0aW1lb3V0Iik7Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghdGltZXIuYWxyZWFkeURvbmUgJiYgdG90YWxUaW1lb3V0IDw9IDApCi0JCQkJCQkJCXRpbWVyLnRpbWVvdXQgPSB0cnVlOwotCQkJCQkJCW5vdGlmaWVkWzBdID0gdHJ1ZTsKLQkJCQkJCQlub3RpZmllZC5ub3RpZnlBbGwoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBub3RpZnlpbmcgc2VydmVyIHN0YXJ0IHRpbWVvdXQiLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCi0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJzeW5jaHJvbm91c1N0YXJ0IDIiKTsKLQkJfQotCQotCQkvLyBzdGFydCB0aGUgc2VydmVyCi0JCXRyeSB7Ci0JCQlzdGFydEltcGwyKGxhdW5jaE1vZGUsIG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJlbW92ZVNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCXRpbWVyLmFscmVhZHlEb25lID0gdHJ1ZTsKLQkJCXJldHVybiBlLmdldFN0YXR1cygpOwotCQl9Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmVtb3ZlU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJdGltZXIuYWxyZWFkeURvbmUgPSB0cnVlOwotCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQl9Ci0JCQotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAic3luY2hyb25vdXNTdGFydCAzIik7Ci0JCX0KLQkJCi0JCS8vIHdhaXQgZm9yIGl0ISB3YWl0IGZvciBpdCEgLi4uCi0JCXN5bmNocm9uaXplZCAobm90aWZpZWQpIHsKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKCFub3RpZmllZFswXSAmJiAhbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgIXRpbWVyLnRpbWVvdXQKLQkJCQkJCSYmICEoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQgfHwgZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpKSB7Ci0JCQkJCW5vdGlmaWVkLndhaXQoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIHdhaXRpbmcgZm9yIHNlcnZlciBzdGFydCIsIGUpOwotCQkJCX0KLQkJCX0KLQkJCXRpbWVyLmFscmVhZHlEb25lID0gdHJ1ZTsKLQkJfQotCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQlpZiAodGltZXIudGltZW91dCkgewotCQkJc3RvcChmYWxzZSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclN0YXJ0VGltZW91dCwgbmV3IFN0cmluZ1tdIHsgZ2V0TmFtZSgpLCAoc2VydmVyVGltZW91dCAvIDEwMDApICsgIiIgfSksIG51bGwpOwotCQl9Ci0JCQotCQlpZiAoIW1vbml0b3IuaXNDYW5jZWxlZCgpICYmIGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JTdGFydEZhaWxlZCwgZ2V0TmFtZSgpKSwgbnVsbCk7Ci0JCQotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAic3luY2hyb25vdXNTdGFydCA0Iik7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RhcnRJbXBsMihTdHJpbmcgbW9kZTIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiU3RhcnRpbmcgc2VydmVyOiAiICsgU2VydmVyLnRoaXMudG9TdHJpbmcoKSArICIsIGxhdW5jaE1vZGU6ICIgKyBtb2RlMik7Ci0JCX0KLQkJU2F2ZUVkaXRvclByb21wdGVyIGVkaXRvckhlbHBlciA9IChTZXJ2ZXJQbHVnaW4uaXNSdW5uaW5nR1VJTW9kZSgpKSA/IFNlcnZlclBsdWdpbi5nZXRTYXZlRWRpdG9ySGVscGVyKCkgOiBudWxsOwotCQkvLyBtYWtlIHN1cmUgdGhhdCB0aGUgZGVsZWdhdGUgaXMgbG9hZGVkIGFuZCB0aGUgc2VydmVyIHN0YXRlIGlzIGNvcnJlY3QKLQkJbG9hZEFkYXB0ZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuY2xhc3MsIG1vbml0b3IpOwotCQkKLQkJdHJ5IHsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGxhdW5jaENvbmZpZyA9IGdldExhdW5jaENvbmZpZ3VyYXRpb24odHJ1ZSwgbW9uaXRvcik7Ci0JCQkKLQkJCWlmIChlZGl0b3JIZWxwZXIgIT0gbnVsbCl7Ci0JCQkJZWRpdG9ySGVscGVyLnNldERlYnVnTmV2ZXJTYXZlKCk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChsYXVuY2hDb25maWcgIT0gbnVsbCl7Ci0JCQkJbGF1bmNoID0gbGF1bmNoQ29uZmlnLmxhdW5jaChtb2RlMiwgbW9uaXRvcik7IC8vICwgdHJ1ZSk7IC0gY2F1c2VzIHdvcmtzcGFjZSBsb2NrCi0JCQl9Ci0JCQkKLQkJCWlmIChlZGl0b3JIZWxwZXIgIT0gbnVsbCl7Ci0JCQkJZWRpdG9ySGVscGVyLnNldERlYnVnT3JpZ2luYWxWYWx1ZSgpOwotCQkJfQotCQkJCi0JCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIkxhdW5jaDogIiArIGxhdW5jaCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBzdGFydGluZyBzZXJ2ZXIgIiArIFNlcnZlci50aGlzLnRvU3RyaW5nKCksIGUpOwotCQkJfQotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHN0b3BJbXBsKGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmaW5hbCBPYmplY3QgbXV0ZXggPSBuZXcgT2JqZWN0KCk7Ci0JCQotCQkvLyBhZGQgbGlzdGVuZXIgdG8gdGhlIHNlcnZlcgotCQlJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCkgewotCQkJCWludCBldmVudEtpbmQgPSBldmVudC5nZXRLaW5kKCk7Ci0JCQkJSVNlcnZlciBzZXJ2ZXIgPSBldmVudC5nZXRTZXJ2ZXIoKTsKLQkJCQlpZiAoZXZlbnRLaW5kID09IChTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFIHwgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSkgewotCQkJCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKTsKLQkJCQkJaWYgKFNlcnZlci50aGlzID09IHNlcnZlciAmJiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEIHx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkpIHsKLQkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKLQkJCQkJCXN5bmNocm9uaXplZCAobXV0ZXgpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQltdXRleC5ub3RpZnlBbGwoKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3Igbm90aWZ5aW5nIHNlcnZlciBzdG9wIiwgZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWFkZFNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCi0JCWNsYXNzIFRpbWVyIHsKLQkJCWJvb2xlYW4gdGltZW91dDsKLQkJCWJvb2xlYW4gYWxyZWFkeURvbmU7Ci0JCX0KLQkJZmluYWwgVGltZXIgdGltZXIgPSBuZXcgVGltZXIoKTsKLQkJCi0JCWZpbmFsIGludCBzZXJ2ZXJUaW1lb3V0ID0gZ2V0U3RvcFRpbWVvdXQoKSAqIDEwMDA7Ci0JCWlmIChzZXJ2ZXJUaW1lb3V0ID4gMCkgewotCQkJVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQoIlNlcnZlciBTdG9wIFRpbWVvdXQiKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJVGhyZWFkLnNsZWVwKHNlcnZlclRpbWVvdXQpOwotCQkJCQkJaWYgKCF0aW1lci5hbHJlYWR5RG9uZSkgewotCQkJCQkJCXRpbWVyLnRpbWVvdXQgPSB0cnVlOwotCQkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKLQkJCQkJCQlzeW5jaHJvbml6ZWQgKG11dGV4KSB7Ci0JCQkJCQkJCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJzdG9wIG5vdGlmeSB0aW1lb3V0Iik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJbXV0ZXgubm90aWZ5QWxsKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBub3RpZnlpbmcgc2VydmVyIHN0b3AgdGltZW91dCIsIGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCXRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCQl0aHJlYWQuc3RhcnQoKTsKLQkJfQotCQkKLQkJLy8gc3RvcCB0aGUgc2VydmVyCi0JCXN0b3BJbXBsMihmb3JjZSk7Ci0JCQotCQkvLyB3YWl0IGZvciBpdCEgd2FpdCBmb3IgaXQhCi0JCXN5bmNocm9uaXplZCAobXV0ZXgpIHsKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKCF0aW1lci50aW1lb3V0ICYmIGdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEICYmCi0JCQkJCQlnZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkKLQkJCQkJbXV0ZXgud2FpdCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciB3YWl0aW5nIGZvciBzZXJ2ZXIgc3RvcCIsIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQkvL2Nhbid0IHRocm93IGV4Y2VwdGlvbnMKLQkJLyppZiAodGltZXIudGltZW91dCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yU3RvcFRpbWVvdXQsIGdldE5hbWUoKSksIG51bGwpOwotCQllbHNlCi0JCQl0aW1lci5hbHJlYWR5RG9uZSA9IHRydWU7Ci0JCSovCi0JCWlmICghbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclN0b3BGYWlsZWQsIGdldE5hbWUoKSksIG51bGwpOwotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcEltcGwyKGJvb2xlYW4gZm9yY2UpIHsKLQkJaWYgKGdldFNlcnZlclN0YXRlKCkgPT0gU1RBVEVfU1RPUFBFRCkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJTdG9wcGluZyBzZXJ2ZXI6ICIgKyBTZXJ2ZXIudGhpcy50b1N0cmluZygpKTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCWdldEJlaGF2aW91ckRlbGVnYXRlKG51bGwpLnN0b3AoZm9yY2UpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSBzdG9wKCkgIiArIFNlcnZlci50aGlzLnRvU3RyaW5nKCksIGUpOwotCQkJfQotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSBzdG9wKCkgIiArIFNlcnZlci50aGlzLnRvU3RyaW5nKCksIHQpOwotCQkJfQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQlyZXR1cm4gKHJ1bGUgaW5zdGFuY2VvZiBJU2VydmVyIHx8IHJ1bGUgaW5zdGFuY2VvZiBTZXJ2ZXJTY2hlZHVsaW5nUnVsZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb25mbGljdGluZyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQlpZiAoIShydWxlIGluc3RhbmNlb2YgSVNlcnZlcikgJiYgIShydWxlIGluc3RhbmNlb2YgU2VydmVyU2NoZWR1bGluZ1J1bGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQlJU2VydmVyIHMgPSAoSVNlcnZlcikgcnVsZTsKLQkJCXJldHVybiB0aGlzLmVxdWFscyhzKTsKLQkJfQotCQlTZXJ2ZXJTY2hlZHVsaW5nUnVsZSBzc3J1bGUgPSAoU2VydmVyU2NoZWR1bGluZ1J1bGUpIHJ1bGU7Ci0JCXJldHVybiBzc3J1bGUuc2VydmVyLmVxdWFscyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRQdWJsaXNoS2luZFN0cmluZyhpbnQga2luZCl7Ci0JCWlmIChraW5kID09IElTZXJ2ZXIuUFVCTElTSF9BVVRPKXsKLQkJCXJldHVybiBQVUJMSVNIX0FVVE9fU1RSSU5HOwotCQl9Ci0JCWVsc2UgaWYgKGtpbmQgPT0gSVNlcnZlci5QVUJMSVNIX0NMRUFOKXsKLQkJCXJldHVybiBQVUJMSVNIX0NMRUFOX1NUUklORzsKLQkJfQotCQllbHNlIGlmIChraW5kID09IElTZXJ2ZXIuUFVCTElTSF9GVUxMKXsKLQkJCXJldHVybiBQVUJMSVNIX0ZVTExfU1RSSU5HOwotCQl9Ci0JCWVsc2UgaWYgKGtpbmQgPT0gSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMKXsKLQkJCXJldHVybiBQVUJMSVNIX0lOQ1JFTUVOVEFMX1NUUklORzsKLQkJfQotCQlyZXR1cm4gUFVCTElTSF9VTktPV047Ci0JfQotfSAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlckxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWU0OGQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlNlcnZlckxpZmVjeWNsZUFkYXB0ZXI7Ci0vKioKLSAqIExpc3RlbnMgZm9yIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlcnMuIFRoaXMgY2xhc3Mga2VlcHMKLSAqIHRyYWNrIG9mIHNlcnZlciBpbnN0YW5jZXMgY3VycmVudCBzdGF0ZSBhbmQgYW55IGNsaWVudHMKLSAqIHRoYXQgYXJlIHdhaXRpbmcgdG8gcnVuIG9uIHRoZSBzZXJ2ZXIuIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyTGlzdGVuZXIgZXh0ZW5kcyBTZXJ2ZXJMaWZlY3ljbGVBZGFwdGVyIGltcGxlbWVudHMgSVNlcnZlckxpc3RlbmVyIHsKLQkvLyBzdGF0aWMgaW5zdGFuY2UKLQlwcm90ZWN0ZWQgc3RhdGljIFNlcnZlckxpc3RlbmVyIGxpc3RlbmVyOwotCi0JLyoqCi0JICogU2VydmVyTGlzdGVuZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFNlcnZlckxpc3RlbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHN0YXRpYyBpbnN0YW5jZS4KLQkgKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLnBsdWdpbi5TZXJ2ZXJMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VydmVyTGlzdGVuZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJbGlzdGVuZXIgPSBuZXcgU2VydmVyTGlzdGVuZXIoKTsKLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24ncyBzeW5jIHN0YXRlIGNoYW5nZXMuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIubW9kZWwuSVNlcnZlcgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TeW5jU3RhdGVDaGFuZ2UoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEEgbmV3IHJlc291cmNlIGhhcyBiZWVuIGFkZGVkLgotCSAqCi0JICogQHBhcmFtIHNlcnZlciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNlcnZlckFkZGVkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXNlcnZlci5hZGRTZXJ2ZXJMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBBIGV4aXN0aW5nIHJlc291cmNlIGhhcyBiZWVuIHJlbW92ZWQuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgc2VydmVyUmVtb3ZlZChJU2VydmVyIHNlcnZlcikgewotCQlzZXJ2ZXIucmVtb3ZlU2VydmVyTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck1vbml0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck1vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U1NmFlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJNb25pdG9yIGltcGxlbWVudHMgSVNlcnZlck1vbml0b3IgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBTZXJ2ZXJNb25pdG9yRGVsZWdhdGUgZGVsZWdhdGU7Ci0KLQkvKioKLQkgKiBNb25pdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU2VydmVyTW9uaXRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgZGVmYXVsdCBzZXJ2ZXIuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNb25pdG9yI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImRlc2NyaXB0aW9uIik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNb25pdG9yI2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBsYWJlbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JCWlmIChsYWJlbCA9PSBudWxsKQotCQkJcmV0dXJuICJuL2EiOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNb25pdG9yI2dldERlbGVnYXRlKCkKLQkgKi8KLQlwdWJsaWMgU2VydmVyTW9uaXRvckRlbGVnYXRlIGdldERlbGVnYXRlKCkgewotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkZWxlZ2F0ZSA9IChTZXJ2ZXJNb25pdG9yRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSIgKyB0b1N0cmluZygpLCB0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0IG1vbml0b3JpbmcgdGhlIGdpdmVuIHBvcnQsIGFuZCByZXR1cm4gdGhlIHBvcnQgbnVtYmVyIHRvCi0JICogdHVubmVsIHJlcXVlc3RzIHRocm91Z2guCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBwb3J0IGEgcG9ydAotCSAqIEBwYXJhbSBtb25pdG9yUG9ydCB0aGUgcG9ydCB1c2VkIGZvciBtb25pdG9yaW5nCi0JICogQHJldHVybiB0aGUgcG9ydCB1c2VkIGZvciBtb25pdG9yaW5nCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgaW50IHN0YXJ0TW9uaXRvcmluZyhJU2VydmVyIHNlcnZlciwgU2VydmVyUG9ydCBwb3J0LCBpbnQgbW9uaXRvclBvcnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXREZWxlZ2F0ZSgpLnN0YXJ0TW9uaXRvcmluZyhzZXJ2ZXIsIHBvcnQsIG1vbml0b3JQb3J0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJdGhyb3cgY2U7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcCBtb25pdG9yaW5nIHRoZSBnaXZlbiBwb3J0LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gcG9ydCBhIHBvcnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wTW9uaXRvcmluZyhJU2VydmVyIHNlcnZlciwgU2VydmVyUG9ydCBwb3J0KSB7Ci0JCXRyeSB7Ci0JCQlnZXREZWxlZ2F0ZSgpLnN0b3BNb25pdG9yaW5nKHNlcnZlciwgcG9ydCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiTW9uaXRvclsiICsgZ2V0SWQoKSArICJdIjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJNb25pdG9yRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck1vbml0b3JEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2MzZDY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck1vbml0b3JEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotLyoqCi0gKiBBbiBpbnRlcmZhY2UgdG8gYSBUQ1AvSVAgbW9uaXRvci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlck1vbml0b3JEZWxlZ2F0ZSB7Ci0JLyoqCi0JICogU3RhcnQgbW9uaXRvcmluZyB0aGUgZ2l2ZW4gcG9ydCwgYW5kIHJldHVybiB0aGUgcG9ydCBudW1iZXIgdG8KLQkgKiB0dW5uZWwgcmVxdWVzdHMgdGhyb3VnaC4gVGhlIG1vbml0b3JQb3J0IGlzIHRoZSBuZXcgcG9ydCB0byB1c2UsIG9yCi0JICogLTEgdG8gcGljayBhIHJhbmRvbSBwb3J0LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gcG9ydCBhIHBvcnQKLQkgKiBAcGFyYW0gbW9uaXRvclBvcnQgdGhlIHBvcnQgdXNlZCBmb3IgbW9uaXRvcmluZwotCSAqIEByZXR1cm4gdGhlIHBvcnQgdXNlZCBmb3IgbW9uaXRvcmluZwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCBzdGFydE1vbml0b3JpbmcoSVNlcnZlciBzZXJ2ZXIsIFNlcnZlclBvcnQgcG9ydCwgaW50IG1vbml0b3JQb3J0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFN0b3AgbW9uaXRvcmluZyB0aGUgZ2l2ZW4gcG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHBhcmFtIHBvcnQgYSBwb3J0Ci0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc3RvcE1vbml0b3JpbmcoSVNlcnZlciBzZXJ2ZXIsIFNlcnZlclBvcnQgcG9ydCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyTW9uaXRvck1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck1vbml0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZGEzM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyTW9uaXRvck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlck1vbml0b3JNYW5hZ2VyIGltcGxlbWVudHMgSVNlcnZlck1vbml0b3JNYW5hZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9OSVRPUl9EQVRBX0ZJTEUgPSAibW9uaXRvcnMueG1sIjsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFNlcnZlck1vbml0b3JNYW5hZ2VyIGluc3RhbmNlOwotCi0JcHJvdGVjdGVkIExpc3Q8TW9uaXRvcmVkUG9ydD4gcG9ydHMgPSBuZXcgQXJyYXlMaXN0PE1vbml0b3JlZFBvcnQ+KCk7IAotCXByb3RlY3RlZCBTZXJ2ZXJNb25pdG9yIG1vbml0b3I7Ci0JCi0JY2xhc3MgTW9uaXRvcmVkUG9ydCBpbXBsZW1lbnRzIElNb25pdG9yZWRTZXJ2ZXJQb3J0IHsKLQkJcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOwotCQlwcm90ZWN0ZWQgU2VydmVyUG9ydCBwb3J0OwotCQlwcm90ZWN0ZWQgaW50IG5ld1BvcnQgPSAtMTsKLQkJcHJvdGVjdGVkIFN0cmluZ1tdIGNvbnRlbnQ7Ci0JCXB1YmxpYyBib29sZWFuIHN0YXJ0ZWQ7Ci0JCQotCQlwdWJsaWMgTW9uaXRvcmVkUG9ydChJU2VydmVyIHNlcnZlciwgU2VydmVyUG9ydCBwb3J0LCBpbnQgbmV3UG9ydCwgU3RyaW5nW10gY29udGVudCkgewotCQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCQl0aGlzLnBvcnQgPSBwb3J0OwotCQkJdGhpcy5uZXdQb3J0ID0gbmV3UG9ydDsKLQkJCXRoaXMuY29udGVudCA9IGNvbnRlbnQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBNb25pdG9yZWRQb3J0KElNZW1lbnRvIG1lbWVudG8sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJbG9hZChtZW1lbnRvLCBtb25pdG9yKTsKLQkJfQotCQkKLQkJcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCkgewotCQkJcmV0dXJuIHNlcnZlcjsKLQkJfQotCQkKLQkJcHVibGljIFNlcnZlclBvcnQgZ2V0U2VydmVyUG9ydCgpIHsKLQkJCXJldHVybiBwb3J0OwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGdldE1vbml0b3JQb3J0KCkgewotCQkJcmV0dXJuIG5ld1BvcnQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldE1vbml0b3JQb3J0KGludCBwKSB7Ci0JCQluZXdQb3J0ID0gcDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZ1tdIGdldENvbnRlbnRUeXBlcygpIHsKLQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCQlyZXR1cm4gY29udGVudDsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNTdGFydGVkKCkgewotCQkJcmV0dXJuIHN0YXJ0ZWQ7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHNldFN0YXJ0ZWQoYm9vbGVhbiBzKSB7Ci0JCQlzdGFydGVkID0gczsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIE1vbml0b3JlZFBvcnQpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCU1vbml0b3JlZFBvcnQgbXAgPSAoTW9uaXRvcmVkUG9ydCkgb2JqOwotCQkJaWYgKCFtcC5zZXJ2ZXIuZXF1YWxzKHNlcnZlcikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKCFtcC5wb3J0LmVxdWFscyhwb3J0KSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAobmV3UG9ydCAhPSBtcC5uZXdQb3J0KQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChjb250ZW50ID09IG51bGwgJiYgbXAuY29udGVudCAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChjb250ZW50ICE9IG51bGwgJiYgbXAuY29udGVudCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IGNvbnRlbnQubGVuZ3RoOwotCQkJCWlmIChzaXplICE9IG1wLmNvbnRlbnQubGVuZ3RoKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJCWlmICghY29udGVudFtpXS5lcXVhbHMobXAuY29udGVudFtpXSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gY2FuU2F2ZSgpIHsKLQkJCXJldHVybiAocG9ydC5nZXRJZCgpICE9IG51bGwpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBzYXZlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJCW1lbWVudG8ucHV0U3RyaW5nKCJzZXJ2ZXJJZCIsIHNlcnZlci5nZXRJZCgpKTsKLQkJCWlmIChuZXdQb3J0ICE9IC0xKQotCQkJCW1lbWVudG8ucHV0U3RyaW5nKCJwb3J0IiwgbmV3UG9ydCArICIiKTsKLQkJCW1lbWVudG8ucHV0U3RyaW5nKCJwb3J0SWQiLCBwb3J0LmdldElkKCkpOwotCQkJbWVtZW50by5wdXRCb29sZWFuKCJzdGFydGVkIiwgc3RhcnRlZCk7Ci0JCQkKLQkJCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJaW50IHNpemUgPSBjb250ZW50Lmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlpZiAoaSA+IDApCi0JCQkJCQlzYi5hcHBlbmQoIiwiKTsKLQkJCQkJc2IuYXBwZW5kKGNvbnRlbnRbaV0pOwotCQkJCX0KLQkJCQltZW1lbnRvLnB1dFN0cmluZygiY29udGVudFR5cGVzIiwgc2IudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIGxvYWQoSU1lbWVudG8gbWVtZW50bywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yMikgewotCQkJU3RyaW5nIHNlcnZlcklkID0gbWVtZW50by5nZXRTdHJpbmcoInNlcnZlcklkIik7Ci0JCQlzZXJ2ZXIgPSBudWxsOwotCQkJaWYgKHNlcnZlcklkICE9IG51bGwpCi0JCQkJc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlcklkKTsKLQkJCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2VydmVyIGNvdWxkIG5vdCBiZSBmb3VuZDogIiArIHNlcnZlcklkICsgIiAiICsgc2VydmVyKTsKLQkJCVN0cmluZyBuZXdQb3J0U3RyID0gbWVtZW50by5nZXRTdHJpbmcoInBvcnQiKTsKLQkJCWlmIChuZXdQb3J0U3RyICE9IG51bGwgJiYgbmV3UG9ydFN0ci5sZW5ndGgoKSA+IDApCi0JCQkJbmV3UG9ydCA9IEludGVnZXIucGFyc2VJbnQobmV3UG9ydFN0cik7Ci0JCQlTdHJpbmcgcG9ydElkID0gbWVtZW50by5nZXRTdHJpbmcoInBvcnRJZCIpOwotCQkJCi0JCQlTZXJ2ZXJQb3J0W10gcG9ydHMyID0gc2VydmVyLmdldFNlcnZlclBvcnRzKG1vbml0b3IyKTsKLQkJCWlmIChwb3J0czIgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gcG9ydHMyLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgcG9ydCA9PSBudWxsICYmIGkgPCBzaXplOyBpKyspIHsKLQkJCQkJU2VydmVyUG9ydCBzcCA9IHBvcnRzMltpXTsKLQkJCQkJaWYgKHNwLmdldElkKCkgIT0gbnVsbCAmJiBzcC5nZXRJZCgpLmVxdWFscyhwb3J0SWQpKQotCQkJCQkJcG9ydCA9IHNwOwotCQkJCX0KLQkJCX0KLQkJCWlmIChwb3J0ID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCByZWxvY2F0ZSBwb3J0OiAiICsgc2VydmVySWQgKyAiICIgKyBzZXJ2ZXIgKyAiICIgKyBwb3J0SWQpOwotCQkJCi0JCQlTdHJpbmcgcyA9IG1lbWVudG8uZ2V0U3RyaW5nKCJjb250ZW50VHlwZXMiKTsKLQkJCWlmIChzICE9IG51bGwpCi0JCQkJY29udGVudCA9IFNlcnZlclBsdWdpbi50b2tlbml6ZShzLCAiLCIpOwotCQkJCi0JCQlCb29sZWFuIGIgPSBtZW1lbnRvLmdldEJvb2xlYW4oInN0YXJ0ZWQiKTsKLQkJCWlmIChiICE9IG51bGwgJiYgYi5ib29sZWFuVmFsdWUoKSkgewotCQkJCXRyeSB7Ci0JCQkJCW5ld1BvcnQgPSBtb25pdG9yLnN0YXJ0TW9uaXRvcmluZyhzZXJ2ZXIsIHBvcnQsIG5ld1BvcnQpOwotCQkJCQlzdGFydGVkID0gdHJ1ZTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiQ291bGQgbm90IHJlc3RhcnQgc2VydmVyIG1vbml0b3IiLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTZXJ2ZXJNb25pdG9yTWFuYWdlcigpIHsKLQkJSVNlcnZlck1vbml0b3JbXSBtb25pdG9ycyA9IFNlcnZlclBsdWdpbi5nZXRTZXJ2ZXJNb25pdG9ycygpOwotCQlpZiAobW9uaXRvcnMgIT0gbnVsbCAmJiBtb25pdG9ycy5sZW5ndGggPiAwKQotCQkJbW9uaXRvciA9IChTZXJ2ZXJNb25pdG9yKSBtb25pdG9yc1swXTsKLQkJCi0JCWluc3RhbmNlID0gdGhpczsKLQkJbG9hZE1vbml0b3JzKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU2VydmVyTW9uaXRvck1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJbmV3IFNlcnZlck1vbml0b3JNYW5hZ2VyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNodXRkb3duKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW5zdGFuY2Uuc2F2ZU1vbml0b3JzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9uaXRvciB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyB1c2VkLgotCSAqICAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHNlcnZlciBtb25pdG9yCi0JICovCi0JcHVibGljIElTZXJ2ZXJNb25pdG9yIGdldEN1cnJlbnRTZXJ2ZXJNb25pdG9yKCkgewotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBTd2l0Y2ggdG8gdXNlIGEgZGlmZmVyZW50IHNlcnZlciBtb25pdG9yLiBBbGwgZXhpc3RpbmcgbW9uaXRvcnMgd2lsbCBiZQotCSAqIHJlbW92ZWQgZnJvbSB0aGUgY3VycmVudCBtb25pdG9yIGFuZCBhZGRlZCB0byB0aGUgbmV3IG1vbml0b3IuCi0JICogCi0JICogQHBhcmFtIG5ld01vbml0b3IKLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmVyTW9uaXRvcihJU2VydmVyTW9uaXRvciBuZXdNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgIk5vdCBpbXBsZW1lbnRlZCB5ZXQiLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBwb3J0cyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgbW9uaXRvcmVkLgotCSAqCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBtb25pdG9yZWQgc2VydmVyIHBvcnRzCi0JICovCi0JcHVibGljIElNb25pdG9yZWRTZXJ2ZXJQb3J0W10gZ2V0TW9uaXRvcmVkUG9ydHMoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJTGlzdDxJTW9uaXRvcmVkU2VydmVyUG9ydD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vbml0b3JlZFNlcnZlclBvcnQ+KCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcG9ydHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTW9uaXRvcmVkUG9ydCBtcCA9IChNb25pdG9yZWRQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobXAuc2VydmVyLmVxdWFscyhzZXJ2ZXIpKQotCQkJCWxpc3QuYWRkKG1wKTsKLQkJfQotCQkKLQkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgSU1vbml0b3JlZFNlcnZlclBvcnRbbGlzdC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgbW9uaXRvcmluZyB0aGUgZ2l2ZW4gcG9ydCwgYW5kIHJldHVybnMgdGhlIG5ldyBwb3J0ICMgdG8gdXNlIHRoYXQgd2lsbAotCSAqIHJvdXRlIHRvIHRoZSBtb25pdG9yZWQgcG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHBhcmFtIHBvcnQgYSBwb3J0Ci0JICogQHBhcmFtIG1vbml0b3JQb3J0IHRoZSBwb3J0IHVzZWQgZm9yIG1vbml0b3JpbmcKLQkgKiBAcGFyYW0gY29udGVudCB0aGUgY29udGVudAotCSAqIEByZXR1cm4gYSBtb25pdG9yZWQgc2VydmVyIHBvcnQKLQkgKi8KLQlwdWJsaWMgSU1vbml0b3JlZFNlcnZlclBvcnQgY3JlYXRlTW9uaXRvcihJU2VydmVyIHNlcnZlciwgU2VydmVyUG9ydCBwb3J0LCBpbnQgbW9uaXRvclBvcnQsIFN0cmluZ1tdIGNvbnRlbnQpIHsKLQkJaWYgKHBvcnQgPT0gbnVsbCB8fCBtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCU1vbml0b3JlZFBvcnQgbXAgPSBuZXcgTW9uaXRvcmVkUG9ydChzZXJ2ZXIsIHBvcnQsIG1vbml0b3JQb3J0LCBjb250ZW50KTsKLQkJcG9ydHMuYWRkKG1wKTsKLQkJcmV0dXJuIG1wOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbW9uaXRvcmluZyB0aGUgZ2l2ZW4gcG9ydC4gVGhyb3dzIGEgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtCi0JICogc3RvcHBpbmcgdGhlIG1vbml0b3JpbmcKLQkgKgotCSAqIEBwYXJhbSBwb3J0Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTW9uaXRvcihJTW9uaXRvcmVkU2VydmVyUG9ydCBwb3J0KSB7Ci0JCWlmIChwb3J0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdHJ5IHsKLQkJCXBvcnRzLnJlbW92ZShwb3J0KTsKLQkJCWlmIChwb3J0LmlzU3RhcnRlZCgpKQotCQkJCW1vbml0b3Iuc3RvcE1vbml0b3JpbmcocG9ydC5nZXRTZXJ2ZXIoKSwgcG9ydC5nZXRTZXJ2ZXJQb3J0KCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZCBub3QgcmVtb3ZlIG1vbml0b3IiLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFN0YXJ0IHRoZSBtb25pdG9yLiBJZiB0aGUgbXNwIHBvcnQgaXMgLTEsIGl0IHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgcG9ydCB0aGF0IGlzIGFjdHVhbGx5IGluIHVzZS4KLQkgKiAKLQkgKiBAcGFyYW0gbXNwCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRNb25pdG9yKElNb25pdG9yZWRTZXJ2ZXJQb3J0IG1zcCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobXNwID09IG51bGwgfHwgbXNwLmlzU3RhcnRlZCgpKQotCQkJcmV0dXJuOwotCQkKLQkJTW9uaXRvcmVkUG9ydCBwb3J0ID0gKE1vbml0b3JlZFBvcnQpIG1zcDsKLQkJcG9ydC5zZXRNb25pdG9yUG9ydChtb25pdG9yLnN0YXJ0TW9uaXRvcmluZyhtc3AuZ2V0U2VydmVyKCksIG1zcC5nZXRTZXJ2ZXJQb3J0KCksIG1zcC5nZXRNb25pdG9yUG9ydCgpKSk7Ci0JCXBvcnQuc2V0U3RhcnRlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIG1vbml0b3JpbmcuCi0JICogCi0JICogQHBhcmFtIG1zcAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BNb25pdG9yKElNb25pdG9yZWRTZXJ2ZXJQb3J0IG1zcCkgewotCQlpZiAobXNwID09IG51bGwgfHwgIW1zcC5pc1N0YXJ0ZWQoKSkKLQkJCXJldHVybjsKLQkJTW9uaXRvcmVkUG9ydCBwb3J0ID0gKE1vbml0b3JlZFBvcnQpIG1zcDsKLQkJbW9uaXRvci5zdG9wTW9uaXRvcmluZyhtc3AuZ2V0U2VydmVyKCksIG1zcC5nZXRTZXJ2ZXJQb3J0KCkpOwotCQlwb3J0LnNldFN0YXJ0ZWQoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hcHBlZCBwb3J0IHRvIHVzZSB3aGVuIG1ha2luZyByZXF1ZXN0cyB0byB0aGUgZ2l2ZW4gc2VydmVyCi0JICogYW5kIHBvcnQgbnVtYmVyLiBSZXR1cm5zIHRoZSBleGlzdGluZyBwb3J0IG51bWJlciBpZiB0aGUgcG9ydCBpcyBub3QgYmVpbmcKLQkgKiBtb25pdG9yZWQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBwb3J0IGEgcG9ydCBudW1iZXIKLQkgKiBAcGFyYW0gY29udGVudCB0aGUgY29udGVudAotCSAqIEByZXR1cm4gdGhlIHBvcnQgdXNlZCBmb3IgbW9uaXRvcmluZwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TW9uaXRvcmVkUG9ydChJU2VydmVyIHNlcnZlciwgaW50IHBvcnQsIFN0cmluZyBjb250ZW50KSB7Ci0JCXRyeSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHBvcnRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJTW9uaXRvcmVkUG9ydCBtcCA9IChNb25pdG9yZWRQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG1wLmlzU3RhcnRlZCgpICYmIG1wLnNlcnZlci5lcXVhbHMoc2VydmVyKSAmJiBtcC5wb3J0LmdldFBvcnQoKSA9PSBwb3J0KSB7Ci0JCQkJCVN0cmluZ1tdIGNvbnRlbnRUeXBlcyA9IG1wLmdldENvbnRlbnRUeXBlcygpOwotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCWlmIChjb250ZW50ICE9IG51bGwgJiYgY29udGVudFR5cGVzICE9IG51bGwgJiYgY29udGVudFR5cGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJCWludCBzaXplID0gY29udGVudFR5cGVzLmxlbmd0aDsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCQkJCWlmIChjb250ZW50LmVxdWFscyhjb250ZW50VHlwZXNbaV0pKQotCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCX0gZWxzZQotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlpZiAoZm91bmQgJiYgbXAubmV3UG9ydCAhPSAtMSkKLQkJCQkJCXJldHVybiBtcC5uZXdQb3J0OwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBwb3J0OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTW9uaXRvcnMoKSB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoTU9OSVRPUl9EQVRBX0ZJTEUpLnRvT1NTdHJpbmcoKTsKLQkJdHJ5IHsKLQkJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJtb25pdG9ycyIpOwotCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHBvcnRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJTW9uaXRvcmVkUG9ydCBtcCA9IChNb25pdG9yZWRQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG1wLmNhblNhdmUoKSkgewotCQkJCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoIm1vbml0b3IiKTsKLQkJCQkJbXAuc2F2ZShjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQltZW1lbnRvLnNhdmVUb0ZpbGUoZmlsZW5hbWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBzYXZpbmcgbW9uaXRvciBpbmZvIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9hZE1vbml0b3JzKCkgewotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiTG9hZGluZyBtb25pdG9yIGluZm8iKTsKLQkJfQotCQlTdHJpbmcgZmlsZW5hbWUgPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKE1PTklUT1JfREFUQV9GSUxFKS50b09TU3RyaW5nKCk7Ci0JCQotCQl0cnkgewotCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oZmlsZW5hbWUpOwotCQkJCi0JCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbigibW9uaXRvciIpOwotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJTW9uaXRvcmVkUG9ydCBtcCA9IG5ldyBNb25pdG9yZWRQb3J0KGNoaWxkcmVuW2ldLCBudWxsKTsKLQkJCQkJcG9ydHMuYWRkKG1wKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBtb25pdG9yOiAiICsgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgbW9uaXRvciBpbmZvIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJOb3RpZmljYXRpb25NYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJOb3RpZmljYXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNjY0NzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyTm90aWZpY2F0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckV2ZW50OwotLyoqCi0gKiBOb3RpZmljYXRpb24gbWFuYWdlciBmb3Igc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyTm90aWZpY2F0aW9uTWFuYWdlciB7Ci0JcHJpdmF0ZSBMaXN0PExpc3RlbmVyRW50cnk+IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdGVuZXJFbnRyeT4oKTsKLQotCS8qKgotCSAqIEZvciBtYXNraW5nIGV2ZW50IG9uIGFsbCBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTF9FVkVOVFMgPSAweEZGRkY7Ci0KLQlwcml2YXRlIGNsYXNzIExpc3RlbmVyRW50cnkgewotCQlwcml2YXRlIElTZXJ2ZXJMaXN0ZW5lciBsaXN0ZW5lcjsKLQkJcHJpdmF0ZSBpbnQgZXZlbnRNYXNrOwotCi0JCXByb3RlY3RlZCBMaXN0ZW5lckVudHJ5KElTZXJ2ZXJMaXN0ZW5lciBjdXJMaXN0ZW5lciwgaW50IGN1ckV2ZW50TWFzaykgewotCQkJbGlzdGVuZXIgPSBjdXJMaXN0ZW5lcjsKLQkJCWV2ZW50TWFzayA9IGN1ckV2ZW50TWFzazsKLQkJfQotCi0JCXByb3RlY3RlZCBJU2VydmVyTGlzdGVuZXIgZ2V0TGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbGlzdGVuZXI7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgaW50IGdldEV2ZW50TWFzaygpIHsKLQkJCXJldHVybiBldmVudE1hc2s7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbm90aWZpY2F0aW9uIG1hbmFnZXIuCi0JICovCi0JcHVibGljIFNlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVyIGZvciBhbGwgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBjdXJMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lciBjdXJMaXN0ZW5lcikgewotCQlhZGRMaXN0ZW5lcihjdXJMaXN0ZW5lciwgQUxMX0VWRU5UUyk7Ci0JfQotCQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lciBmb3IgdGhlIGV2ZW50cyBzcGVjaWZpZWQgYnkgdGhlIG1hc2suCi0JICogCi0JICogQHBhcmFtIGN1ckxpc3RlbmVyCi0JICogQHBhcmFtIGV2ZW50TWFzawotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lciBjdXJMaXN0ZW5lciwgaW50IGV2ZW50TWFzaykgewotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiLT4tIEFkZGluZyBzZXJ2ZXIgbGlzdGVuZXIgdG8gbm90aWZpY2F0aW9uIG1hbmFnZXI6ICIgKyBjdXJMaXN0ZW5lciArICIgIgotCQkJCQkrIGV2ZW50TWFzayArICIgLT4tIik7Ci0JCX0KLQkJaWYgKGN1ckxpc3RlbmVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxpc3QpIHsKLQkJCWxpc3RlbmVyTGlzdC5hZGQobmV3IExpc3RlbmVyRW50cnkoY3VyTGlzdGVuZXIsIGV2ZW50TWFzaykpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnJvYWRjYXN0Q2hhbmdlKFNlcnZlckV2ZW50IGV2ZW50KSB7Ci0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICItPi0gQnJvYWRjYXN0aW5nIHNlcnZlciBldmVudDogIiArIGV2ZW50ICsgIiAtPi0iKTsKLQkJfQotCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBldmVudEtpbmQgPSBldmVudC5nZXRLaW5kKCk7Ci0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICIgIFNlcnZlciBldmVudCBraW5kOiAiICsgZXZlbnRLaW5kICsgIiAtPi0iKTsKLQkJfQotCQkKLQkJLy8gb25seSBub3RpZnkgbGlzdGVuZXJzIHRoYXQgbGlzdGVuIHRvIG1vZHVsZSBldmVudAotCQlpbnQgc2l6ZTsKLQkJTGlzdGVuZXJFbnRyeVtdIGxpc3RlbmVyczsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxpc3QpIHsKLQkJCXNpemUgPSBsaXN0ZW5lckxpc3Quc2l6ZSgpOwotCQkJbGlzdGVuZXJzID0gbGlzdGVuZXJMaXN0LnRvQXJyYXkobmV3IExpc3RlbmVyRW50cnlbc2l6ZV0pOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlMaXN0ZW5lckVudHJ5IGN1ckVudHJ5ID0gbGlzdGVuZXJzW2ldOwotCQkJaW50IG1hc2sgPSBjdXJFbnRyeS5nZXRFdmVudE1hc2soKTsKLQkJCQotCQkJLy8gY2hlY2sgaWYgdGhlIHR5cGUgb2YgdGhlIGV2ZW50IG1hdGNoZXMgdGhlIG1hc2ssIGUuZy4gc2VydmVyIG9yIG1vZHVsZSBjaGFuZ2UKLQkJCWJvb2xlYW4gaXNUeXBlTWF0Y2ggPSAoKG1hc2sgJiBldmVudEtpbmQgJiBTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFKSAhPSAwKSAKLQkJCQkJfHwgKChtYXNrICYgZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuTU9EVUxFX0NIQU5HRSkgIT0gMCk7Ci0JCQkvLyBjaGVjayB0aGUga2luZCBvZiBjaGFuZ2UKLQkJCS8vIHRha2Ugb3V0IHRoZSBTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFIGJpdCBhbmQgU2VydmVyRXZlbnQuTU9EVUxFX0NIQU5HRSBiaXQKLQkJCWludCBraW5kT25seSA9IChldmVudEtpbmQgfCBTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFIHwgU2VydmVyRXZlbnQuTU9EVUxFX0NIQU5HRSkgXiBTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFIF4gU2VydmVyRXZlbnQuTU9EVUxFX0NIQU5HRTsKLQkJCWJvb2xlYW4gaXNLaW5kTWF0Y2ggPSAobWFzayAmIGtpbmRPbmx5KSAhPSAwOwotCQkJCi0JCQlpZiAoaXNUeXBlTWF0Y2ggJiYgaXNLaW5kTWF0Y2gpIHsKLQkJCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICItPi0gRmlyaW5nIHNlcnZlciBldmVudCB0byBsaXN0ZW5lcjogIiArIGN1ckVudHJ5LmdldExpc3RlbmVyKCkKLQkJCQkJCQkrICIgLT4tIik7Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCWlmIChUcmFjZS5MSVNURU5FUlMpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19MSVNURU5FUlMsCi0JCQkJCQkJCSIgIEZpcmluZyBzZXJ2ZXIgZXZlbnQgdG8gbGlzdGVuZXI6ICIgKyBjdXJFbnRyeS5nZXRMaXN0ZW5lcigpKTsKLQkJCQkJfQotCQkJCQljdXJFbnRyeS5nZXRMaXN0ZW5lcigpLnNlcnZlckNoYW5nZWQoZXZlbnQpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICIgIEVycm9yIGZpcmluZyBzZXJ2ZXIgZXZlbnQ6ICIgKyBjdXJFbnRyeS5nZXRMaXN0ZW5lcigpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoVHJhY2UuTElTVEVORVJTKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19MSVNURU5FUlMsICItPC0gRG9uZSBmaXJpbmcgc2VydmVyIGV2ZW50IC08LSIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiLTwtIERvbmUgYnJvYWRjYXN0aW5nIHNlcnZlciBldmVudCAtPC0iKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGlzdGVuZXIgbGlzdCBpcyBlbXB0eSwgb3IgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbGlzdGVuZXIgbGlzdCBpcyBlbXB0eSwgb3IgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBsaXN0ZW5lckxpc3QuaXNFbXB0eSgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIGZyb20gbm90aWZpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjdXJMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lciBjdXJMaXN0ZW5lcikgewotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiLT4tIFJlbW92aW5nIHNlcnZlciBsaXN0ZW5lciBmcm9tIG5vdGlmaWNhdGlvbiBtYW5hZ2VyOiAiICsgY3VyTGlzdGVuZXIKLQkJCQkJKyAiIC0+LSIpOwotCQl9Ci0JCWlmIChjdXJMaXN0ZW5lciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxpc3QpIHsKLQkJCUxpc3RlbmVyRW50cnkgbWF0Y2hlZExpc3RlbmVyRW50cnkgPSBudWxsOwotCQkJSXRlcmF0b3IgbGlzdGVuZXJJdGVyID0gbGlzdGVuZXJMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAobWF0Y2hlZExpc3RlbmVyRW50cnkgPT0gbnVsbCAmJiBsaXN0ZW5lckl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJTGlzdGVuZXJFbnRyeSBjdXJFbnRyeSA9IChMaXN0ZW5lckVudHJ5KWxpc3RlbmVySXRlci5uZXh0KCk7Ci0JCQkJaWYgKGN1ckxpc3RlbmVyLmVxdWFscyhjdXJFbnRyeS5nZXRMaXN0ZW5lcigpKSkgewotCQkJCQltYXRjaGVkTGlzdGVuZXJFbnRyeSA9IGN1ckVudHJ5OwotCQkJCX0KLQkJCX0KLQkJCWlmIChtYXRjaGVkTGlzdGVuZXJFbnRyeSAhPSBudWxsKQotCQkJCWxpc3RlbmVyTGlzdC5yZW1vdmUobWF0Y2hlZExpc3RlbmVyRW50cnkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYWZiZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRlYnVnLkRlYnVnT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGVidWcuRGVidWdPcHRpb25zTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi0vKioKLSAqIFRoZSBtYWluIHNlcnZlciBwbHVnaW4gY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfUFJFRl9GSUxFID0gIi5zZXJ2ZXJQcmVmZXJlbmNlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFX1NFUlZFUl9BREFQVEVSUyA9ICJleGNsdWRlU2VydmVyQWRhcHRlcnMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUlVOVElNRV9NT0RVTEVfVFlQRSA9ICJydW50aW1lTW9kdWxlVHlwZSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hVVERPV05fSk9CX0ZBTUlMWSA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuZmFtaWx5IjsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0lTVFJZX0pPQl9GQU1JTFkgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5yZWdpc3RyeS5mYW1pbHkiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEYXRlRm9ybWF0IGRmID0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKERhdGVGb3JtYXQuU0hPUlQsIERhdGVGb3JtYXQuU0hPUlQpOwotCXByb3RlY3RlZCBzdGF0aWMgaW50IG51bSA9IDA7Ci0KLQkvLyBjYWNoZWQgY29weSBvZiBhbGwgbGF1bmNoYWJsZSBhZGFwdGVycwotCXByaXZhdGUgc3RhdGljIExpc3Q8TGF1bmNoYWJsZUFkYXB0ZXI+IGxhdW5jaGFibGVBZGFwdGVyczsKLQotCS8vIGNhY2hlZCBjb3B5IG9mIGFsbCBsYXVuY2hhYmxlIGNsaWVudHMKLQlwcml2YXRlIHN0YXRpYyBMaXN0PElDbGllbnQ+IGNsaWVudHM7Ci0KLQkvLyBjYWNoZWQgY29weSBvZiBhbGwgbW9kdWxlIGZhY3RvcmllcwotCXByaXZhdGUgc3RhdGljIExpc3Q8TW9kdWxlRmFjdG9yeT4gbW9kdWxlRmFjdG9yaWVzOwotCi0JLy8gc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKLQlwcml2YXRlIHN0YXRpYyBTZXJ2ZXJQbHVnaW4gc2luZ2xldG9uOwotCi0JLy8gY2FjaGVkIGNvcHkgb2YgYWxsIHB1Ymxpc2ggdGFza3MKLQlwcml2YXRlIHN0YXRpYyBMaXN0PElQdWJsaXNoVGFzaz4gcHVibGlzaFRhc2tzOwotCQotCS8vIGNhY2hlZCBjb3B5IG9mIGFsbCBwdWJsaXNoIHRhc2tzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxQdWJsaXNoQ29udHJvbGxlcj4gcHVibGlzaENvbnRyb2xsZXJzOwotCi0JLy8gY2FjaGVkIGNvcHkgb2YgYWxsIHB1Ymxpc2hlcnMKLQlwcml2YXRlIHN0YXRpYyBMaXN0PFB1Ymxpc2hlcj4gcHVibGlzaGVyczsKLQotCS8vCWNhY2hlZCBjb3B5IG9mIGFsbCBzZXJ2ZXIgbW9uaXRvcnMKLQlwcml2YXRlIHN0YXRpYyBMaXN0PElTZXJ2ZXJNb25pdG9yPiBtb25pdG9yczsKLQotCS8vCWNhY2hlZCBjb3B5IG9mIGFsbCBydW50aW1lIGxvY2F0b3JzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxJUnVudGltZUxvY2F0b3I+IHJ1bnRpbWVMb2NhdG9yczsKLQotCS8vIGNhY2hlZCBjb3B5IG9mIGFsbCBtb2R1bGUgYXJ0aWZhY3QgYWRhcHRlcnMKLQlwcml2YXRlIHN0YXRpYyBMaXN0PE1vZHVsZUFydGlmYWN0QWRhcHRlcj4gbW9kdWxlQXJ0aWZhY3RBZGFwdGVyczsKLQotCS8vCWNhY2hlZCBjb3B5IG9mIGFsbCBpbnN0YWxsYWJsZSBydW50aW1lcwotCXByaXZhdGUgc3RhdGljIExpc3Q8SUluc3RhbGxhYmxlUnVudGltZT4gaW5zdGFsbGFibGVSdW50aW1lczsKLQotCS8vIGNhY2hlZCBjb3B5IG9mIFNhdmVFZGl0b3JQcm9tcHRlcgotCXByaXZhdGUgc3RhdGljIFNhdmVFZGl0b3JQcm9tcHRlciBzYXZlRWRpdG9yUHJvbXB0ZXI7Ci0JCi0JLy8gY2FjaGVkIGNvcHkgb2YgaXNSdW5uaW5nSW5HVUlDYWNoZQotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiBpc1J1bm5pbmdJbkdVSUNhY2hlID0gbnVsbDsKLQotCS8vIHJlZ2lzdHJ5IGxpc3RlbmVyCi0JcHJpdmF0ZSBzdGF0aWMgSVJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIgcmVnaXN0cnlMaXN0ZW5lcjsKLQkKLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dDsKLQotCS8vIGJ1bmRsZSBsaXN0ZW5lcgotCXByaXZhdGUgQnVuZGxlTGlzdGVuZXIgYnVuZGxlTGlzdGVuZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUF9EQVRBX0ZJTEUgPSAidG1wLWRhdGEueG1sIjsKLQotCWNsYXNzIFRlbXBEaXIgewotCQlTdHJpbmcgcGF0aDsKLQkJaW50IGFnZTsKLQkJYm9vbGVhbiByZWN5Y2xlID0gdHJ1ZTsKLQl9Ci0KLQkvLyB0ZW1wIGRpcmVjdG9yaWVzIC0gU3RyaW5nIGtleSB0byBUZW1wRGlyCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBUZW1wRGlyPiB0ZW1wRGlySGFzaDsKLQotCS8qKgotCSAqIHNlcnZlciBjb3JlIHBsdWdpbiBpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBTZXJ2ZXJQbHVnaW4uCi0JICovCi0JcHVibGljIFNlcnZlclBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJc2luZ2xldG9uID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0JICoKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5wbHVnaW4uU2VydmVyUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXJ2ZXJQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB0aGUgcmVxdWVzdG9yIGNhbiB1c2UKLQkgKiB0aHJvdWdob3V0IGl0J3MgbGlmZWN5Y2xlLiBUaGlzIGlzIHByaW1hcmlseSB0byBiZSB1c2VkIGJ5Ci0JICogc2VydmVyIGluc3RhbmNlcyBmb3Igd29ya2luZyBkaXJlY3RvcmllcywgaW5zdGFuY2Ugc3BlY2lmaWMKLQkgKiBmaWxlcywgZXRjLgotCSAqCi0JICogPHA+QXMgbG9uZyBhcyB0aGUgc2FtZSBrZXkgaXMgdXNlZCB0byBjYWxsIHRoaXMgbWV0aG9kIG9uCi0JICogZWFjaCB1c2Ugb2YgdGhlIHdvcmtiZW5jaCwgdGhpcyBtZXRob2QgZGlyZWN0b3J5IHdpbGwgcmV0dXJuCi0JICogdGhlIHNhbWUgZGlyZWN0b3J5LiBJZiB0aGUgZGlyZWN0b3J5IGlzIG5vdCByZXF1ZXN0ZWQgb3ZlciBhCi0JICogcGVyaW9kIG9mIHRpbWUsIHRoZSBkaXJlY3RvcnkgbWF5IGJlIGRlbGV0ZWQgYW5kIGEgbmV3IG9uZQotCSAqIHdpbGwgYmUgYXNzaWduZWQgb24gdGhlIG5leHQgcmVxdWVzdC4gRm9yIHRoaXMgcmVhc29uLCBhCi0JICogc2VydmVyIGluc3RhbmNlIHNob3VsZCByZXF1ZXN0IHRoZSB0ZW1wIGRpcmVjdG9yeSBvbiBzdGFydHVwCi0JICogaWYgaXQgd2FudHMgdG8gc3RvcmUgZmlsZXMgdGhlcmUuIEluIGFsbCBjYXNlcywgdGhlIGluc3RhbmNlCi0JICogc2hvdWxkIGhhdmUgYSBiYWNrdXAgcGxhbiBhbnl3YXksIGFzIHRoaXMgZGlyZWN0b3J5IG1heSBiZQotCSAqIGRlbGV0ZWQgYWNjaWRlbnRhbGx5LjwvcD4KLQkgKgotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuIGphdmEuaW8uRmlsZQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRUZW1wRGlyZWN0b3J5KFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldFRlbXBEaXJlY3Rvcnkoa2V5LCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB0aGUgcmVxdWVzdG9yIGNhbiB1c2UKLQkgKiB0aHJvdWdob3V0IGl0J3MgbGlmZWN5Y2xlLiBUaGlzIGlzIHByaW1hcmlseSB0byBiZSB1c2VkIGJ5Ci0JICogc2VydmVyIGluc3RhbmNlcyBmb3Igd29ya2luZyBkaXJlY3RvcmllcywgaW5zdGFuY2Ugc3BlY2lmaWMKLQkgKiBmaWxlcywgZXRjLgotCSAqCi0JICogPHA+QXMgbG9uZyBhcyB0aGUgc2FtZSBrZXkgaXMgdXNlZCB0byBjYWxsIHRoaXMgbWV0aG9kIG9uCi0JICogZWFjaCB1c2Ugb2YgdGhlIHdvcmtiZW5jaCwgdGhpcyBtZXRob2QgZGlyZWN0b3J5IHdpbGwgcmV0dXJuCi0JICogdGhlIHNhbWUgZGlyZWN0b3J5LiBJZiByZWN5Y2xpbmcgaXMgZW5hYmxlZCBhbmQgdGhlIGRpcmVjdG9yeQotCSAqIGlzIG5vdCByZXF1ZXN0ZWQgb3ZlciBhIHBlcmlvZCBvZiB0aW1lLCB0aGUgZGlyZWN0b3J5IG1heSBiZQotCSAqIGRlbGV0ZWQgYW5kIGEgbmV3IG9uZSB3aWxsIGJlIGFzc2lnbmVkIG9uIHRoZSBuZXh0IHJlcXVlc3QuCi0JICogSWYgdGhpcyBiZWhhdmlvciBpcyBub3QgZGVzaXJlZCwgcmVjeWNsaW5nIHNob3VsZCBiZSBkaXNhYmxlZC48L3A+Ci0JICoKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHBhcmFtIHJlY3ljbGUgdHJ1ZSBpZiBkaXJlY3RvcnkgbWF5IGJlIGRlbGV0ZWQgaWYgbm90IHVzZWQKLQkgKiBvdmVyIGEgcGVyaW9kIG9mIHRpbWUKLQkgKiBAcmV0dXJuIGphdmEuaW8uRmlsZQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRUZW1wRGlyZWN0b3J5KFN0cmluZyBrZXksIGJvb2xlYW4gcmVjeWNsZSkgewotCQlpZiAoa2V5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkKLQkJLy8gZmlyc3QsIGxvb2sgdGhyb3VnaCBoYXNoIG9mIGN1cnJlbnQgZGlyZWN0b3JpZXMKLQkJSVBhdGggc3RhdGVQYXRoID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpOwotCQl0cnkgewotCQkJVGVtcERpciBkaXIgPSBnZXRUZW1wRGlycygpLmdldChrZXkpOwotCQkJaWYgKGRpciAhPSBudWxsKSB7Ci0JCQkJZGlyLmFnZSA9IDA7Ci0JCQkJLy8gSWYgcmVjeWNsZSBzdGF0dXMgbmVlZHMgY2hhbmdpbmcsIHVwZGF0ZQotCQkJCWlmIChkaXIucmVjeWNsZSAhPSByZWN5Y2xlKSB7Ci0JCQkJCWRpci5yZWN5Y2xlID0gcmVjeWNsZTsKLQkJCQkJc2F2ZVRlbXBEaXJJbmZvKCk7Ci0JCQkJfQotCQkJCXJldHVybiBzdGF0ZVBhdGguYXBwZW5kKGRpci5wYXRoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCi0JCS8vIG90aGVyd2lzZSwgY3JlYXRlIGEgbmV3IGRpcmVjdG9yeQotCQotCQkvLyBmaW5kIGZpcnN0IGZyZWUgZGlyZWN0b3J5Ci0JCVN0cmluZyBwYXRoID0gbnVsbDsKLQkJRmlsZSBkaXIgPSBudWxsOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAoZGlyID09IG51bGwgfHwgZGlyLmV4aXN0cygpKSB7Ci0JCQlwYXRoID0gInRtcCIgKyBjb3VudDsKLQkJCWRpciA9IHN0YXRlUGF0aC5hcHBlbmQocGF0aCkudG9GaWxlKCk7Ci0JCQljb3VudCArKzsKLQkJfQotCQotCQlkaXIubWtkaXJzKCk7Ci0JCi0JCVRlbXBEaXIgZCA9IG5ldyBUZW1wRGlyKCk7Ci0JCWQucGF0aCA9IHBhdGg7Ci0JCWQucmVjeWNsZSA9IHJlY3ljbGU7Ci0JCWdldFRlbXBEaXJzKCkucHV0KGtleSwgZCk7Ci0JCXNhdmVUZW1wRGlySW5mbygpOwotCQlyZXR1cm4gc3RhdGVQYXRoLmFwcGVuZChwYXRoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGEgdGVtcCBkaXJlY3RvcnkuCi0JICogQHBhcmFtIGtleQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVRlbXBEaXJlY3RvcnkoU3RyaW5nIGtleSkgewotCQlpZiAoa2V5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlJUGF0aCBzdGF0ZVBhdGggPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCk7Ci0JCXRyeSB7Ci0JCQlUZW1wRGlyIGRpciA9IGdldFRlbXBEaXJzKCkuZ2V0KGtleSk7Ci0JCQlpZiAoZGlyICE9IG51bGwpIHsKLQkJCQlnZXRUZW1wRGlycygpLnJlbW92ZShrZXkpOwotCQkJCXNhdmVUZW1wRGlySW5mbygpOwotCQkJCWRlbGV0ZURpcmVjdG9yeShzdGF0ZVBhdGguYXBwZW5kKGRpci5wYXRoKS50b0ZpbGUoKSwgbnVsbCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiQ291bGQgbm90IHJlbW92ZSB0ZW1wIGRpcmVjdG9yeSIsIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBUZW1wRGlyPiBnZXRUZW1wRGlycygpIHsKLQkJaWYgKHRlbXBEaXJIYXNoID09IG51bGwpCi0JCQlsb2FkVGVtcERpckluZm8oKTsKLQkJcmV0dXJuIHRlbXBEaXJIYXNoOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRUZW1wRGlySW5mbygpIHsKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIkxvYWRpbmcgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbmZvcm1hdGlvbiIpOwotCQl9Ci0JCUlQYXRoIHN0YXRlUGF0aCA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gc3RhdGVQYXRoLmFwcGVuZChURU1QX0RBVEFfRklMRSkudG9PU1N0cmluZygpOwotCQkKLQkJdGVtcERpckhhc2ggPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFRlbXBEaXI+KCk7Ci0JCXRyeSB7Ci0JCQlJTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5sb2FkTWVtZW50byhmaWxlbmFtZSk7Ci0JCQkKLQkJCUlNZW1lbnRvW10gY2hpbGRyZW4gPSBtZW1lbnRvLmdldENoaWxkcmVuKCJ0ZW1wLWRpcmVjdG9yeSIpOwotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVN0cmluZyBrZXkgPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoImtleSIpOwotCQkJCQotCQkJCVRlbXBEaXIgZCA9IG5ldyBUZW1wRGlyKCk7Ci0JCQkJZC5wYXRoID0gY2hpbGRyZW5baV0uZ2V0U3RyaW5nKCJwYXRoIik7Ci0JCQkJZC5hZ2UgPSBjaGlsZHJlbltpXS5nZXRJbnRlZ2VyKCJhZ2UiKS5pbnRWYWx1ZSgpOwotCQkJCUJvb2xlYW4gcmVjeWNsZSA9IGNoaWxkcmVuW2ldLmdldEJvb2xlYW4oInJlY3ljbGUiKTsKLQkJCQlpZiAocmVjeWNsZSAhPSBudWxsKSB7Ci0JCQkJCWQucmVjeWNsZSA9IHJlY3ljbGUuYm9vbGVhblZhbHVlKCk7Ci0JCQkJfQotCQkJCS8vIEFnZSBvbmx5IGlmIHJlY3ljbGluZyBpcyBlbmFibGVkCi0JCQkJaWYgKGQucmVjeWNsZSkgewotCQkJCQlkLmFnZSsrOwotCQkJCX0KLQkJCQkKLQkJCQl0ZW1wRGlySGFzaC5wdXQoa2V5LCBkKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJDb3VsZCBub3QgbG9hZCB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluZm9ybWF0aW9uIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGxvZ2dpbmcuCi0JICoKLQkgKiBAcGFyYW0gc3RhdHVzIGFuIGVycm9yIHN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluZm9ybWF0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBzYXZlVGVtcERpckluZm8oKSB7Ci0JCS8vIHNhdmUgcmVtYWluaW5nIGRpcmVjdG9yaWVzCi0JCUlQYXRoIHN0YXRlUGF0aCA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gc3RhdGVQYXRoLmFwcGVuZChURU1QX0RBVEFfRklMRSkudG9PU1N0cmluZygpOwotCQkKLQkJdHJ5IHsKLQkJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJ0ZW1wLWRpcmVjdG9yaWVzIik7Ci0JCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFRlbXBEaXJzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCVRlbXBEaXIgZCA9IGdldFRlbXBEaXJzKCkuZ2V0KGtleSk7Ci0KLQkJCQkvLyBJZiBub3QgcmVjeWNsaW5nIG9yIG5vdCBvbGQgZW5vdWdoLCBrZWVwCi0JCQkJaWYgKCFkLnJlY3ljbGUgfHwgZC5hZ2UgPCA1KSB7Ci0JCQkJCUlNZW1lbnRvIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZCgidGVtcC1kaXJlY3RvcnkiKTsKLQkJCQkJY2hpbGQucHV0U3RyaW5nKCJrZXkiLCBrZXkpOwotCQkJCQljaGlsZC5wdXRTdHJpbmcoInBhdGgiLCBkLnBhdGgpOwotCQkJCQljaGlsZC5wdXRJbnRlZ2VyKCJhZ2UiLCBkLmFnZSk7Ci0JCQkJCWNoaWxkLnB1dEJvb2xlYW4oInJlY3ljbGUiLCBkLnJlY3ljbGUpOwotCQkJCX0gZWxzZQotCQkJCQlkZWxldGVEaXJlY3Rvcnkoc3RhdGVQYXRoLmFwcGVuZChkLnBhdGgpLnRvRmlsZSgpLCBudWxsKTsKLQkJCX0KLQkKLQkJCW1lbWVudG8uc2F2ZVRvRmlsZShmaWxlbmFtZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW5mb3JtYXRpb24iLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChUcmFjZS5DT05GSUcpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19DT05GSUcsICItLS0tLT4tLS0tLSBTZXJ2ZXIgQ29yZSBwbHVnaW4gc3RhcnR1cCAtLS0tLT4tLS0tLSIpOwotCQl9Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlidW5kbGVDb250ZXh0ID0gY29udGV4dDsKLQkJCi0JCWJ1bmRsZUxpc3RlbmVyID0gbmV3IEJ1bmRsZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgYnVuZGxlQ2hhbmdlZChCdW5kbGVFdmVudCBldmVudCkgewotCQkJCVN0cmluZyBidW5kbGVJZCA9IGV2ZW50LmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCQkJCS8vVHJhY2UudHJhY2UoVHJhY2UuSU5GTywgZXZlbnQuZ2V0VHlwZSgpICsgIiAiICsgYnVuZGxlSWQpOwotCQkJCWlmIChCdW5kbGVFdmVudC5TVE9QUEVEID09IGV2ZW50LmdldFR5cGUoKSAmJiBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc0FjdGl2ZUJ1bmRsZShidW5kbGVJZCkpCi0JCQkJCXN0b3BCdW5kbGUoYnVuZGxlSWQpOwotCQkJfQotCQl9OwotCQljb250ZXh0LmFkZEJ1bmRsZUxpc3RlbmVyKGJ1bmRsZUxpc3RlbmVyKTsKLQotCQkvLyBMb2FkIHRoZSBQdWJsaXNoQ29udHJvbGxlciBkdXJpbmcgcGx1Z2luIHN0YXJ0dXAgc2luY2UgdGhpcyB3aWxsIGJlIHVzZWQKLQkJLy8gZHVyaW5nIHRoZSBhIHdvcmtzcGFjZSBkZWx0YSAoY2hhbmdlcyB0byB0aGUgd29ya3NwYWNlKQotCQlnZXRQdWJsaXNoQ29udHJvbGxlcigpOwotCi0JCS8vIHJlZ2lzdGVyIHRoZSBkZWJ1ZyBvcHRpb25zIGxpc3RlbmVyCi0JCWZpbmFsIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gcHJvcHMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPig0KTsKLQkJcHJvcHMucHV0KERlYnVnT3B0aW9ucy5MSVNURU5FUl9TWU1CT0xJQ05BTUUsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQpOwotCQljb250ZXh0LnJlZ2lzdGVyU2VydmljZShEZWJ1Z09wdGlvbnNMaXN0ZW5lci5jbGFzcy5nZXROYW1lKCksIG5ldyBUcmFjZSgpLCBwcm9wcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcEJ1bmRsZShmaW5hbCBTdHJpbmcgYnVuZGxlSWQpIHsKLQkJY2xhc3MgU3RvcEpvYiBleHRlbmRzIEpvYiB7Ci0JCQlwdWJsaWMgU3RvcEpvYigpIHsKLQkJCQlzdXBlcigiRGlzcG9zaW5nIHNlcnZlcnMiKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJCQlyZXR1cm4gU0hVVERPV05fSk9CX0ZBTUlMWS5lcXVhbHMoZmFtaWx5KTsKLQkJCX0KLQotCQkJcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjIpIHsKLQkJCQlSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zaHV0ZG93bkJ1bmRsZShidW5kbGVJZCk7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlTdG9wSm9iIGpvYiA9IG5ldyBTdG9wSm9iKCk7Ci0JCQlqb2Iuc2V0VXNlcihmYWxzZSk7Ci0JCQlqb2Iuc2NoZWR1bGUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCS8vIGlnbm9yZSBlcnJvcnMKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoVHJhY2UuQ09ORklHKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfQ09ORklHLCAiLS0tLS08LS0tLS0gU2VydmVyIENvcmUgcGx1Z2luIHNodXRkb3duIC0tLS0tPC0tLS0tIik7Ci0JCX0KLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJCi0JCWlmIChyZWdpc3RyeUxpc3RlbmVyICE9IG51bGwpCi0JCQlQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLnJlbW92ZVJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIocmVnaXN0cnlMaXN0ZW5lcik7Ci0JCQotCQlSZXNvdXJjZU1hbmFnZXIuc2h1dGRvd24oKTsKLQkJU2VydmVyTW9uaXRvck1hbmFnZXIuc2h1dGRvd24oKTsKLQkJCi0JCXRyeSB7Ci0JCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oU0hVVERPV05fSk9CX0ZBTUlMWSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiRXJyb3Igd2FpdGluZyBmb3Igc2h1dGRvd24gam9iIiwgZSk7Ci0JCQl9Ci0JCX0KLQkJY29udGV4dC5yZW1vdmVCdW5kbGVMaXN0ZW5lcihidW5kbGVMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogTG9ncyBhbiBlcnJvciBtZXNzYWdlIGNhdXNlZCBieSBhIG1pc3Npbmcgb3IgZmFpbGVkIGV4dGVuc2lvbgotCSAqIChzZXJ2ZXIgYWRhcHRlcnMsIHJ1bnRpbWUsIGNsYXNzLXBhdGggcHJvdmlkZXIsIGV0Yy4pLiBBIHNpbmdsZQotCSAqIGVycm9yIGlzIG91dHB1dCB0byB0aGUgLmxvZyAob25jZSBwZXIgc2Vzc2lvbikgYW5kIHRoZSBmdWxsCi0JICogZXhjZXB0aW9uIGlzIG91dHB1dCB0byB0cmFjaW5nLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIG1pc3NpbmcvZmFpbGVkIGV4dGVuc2lvbgotCSAqIEBwYXJhbSB0IGEgdGhyb3dhYmxlIG9yIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeHRlbnNpb25GYWlsdXJlKFN0cmluZyBpZCwgVGhyb3dhYmxlIHQpIHsKLQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIk1pc3Npbmcgb3IgZmFpbGVkIHNlcnZlciBleHRlbnNpb246ICIgKyBpZAotCQkJCQkrICIuIEVuYWJsZSB0cmFjaW5nIGZvciBtb3JlIGluZm9ybWF0aW9uIik7Ci0JCX0KLQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiRXhjZXB0aW9uIGluIHNlcnZlciBkZWxlZ2F0ZSIsIHQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRBbGwoTGlzdDxPYmplY3Q+IGxpc3QsIE9iamVjdFtdIG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpbnQgc2l6ZSA9IG9iai5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlsaXN0LmFkZChvYmpbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGEgc2VydmVyIG9yIHJ1bnRpbWUgZXhpc3RzIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICoKLQkgKiBAcGFyYW0gZWxlbWVudCBhbiBvYmplY3QKLQkgKiBAcGFyYW0gbmFtZSBhIG5hbWUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBuYW1lIGlzIGluIHVzZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05hbWVJblVzZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCi0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudCBpbnN0YW5jZW9mIElSdW50aW1lKQotCQkJYWRkQWxsKGxpc3QsIFNlcnZlckNvcmUuZ2V0UnVudGltZXMoKSk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJBdHRyaWJ1dGVzKQotCQkJYWRkQWxsKGxpc3QsIFNlcnZlckNvcmUuZ2V0U2VydmVycygpKTsKLQkJCi0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJ1bnRpbWVXb3JraW5nQ29weSkKLQkJCQllbGVtZW50ID0gKChJUnVudGltZVdvcmtpbmdDb3B5KSBlbGVtZW50KS5nZXRPcmlnaW5hbCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyV29ya2luZ0NvcHkpCi0JCQkJZWxlbWVudCA9ICgoSVNlcnZlcldvcmtpbmdDb3B5KSBlbGVtZW50KS5nZXRPcmlnaW5hbCgpOwotCQkJaWYgKGxpc3QuY29udGFpbnMoZWxlbWVudCkpCi0JCQkJbGlzdC5yZW1vdmUoZWxlbWVudCk7Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXJBdHRyaWJ1dGVzICYmIAotCQkJCQkobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCgoSVNlcnZlckF0dHJpYnV0ZXMpb2JqKS5nZXROYW1lKCkpIHx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgoKElTZXJ2ZXJBdHRyaWJ1dGVzKW9iaikuZ2V0SWQoKSkpKSAKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJUnVudGltZSAmJiBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoKChJUnVudGltZSlvYmopLmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byB0b2tlbml6ZSBhIHN0cmluZyBpbnRvIGFuIGFycmF5LgotCSAqIAotCSAqIEBwYXJhbSBzdHIgYSBzdHJpbmcgdG8gYmUgcGFyc2VkCi0JICogQHBhcmFtIGRlbGltIHRoZSBkZWxpbWl0ZXJzCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSB0b2tlbml6ZWQgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSB0b2tlbml6ZShTdHJpbmcgc3RyLCBTdHJpbmcgZGVsaW0pIHsKLQkJaWYgKHN0ciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCQotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsIGRlbGltKTsKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHMgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCWlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApCi0JCQkJbGlzdC5hZGQocy50cmltKCkpOwotCQl9Ci0JCQotCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShzKTsKLQkJcmV0dXJuIHM7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgTG9vc2UgTW9kdWxlIFR5cGVzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZFJ1bnRpbWVNb2R1bGVUeXBlcyhJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsJCi0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIEVYVEVOU0lPTl9SVU5USU1FX01PRFVMRV9UWVBFKTsKLQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UgOiBjZikgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgW10gbG9vc2VNb2R1bGVSdW50aW1lSWRzID0gU2VydmVyUGx1Z2luLnRva2VuaXplKGNlLmdldEF0dHJpYnV0ZSgicnVudGltZVR5cGVzIiksICIsIik7CQkJCQotCQkJCWlmIChsb29zZU1vZHVsZVJ1bnRpbWVJZHMubGVuZ3RoIDwgMCl7Ci0JCQkJCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsCi0JCQkJCQkJCSIgIHJ1bnRpbWVUeXBlcyBvbiBleHRlbnNpb24gcG9pbnQgZGVmaW5pdGlvbiBpcyBlbXB0eSIpOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKFNlcnZlclBsdWdpbi5jb250YWlucyhsb29zZU1vZHVsZVJ1bnRpbWVJZHMsIHJ1bnRpbWVUeXBlLmdldElkKCkpKXsKLQkJCQkJKChSdW50aW1lVHlwZSlydW50aW1lVHlwZSkuYWRkTW9kdWxlVHlwZShjZSk7CQkJCQkKLQkJCQkJaWYgKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0VYVEVOU0lPTl9QT0lOVCwKLQkJCQkJCQkJIiAgTG9hZGVkIFJ1bnRpbWUgc3VwcG9ydGVkIE1vZHVsZVR5cGU6ICIgKyBjZS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsCi0JCQkJCQkJIiAgQ291bGQgbm90IGxvYWQgUnVudGltZSBzdXBwb3J0ZWQgTW9kdWxlVHlwZTogIiArIGNlLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVR5cGU+IGdldE1vZHVsZVR5cGVzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzKSB7Ci0JCUxpc3Q8SU1vZHVsZVR5cGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGVUeXBlPigpOwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkKLQkJCXJldHVybiBsaXN0OwotCQkKLQkJaW50IHNpemUgPSBlbGVtZW50cy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlTdHJpbmdbXSB0eXBlcyA9IHRva2VuaXplKGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgidHlwZXMiKSwgIiwiKTsKLQkJCVN0cmluZ1tdIHZlcnNpb25zID0gdG9rZW5pemUoZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKCJ2ZXJzaW9ucyIpLCAiLCIpOwotCQkJaW50IHNpemVUID0gdHlwZXMubGVuZ3RoOwotCQkJaW50IHNpemVWID0gdmVyc2lvbnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplVDsgaisrKSB7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBzaXplVjsgaysrKQotCQkJCQlsaXN0LmFkZChNb2R1bGVUeXBlLmdldE1vZHVsZVR5cGUodHlwZXNbal0sIHZlcnNpb25zW2tdKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXJyYXkgb2Ygc3RyaW5ncyBjb250YWlucyBhIHNwZWNpZmljCi0JICogc3RyaW5nLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBwYXJhbSBpZHMgYW4gYXJyYXkgb2Ygc3RyaW5ncywgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gaWQgYSBzdHJpbmcKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcnJheSBvZiBzdHJpbmdzIGNvbnRhaW5zIGEgc3BlY2lmaWMKLQkgKiAgICBzdHJpbmcsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nW10gaWRzLCBTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoaWRzID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWludCBzaXplID0gaWRzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChpZHNbaV0uZW5kc1dpdGgoIioiKSkgewotCQkJCWlmIChpZC5sZW5ndGgoKSA+PSBpZHNbaV0ubGVuZ3RoKCkgJiYgaWQuc3RhcnRzV2l0aChpZHNbaV0uc3Vic3RyaW5nKDAsIGlkc1tpXS5sZW5ndGgoKSAtIDEpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGlkLmVxdWFscyhpZHNbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZWN1cnNpdmVseSBkZWxldGUgYSBkaXJlY3RvcnkuCi0JICoKLQkgKiBAcGFyYW0gZGlyIGEgZm9sZGVyCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBpcyByZXF1aXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaXJlY3RvcnkoRmlsZSBkaXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJaWYgKCFkaXIuZXhpc3RzKCkgfHwgIWRpci5pc0RpcmVjdG9yeSgpKQotCQkJCXJldHVybjsKLQkKLQkJCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKLQkJCWludCBzaXplID0gZmlsZXMubGVuZ3RoOwotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTkxTLmJpbmQoTWVzc2FnZXMuZGVsZXRpbmdUYXNrLCBuZXcgU3RyaW5nW10ge2Rpci5nZXRBYnNvbHV0ZVBhdGgoKX0pLCBzaXplICogMTApOwotCQotCQkJLy8gY3ljbGUgdGhyb3VnaCBmaWxlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlGaWxlIGN1cnJlbnQgPSBmaWxlc1tpXTsKLQkJCQlpZiAoY3VycmVudC5pc0ZpbGUoKSkgewotCQkJCQljdXJyZW50LmRlbGV0ZSgpOwotCQkJCQltb25pdG9yLndvcmtlZCgxMCk7Ci0JCQkJfSBlbHNlIGlmIChjdXJyZW50LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0aW5nVGFzaywgbmV3IFN0cmluZ1tdIHtjdXJyZW50LmdldEFic29sdXRlUGF0aCgpfSkpOwotCQkJCQlkZWxldGVEaXJlY3RvcnkoY3VycmVudCwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTApKTsKLQkJCQl9Ci0JCQl9Ci0JCQlkaXIuZGVsZXRlKCk7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgZGVsZXRpbmcgZGlyZWN0b3J5ICIgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCksIGUpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIGxhdW5jaGFibGUgYWRhcHRlcnMuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGxhdW5jaGFibGUgYWRhcHRlcnMge0BsaW5rIElMYXVuY2hhYmxlQWRhcHRlcn0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElMYXVuY2hhYmxlQWRhcHRlcltdIGdldExhdW5jaGFibGVBZGFwdGVycygpIHsKLQkJaWYgKGxhdW5jaGFibGVBZGFwdGVycyA9PSBudWxsKQotCQkJbG9hZExhdW5jaGFibGVBZGFwdGVycygpOwotCQlJTGF1bmNoYWJsZUFkYXB0ZXJbXSBsYSA9IG5ldyBJTGF1bmNoYWJsZUFkYXB0ZXJbbGF1bmNoYWJsZUFkYXB0ZXJzLnNpemUoKV07Ci0JCWxhdW5jaGFibGVBZGFwdGVycy50b0FycmF5KGxhKTsKLQkJcmV0dXJuIGxhOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIGNsaWVudCBpbnN0YW5jZXMuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGNsaWVudCBpbnN0YW5jZXMge0BsaW5rIElDbGllbnR9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJQ2xpZW50W10gZ2V0Q2xpZW50cygpIHsKLQkJaWYgKGNsaWVudHMgPT0gbnVsbCkKLQkJCWxvYWRDbGllbnRzKCk7Ci0JCUlDbGllbnRbXSBjID0gbmV3IElDbGllbnRbY2xpZW50cy5zaXplKCldOwotCQljbGllbnRzLnRvQXJyYXkoYyk7Ci0JCXJldHVybiBjOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkIHRoZSBsYXVuY2hhYmxlIGFkYXB0ZXJzIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkTGF1bmNoYWJsZUFkYXB0ZXJzKCkgewotCQlpZiAobGF1bmNoYWJsZUFkYXB0ZXJzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICItPi0gTG9hZGluZyAubGF1bmNoYWJsZUFkYXB0ZXJzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJfQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAibGF1bmNoYWJsZUFkYXB0ZXJzIik7Ci0KLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCUxpc3Q8TGF1bmNoYWJsZUFkYXB0ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExhdW5jaGFibGVBZGFwdGVyPihzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJbGlzdC5hZGQobmV3IExhdW5jaGFibGVBZGFwdGVyKGNmW2ldKSk7Ci0JCQkJaWYgKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRVhURU5TSU9OX1BPSU5ULCAiICBMb2FkZWQgbGF1bmNoYWJsZUFkYXB0ZXI6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBsYXVuY2hhYmxlQWRhcHRlcjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwKLQkJCQkJCQl0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHNvcnQgYnkgcHJpb3JpdHkgdG8gcHV0IGhpZ2hlciBudW1iZXJzIGZpcnN0Ci0JCXNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplLTE7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IGkrMTsgaiA8IHNpemU7IGorKykgewotCQkJCUxhdW5jaGFibGVBZGFwdGVyIGEgPSBsaXN0LmdldChpKTsKLQkJCQlMYXVuY2hhYmxlQWRhcHRlciBiID0gbGlzdC5nZXQoaik7Ci0JCQkJaWYgKGEuZ2V0UHJpb3JpdHkoKSA8IGIuZ2V0UHJpb3JpdHkoKSkgewotCQkJCQlsaXN0LnNldChpLCBiKTsKLQkJCQkJbGlzdC5zZXQoaiwgYSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWxhdW5jaGFibGVBZGFwdGVycyA9IGxpc3Q7Ci0JCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5sYXVuY2hhYmxlQWRhcHRlcnMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgY2xpZW50IGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkQ2xpZW50cygpIHsKLQkJaWYgKGNsaWVudHMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0VYVEVOU0lPTl9QT0lOVCwgIi0+LSBMb2FkaW5nIC5jbGllbnRzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJfQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAiY2xpZW50cyIpOwotCQkKLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCUxpc3Q8SUNsaWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUNsaWVudD4oc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKG5ldyBDbGllbnQoY2ZbaV0pKTsKLQkJCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBjbGllbnRzOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgY2xpZW50czogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBzb3J0IGJ5IHByaW9yaXR5IHRvIHB1dCBoaWdoZXIgbnVtYmVycyBmaXJzdAotCQlzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZS0xOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSBpKzE7IGogPCBzaXplOyBqKyspIHsKLQkJCQlDbGllbnQgYSA9IChDbGllbnQpIGxpc3QuZ2V0KGkpOwotCQkJCUNsaWVudCBiID0gKENsaWVudCkgbGlzdC5nZXQoaik7Ci0JCQkJaWYgKGEuZ2V0UHJpb3JpdHkoKSA8IGIuZ2V0UHJpb3JpdHkoKSkgewotCQkJCQlsaXN0LnNldChpLCBiKTsKLQkJCQkJbGlzdC5zZXQoaiwgYSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNsaWVudHMgPSBsaXN0OwotCQkKLQkJaWYgKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0VYVEVOU0lPTl9QT0lOVCwgIi08LSBEb25lIGxvYWRpbmcgLmNsaWVudHMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gcHVibGlzaCB0YXNrcy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgcHVibGlzaCB0YXNrcyBpbnN0YW5jZXMge0BsaW5rIElQdWJsaXNoVGFza30KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQdWJsaXNoVGFza1tdIGdldFB1Ymxpc2hUYXNrcygpIHsKLQkJaWYgKHB1Ymxpc2hUYXNrcyA9PSBudWxsKQotCQkJbG9hZFB1Ymxpc2hUYXNrcygpOwotCQlJUHVibGlzaFRhc2tbXSBzdCA9IG5ldyBJUHVibGlzaFRhc2tbcHVibGlzaFRhc2tzLnNpemUoKV07Ci0JCXB1Ymxpc2hUYXNrcy50b0FycmF5KHN0KTsKLQkJcmV0dXJuIHN0OwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIHB1Ymxpc2ggdGFzayBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZFB1Ymxpc2hUYXNrcygpIHsKLQkJaWYgKHB1Ymxpc2hUYXNrcyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRVhURU5TSU9OX1BPSU5ULCAiLT4tIExvYWRpbmcgLnB1Ymxpc2hUYXNrcyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCX0KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgInB1Ymxpc2hUYXNrcyIpOwotCQkKLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCUxpc3Q8SVB1Ymxpc2hUYXNrPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUHVibGlzaFRhc2s+KHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlsaXN0LmFkZChuZXcgUHVibGlzaFRhc2soY2ZbaV0pKTsKLQkJCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBwdWJsaXNoVGFzazogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIHB1Ymxpc2hUYXNrOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcHVibGlzaFRhc2tzID0gbGlzdDsKLQkJCi0JCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5wdWJsaXNoVGFza3MgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gcHVibGlzaGVycy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgcHVibGlzaGVyIGluc3RhbmNlcyB7QGxpbmsgUHVibGlzaGVyfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHVibGlzaGVyW10gZ2V0UHVibGlzaGVycygpIHsKLQkJaWYgKHB1Ymxpc2hlcnMgPT0gbnVsbCkKLQkJCWxvYWRQdWJsaXNoZXJzKCk7Ci0JCVB1Ymxpc2hlcltdIHB1YiA9IG5ldyBQdWJsaXNoZXJbcHVibGlzaGVycy5zaXplKCldOwotCQlwdWJsaXNoZXJzLnRvQXJyYXkocHViKTsKLQkJcmV0dXJuIHB1YjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwdWJsaXNoZXIgd2l0aCB0aGUgZ2l2ZW4gaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24KLQkgKiBwdWJsaXNoZXIgKHtAbGluayAjZ2V0UHVibGlzaGVycygpfSkgZm9yIHRoZSBvbmUgYSBtYXRjaGluZwotCSAqIHB1Ymxpc2hlciBpZCAoe0BsaW5rIFB1Ymxpc2hlciNnZXRJZCgpfSkuIFRoZSBpZCBtYXkgbm90IGJlIG51bGwuCi0JICoKLQkgKiBAcGFyYW0gaWQgdGhlIHB1Ymxpc2hlciBpZAotCSAqIEByZXR1cm4gdGhlIHB1Ymxpc2hlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gcHVibGlzaGVycwotCSAqICAgIHdpdGggdGhlIGdpdmVuIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBQdWJsaXNoZXIgZmluZFB1Ymxpc2hlcihTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlpZiAocHVibGlzaGVycyA9PSBudWxsKQotCQkJbG9hZFB1Ymxpc2hlcnMoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcHVibGlzaGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQdWJsaXNoZXIgcHViID0gKFB1Ymxpc2hlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGlkLmVxdWFscyhwdWIuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIHB1YjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBwdWJsaXNoZXIgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRQdWJsaXNoZXJzKCkgewotCQlpZiAocHVibGlzaGVycyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRVhURU5TSU9OX1BPSU5ULCAiLT4tIExvYWRpbmcgLnB1Ymxpc2hlcnMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQl9Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJwdWJsaXNoZXJzIik7Ci0JCQotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJTGlzdDxQdWJsaXNoZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFB1Ymxpc2hlcj4oc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKG5ldyBQdWJsaXNoZXIoY2ZbaV0pKTsKLQkJCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBwdWJsaXNoZXI6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBwdWJsaXNoZXI6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwdWJsaXNoZXJzID0gbGlzdDsKLQkJCi0JCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5wdWJsaXNoZXJzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBwdWJsaXNoZXJzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBwdWJsaXNoZXIgaW5zdGFuY2VzIHtAbGluayBQdWJsaXNoZXJ9Ci0JICovCi0JcHVibGljIHN0YXRpYyBQdWJsaXNoQ29udHJvbGxlcltdIGdldFB1Ymxpc2hDb250cm9sbGVyKCkgewotCQlpZiAocHVibGlzaGVycyA9PSBudWxsKQotCQkJbG9hZFB1Ymxpc2hDb250cm9sbGVycygpOwotCQlQdWJsaXNoQ29udHJvbGxlcltdIGNvbnRyb2xsZXJzID0gbmV3IFB1Ymxpc2hDb250cm9sbGVyW3B1Ymxpc2hDb250cm9sbGVycy5zaXplKCldOwotCQlwdWJsaXNoQ29udHJvbGxlcnMudG9BcnJheShjb250cm9sbGVycyk7Ci0JCXJldHVybiBjb250cm9sbGVyczsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZCB0aGUgcHVibGlzaENvbnRyb2xsZXIgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRQdWJsaXNoQ29udHJvbGxlcnMoKSB7Ci0JCWlmIChwdWJsaXNoQ29udHJvbGxlcnMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0VYVEVOU0lPTl9QT0lOVCwgIi0+LSBMb2FkaW5nIC5wdWJsaXNoQ29udHJvbGxlciBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCX0KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgInB1Ymxpc2hDb250cm9sbGVyIik7Ci0JCQotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJTGlzdDxQdWJsaXNoQ29udHJvbGxlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8UHVibGlzaENvbnRyb2xsZXI+KHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlsaXN0LmFkZChuZXcgUHVibGlzaENvbnRyb2xsZXIoY2ZbaV0pKTsKLQkJCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsCi0JCQkJCQkJIiAgTG9hZGVkIC5wdWJsaXNoQ29udHJvbGxlcjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsCi0JCQkJCQkJIiAgQ291bGQgbm90IGxvYWQgLnB1Ymxpc2hDb250cm9sbGVyOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcHVibGlzaENvbnRyb2xsZXJzID0gbGlzdDsKLQkJCi0JCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5wdWJsaXNoQ29udHJvbGxlciBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBtb2R1bGUgbW9kdWxlIGZhY3Rvcmllcy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBtb2R1bGUgZmFjdG9yaWVzIHtAbGluayBNb2R1bGVGYWN0b3J5fQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kdWxlRmFjdG9yeVtdIGdldE1vZHVsZUZhY3RvcmllcygpIHsKLQkJaWYgKG1vZHVsZUZhY3RvcmllcyA9PSBudWxsKQotCQkJbG9hZE1vZHVsZUZhY3RvcmllcygpOwotCQkKLQkJTW9kdWxlRmFjdG9yeVtdIG1mID0gbmV3IE1vZHVsZUZhY3RvcnlbbW9kdWxlRmFjdG9yaWVzLnNpemUoKV07Ci0JCW1vZHVsZUZhY3Rvcmllcy50b0FycmF5KG1mKTsKLQkJcmV0dXJuIG1mOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSBmYWN0b3J5IHdpdGggdGhlIGdpdmVuIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vbmUuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHNlYXJjaGVzIHRoZSBsaXN0IG9mIGtub3duCi0JICogbW9kdWxlIGZhY3RvcmllcyAoe0BsaW5rICNnZXRNb2R1bGVGYWN0b3JpZXMoKX0pIGZvciB0aGUgb25lIGEgbWF0Y2hpbmcKLQkgKiBtb2R1bGUgZmFjdG9yeSBpZCAoe0BsaW5rIE1vZHVsZUZhY3RvcnkjZ2V0SWQoKX0pLiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsLgotCSAqCi0JICogQHBhcmFtIGlkIHRoZSBtb2R1bGUgZmFjdG9yeSBpZAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSBmYWN0b3J5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBtb2R1bGUgZmFjdG9yeQotCSAqICAgIHdpdGggdGhlIGdpdmVuIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVGYWN0b3J5IGZpbmRNb2R1bGVGYWN0b3J5KFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCWlmIChtb2R1bGVGYWN0b3JpZXMgPT0gbnVsbCkKLQkJCWxvYWRNb2R1bGVGYWN0b3JpZXMoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kdWxlRmFjdG9yaWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1vZHVsZUZhY3RvcnkgZmFjdG9yeSA9IChNb2R1bGVGYWN0b3J5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaWQuZXF1YWxzKGZhY3RvcnkuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIGZhY3Rvcnk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGF1bmNoYWJsZSBhZGFwdGVyIHdpdGggdGhlIGdpdmVuIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vbmUuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHNlYXJjaGVzIHRoZSBsaXN0IG9mIGtub3duCi0JICogbGF1bmNoYWJsZSBhZGFwdGVycyAoe0BsaW5rICNnZXRMYXVuY2hhYmxlQWRhcHRlcnMoKX0pIGZvciB0aGUgb25lIGEgbWF0Y2hpbmcKLQkgKiBsYXVuY2hhYmxlIGFkYXB0ZXIgaWQgKHtAbGluayBJTGF1bmNoYWJsZUFkYXB0ZXIjZ2V0SWQoKX0pLiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsLgotCSAqCi0JICogQHBhcmFtIGlkIHRoZSBsYXVuY2hhYmxlIGFkYXB0ZXIgaWQKLQkgKiBAcmV0dXJuIHRoZSBsYXVuY2hhYmxlIGFkYXB0ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGxhdW5jaGFibGUgYWRhcHRlcgotCSAqICAgIHdpdGggdGhlIGdpdmVuIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBJTGF1bmNoYWJsZUFkYXB0ZXIgZmluZExhdW5jaGFibGVBZGFwdGVyKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCWlmIChsYXVuY2hhYmxlQWRhcHRlcnMgPT0gbnVsbCkKLQkJCWxvYWRMYXVuY2hhYmxlQWRhcHRlcnMoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGF1bmNoYWJsZUFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlMYXVuY2hhYmxlQWRhcHRlciBsYSA9IChJTGF1bmNoYWJsZUFkYXB0ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpZC5lcXVhbHMobGEuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIGxhOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsaWVudCB3aXRoIHRoZSBnaXZlbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBub25lLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBzZWFyY2hlcyB0aGUgbGlzdCBvZiBrbm93bgotCSAqIGNsaWVudHMgKHtAbGluayAjZ2V0Q2xpZW50cygpfSkgZm9yIHRoZSBvbmUgYSBtYXRjaGluZwotCSAqIGNsaWVudCBpZCAoe0BsaW5rIElDbGllbnQjZ2V0SWQoKX0pLiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsLgotCSAqCi0JICogQHBhcmFtIGlkIHRoZSBjbGllbnQgaWQKLQkgKiBAcmV0dXJuIHRoZSBjbGllbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGNsaWVudAotCSAqICAgIHdpdGggdGhlIGdpdmVuIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ2xpZW50IGZpbmRDbGllbnQoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJaWYgKGNsaWVudHMgPT0gbnVsbCkKLQkJCWxvYWRDbGllbnRzKCk7Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGNsaWVudHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSUNsaWVudCBjbGllbnQgPSAoSUNsaWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGlkLmVxdWFscyhjbGllbnQuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIGNsaWVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBtb2R1bGUgZmFjdG9yaWVzIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkTW9kdWxlRmFjdG9yaWVzKCkgewotCQlpZiAobW9kdWxlRmFjdG9yaWVzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICItPi0gTG9hZGluZyAubW9kdWxlRmFjdG9yaWVzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJfQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAibW9kdWxlRmFjdG9yaWVzIik7Ci0JCQotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJTGlzdDxNb2R1bGVGYWN0b3J5PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxNb2R1bGVGYWN0b3J5PihzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJbGlzdC5hZGQobmV3IE1vZHVsZUZhY3RvcnkoY2ZbaV0pKTsKLQkJCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBtb2R1bGVGYWN0b3JpZXM6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBtb2R1bGVGYWN0b3JpZXM6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUgLSAxOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSBpICsgMTsgaiA8IHNpemU7IGorKykgewotCQkJCU1vZHVsZUZhY3RvcnkgYSA9IGxpc3QuZ2V0KGkpOwotCQkJCU1vZHVsZUZhY3RvcnkgYiA9IGxpc3QuZ2V0KGopOwotCQkJCWlmIChhLmdldE9yZGVyKCkgPiBiLmdldE9yZGVyKCkpIHsKLQkJCQkJbGlzdC5zZXQoaSwgYik7Ci0JCQkJCWxpc3Quc2V0KGosIGEpOwotCQkJCX0KLQkJCX0KLQkJfQotCQltb2R1bGVGYWN0b3JpZXMgPSBsaXN0OwotCQkKLQkJaWYgKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0VYVEVOU0lPTl9QT0lOVCwgIi08LSBEb25lIGxvYWRpbmcgLm1vZHVsZUZhY3RvcmllcyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBzZXJ2ZXIgbW9uaXRvciBpbnN0YW5jZXMuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHNlcnZlciBtb25pdG9yIGluc3RhbmNlcyB7QGxpbmsgSVNlcnZlck1vbml0b3J9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJU2VydmVyTW9uaXRvcltdIGdldFNlcnZlck1vbml0b3JzKCkgewotCQlpZiAobW9uaXRvcnMgPT0gbnVsbCkKLQkJCWxvYWRTZXJ2ZXJNb25pdG9ycygpOwotCQlJU2VydmVyTW9uaXRvcltdIHNtID0gbmV3IElTZXJ2ZXJNb25pdG9yW21vbml0b3JzLnNpemUoKV07Ci0JCW1vbml0b3JzLnRvQXJyYXkoc20pOwotCQlyZXR1cm4gc207Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgc2VydmVyIG1vbml0b3IgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRTZXJ2ZXJNb25pdG9ycygpIHsKLQkJaWYgKG1vbml0b3JzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICItPi0gTG9hZGluZyAuc2VydmVyTW9uaXRvcnMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQl9Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJpbnRlcm5hbFNlcnZlck1vbml0b3JzIik7Ci0KLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCUxpc3Q8SVNlcnZlck1vbml0b3I+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXJNb25pdG9yPihzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJbGlzdC5hZGQobmV3IFNlcnZlck1vbml0b3IoY2ZbaV0pKTsKLQkJCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBzZXJ2ZXJNb25pdG9yOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgc2VydmVyTW9uaXRvcjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCW1vbml0b3JzID0gbGlzdDsKLQkJCi0JCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5zZXJ2ZXJNb25pdG9ycyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBydW50aW1lIGxvY2F0b3IgaW5zdGFuY2VzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBydW50aW1lIGxvY2F0b3IgaW5zdGFuY2VzIHtAbGluayBJUnVudGltZUxvY2F0b3J9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZUxvY2F0b3JbXSBnZXRSdW50aW1lTG9jYXRvcnMoKSB7Ci0JCWlmIChydW50aW1lTG9jYXRvcnMgPT0gbnVsbCkKLQkJCWxvYWRSdW50aW1lTG9jYXRvcnMoKTsKLQkJSVJ1bnRpbWVMb2NhdG9yW10gcmwgPSBuZXcgSVJ1bnRpbWVMb2NhdG9yW3J1bnRpbWVMb2NhdG9ycy5zaXplKCldOwotCQlydW50aW1lTG9jYXRvcnMudG9BcnJheShybCk7Ci0JCXJldHVybiBybDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBydW50aW1lIGxvY2F0b3JzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRSdW50aW1lTG9jYXRvcnMoKSB7Ci0JCWlmIChydW50aW1lTG9jYXRvcnMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0VYVEVOU0lPTl9QT0lOVCwgIi0+LSBMb2FkaW5nIC5ydW50aW1lTG9jYXRvcnMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQl9Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJydW50aW1lTG9jYXRvcnMiKTsKLQotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJTGlzdDxJUnVudGltZUxvY2F0b3I+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lTG9jYXRvcj4oc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKG5ldyBSdW50aW1lTG9jYXRvcihjZltpXSkpOwotCQkJCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0VYVEVOU0lPTl9QT0lOVCwgIiAgTG9hZGVkIHJ1bnRpbWVMb2NhdG9yOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgcnVudGltZUxvY2F0b3I6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlydW50aW1lTG9jYXRvcnMgPSBsaXN0OwotCQkKLQkJaWYgKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0VYVEVOU0lPTl9QT0lOVCwgIi08LSBEb25lIGxvYWRpbmcgLnJ1bnRpbWVMb2NhdG9ycyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBtb2R1bGUgYXJ0aWZhY3QgYWRhcHRlcnMuCi0JICoKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgbW9kdWxlIGFydGlmYWN0IGFkYXB0ZXJzCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBNb2R1bGVBcnRpZmFjdEFkYXB0ZXJbXSBnZXRNb2R1bGVBcnRpZmFjdEFkYXB0ZXJzKCkgewotCQlpZiAobW9kdWxlQXJ0aWZhY3RBZGFwdGVycyA9PSBudWxsKQotCQkJbG9hZE1vZHVsZUFydGlmYWN0QWRhcHRlcnMoKTsKLQkJCi0JCU1vZHVsZUFydGlmYWN0QWRhcHRlcltdIG1vYSA9IG5ldyBNb2R1bGVBcnRpZmFjdEFkYXB0ZXJbbW9kdWxlQXJ0aWZhY3RBZGFwdGVycy5zaXplKCldOwotCQltb2R1bGVBcnRpZmFjdEFkYXB0ZXJzLnRvQXJyYXkobW9hKTsKLQkJcmV0dXJuIG1vYTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBtb2R1bGUgYXJ0aWZhY3QgYWRhcHRlcnMgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRNb2R1bGVBcnRpZmFjdEFkYXB0ZXJzKCkgewotCQlpZiAobW9kdWxlQXJ0aWZhY3RBZGFwdGVycyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRVhURU5TSU9OX1BPSU5ULCAiLT4tIExvYWRpbmcgLm1vZHVsZUFydGlmYWN0QWRhcHRlcnMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQl9Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJtb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIik7Ci0KLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCUxpc3Q8TW9kdWxlQXJ0aWZhY3RBZGFwdGVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxNb2R1bGVBcnRpZmFjdEFkYXB0ZXI+KHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlsaXN0LmFkZChuZXcgTW9kdWxlQXJ0aWZhY3RBZGFwdGVyKGNmW2ldKSk7Ci0JCQkJaWYgKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRVhURU5TSU9OX1BPSU5ULAotCQkJCQkJCSIgIExvYWRlZCBtb2R1bGVBcnRpZmFjdEFkYXB0ZXI6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLAotCQkJCQkJCSIgIENvdWxkIG5vdCBsb2FkIG1vZHVsZUFydGlmYWN0QWRhcHRlcjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBzb3J0IGJ5IGluZGV4IHRvIHB1dCBsb3dlciBudW1iZXJzIGZpcnN0IGluIG9yZGVyCi0JCXNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplLTE7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IGkrMTsgaiA8IHNpemU7IGorKykgewotCQkJCU1vZHVsZUFydGlmYWN0QWRhcHRlciBhID0gbGlzdC5nZXQoaSk7Ci0JCQkJTW9kdWxlQXJ0aWZhY3RBZGFwdGVyIGIgPSBsaXN0LmdldChqKTsKLQkJCQlpZiAoYS5nZXRQcmlvcml0eSgpIDwgYi5nZXRQcmlvcml0eSgpKSB7Ci0JCQkJCWxpc3Quc2V0KGksIGIpOwotCQkJCQlsaXN0LnNldChqLCBhKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbW9kdWxlQXJ0aWZhY3RBZGFwdGVycyA9IGxpc3Q7Ci0JCQotCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRVhURU5TSU9OX1BPSU5ULCAiLTwtIERvbmUgbG9hZGluZyAubW9kdWxlQXJ0aWZhY3RBZGFwdGVycyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbW9kdWxlIGFydGlmYWN0IG1heSBiZSBhdmFpbGFibGUgZm9yIHRoZSBnaXZlbiBvYmplY3QsCi0JICogYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICoKLQkgKiBAcGFyYW0gb2JqIGFuIG9iamVjdAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgaXMgYSBtb2R1bGUgYXJ0aWZhY3QgYWRhcHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNNb2R1bGVBcnRpZmFjdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJTZXJ2ZXJQbHVnaW4uaGFzTW9kdWxlQXJ0aWZhY3QoKSAiICsgb2JqKTsKLQkJfQotCQlNb2R1bGVBcnRpZmFjdEFkYXB0ZXJbXSBhZGFwdGVycyA9IGdldE1vZHVsZUFydGlmYWN0QWRhcHRlcnMoKTsKLQkJaWYgKGFkYXB0ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gYWRhcHRlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoYWRhcHRlcnNbaV0uaXNFbmFibGVkKG9iaikpIHsKLQkJCQkJCWlmIChUcmFjZS5GSU5FUikgewotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FUiwgIlNlcnZlclBsdWdpbi5oYXNNb2R1bGVBcnRpZmFjdCgpIC0gIiArIGFkYXB0ZXJzW2ldLmdldElkKCkpOwotCQkJCQkJfQotCQkJCQkJaWYgKGFkYXB0ZXJzW2ldLmlzRGVsZWdhdGVMb2FkZWQoKSkgewotCQkJCQkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQkJCUlNb2R1bGVBcnRpZmFjdFtdIG1hID0gYWRhcHRlcnNbaV0uZ2V0TW9kdWxlQXJ0aWZhY3RzKG9iaik7Ci0JCQkJCQkJaWYgKFRyYWNlLkZJTkVSKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FUiwgIkRlZXAgZW5hYmxlZCB0aW1lOiAiCi0JCQkJCQkJCQkJKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChtYSAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmIChUcmFjZS5GSU5FUikgewotCQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVSLCAiRGVlcCBlbmFibGVkIik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChUcmFjZS5GSU5FUikgewotCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVIsICJOb3QgZW5hYmxlZCIpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKFRyYWNlLkZJTkVSKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FUiwgIkVuYWJsZWQiKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkNvdWxkIG5vdCB1c2UgbW9kdWxlQXJ0aWZhY3RBZGFwdGVyIiwgY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG1vZHVsZSBhcnRpZmFjdCBpZiBvbmUgY2FuIGJlIGZvdW5kIHdpdGhvdXQgbG9hZGluZyBwbHVnaW5zLgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuIGEgbW9kdWxlIGFydGlmYWN0LCBvciBudWxsCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3RbXSBnZXRNb2R1bGVBcnRpZmFjdHMoT2JqZWN0IG9iaikgewotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiU2VydmVyUGx1Z2luLmdldE1vZHVsZUFydGlmYWN0KCkgIiArIG9iaik7Ci0JCX0KLQkJTW9kdWxlQXJ0aWZhY3RBZGFwdGVyW10gYWRhcHRlcnMgPSBnZXRNb2R1bGVBcnRpZmFjdEFkYXB0ZXJzKCk7Ci0JCWlmIChhZGFwdGVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGFkYXB0ZXJzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGFkYXB0ZXJzW2ldLmlzRW5hYmxlZChvYmopKSB7Ci0JCQkJCQlJTW9kdWxlQXJ0aWZhY3RbXSBtYSA9IGFkYXB0ZXJzW2ldLmdldE1vZHVsZUFydGlmYWN0cyhvYmopOwotCQkJCQkJaWYgKG1hICE9IG51bGwpCi0JCQkJCQkJcmV0dXJuIG1hOwotCQkJCQkJLyppZiAoUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5oYXNBZGFwdGVyKG9iaiwgTU9EVUxFX0FSVElGQUNUX0NMQVNTKSkgewotCQkJCQkJCXJldHVybiAoSU1vZHVsZUFydGlmYWN0KSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIob2JqLCBNT0RVTEVfQVJUSUZBQ1RfQ0xBU1MpOwotCQkJCQkJfSovCi0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJDb3VsZCBub3QgdXNlIG1vZHVsZUFydGlmYWN0QWRhcHRlciAiICsgYWRhcHRlcnNbaV0sIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBpbnN0YWxsYWJsZSBydW50aW1lcy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAoc2luY2UgMy4zKSAKLQkgKiBUaGUgc3VwcG9ydCBmb3IgSW5zdGFsbGFibGVSdW50aW1lIGhhcyBiZWVuIG1vdmVkIHRvIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZGlzY292ZXJ5Ci0JICogYW5kIGlzIG5vdyBzdXBwb3J0ZWQgdGhyb3VnaCB0aGUgcDIgcmVwb3NpdG9yeSBsb29rdXAgQVBJcwotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGluc3RhbGxhYmxlIHJ1bnRpbWVzIHtAbGluayBJSW5zdGFsbGFibGVSdW50aW1lfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlUnVudGltZVtdIGdldEluc3RhbGxhYmxlUnVudGltZXMoKSB7Ci0JCS8vaWYgKGluc3RhbGxhYmxlUnVudGltZXMgPT0gbnVsbCkKLQkJCWxvYWRJbnN0YWxsYWJsZVJ1bnRpbWVzKCk7Ci0JCQotCQlJSW5zdGFsbGFibGVSdW50aW1lW10gaXIgPSBuZXcgSUluc3RhbGxhYmxlUnVudGltZVtpbnN0YWxsYWJsZVJ1bnRpbWVzLnNpemUoKV07Ci0JCWluc3RhbGxhYmxlUnVudGltZXMudG9BcnJheShpcik7Ci0JCXJldHVybiBpcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YWxsYWJsZSBydW50aW1lIGZvciB0aGUgZ2l2ZW4gcnVudGltZSB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vbmUgZXhpc3RzLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIChzaW5jZSAzLjMpIAotCSAqIFRoZSBzdXBwb3J0IGZvciBJbnN0YWxsYWJsZVJ1bnRpbWUgaGFzIGJlZW4gbW92ZWQgdG8gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5kaXNjb3ZlcnkKLQkgKiBhbmQgaXMgbm93IHN1cHBvcnRlZCB0aHJvdWdoIHRoZSBwMiByZXBvc2l0b3J5IGxvb2t1cCBBUElzCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWVUeXBlSWQgYSBydW50aW1lIHR5cGUgaWQKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YWxsYWJsZSBydW50aW1lIGZvciB0aGUgZ2l2ZW4gcnVudGltZSB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgIGlmIG5vbmUgZXhpc3RzIHtAbGluayBJSW5zdGFsbGFibGVSdW50aW1lfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlUnVudGltZSBmaW5kSW5zdGFsbGFibGVSdW50aW1lKFN0cmluZyBydW50aW1lVHlwZUlkKSB7Ci0JCWlmIChydW50aW1lVHlwZUlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQkvL2lmIChpbnN0YWxsYWJsZVJ1bnRpbWVzID09IG51bGwpCi0JCQlsb2FkSW5zdGFsbGFibGVSdW50aW1lcygpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBpbnN0YWxsYWJsZVJ1bnRpbWVzLml0ZXJhdG9yKCk7Ci0JCS8vSVJ1bnRpbWVUeXBlW10gcnVudGltZVR5cGVzID0gU2VydmVyQ29yZS5nZXRSdW50aW1lVHlwZXMoKTsKLQkJLy9pbnQgc2l6ZSA9IHJ1bnRpbWVUeXBlcy5sZW5ndGg7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlJbnN0YWxsYWJsZVJ1bnRpbWUgcnVudGltZSA9IChJSW5zdGFsbGFibGVSdW50aW1lKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkvL2ZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKHJ1bnRpbWUuZ2V0SWQoKS5lcXVhbHMocnVudGltZVR5cGVJZCkpCi0JCQkJCXJldHVybiBydW50aW1lOwotCQkJLy99Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGluc3RhbGxhYmxlIHJ1bnRpbWVzLgotCSAqIEBkZXByZWNhdGVkIChzaW5jZSAzLjMpIAotCSAqIFRoZSBzdXBwb3J0IGZvciBJbnN0YWxsYWJsZVJ1bnRpbWUgaGFzIGJlZW4gbW92ZWQgdG8gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5kaXNjb3ZlcnkKLQkgKiBhbmQgaXMgbm93IHN1cHBvcnRlZCB0aHJvdWdoIHRoZSBwMiByZXBvc2l0b3J5IGxvb2t1cCBBUElzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZEluc3RhbGxhYmxlUnVudGltZXMoKSB7Ci0JCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICItPi0gTG9hZGluZyAuaW5zdGFsbGFibGVSdW50aW1lcyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCX0KLQkJCi0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJpbnN0YWxsYWJsZVJ1bnRpbWVzIik7Ci0JCQotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJTGlzdDxJSW5zdGFsbGFibGVSdW50aW1lPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJSW5zdGFsbGFibGVSdW50aW1lPihzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKCJydW50aW1lIi5lcXVhbHMoY2ZbaV0uZ2V0TmFtZSgpKSkgewotCQkJCQlTdHJpbmcgb3MgPSBjZltpXS5nZXRBdHRyaWJ1dGUoIm9zIik7Ci0JCQkJCWlmIChvcyA9PSBudWxsIHx8IG9zLmNvbnRhaW5zKFBsYXRmb3JtLmdldE9TKCkpKQotCQkJCQkJbGlzdC5hZGQobmV3IEluc3RhbGxhYmxlUnVudGltZTIoY2ZbaV0pKTsKLQkJCQl9IGVsc2UKLQkJCQkJbGlzdC5hZGQobmV3IEluc3RhbGxhYmxlUnVudGltZShjZltpXSkpOwotCQkJCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0VYVEVOU0lPTl9QT0lOVCwKLQkJCQkJCQkiICBMb2FkZWQgaW5zdGFsbGFibGVSdW50aW1lOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwKLQkJCQkJCQkiICBDb3VsZCBub3QgbG9hZCBpbnN0YWxsYWJsZVJ1bnRpbWU6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpbnN0YWxsYWJsZVJ1bnRpbWVzID0gbGlzdDsKLQkJCi0JCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5pbnN0YWxsYWJsZVJ1bnRpbWVzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZWdpc3RyeUxpc3RlbmVyKElSZWdpc3RyeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJlZ2lzdHJ5TGlzdGVuZXIgPSBsaXN0ZW5lcjsgCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHByb2plY3QuIFRoZSBwcm9qZWN0IG1heSBub3QKLQkgKiBiZSBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAotCSAqIEByZXR1cm4gdGhlIHByb3BlcnRpZXMgb2YgdGhlIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb2plY3RQcm9wZXJ0aWVzIGdldFByb2plY3RQcm9wZXJ0aWVzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJcmV0dXJuIG5ldyBQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgYW5kIGIgbWF0Y2gsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIFN0cmluZ3MgbWF0Y2ggaWYgdGhleSBhcmUgZXF1YWwsIGlmIGVpdGhlciBpcyBudWxsLCBpZiBlaXRoZXIgaXMgIioiLCBvciBpZgotCSAqIG9uZSBlbmRzIHdpdGggIi4qIiBhbmQgdGhlIGJlZ2lubmluZyBtYXRjaGVzIHRoZSBvdGhlciBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIGEgYSBzdHJpbmcgdG8gbWF0Y2gKLQkgKiBAcGFyYW0gYiBhbm90aGVyIHN0cmluZyB0byBtYXRjaAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBhbmQgYiBtYXRjaCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLQkJaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwgfHwgYS5lcXVhbHMoYikgfHwgIioiLmVxdWFscyhhKSB8fCAiKiIuZXF1YWxzKGIpCi0JCQl8fCAoYS5lbmRzV2l0aCgiLioiKSAmJiBiLnN0YXJ0c1dpdGgoYS5zdWJzdHJpbmcoMCwgYS5sZW5ndGgoKSAtIDEpKSkKLQkJCXx8IChiLmVuZHNXaXRoKCIuKiIpICYmIGEuc3RhcnRzV2l0aChiLnN1YnN0cmluZygwLCBiLmxlbmd0aCgpIC0gMSkpKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoYS5zdGFydHNXaXRoKGIpIHx8IGIuc3RhcnRzV2l0aChhKSkgewotCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkludmFsaWQgbWF0Y2hpbmcgcnVsZXMgdXNlZDogIiArIGEgKyAiLyIgKyBiKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEV4Y2x1ZGVkU2VydmVyQWRhcHRlcnMoKSB7Ci0JCXJldHVybiB0b2tlbml6ZShnZXRQcm9wZXJ0eShFWENMVURFX1NFUlZFUl9BREFQVEVSUyksICIsIik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKLQkJaWYgKGtleSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCWlmIChQbGF0Zm9ybS5nZXRQcm9kdWN0KCkgIT0gbnVsbCkKLQkJCXJldHVybiBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0UHJvcGVydHkoa2V5KTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSdW5uaW5nR1VJTW9kZSgpIHsKLQotCQlpZiAoaXNSdW5uaW5nSW5HVUlDYWNoZSA9PSBudWxsKSB7Ci0JCQlib29sZWFuIGlzR3VpID0gZmFsc2U7Ci0JCQlzd2l0Y2ggKFVJQ29udGV4dERldGVybWluYXRpb24uZ2V0Q3VycmVudENvbnRleHQoKSkgewotCQkJY2FzZSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLlVJX0NPTlRFWFQ6Ci0JCQkJaXNHdWkgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLkhFQURMRVNTX0NPTlRFWFQ6Ci0JCQlkZWZhdWx0OgotCQkJCWlzR3VpID0gZmFsc2U7Ci0JCQl9Ci0JCQlpc1J1bm5pbmdJbkdVSUNhY2hlID0gbmV3IEJvb2xlYW4oaXNHdWkpOwotCQl9Ci0JCXJldHVybiBpc1J1bm5pbmdJbkdVSUNhY2hlLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZmVyIHRoZSBjb250cm9sIHRvIHRoZSBVSSBhbmQgcHJvbXB0cyB0byBzYXZlIGFsbCB0aGUgZWRpdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2F2ZUVkaXRvclByb21wdGVyIGdldFNhdmVFZGl0b3JIZWxwZXIoKSB7Ci0JCWxvYWRTYXZlRWRpdG9yRXh0ZW5zaW9uKCk7Ci0JCXJldHVybiBzYXZlRWRpdG9yUHJvbXB0ZXI7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkU2F2ZUVkaXRvckV4dGVuc2lvbigpIHsKLQkJaWYgKHNhdmVFZGl0b3JQcm9tcHRlciAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRVhURU5TSU9OX1BPSU5ULCAiLT4tIExvYWRpbmcgLnNhdmVFZGl0b3JQcm9tcHRlciBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCX0KLQkJCi0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJzYXZlRWRpdG9yUHJvbXB0ZXIiKTsKLQkJCi0JCWludCBzaXplID0gY2YubGVuZ3RoOwotCQlpZiAoc2l6ZSA9PSAwKSB7Ci0JCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0VYVEVOU0lPTl9QT0lOVCwgIiAgTm8gLnNhdmVFZGl0b3JQcm9tcHRlciBpcyBmb3VuZC4iKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRyeXsKLQkJCQlzYXZlRWRpdG9yUHJvbXB0ZXIgPSAoU2F2ZUVkaXRvclByb21wdGVyKWNmWzBdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQkJaWYgKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRVhURU5TSU9OX1BPSU5ULCAiICBMb2FkZWQgc2F2ZUVkaXRvclByb21wdGVyOiAiICsgY2ZbMF0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKXsKLQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIHNhdmVFZGl0b3JQcm9tcHRlcjogIiArIGNmWzBdLmdldEF0dHJpYnV0ZSgiaWQiKSwgY2UpOwotCQkJCX0JCQkKLQkJCX0KLQkJCWlmIChzaXplID4gMSkgewotCQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiICBNb3JlIHRoYW4gb25lIC5zYXZlRWRpdG9yUHJvbXB0ZXIgZm91bmQsIG9ubHkgb25lIGxvYWRlZCA9PiIKLQkJCQkJCQkrIGNmWzBdLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRVhURU5TSU9OX1BPSU5ULCAiLTwtIERvbmUgbG9hZGluZyAuc2F2ZUVkaXRvclByb21wdGVyIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQkJfQotCQkKLQl9Ci0JCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUHJlZmVyZW5jZU1vZGlmeUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJQcmVmZXJlbmNlTW9kaWZ5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE2MDE1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJQcmVmZXJlbmNlTW9kaWZ5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZU1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotcHVibGljIGNsYXNzIFNlcnZlclByZWZlcmVuY2VNb2RpZnlMaXN0ZW5lciBleHRlbmRzIFByZWZlcmVuY2VNb2RpZnlMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DS0VEX0FUVFJJQlVURV9OQU1FID0gImxvY2tlZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRVNfUFJFRkVSRU5DRV9OQU1FID0gInJ1bnRpbWVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX05PREVfTkFNRSA9ICJydW50aW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlTW9kaWZ5TGlzdGVuZXIjcHJlQXBwbHkob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXMpCi0JICovCi0JcHVibGljIElFY2xpcHNlUHJlZmVyZW5jZXMgcHJlQXBwbHkoSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlKSB7Ci0JCVByZWZlcmVuY2VzIGluc3RhbmNlID0gbm9kZS5ub2RlKEluc3RhbmNlU2NvcGUuU0NPUEUpOwotCQlQcmVmZXJlbmNlcyBydW50aW1lcyA9IGluc3RhbmNlLm5vZGUoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCk7Ci0JCWlmIChydW50aW1lcyAhPSBudWxsKQotCQkJcmVtb3ZlTG9ja2VkU2VydmVyUnVudGltZVByZWZlcmVuY2UocnVudGltZXMpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzdXBlci5wcmVBcHBseShub2RlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTG9ja2VkU2VydmVyUnVudGltZVByZWZlcmVuY2UoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpIHsKLQkJdHJ5IHsKLQkJCUZpbGUgcHJlZkZpbGUgPSBuZXcgRmlsZShwcmVmZXJlbmNlcy5nZXQoUlVOVElNRVNfUFJFRkVSRU5DRV9OQU1FLCAiIikpOwotCQkJaWYgKCFwcmVmRmlsZS5leGlzdHMoKSl7Ci0JCQkJcmV0dXJuOyAKLQkJCX0KLQkJCQotCQkJRG9jdW1lbnQgZG9jID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpCi0JCQkJCS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihwcmVmRmlsZS50b1N0cmluZygpKSkpOyAvLyROT04tTkxTLTEkCi0JCQlOb2RlTGlzdCBub2RlTGlzdCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZShSVU5USU1FX05PREVfTkFNRSk7Ci0JCQlmb3IgKGludCBzID0gMDsgcyA8IG5vZGVMaXN0LmdldExlbmd0aCgpOyBzKyspIHsKLQkJCQlOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKHMpOwotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJTm9kZSBsb2NrZWQgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShMT0NLRURfQVRUUklCVVRFX05BTUUpOwotCQkJCQlpZiAobG9ja2VkICE9IG51bGwgJiYgQm9vbGVhbi5wYXJzZUJvb2xlYW4obG9ja2VkLmdldE5vZGVWYWx1ZSgpKSkKLQkJCQkJCW5vZGUuZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZ1dyaXRlciBydW50aW1lcyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCkudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jKSwgbmV3IFN0cmVhbVJlc3VsdChydW50aW1lcykpOyAgICAgICAgCi0gICAgICAgICAgICBwcmVmZXJlbmNlcy5yZW1vdmUoUlVOVElNRVNfUFJFRkVSRU5DRV9OQU1FKTsKLSAgICAgICAgICAgIHByZWZlcmVuY2VzLnB1dChSVU5USU1FU19QUkVGRVJFTkNFX05BTUUsIHJ1bnRpbWVzLnRvU3RyaW5nKCkpOwotCQkgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCSAgICAvL3RoZXJlIGlzIG5vIGRlZmluZWQgcnVudGltZSBlbnZpcm9ubWVudCAKLQkJCSAgcmV0dXJuOwotCQkgIH0KLQkJICAKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclByZWZlcmVuY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWJkZjlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdGhhdCBzdG9yZXMgcHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBmb3Igc2VydmVyIHRvb2xzLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyUHJlZmVyZW5jZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0FVVE9fUFVCTElTSCA9ICJhdXRvLXB1Ymxpc2giOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX01PRFVMRV9TVEFSVF9USU1FT1VUID0gIm1vZHVsZS1zdGFydC10aW1lb3V0IjsKLQkJCi0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlczsKLQotCXByb3RlY3RlZCBzdGF0aWMgU2VydmVyUHJlZmVyZW5jZXMgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJQcmVmZXJlbmNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBTZXJ2ZXJQcmVmZXJlbmNlcygpIHsKLQkJc3VwZXIoKTsKLQkJcHJlZmVyZW5jZXMgPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlzZXREZWZhdWx0cygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXRpYyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdGF0aWMgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZlclByZWZlcmVuY2VzIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFNlcnZlclByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgcHVibGlzaGluZyBzaG91bGQgb2NjdXIgYmVmb3JlIHN0YXJ0aW5nIHRoZQotCSAqIHNlcnZlci4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b1B1Ymxpc2hpbmcoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFBSRUZfQVVUT19QVUJMSVNIKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHB1Ymxpc2hpbmcgc2hvdWxkIG9jY3VyIGJlZm9yZSBzdGFydGluZyB0aGUKLQkgKiBzZXJ2ZXIuCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRBdXRvUHVibGlzaGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgc2VydmVycyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVzdGFydGVkIHdoZW4KLQkgKiB0aGV5IG5lZWQgYSByZXN0YXJ0LgotCSAqCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0b1Jlc3RhcnRpbmcoYm9vbGVhbiB2YWx1ZSkgewotCQkvLyBpZ25vcmUKLQl9Ci0KLQkvKioKLQkgKiBTZXQgd2hldGhlciBwdWJsaXNoaW5nIHNob3VsZCBoYXBwZW4gYmVmb3JlIHRoZSBzZXJ2ZXIgc3RhcnRzLgotCSAqCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0b1B1Ymxpc2hpbmcoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX0FVVE9fUFVCTElTSCwgdmFsdWUpOwotCQlTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgc3RhcnQgdGltZW91dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUgc3RhcnQgdGltZW91dAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TW9kdWxlU3RhcnRUaW1lb3V0KCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0SW50KFBSRUZfTU9EVUxFX1NUQVJUX1RJTUVPVVQpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZGVmYXVsdCB2YWx1ZXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRzKCkgewotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfQVVUT19QVUJMSVNILCBpc0RlZmF1bHRBdXRvUHVibGlzaGluZygpKTsKLQkJCQotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfTU9EVUxFX1NUQVJUX1RJTUVPVVQsIDMwMDAwMSk7Ci0JCWJvb2xlYW4gc2F2ZSA9IGZhbHNlOwotCQlpZiAocHJlZmVyZW5jZXMuaXNEZWZhdWx0KFBSRUZfTU9EVUxFX1NUQVJUX1RJTUVPVVQpKSB7Ci0JCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX01PRFVMRV9TVEFSVF9USU1FT1VULCAzMDAwMDApOwotCQkJc2F2ZSA9IHRydWU7Ci0JCX0KLQkJaWYgKHNhdmUpCi0JCQlTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUHVibGlzaEluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclB1Ymxpc2hJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMzYxMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUHVibGlzaEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC4qOwotLyoqCi0gKiBIZWxwZXIgdG8gb2J0YWluIGFuZCBzdG9yZSB0aGUgcHVibGlzaGluZyBpbmZvcm1hdGlvbiAod2hhdCBmaWxlcwotICogd2VyZSBwdWJsaXNoZWQgYW5kIHdoZW4pIGZvciBhIHNpbmdsZSBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJQdWJsaXNoSW5mbyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAidmVyc2lvbiI7Ci0KLQlwcm90ZWN0ZWQgSVBhdGggcGF0aDsKLQotCS8vIG1hcCBvZiBtb2R1bGUgaWRzIHRvIE1vZHVsZVB1Ymxpc2hJbmZvCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE1vZHVsZVB1Ymxpc2hJbmZvPiBtb2R1bGVQdWJsaXNoSW5mbzsKLQotCS8qKgotCSAqIFNlcnZlclB1Ymxpc2hJbmZvIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFNlcnZlclB1Ymxpc2hJbmZvKElQYXRoIHBhdGgpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JCW1vZHVsZVB1Ymxpc2hJbmZvID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNb2R1bGVQdWJsaXNoSW5mbz4oKTsKLQkJbG9hZCgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEtleShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCi0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBtb2R1bGUubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlzYi5hcHBlbmQoIiMiKTsKLQkJCQlpZiAobW9kdWxlW2ldICE9IG51bGwpCi0JCQkJCXNiLmFwcGVuZChtb2R1bGVbaV0uZ2V0SWQoKSk7Ci0JCQkJZWxzZQotCQkJCQlzYi5hcHBlbmQoIm51bGwiKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0S2V5KFN0cmluZyBtb2R1bGVJZCkgewotCQlyZXR1cm4gbW9kdWxlSWQ7Ci0JfQotCi0JcHJpdmF0ZSBJTW9kdWxlW10gZ2V0TW9kdWxlKFN0cmluZyBtb2R1bGVJZCkgewotCQlpZiAobW9kdWxlSWQgPT0gbnVsbCB8fCBtb2R1bGVJZC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBJTW9kdWxlWzBdOwotCQkKLQkJTGlzdDxJTW9kdWxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1vZHVsZUlkLCAiIyIpOwotCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgbWlkID0gc3QubmV4dFRva2VuKCk7Ci0JCQlpZiAobWlkICE9IG51bGwgJiYgbWlkLmxlbmd0aCgpID4gMCkgewotCQkJCUlNb2R1bGUgbSA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlKG1pZCk7Ci0JCQkJaWYgKG0gPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJbGlzdC5hZGQobSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlNb2R1bGVbXSBtb2R1bGVzID0gbmV3IElNb2R1bGVbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkobW9kdWxlcyk7Ci0JCXJldHVybiBtb2R1bGVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc01vZHVsZVB1Ymxpc2hJbmZvKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJU3RyaW5nIGtleSA9IGdldEtleShtb2R1bGUpOwotCQlzeW5jaHJvbml6ZWQgKG1vZHVsZVB1Ymxpc2hJbmZvKSB7Ci0JCQlyZXR1cm4gbW9kdWxlUHVibGlzaEluZm8uY29udGFpbnNLZXkoa2V5KTsKLQkJfQotCX0KLQotCS8qcHVibGljIHZvaWQgcmVtb3ZlTW9kdWxlUHVibGlzaEluZm8oSU1vZHVsZVtdIG1vZHVsZSkgewotCQlTdHJpbmcga2V5ID0gZ2V0S2V5KG1vZHVsZSk7Ci0JCW1vZHVsZVB1Ymxpc2hJbmZvLnJlbW92ZShrZXkpOwotCQkKLQkJc2F2ZSgpOwotCX0qLwotCi0JLyoqCi0JICogCi0JICogTm90ZTogc2F2ZSgpIG11c3QgYmUgY2FsbGVkIG1hbnVhbGx5IGFmdGVyIG1ha2luZyB0aGlzIGNhbGwuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZUxpc3QKLQkgKiBAZGVwcmVjYXRlZCBVc2UgcmVtb3ZlRGVsZXRlZE1vZHVsZVB1Ymxpc2hJbmZvKFNlcnZlciwgTGlzdCkgaW5zdGVhZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURlbGV0ZWRNb2R1bGVQdWJsaXNoSW5mbyhMaXN0IG1vZHVsZUxpc3QpIHsKLQkJcmVtb3ZlRGVsZXRlZE1vZHVsZVB1Ymxpc2hJbmZvKG51bGwsIG1vZHVsZUxpc3QpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgbW9kdWxlcyBmcm9tIHRoZSBuZXh0IHB1Ymxpc2guCi0JICogTm90ZTogc2F2ZSgpIG11c3QgYmUgY2FsbGVkIG1hbnVhbGx5IGFmdGVyIG1ha2luZyB0aGlzIGNhbGwuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBtb2R1bGVMaXN0IHRoZSBtb2R1bGVzIGN1cnJlbnRseSBvbiB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGVsZXRlZE1vZHVsZVB1Ymxpc2hJbmZvKFNlcnZlciBzZXJ2ZXIsIExpc3QgbW9kdWxlTGlzdCkgewotCQlpbnQgc2l6ZSA9IG1vZHVsZUxpc3Quc2l6ZSgpOwotCQlMaXN0PFN0cmluZz4gcmVtb3ZlZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkKLQkJc3luY2hyb25pemVkIChtb2R1bGVQdWJsaXNoSW5mbykgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVQdWJsaXNoSW5mby5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCi0JCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCUlNb2R1bGVbXSBtb2R1bGUgPSAoSU1vZHVsZVtdKSBtb2R1bGVMaXN0LmdldChpKTsKLQkJCQkJU3RyaW5nIGtleTIgPSBnZXRLZXkobW9kdWxlKTsKLQkJCQkJaWYgKGtleSAhPSBudWxsICYmIGtleS5lcXVhbHMoa2V5MikpCi0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJSW50ZWdlciBpbiA9IHNlcnZlci5tb2R1bGVQdWJsaXNoU3RhdGUuZ2V0KGtleSk7Ci0JCQkJCQlpZiAoaW4gIT0gbnVsbCAmJiBpbi5pbnRWYWx1ZSgpICE9IElTZXJ2ZXIuUFVCTElTSF9TVEFURV9OT05FKQotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmICghZm91bmQpCi0JCQkJCXJlbW92ZWQuYWRkKGtleSk7Ci0JCQl9Ci0JCQkKLQkJCWl0ZXJhdG9yID0gcmVtb3ZlZC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJbW9kdWxlUHVibGlzaEluZm8ucmVtb3ZlKGtleSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHB1Ymxpc2ggc3RhdGUuCi0JICovCi0JcHJvdGVjdGVkIE1vZHVsZVB1Ymxpc2hJbmZvIGdldE1vZHVsZVB1Ymxpc2hJbmZvKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJU3RyaW5nIGtleSA9IGdldEtleShtb2R1bGUpOwotCQkKLQkJLy8gY2hlY2sgaWYgaXQgbm93IGV4aXN0cwotCQlzeW5jaHJvbml6ZWQgKG1vZHVsZVB1Ymxpc2hJbmZvKSB7Ci0JCQlpZiAobW9kdWxlUHVibGlzaEluZm8uY29udGFpbnNLZXkoa2V5KSkKLQkJCQlyZXR1cm4gbW9kdWxlUHVibGlzaEluZm8uZ2V0KGtleSk7Ci0JCQkKLQkJCS8vIGhhdmUgdG8gY3JlYXRlIGEgbmV3IG9uZQotCQkJSU1vZHVsZSBtb2QgPSBtb2R1bGVbbW9kdWxlLmxlbmd0aCAtIDFdOwotCQkJTW9kdWxlUHVibGlzaEluZm8gbXBpID0gbmV3IE1vZHVsZVB1Ymxpc2hJbmZvKGdldEtleShtb2R1bGUpLCBtb2QuZ2V0TmFtZSgpLCBtb2QuZ2V0TW9kdWxlVHlwZSgpKTsKLQkJCW1vZHVsZVB1Ymxpc2hJbmZvLnB1dChrZXksIG1waSk7Ci0JCQlyZXR1cm4gbXBpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVtb3ZlZE1vZHVsZXMoTGlzdDxJTW9kdWxlW10+IG1vZHVsZUxpc3QpIHsKLQkJaW50IHNpemUgPSBtb2R1bGVMaXN0LnNpemUoKTsKLQkJTGlzdDxNb2R1bGVQdWJsaXNoSW5mbz4gcmVtb3ZlZCA9IG5ldyBBcnJheUxpc3Q8TW9kdWxlUHVibGlzaEluZm8+KCk7Ci0JCXN5bmNocm9uaXplZCAobW9kdWxlUHVibGlzaEluZm8pIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kdWxlUHVibGlzaEluZm8ua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCi0JCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCUlNb2R1bGVbXSBtb2R1bGUgPSBtb2R1bGVMaXN0LmdldChpKTsKLQkJCQkJU3RyaW5nIGtleTIgPSBnZXRLZXkobW9kdWxlKTsKLQkJCQkJaWYgKGtleSAhPSBudWxsICYmIGtleS5lcXVhbHMoa2V5MikpCi0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJfQotCQkJCWlmICghZm91bmQpIHsKLQkJCQkJTW9kdWxlUHVibGlzaEluZm8gbXBpID0gbW9kdWxlUHVibGlzaEluZm8uZ2V0KGtleSk7Ci0JCQkJCXJlbW92ZWQuYWRkKG1waSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpdGVyYXRvciA9IHJlbW92ZWQuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlNb2R1bGVQdWJsaXNoSW5mbyBtcGkgPSAoTW9kdWxlUHVibGlzaEluZm8pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlJTW9kdWxlW10gbW9kdWxlMiA9IGdldE1vZHVsZShtcGkuZ2V0TW9kdWxlSWQoKSk7Ci0JCQkJaWYgKG1vZHVsZTIgPT0gbnVsbCB8fCBtb2R1bGUyLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCVN0cmluZyBtb2R1bGVJZCA9IG1waS5nZXRNb2R1bGVJZCgpOwotCQkJCQlpZiAobW9kdWxlSWQgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nW10gaWRzID0gZ2V0TW9kdWxlSWRzKG1vZHVsZUlkKTsKLQkJCQkJCWludCBkZXB0aCA9IGlkcy5sZW5ndGg7Ci0JCQkJCQkKLQkJCQkJCW1vZHVsZTIgPSBuZXcgSU1vZHVsZVtkZXB0aF07Ci0JCQkJCQlTdHJpbmcgcyA9ICIiOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7Ci0JCQkJCQkJcyArPSBpZHNbaV07Ci0JCQkJCQkJaWYgKGkgPT0gZGVwdGggLSAxKQotCQkJCQkJCQltb2R1bGUyW2ldID0gbXBpLmdldERlbGV0ZWRNb2R1bGUoKTsKLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJTW9kdWxlUHVibGlzaEluZm8gbXBpMiA9IG1vZHVsZVB1Ymxpc2hJbmZvLmdldChzKTsKLQkJCQkJCQkJaWYgKG1waTIgIT0gbnVsbCkKLQkJCQkJCQkJCW1vZHVsZTJbaV0gPSBtcGkyLmdldERlbGV0ZWRNb2R1bGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcyArPSAiIyI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG1vZHVsZTIgIT0gbnVsbCAmJiBtb2R1bGUyLmxlbmd0aCA+IDApCi0JCQkJCW1vZHVsZUxpc3QuYWRkKG1vZHVsZTIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgYSBjb21iaW5lZCBtb2R1bGUgaWQgc3RyaW5nIGludG8gdGhlIGluZGl2aWR1YWwgbW9kdWxlIGlkcwotCSAqIEBwYXJhbSBtb2R1bGVJZAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbW9kdWxlIGlkcwotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gZ2V0TW9kdWxlSWRzKFN0cmluZyBtb2R1bGVJZCkgewotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1vZHVsZUlkLCAiIyIpOwotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigyKTsKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJbGlzdC5hZGQoc3QubmV4dFRva2VuKCkpOwotCQl9Ci0JCQotCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShzKTsKLQkJcmV0dXJuIHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgbG9hZCgpIHsKLQkJU3RyaW5nIGZpbGVuYW1lID0gcGF0aC50b09TU3RyaW5nKCk7Ci0JCQotCQlpZiAobmV3IEZpbGUoZmlsZW5hbWUpLmV4aXN0cygpKSB7Ci0JCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIkxvYWRpbmcgcHVibGlzaCBpbmZvIGZyb20gIiArIGZpbGVuYW1lKTsKLQkJCX0KLQkJCQotCQkJRGF0YUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpKSk7Ci0JCQkJaW4ucmVhZEJ5dGUoKTsKLQkJCQlpbi5yZWFkQnl0ZSgpOwotCQkJCS8vIHZlcnNpb24KLQkJCQlpbnQgdmVyID0gaW4ucmVhZEJ5dGUoKTsKLQkJCQlpZiAodmVyIDw9IDEpIHsKLQkJCQkJaW50IHNpemUgPSBpbi5yZWFkSW50KCk7CQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJTW9kdWxlUHVibGlzaEluZm8gbXBpID0gbmV3IE1vZHVsZVB1Ymxpc2hJbmZvKGluKTsKLQkJCQkJCW1vZHVsZVB1Ymxpc2hJbmZvLnB1dChnZXRLZXkobXBpLmdldE1vZHVsZUlkKCkpLCBtcGkpOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgcHVibGlzaCBpbmZvcm1hdGlvbiIsIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgZmlsZW5hbWUubGVuZ3RoKCkgLSAzKSArICJ4bWwiOwotCQlpZiAobmV3IEZpbGUoZmlsZW5hbWUpLmV4aXN0cygpKSB7Ci0JCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIkxvYWRpbmcgcHVibGlzaCBpbmZvIGZyb20gb2xkIGZvcm1hdCAiICsgZmlsZW5hbWUpOwotCQkJfQotCQkJCi0JCQl0cnkgewotCQkJCUlNZW1lbnRvIG1lbWVudG8yID0gWE1MTWVtZW50by5sb2FkTWVtZW50byhmaWxlbmFtZSk7Ci0JCQkJRmxvYXQgZiA9IG1lbWVudG8yLmdldEZsb2F0KFZFUlNJT04pOwotCQkJCWlmIChmICE9IG51bGwgJiYgZi5mbG9hdFZhbHVlKCkgPj0gMykKLQkJCQkJcmV0dXJuOwotCQkJCQotCQkJCUlNZW1lbnRvW10gY2hpbGRyZW4gPSBtZW1lbnRvMi5nZXRDaGlsZHJlbigibW9kdWxlIik7Ci0JCQkJCi0JCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJTW9kdWxlUHVibGlzaEluZm8gbXBpID0gbmV3IE1vZHVsZVB1Ymxpc2hJbmZvKGNoaWxkcmVuW2ldKTsKLQkJCQkJbW9kdWxlUHVibGlzaEluZm8ucHV0KGdldEtleShtcGkuZ2V0TW9kdWxlSWQoKSksIG1waSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIHB1Ymxpc2ggaW5mb3JtYXRpb24iLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKCkgewotCQlTdHJpbmcgZmlsZW5hbWUgPSBwYXRoLnRvT1NTdHJpbmcoKTsKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIlNhdmluZyBwdWJsaXNoIGluZm8gdG8gIiArIGZpbGVuYW1lKTsKLQkJfQotCQkKLQkJRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQl0cnkgewotCQkJb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKSkpOwotCQkJb3V0LndyaXRlQnl0ZSgxNCk7Ci0JCQlvdXQud3JpdGVCeXRlKDE0KTsKLQkJCS8vIHZlcnNpb24KLQkJCW91dC53cml0ZUJ5dGUoMSk7Ci0JCQkKLQkJCXN5bmNocm9uaXplZCAobW9kdWxlUHVibGlzaEluZm8pIHsKLQkJCQlvdXQud3JpdGVJbnQobW9kdWxlUHVibGlzaEluZm8ua2V5U2V0KCkuc2l6ZSgpKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZVB1Ymxpc2hJbmZvLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlTdHJpbmcgY29udHJvbFJlZiA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJTW9kdWxlUHVibGlzaEluZm8gbXBpID0gbW9kdWxlUHVibGlzaEluZm8uZ2V0KGNvbnRyb2xSZWYpOwotCQkJCQltcGkuc2F2ZShvdXQpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgcHVibGlzaCBpbmZvcm1hdGlvbiIsIGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAob3V0ICE9IG51bGwpCi0JCQkJCW91dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCQkKLQkJLy8gcmVtb3ZlIG9sZCBmaWxlCi0JCWZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGZpbGVuYW1lLmxlbmd0aCgpIC0gMykgKyAieG1sIjsKLQkJRmlsZSBmID0gbmV3IEZpbGUoZmlsZW5hbWUpOwotCQlpZiAoZi5leGlzdHMoKSkKLQkJCWYuZGVsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogTm90ZTogc2F2ZSgpIG11c3QgYmUgY2FsbGVkIG1hbnVhbGx5IGFmdGVyIG1ha2luZyB0aGlzIGNhbGwuCi0JICogQHBhcmFtIG1vZHVsZQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGwoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlNb2R1bGVQdWJsaXNoSW5mbyBtcGkgPSBnZXRNb2R1bGVQdWJsaXNoSW5mbyhtb2R1bGUpOwotCQltcGkuZmlsbChtb2R1bGUpOwotCX0KLQotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGdldERlbHRhKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJTW9kdWxlUmVzb3VyY2VEZWx0YVswXTsKLQkJCi0JCXJldHVybiBnZXRNb2R1bGVQdWJsaXNoSW5mbyhtb2R1bGUpLmdldERlbHRhKG1vZHVsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZVtdIGdldFJlc291cmNlcyhJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSU1vZHVsZVJlc291cmNlWzBdOwotCQkKLQkJcmV0dXJuIGdldE1vZHVsZVB1Ymxpc2hJbmZvKG1vZHVsZSkuZ2V0TW9kdWxlUmVzb3VyY2VzKG1vZHVsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGdldERlbHRhKElNb2R1bGVSZXNvdXJjZVtdIG9yaWdpbmFsLCBJTW9kdWxlUmVzb3VyY2VbXSBjdXJyZW50KSB7Ci0JCWlmIChvcmlnaW5hbCA9PSBudWxsIHx8IGN1cnJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSU1vZHVsZVJlc291cmNlRGVsdGFbMF07Ci0JCQotCQlMaXN0PE1vZHVsZVJlc291cmNlRGVsdGE+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE1vZHVsZVJlc291cmNlRGVsdGE+KCk7Ci0JCWludCBzaXplID0gb3JpZ2luYWwubGVuZ3RoOwotCQlpbnQgc2l6ZTIgPSBjdXJyZW50Lmxlbmd0aDsKLQkJCi0JCU1hcDxJTW9kdWxlUmVzb3VyY2UsIElNb2R1bGVSZXNvdXJjZT4gb3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcDxJTW9kdWxlUmVzb3VyY2UsIElNb2R1bGVSZXNvdXJjZT4oc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXsKLQkJCW9yaWdpbmFsTWFwLnB1dChvcmlnaW5hbFtpXSwgb3JpZ2luYWxbaV0pOwotCQl9Ci0JCQotCQkvLyBhZGRlZCBhbmQgY2hhbmdlZCByZXNvdXJjZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKSB7Ci0JCQlJTW9kdWxlUmVzb3VyY2Ugb2xkID0gb3JpZ2luYWxNYXAucmVtb3ZlKGN1cnJlbnRbaV0pOwotCQkJaWYgKG9sZCA9PSBudWxsKSB7Ci0JCQkJTW9kdWxlUmVzb3VyY2VEZWx0YSBkZWx0YSA9IG5ldyBNb2R1bGVSZXNvdXJjZURlbHRhKGN1cnJlbnRbaV0sIElNb2R1bGVSZXNvdXJjZURlbHRhLkFEREVEKTsKLQkJCQlpZiAoY3VycmVudFtpXSBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIpIHsKLQkJCQkJSU1vZHVsZUZvbGRlciBjdXJyZW50Rm9sZGVyID0gKElNb2R1bGVGb2xkZXIpIGN1cnJlbnRbaV07IAotCQkJCQlkZWx0YS5zZXRDaGlsZHJlbihnZXREZWx0YVRyZWUoY3VycmVudEZvbGRlci5tZW1iZXJzKCksIElNb2R1bGVSZXNvdXJjZURlbHRhLkFEREVEKSk7Ci0JCQkJfQotCQkJCWxpc3QuYWRkKGRlbHRhKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGN1cnJlbnRbaV0gaW5zdGFuY2VvZiBJTW9kdWxlRmlsZSkgewotCQkJCQkvLyBpbmNsdWRlIGZpbGVzIG9ubHkgaWYgdGhlIG1vZGlmaWNhdGlvbiBzdGFtcCBoYXMgY2hhbmdlZAotCQkJCQlJTW9kdWxlRmlsZSBtZjEgPSAoSU1vZHVsZUZpbGUpIG9sZDsKLQkJCQkJSU1vZHVsZUZpbGUgbWYyID0gKElNb2R1bGVGaWxlKSBjdXJyZW50W2ldOwotCQkJCQlpZiAobWYxLmdldE1vZGlmaWNhdGlvblN0YW1wKCkgIT0gbWYyLmdldE1vZGlmaWNhdGlvblN0YW1wKCkpIHsKLQkJCQkJCWxpc3QuYWRkKG5ldyBNb2R1bGVSZXNvdXJjZURlbHRhKGN1cnJlbnRbaV0sIElNb2R1bGVSZXNvdXJjZURlbHRhLkNIQU5HRUQpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGluY2x1ZGUgZm9sZGVycyBvbmx5IGlmIHRoZWlyIGNvbnRlbnRzIGhhdmUgY2hhbmdlZAotCQkJCQlJTW9kdWxlRm9sZGVyIG1mMSA9IChJTW9kdWxlRm9sZGVyKSBvbGQ7Ci0JCQkJCUlNb2R1bGVGb2xkZXIgbWYyID0gKElNb2R1bGVGb2xkZXIpIGN1cnJlbnRbaV07Ci0JCQkJCUlNb2R1bGVSZXNvdXJjZURlbHRhW10gbXJkYyA9IGdldERlbHRhKG1mMS5tZW1iZXJzKCksIG1mMi5tZW1iZXJzKCkpOwotCQkJCQlpZiAobXJkYy5sZW5ndGggPiAwKSB7Ci0JCQkJCQlNb2R1bGVSZXNvdXJjZURlbHRhIG1yZCA9IG5ldyBNb2R1bGVSZXNvdXJjZURlbHRhKGN1cnJlbnRbaV0sIElNb2R1bGVSZXNvdXJjZURlbHRhLk5PX0NIQU5HRSk7Ci0JCQkJCQltcmQuc2V0Q2hpbGRyZW4obXJkYyk7Ci0JCQkJCQlsaXN0LmFkZChtcmQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyByZW1vdmVkIHJlc291cmNlcwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKG9yaWdpbmFsTWFwLmNvbnRhaW5zS2V5KG9yaWdpbmFsW2ldKSkgewotCQkJCU1vZHVsZVJlc291cmNlRGVsdGEgZGVsdGEgPSBuZXcgTW9kdWxlUmVzb3VyY2VEZWx0YShvcmlnaW5hbFtpXSwgSU1vZHVsZVJlc291cmNlRGVsdGEuUkVNT1ZFRCk7Ci0JCQkJaWYgKG9yaWdpbmFsW2ldIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikgewotCQkJCQlJTW9kdWxlRm9sZGVyIHJlbW92ZWRGb2xkZXIgPSAoSU1vZHVsZUZvbGRlcikgb3JpZ2luYWxbaV07IAotCQkJCQlkZWx0YS5zZXRDaGlsZHJlbihnZXREZWx0YVRyZWUocmVtb3ZlZEZvbGRlci5tZW1iZXJzKCksIElNb2R1bGVSZXNvdXJjZURlbHRhLlJFTU9WRUQpKTsKLQkJCQl9Ci0JCQkJbGlzdC5hZGQoZGVsdGEpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IElNb2R1bGVSZXNvdXJjZURlbHRhW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzRGVsdGEoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlyZXR1cm4gaGFzTW9kdWxlUHVibGlzaEluZm8obW9kdWxlKSAKLSAgICAgICAgICAgICYmIGdldE1vZHVsZVB1Ymxpc2hJbmZvKG1vZHVsZSkuaGFzRGVsdGEobW9kdWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaGFzRGVsdGEoSU1vZHVsZVJlc291cmNlW10gb3JpZ2luYWwsIElNb2R1bGVSZXNvdXJjZVtdIGN1cnJlbnQpIHsKLQkJaWYgKG9yaWdpbmFsID09IG51bGwgfHwgY3VycmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaW50IHNpemUgPSBvcmlnaW5hbC5sZW5ndGg7Ci0JCWludCBzaXplMiA9IGN1cnJlbnQubGVuZ3RoOwotCQkKLQkJTWFwPElNb2R1bGVSZXNvdXJjZSwgSU1vZHVsZVJlc291cmNlPiBvcmlnaW5hbE1hcCA9IG5ldyBIYXNoTWFwPElNb2R1bGVSZXNvdXJjZSwgSU1vZHVsZVJlc291cmNlPihzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQlvcmlnaW5hbE1hcC5wdXQob3JpZ2luYWxbaV0sIG9yaWdpbmFsW2ldKTsKLQkJCi0JCS8vIGFkZGVkIGFuZCBjaGFuZ2VkIHJlc291cmNlcwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUyOyBpKyspIHsKLQkJCUlNb2R1bGVSZXNvdXJjZSBvbGQgPSBvcmlnaW5hbE1hcC5yZW1vdmUoY3VycmVudFtpXSk7Ci0JCQlpZiAob2xkID09IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkKLQkJCWlmIChjdXJyZW50W2ldIGluc3RhbmNlb2YgSU1vZHVsZUZpbGUpIHsKLQkJCQkvLyBpbmNsdWRlIGZpbGVzIG9ubHkgaWYgdGhlIG1vZGlmaWNhdGlvbiBzdGFtcCBoYXMgY2hhbmdlZAotCQkJCUlNb2R1bGVGaWxlIG1mMSA9IChJTW9kdWxlRmlsZSkgb2xkOwotCQkJCUlNb2R1bGVGaWxlIG1mMiA9IChJTW9kdWxlRmlsZSkgY3VycmVudFtpXTsKLQkJCQlpZiAobWYxLmdldE1vZGlmaWNhdGlvblN0YW1wKCkgIT0gbWYyLmdldE1vZGlmaWNhdGlvblN0YW1wKCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBpbmNsdWRlIGZvbGRlcnMgb25seSBpZiB0aGVpciBjb250ZW50cyBoYXZlIGNoYW5nZWQKLQkJCQlJTW9kdWxlRm9sZGVyIG1mMSA9IChJTW9kdWxlRm9sZGVyKSBvbGQ7Ci0JCQkJSU1vZHVsZUZvbGRlciBtZjIgPSAoSU1vZHVsZUZvbGRlcikgY3VycmVudFtpXTsKLQkJCQlpZiAoaGFzRGVsdGEobWYxLm1lbWJlcnMoKSwgbWYyLm1lbWJlcnMoKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQkvLyByZW1vdmVkIHJlc291cmNlcwotCQlyZXR1cm4gIW9yaWdpbmFsTWFwLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSByZXNvdXJjZSBkZWx0YSBmb3IgYW4gZW50aXJlIHRyZWUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBnZXREZWx0YVRyZWUoSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzLCBpbnQga2luZCkgewotCQlpZiAocmVzb3VyY2VzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElNb2R1bGVSZXNvdXJjZURlbHRhWzBdOwotCQkKLQkJTGlzdDxNb2R1bGVSZXNvdXJjZURlbHRhPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxNb2R1bGVSZXNvdXJjZURlbHRhPigpOwotCQkKLQkJLy8gbG9vayBmb3IgZHVwbGljYXRlcwotCQlpbnQgc2l6ZSA9IHJlc291cmNlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlNb2R1bGVSZXNvdXJjZURlbHRhIG1yZCA9IG5ldyBNb2R1bGVSZXNvdXJjZURlbHRhKHJlc291cmNlc1tpXSwga2luZCk7Ci0JCQlpZiAocmVzb3VyY2VzW2ldIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikgewotCQkJCUlNb2R1bGVGb2xkZXIgbWYgPSAoSU1vZHVsZUZvbGRlcikgcmVzb3VyY2VzW2ldOwotCQkJCW1yZC5zZXRDaGlsZHJlbihnZXREZWx0YVRyZWUobWYubWVtYmVycygpLCBraW5kKSk7Ci0JCQl9Ci0JCQlsaXN0LmFkZChtcmQpOwotCQl9Ci0JCQotCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBJTW9kdWxlUmVzb3VyY2VEZWx0YVtsaXN0LnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGlzdCBvZiBtb2R1bGVzIGJlaW5nIHB1Ymxpc2hlZCBkb2VzIG5vdCBtYXRjaCB0aGUgcHJldmlvdXMKLQkgKiBsaXN0IG9mIHB1Ymxpc2hlZCBtb2R1bGVzLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGVzIGEgbGlzdCBvZiBtb2R1bGVzCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3RydWN0dXJlIG9mIHB1Ymxpc2hlZCBtb2R1bGVzIGhhcyBjaGFuZ2VkLCBvcgotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNTdHJ1Y3R1cmVDaGFuZ2VkKExpc3Q8SU1vZHVsZVtdPiBtb2R1bGVzKSB7Ci0JCXN5bmNocm9uaXplZCAobW9kdWxlUHVibGlzaEluZm8pIHsKLQkJCS8vIGlmIHRoZSBsaXN0cyBhcmUgZGlmZmVyZW50IHNpemUsIHRoZSBzdHJ1Y3R1cmVkIGNoYW5nZWQKLQkJCWlmIChtb2R1bGVzLnNpemUoKSAhPSBtb2R1bGVQdWJsaXNoSW5mby5rZXlTZXQoKS5zaXplKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkKLQkJCS8vIGlmIHRoZSBsaXN0IGFyZSB0aGUgc2FtZSBzaXplLCBjb21wYXJlIG1vZHVsZXMgaWQKLQkJCWZpbmFsIGJvb2xlYW5bXSBjaGFuZ2VkID0gbmV3IGJvb2xlYW5bMV07Ci0JCQkKLQkJCWZvciAoSU1vZHVsZVtdIG1vZHVsZTptb2R1bGVzKXsKLQkJCQlTdHJpbmcga2V5ID0gZ2V0S2V5KG1vZHVsZSk7Ci0JCQkJaWYgKCFtb2R1bGVQdWJsaXNoSW5mby5jb250YWluc0tleShrZXkpKXsKLQkJCQkJY2hhbmdlZFswXSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlyZXR1cm4gY2hhbmdlZFswXTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbGwgdGhlIG1vZHVsZSBjYWNoZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydENhY2hpbmcoKSB7Ci0JCXN5bmNocm9uaXplZCAobW9kdWxlUHVibGlzaEluZm8pIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kdWxlUHVibGlzaEluZm8udmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlNb2R1bGVQdWJsaXNoSW5mbyBtcGkgPSAoTW9kdWxlUHVibGlzaEluZm8pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQltcGkuc3RhcnRDYWNoaW5nKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgYWxsIGNhY2hlcyBvZiBjdXJyZW50IG1vZHVsZSByZXNvdXJjZXMgYW5kIGRlbHRhcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhckNhY2hlKCkgewotCQlzeW5jaHJvbml6ZWQgKG1vZHVsZVB1Ymxpc2hJbmZvKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZVB1Ymxpc2hJbmZvLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJTW9kdWxlUHVibGlzaEluZm8gbXBpID0gKE1vZHVsZVB1Ymxpc2hJbmZvKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJbXBpLmNsZWFyQ2FjaGUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlY3JlYXRlcyB0aGUgY2FjaGUgZm9yIHRoZSBzcGVjaWZpZWQge0BsaW5rIElNb2R1bGV9LgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgVGhlIHtAbGluayBJTW9kdWxlfQotCSAqLwotCXB1YmxpYyB2b2lkIHJlYnVpbGRDYWNoZShJTW9kdWxlW10gbW9kdWxlKSB7Ci0KLQkJc3luY2hyb25pemVkIChtb2R1bGVQdWJsaXNoSW5mbykgewotCQkJZmluYWwgU3RyaW5nIHB1Ymxpc2hJbmZvS2V5ID0gdGhpcy5nZXRLZXkobW9kdWxlKTsKLQkJCU1vZHVsZVB1Ymxpc2hJbmZvIG1waSA9IG1vZHVsZVB1Ymxpc2hJbmZvLmdldChwdWJsaXNoSW5mb0tleSk7Ci0JCQlpZihtcGkgIT0gbnVsbCkgewotCQkJCW1waS5zdGFydENhY2hpbmcoKTsgLy8gY2xlYXIgb3V0IHRoZSByZXNvdXJjZSBsaXN0Ci0JCQkJbXBpLmZpbGwobW9kdWxlKTsgLy8gcmVidWlsZCB0aGUgcmVzb3VyY2UgbGlzdAotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclNjaGVkdWxpbmdSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJTY2hlZHVsaW5nUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGM3OTBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclNjaGVkdWxpbmdSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBTaW1wbGUgam9iIHNjaGVkdWxpbmcgcnVsZSB0aGF0IHN0b3BzIGEgc2VydmVyIGZyb20gc3RhcnRpbmcsCi0gKiBwdWJsaXNoaW5nLCBvciBzdG9wcGluZyBhdCB0aGUgc2FtZSB0aW1lLgotICogCi0gKiBAZGVwcmVjYXRlZCB1c2UgSVNlcnZlciBpbnN0YW5jZSBkaXJlY3RseQotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyU2NoZWR1bGluZ1J1bGUgaW1wbGVtZW50cyBJU2NoZWR1bGluZ1J1bGUgewotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQotCXB1YmxpYyBTZXJ2ZXJTY2hlZHVsaW5nUnVsZShJU2VydmVyIHNlcnZlcikgewotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQlyZXR1cm4gKHJ1bGUgaW5zdGFuY2VvZiBJU2VydmVyIHx8IHJ1bGUgaW5zdGFuY2VvZiBTZXJ2ZXJTY2hlZHVsaW5nUnVsZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb25mbGljdGluZyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQlpZiAoIShydWxlIGluc3RhbmNlb2YgSVNlcnZlcikgJiYgIShydWxlIGluc3RhbmNlb2YgU2VydmVyU2NoZWR1bGluZ1J1bGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQlJU2VydmVyIHMgPSAoSVNlcnZlcikgcnVsZTsKLQkJCXJldHVybiBzZXJ2ZXIuZXF1YWxzKHMpOwotCQl9Ci0JCQotCQlTZXJ2ZXJTY2hlZHVsaW5nUnVsZSBzc3J1bGUgPSAoU2VydmVyU2NoZWR1bGluZ1J1bGUpIHJ1bGU7Ci0JCXJldHVybiBzc3J1bGUuc2VydmVyLmVxdWFscyhzZXJ2ZXIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiU2VydmVyIHNjaGVkdWxpbmcgcnVsZSBmb3IgIiArIHNlcnZlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWE1ODFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyQmVoYXZpb3VyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckRlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclR5cGUgaW1wbGVtZW50cyBJU2VydmVyVHlwZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVElNRU9VVCA9IDEwMDAgKiA2MCAqIDQ7IC8vIDQgbWludXRlcwotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJUeXBlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU2VydmVyVHlwZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgZmFjdG9yeS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdGFydEJlZm9yZVB1Ymxpc2goKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gInRydWUiLmVxdWFscyhlbGVtZW50LmdldEF0dHJpYnV0ZSgic3RhcnRCZWZvcmVQdWJsaXNoIikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFNlcnZlckRlbGVnYXRlIGNyZWF0ZVNlcnZlckRlbGVnYXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIChTZXJ2ZXJEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlIGNyZWF0ZVNlcnZlckJlaGF2aW91ckRlbGVnYXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIChTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJiZWhhdmlvdXJDbGFzcyIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVJ1bnRpbWVUeXBlIGdldFJ1bnRpbWVUeXBlKCkgewotCQl0cnkgewotCQkJU3RyaW5nIHR5cGVJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW50aW1lVHlwZUlkIik7Ci0JCQlpZiAodHlwZUlkID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gU2VydmVyQ29yZS5maW5kUnVudGltZVR5cGUodHlwZUlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUnVudGltZSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInJ1bnRpbWUiKTsKLQkJCXJldHVybiAidHJ1ZSIuZXF1YWxzKHMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIElMYXVuY2hDb25maWd1cmF0aW9uVHlwZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBsYXVuY2hDb25maWdJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJsYXVuY2hDb25maWdJZCIpOwotCQkJaWYgKGxhdW5jaENvbmZpZ0lkID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlJTGF1bmNoTWFuYWdlciBsYXVuY2hNYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJCXJldHVybiBsYXVuY2hNYW5hZ2VyLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKGxhdW5jaENvbmZpZ0lkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2VydmVyIGNhbiBzdGFydCBvciBtYXkgYWxyZWFkeSBiZSBzdGFydGVkCi0JICogaW4gdGhlIGdpdmVuIG1vZGUsIGFuZCBmYWxzZSBpZiBub3QuIFVzZXMgdGhlIGxhdW5jaE1vZGUgYXR0cmlidXRlLAotCSAqIHdoaWNoIG1heSBjb250YWluIHRoZSBzdHJpbmdzICJydW4iLCAiZGVidWciLCBhbmQvb3IgInByb2ZpbGUiLgotCSAqIAotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIFN0cmluZwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzTGF1bmNoTW9kZShTdHJpbmcgbGF1bmNoTW9kZSkgewotCQl0cnkgewotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIGNvbmZpZ1R5cGUgPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZSgpOwotCQkJaWYgKGNvbmZpZ1R5cGUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gY29uZmlnVHlwZS5zdXBwb3J0c01vZGUobGF1bmNoTW9kZSk7Ci0JCQkKLQkJCVN0cmluZyBtb2RlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImxhdW5jaE1vZGVzIik7Ci0JCQlpZiAobW9kZSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiBtb2RlLmluZGV4T2YobGF1bmNoTW9kZSkgPj0gMDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzUmVtb3RlSG9zdHMoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgaG9zdHMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgic3VwcG9ydHNSZW1vdGVIb3N0cyIpOwotCQkJcmV0dXJuIChob3N0cyAhPSBudWxsICYmIGhvc3RzLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJ0cnVlIikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIGJ5dGUgZ2V0SW5pdGlhbFN0YXRlKCkgewotCQl0cnkgewotCQkJU3RyaW5nIHN0YXRlU3RyaW5nID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImluaXRpYWxTdGF0ZSIpOwotCQkJaWYgKHN0YXRlU3RyaW5nICE9IG51bGwpCi0JCQkJc3RhdGVTdHJpbmcgPSBzdGF0ZVN0cmluZy50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKCJzdG9wcGVkIi5lcXVhbHMoc3RhdGVTdHJpbmcpKQotCQkJCXJldHVybiBJU2VydmVyLlNUQVRFX1NUT1BQRUQ7Ci0JCQllbHNlIGlmICgic3RhcnRlZCIuZXF1YWxzKHN0YXRlU3RyaW5nKSkKLQkJCQlyZXR1cm4gSVNlcnZlci5TVEFURV9TVEFSVEVEOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIElTZXJ2ZXIuU1RBVEVfVU5LTk9XTjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNTZXJ2ZXJDb25maWd1cmF0aW9uKCkgewotCQl0cnkgewotCQkJcmV0dXJuICgidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShlbGVtZW50LmdldEF0dHJpYnV0ZSgiaGFzQ29uZmlndXJhdGlvbiIpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGNyZWF0ZVNlcnZlcihTdHJpbmcgaWQsIElGaWxlIGZpbGUsIElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlTZXJ2ZXJXb3JraW5nQ29weSBzd2MgPSBuZXcgU2VydmVyV29ya2luZ0NvcHkoaWQsIGZpbGUsIHJ1bnRpbWUsIHRoaXMpOwotCQlpZiAoaGFzUnVudGltZSgpKQotCQkJc3djLnNldFJ1bnRpbWUocnVudGltZSk7Ci0JCQotCQlzd2Muc2V0RGVmYXVsdHMobW9uaXRvcik7Ci0JCQotCQlpZiAoaGFzU2VydmVyQ29uZmlndXJhdGlvbigpICYmIHJ1bnRpbWUgIT0gbnVsbCAmJiBydW50aW1lLmdldExvY2F0aW9uKCkgIT0gbnVsbCAmJiAhcnVudGltZS5nZXRMb2NhdGlvbigpLmlzRW1wdHkoKSkKLQkJCXN3Yy5pbXBvcnRSdW50aW1lQ29uZmlndXJhdGlvbihydW50aW1lLCBudWxsKTsKLQkJCi0JCXJldHVybiBzd2M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gcnVudGltZSBpbnN0YW5jZXMgb2YKLQkgKiB0aGUgZ2l2ZW4gcnVudGltZSB0eXBlLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBmaWx0ZXJzIHRoZSBsaXN0IG9mIGtub3duCi0JICogcnVudGltZSAoe0BsaW5rIFNlcnZlckNvcmUjZ2V0UnVudGltZXMoKX0pIGZvciBvbmVzIHdpdGggYSBtYXRjaGluZwotCSAqIHJ1bnRpbWUgdHlwZSAoe0BsaW5rIElSdW50aW1lI2dldFJ1bnRpbWVUeXBlKCl9KS4gVGhlIGFycmF5IHdpbGwgbm90Ci0JICogY29udGFpbiBhbnkgd29ya2luZyBjb3BpZXMuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHJ1bnRpbWVUeXBlIHRoZSBydW50aW1lIHR5cGUKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgbGlzdCBvZiBydW50aW1lIGluc3RhbmNlcyB7QGxpbmsgSVJ1bnRpbWV9Ci0JICogb2YgdGhlIGdpdmVuIHJ1bnRpbWUgdHlwZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSVJ1bnRpbWVbXSBnZXRSdW50aW1lcyhJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKLQkJTGlzdDxJUnVudGltZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWU+KCk7Ci0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCWlmIChydW50aW1lcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKHJ1bnRpbWVzW2ldLmdldFJ1bnRpbWVUeXBlKCkgIT0gbnVsbCAmJiBydW50aW1lc1tpXS5nZXRSdW50aW1lVHlwZSgpLmVxdWFscyhydW50aW1lVHlwZSkpCi0JCQkJCWxpc3QuYWRkKHJ1bnRpbWVzW2ldKTsKLQkJCX0KLQkJfQotCQkKLQkJSVJ1bnRpbWVbXSByID0gbmV3IElSdW50aW1lW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHIpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGNyZWF0ZVNlcnZlcihTdHJpbmcgaWQsIElGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJUnVudGltZSBydW50aW1lID0gbnVsbDsKLQkJaWYgKGhhc1J1bnRpbWUoKSkgewotCQkJLy8gbG9vayBmb3IgZXhpc3RpbmcgcnVudGltZQotCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gZ2V0UnVudGltZVR5cGUoKTsKLQkJCUlSdW50aW1lW10gcnVudGltZXMgPSBnZXRSdW50aW1lcyhydW50aW1lVHlwZSk7Ci0JCQlpZiAocnVudGltZXMgIT0gbnVsbCAmJiBydW50aW1lcy5sZW5ndGggPiAwKQotCQkJCXJ1bnRpbWUgPSBydW50aW1lc1swXTsKLQkJCWVsc2UgewotCQkJCS8vIGNyZWF0ZSBydW50aW1lCi0JCQkJdHJ5IHsKLQkJCQkJcnVudGltZSA9IHJ1bnRpbWVUeXBlLmNyZWF0ZVJ1bnRpbWUoaWQsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZG4ndCBjcmVhdGUgcnVudGltZSIsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlTZXJ2ZXJXb3JraW5nQ29weSBzd2MgPSBuZXcgU2VydmVyV29ya2luZ0NvcHkoaWQsIGZpbGUsIHJ1bnRpbWUsIHRoaXMpOwotCQlpZiAocnVudGltZSAhPSBudWxsKQotCQkJc3djLnNldFJ1bnRpbWUocnVudGltZSk7Ci0JCQotCQlzd2Muc2V0RGVmYXVsdHMobW9uaXRvcik7Ci0JCWlmIChzd2MuZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSkKLQkJCXN3Yy5pbXBvcnRSdW50aW1lQ29uZmlndXJhdGlvbihydW50aW1lLCBudWxsKTsKLQkJCi0JCXJldHVybiBzd2M7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0U2VydmVyUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJaWYgKHByb2plY3RzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcHJvamVjdHMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoU2VydmVyUGx1Z2luLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3RzW2ldKS5pc1NlcnZlclByb2plY3QoKSkKLQkJCQkJcmV0dXJuIHByb2plY3RzW2ldOwotCQkJfQotCQl9Ci0JCQotCQlTdHJpbmcgcyA9IGZpbmRVbnVzZWRTZXJ2ZXJQcm9qZWN0TmFtZSgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHMpOwotCQlwcm9qZWN0LmNyZWF0ZShudWxsKTsKLQkJcHJvamVjdC5vcGVuKG51bGwpOwotCQlTZXJ2ZXJQbHVnaW4uZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCkuc2V0U2VydmVyUHJvamVjdCh0cnVlLCBudWxsKTsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgYW4gdW51c2VkIHByb2plY3QgbmFtZSB0byB1c2UgYXMgYSBzZXJ2ZXIgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBmaW5kVW51c2VkU2VydmVyUHJvamVjdE5hbWUoKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlTdHJpbmcgbmFtZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmRlZmF1bHRTZXJ2ZXJQcm9qZWN0TmFtZSwgIiIpLnRyaW0oKTsKLQkJaW50IGNvdW50ID0gMTsKLQkJd2hpbGUgKHJvb3QuZ2V0UHJvamVjdChuYW1lKS5leGlzdHMoKSkgewotCQkJbmFtZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmRlZmF1bHRTZXJ2ZXJQcm9qZWN0TmFtZSwgKytjb3VudCArICIiKS50cmltKCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0aW1lb3V0IChpbiBtcykgdGhhdCBzaG91bGQgYmUgdXNlZCB0byB3YWl0IGZvciB0aGUgc2VydmVyIHRvIHN0YXJ0LgotCSAqIFRoZSBkZWZhdWx0IGlzIDIgbWludXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgc3RhcnR1cCB0aW1lb3V0Ci0JICovCi0JcHVibGljIGludCBnZXRTdGFydFRpbWVvdXQoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZSgic3RhcnRUaW1lb3V0IikpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIERFRkFVTFRfVElNRU9VVDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRpbWVvdXQgKGluIG1zKSB0byB3YWl0IGJlZm9yZSBhc3N1bWluZyB0aGF0IHRoZSBzZXJ2ZXIKLQkgKiBoYXMgZmFpbGVkIHRvIHN0b3AuIFRoZSBkZWZhdWx0IGlzIDIgbWludXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgc2h1dGRvd24gdGltZW91dAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RvcFRpbWVvdXQoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZSgic3RvcFRpbWVvdXQiKSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gREVGQVVMVF9USU1FT1VUOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWVsZW1lbnQgPSBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNlcnZlclR5cGVbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlcldvcmtpbmdDb3B5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJXb3JraW5nQ29weS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGRkNmJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlcldvcmtpbmdDb3B5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSW50ZXJuYWxJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUHVibGlzaE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyQmVoYXZpb3VyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckRlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlcldvcmtpbmdDb3B5IGV4dGVuZHMgU2VydmVyIGltcGxlbWVudHMgSVNlcnZlcldvcmtpbmdDb3B5IHsKLQlwcm90ZWN0ZWQgU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgV29ya2luZ0NvcHlIZWxwZXIgd2NoOwotCi0JcHJvdGVjdGVkIFNlcnZlckRlbGVnYXRlIHdvcmtpbmdDb3B5RGVsZWdhdGU7Ci0KLQkvLyB3b3JraW5nIGNvcHkKLQlwdWJsaWMgU2VydmVyV29ya2luZ0NvcHkoU2VydmVyIHNlcnZlcikgewotCQlzdXBlcihzZXJ2ZXIuZ2V0RmlsZSgpKTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCQotCQltYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oc2VydmVyLm1hcCk7Ci0JCXdjaCA9IG5ldyBXb3JraW5nQ29weUhlbHBlcih0aGlzKTsKLQkJCi0JCXJlc29sdmUoKTsKLQl9Ci0KLQkvLyBjcmVhdGlvbgotCXB1YmxpYyBTZXJ2ZXJXb3JraW5nQ29weShTdHJpbmcgaWQsIElGaWxlIGZpbGUsIElSdW50aW1lIHJ1bnRpbWUsIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUpIHsKLQkJc3VwZXIoaWQsIGZpbGUsIHJ1bnRpbWUsIHNlcnZlclR5cGUpOwotCQl3Y2ggPSBuZXcgV29ya2luZ0NvcHlIZWxwZXIodGhpcyk7Ci0JCXdjaC5zZXREaXJ0eSh0cnVlKTsKLQkJc2VydmVyU3RhdGUgPSAoKFNlcnZlclR5cGUpc2VydmVyVHlwZSkuZ2V0SW5pdGlhbFN0YXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElTZXJ2ZXIgZ2V0T3JpZ2luYWwoKSB7Ci0JCXJldHVybiBzZXJ2ZXI7Ci0JfQotCi0JcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBjcmVhdGVXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIGludCBnZXRTZXJ2ZXJTdGF0ZSgpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpOwotCQlyZXR1cm4gc3VwZXIuZ2V0U2VydmVyU3RhdGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJTdGF0ZShpbnQgc3RhdGUpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyLnNldFNlcnZlclN0YXRlKHN0YXRlKTsKLQkJZWxzZQotCQkJc3VwZXIuc2V0U2VydmVyU3RhdGUoc3RhdGUpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2VydmVyUHVibGlzaFN0YXRlKCkgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlyZXR1cm4gc2VydmVyLmdldFNlcnZlclB1Ymxpc2hTdGF0ZSgpOwotCQlyZXR1cm4gc3VwZXIuZ2V0U2VydmVyUHVibGlzaFN0YXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmVyUHVibGlzaFN0YXRlKGludCBzdGF0ZSkgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlzZXJ2ZXIuc2V0U2VydmVyUHVibGlzaFN0YXRlKHN0YXRlKTsKLQkJZWxzZQotCQkJc3VwZXIuc2V0U2VydmVyUHVibGlzaFN0YXRlKHN0YXRlKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRTZXJ2ZXJTdGF0dXMoKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBzZXJ2ZXIuZ2V0U2VydmVyU3RhdHVzKCk7Ci0JCXJldHVybiBzdXBlci5nZXRTZXJ2ZXJTdGF0dXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyLnNldFNlcnZlclN0YXR1cyhzdGF0dXMpOwotCQllbHNlCi0JCQlzdXBlci5zZXRTZXJ2ZXJTdGF0dXMoc3RhdHVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE1vZHVsZVN0YXRlKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZlci5nZXRNb2R1bGVTdGF0ZShtb2R1bGUpOwotCQlyZXR1cm4gc3VwZXIuZ2V0TW9kdWxlU3RhdGUobW9kdWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVTdGF0ZShJTW9kdWxlW10gbW9kdWxlLCBpbnQgc3RhdGUpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyLnNldE1vZHVsZVN0YXRlKG1vZHVsZSwgc3RhdGUpOwotCQllbHNlCi0JCQlzdXBlci5zZXRNb2R1bGVTdGF0ZShtb2R1bGUsIHN0YXRlKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE1vZHVsZVB1Ymxpc2hTdGF0ZShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBzZXJ2ZXIuZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSk7Ci0JCXJldHVybiBzdXBlci5nZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVQdWJsaXNoU3RhdGUoSU1vZHVsZVtdIG1vZHVsZSwgaW50IHN0YXRlKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5zZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlLCBzdGF0ZSk7Ci0JCWVsc2UKLQkJCXN1cGVyLnNldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUsIHN0YXRlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRNb2R1bGVSZXN0YXJ0U3RhdGUoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlyZXR1cm4gc2VydmVyLmdldE1vZHVsZVJlc3RhcnRTdGF0ZShtb2R1bGUpOwotCQlyZXR1cm4gc3VwZXIuZ2V0TW9kdWxlUmVzdGFydFN0YXRlKG1vZHVsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlUmVzdGFydFN0YXRlKElNb2R1bGVbXSBtb2R1bGUsIGJvb2xlYW4gcikgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlzZXJ2ZXIuc2V0TW9kdWxlUmVzdGFydFN0YXRlKG1vZHVsZSwgcik7Ci0JCWVsc2UKLQkJCXN1cGVyLnNldE1vZHVsZVJlc3RhcnRTdGF0ZShtb2R1bGUsIHIpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGdldE1vZHVsZVN0YXR1cyhJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBzZXJ2ZXIuZ2V0TW9kdWxlU3RhdHVzKG1vZHVsZSk7Ci0JCXJldHVybiBzdXBlci5nZXRNb2R1bGVTdGF0dXMobW9kdWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVTdGF0dXMoSU1vZHVsZVtdIG1vZHVsZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyLnNldE1vZHVsZVN0YXR1cyhtb2R1bGUsIHN0YXR1cyk7Ci0JCWVsc2UKLQkJCXN1cGVyLnNldE1vZHVsZVN0YXR1cyhtb2R1bGUsIHN0YXR1cyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNb2RlKCkgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlyZXR1cm4gc2VydmVyLmdldE1vZGUoKTsKLQkJcmV0dXJuIG1vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kZShTdHJpbmcgbW9kZSkgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlzZXJ2ZXIuc2V0TW9kZShtb2RlKTsKLQkJZWxzZQotCQkJc3VwZXIuc2V0TW9kZShtb2RlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGludCB2YWx1ZSkgewotCQljYW5Nb2RpZnlBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7CQkKLQkJd2NoLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCWNhbk1vZGlmeUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLQkJd2NoLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJY2FuTW9kaWZ5QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwotCQl3Y2guc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIExpc3Q8U3RyaW5nPiB2YWx1ZSkgewotCQljYW5Nb2RpZnlBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0JCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgTWFwIHZhbHVlKSB7Ci0JCWNhbk1vZGlmeUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLQkJd2NoLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weSNzZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoUFJPUF9OQU1FLCBuYW1lKTsKLQkJYm9vbGVhbiBzZXQgPSBnZXRBdHRyaWJ1dGUoUFJPUF9JRF9TRVQsIGZhbHNlKTsKLQkJaWYgKHNlcnZlciA9PSBudWxsICYmICFzZXQpCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9JRCwgbmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiBiKSB7Ci0JCXNldEF0dHJpYnV0ZShQUk9QX0xPQ0tFRCwgYik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIHRoaXMgZWxlbWVudCBpcyBwcml2YXRlLgotCSAqIEdlbmVyYWxseSBzcGVha2luZywgZWxlbWVudHMgbWFya2VkIHByaXZhdGUgYXJlIGludGVybmFsIG9uZXMKLQkgKiB0aGF0IHNob3VsZCBub3QgYmUgc2hvd24gdG8gdXNlcnMgKGJlY2F1c2UgdGhleSB3b24ndCBrbm93Ci0JICogYW55dGhpbmcgYWJvdXQgdGhlbSkuCi0JICogCi0JICogQHBhcmFtIGIgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGlzIHByaXZhdGUsCi0JICogYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAc2VlICNpc1ByaXZhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByaXZhdGUoYm9vbGVhbiBiKSB7Ci0JCXNldEF0dHJpYnV0ZShQUk9QX1BSSVZBVEUsIGIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKLQkJc2V0QXR0cmlidXRlKFBST1BfSE9TVE5BTUUsIGhvc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF1dG9QdWJsaXNoVGltZShpbnQgcCkgewotCQlzZXRBdHRyaWJ1dGUoUFJPUF9BVVRPX1BVQkxJU0hfVElNRSwgcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnRUaW1lb3V0KGludCBwKSB7Ci0JCXNldEF0dHJpYnV0ZShQUk9QX1NUQVJUX1RJTUVPVVQsIHApOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0b3BUaW1lb3V0KGludCBwKSB7Ci0JCXNldEF0dHJpYnV0ZShQUk9QX1NUT1BfVElNRU9VVCwgcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXV0b1B1Ymxpc2hTZXR0aW5nKGludCBzKSB7Ci0JCXNldEF0dHJpYnV0ZShQUk9QX0FVVE9fUFVCTElTSF9TRVRUSU5HLCBzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJDb25maWd1cmF0aW9uKElGb2xkZXIgY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZzsKLQkJaWYgKGNvbmZpZ3VyYXRpb24gPT0gbnVsbCkKLQkJCXNldEF0dHJpYnV0ZShDT05GSUdVUkFUSU9OX0lELCAoU3RyaW5nKW51bGwpOwotCQllbHNlCi0JCQlzZXRBdHRyaWJ1dGUoQ09ORklHVVJBVElPTl9JRCwgY29uZmlndXJhdGlvbi5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIERpc2FibGUgdGhlIHByZWZlcnJlZCBwdWJsaXNoIG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb3AgYSBwdWJsaXNoIG9wZXJhdGlvbgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBjaGFuZ2UgaXMgbWFkZS4gCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZVByZWZlcnJlZFB1Ymxpc2hPcGVyYXRpb25zKFB1Ymxpc2hPcGVyYXRpb24gb3ApIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBnZXRBdHRyaWJ1dGUoUFJPUF9ESVNBQkxFRF9QRVJGRVJSRURfVEFTS1MsIChMaXN0PFN0cmluZz4pbnVsbCk7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQotCQlTdHJpbmcgb3BJZCA9IGdldFB1Ymxpc2hPcGVyYXRpb25JZChvcCk7Ci0JCWlmIChsaXN0LmNvbnRhaW5zKG9wSWQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlsaXN0LmFkZChvcElkKTsKLQkJc2V0QXR0cmlidXRlKFBST1BfRElTQUJMRURfUEVSRkVSUkVEX1RBU0tTLCBsaXN0KTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlIHRoZSBvcHRpb25hbCBwdWJsaXNoIG9wZXJhdGlvbi4gT3B0aW9uYWwgcHVibGlzaCBvcGVyYXRpb24gaXMgbm90IHJhbiBieSBkZWZhdWx0LgotCSAqIAotCSAqIEBwYXJhbSBvcCBhIHB1Ymxpc2ggb3BlcmF0aW9uCi0JICogQHJldHVybiB0cnVlIGlmIGNoYW5nZSBpcyBtYWRlLiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlbmFibGVPcHRpb25hbFB1Ymxpc2hPcGVyYXRpb25zKFB1Ymxpc2hPcGVyYXRpb24gb3ApIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBnZXRBdHRyaWJ1dGUoUFJPUF9FTkFCTEVEX09QVElPTkFMX1RBU0tTLCAoTGlzdDxTdHJpbmc+KW51bGwpOwotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkKLQkJU3RyaW5nIG9wSWQgPSBnZXRQdWJsaXNoT3BlcmF0aW9uSWQob3ApOwotCQlpZiAobGlzdC5jb250YWlucyhvcElkKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJbGlzdC5hZGQob3BJZCk7Ci0JCXNldEF0dHJpYnV0ZShQUk9QX0VOQUJMRURfT1BUSU9OQUxfVEFTS1MsIGxpc3QpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldCBhbGwgcHJlZmVycmVkIG9wZXJhdGlvbnMgdG8gZGVmYXVsdAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0UHJlZmVycmVkUHVibGlzaE9wZXJhdGlvbnMoKSB7Ci0JCXNldEF0dHJpYnV0ZShQUk9QX0RJU0FCTEVEX1BFUkZFUlJFRF9UQVNLUywgKExpc3Q8U3RyaW5nPiludWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldCBhbGwgb3B0aW9uYWwgb3BlcmF0aW9ucyB0byBkZWZhdWx0Ci0JICovCi0JcHVibGljIHZvaWQgcmVzZXRPcHRpb25hbFB1Ymxpc2hPcGVyYXRpb25zKCkgewotCQlzZXRBdHRyaWJ1dGUoUFJPUF9FTkFCTEVEX09QVElPTkFMX1RBU0tTLCAoTGlzdDxTdHJpbmc+KW51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hlckVuYWJsZWQoUHVibGlzaGVyIHB1YiwgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWlmIChwdWIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCS8vIGNvcHkgb3ZlciBhbGwgZWxlbWVudHMgZXhjZXB0IHRoZSB1cGRhdGVkIHB1Ymxpc2hlcgotCQlMaXN0PFN0cmluZz4gbGlzdCA9IGdldEF0dHJpYnV0ZShQUk9QX1BVQkxJU0hFUlMsIEVNUFRZX0xJU1QpOwotCQlMaXN0PFN0cmluZz4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGlkID0gaXRlci5uZXh0KCk7Ci0JCQlpbnQgaW5kID0gaWQuaW5kZXhPZigiOiIpOwotCQkJaWYgKCFwdWIuZ2V0SWQoKS5lcXVhbHMoaWQuc3Vic3RyaW5nKDAsIGluZCkpKQotCQkJCW5ld0xpc3QuYWRkKGlkKTsKLQkJfQotCQkKLQkJU3RyaW5nIHMgPSBwdWIuZ2V0SWQoKSArICI6IjsKLQkJaWYgKGVuYWJsZWQpCi0JCQlzICs9ICJ0cnVlIjsKLQkJZWxzZQotCQkJcyArPSAiZmFsc2UiOwotCQluZXdMaXN0LmFkZChzKTsKLQkJc2V0QXR0cmlidXRlKFBST1BfUFVCTElTSEVSUywgbmV3TGlzdCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZmlsZSB3aGVyZSB0aGlzIHNlcnZlciBpbnN0YW5jZSBpcyBzZXJpYWxpemVkLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2Ugd2hlcmUgdGhlIHNlcnZlciBpbnN0YW5jZQotCSAqICAgIGlzIHNlcmlhbGl6ZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbmZvcm1hdGlvbiBpcwotCSAqICAgIGluc3RlYWQgdG8gYmUgcGVyc2lzdGVkIHdpdGggdGhlIHdvcmtzcGFjZSBidXQgbm90IHdpdGggYW55Ci0JICogICAgcGFydGljdWxhciB3b3Jrc3BhY2UgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlKElGaWxlIGZpbGUpIHsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5I2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCXJldHVybiB3Y2guaXNEaXJ0eSgpOwotCX0KLQotCXB1YmxpYyBTZXJ2ZXJEZWxlZ2F0ZSBnZXRXb3JraW5nQ29weURlbGVnYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBtYWtlIHN1cmUgdGhhdCB0aGUgcmVndWxhciBkZWxlZ2F0ZSBpcyBsb2FkZWQgCi0JCS8vZ2V0RGVsZWdhdGUoKTsKLQkJCi0JCWlmICh3b3JraW5nQ29weURlbGVnYXRlICE9IG51bGwgfHwgc2VydmVyVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIHdvcmtpbmdDb3B5RGVsZWdhdGU7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmICh3b3JraW5nQ29weURlbGVnYXRlID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJd29ya2luZ0NvcHlEZWxlZ2F0ZSA9ICgoU2VydmVyVHlwZSkgc2VydmVyVHlwZSkuY3JlYXRlU2VydmVyRGVsZWdhdGUoKTsKLQkJCQkJSW50ZXJuYWxJbml0aWFsaXplci5pbml0aWFsaXplU2VydmVyRGVsZWdhdGUod29ya2luZ0NvcHlEZWxlZ2F0ZSwgdGhpcywgbW9uaXRvcik7Ci0JCQkJCWlmIChUcmFjZS5QRVJGT1JNQU5DRSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1BFUkZPUk1BTkNFLAotCQkJCQkJCQkiU2VydmVyV29ya2luZ0NvcHkuZ2V0V29ya2luZ0NvcHlEZWxlZ2F0ZSgpOiA8IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpCi0JCQkJCQkJCQkJKyAiPiAiICsgZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB3b3JraW5nQ29weURlbGVnYXRlOwotCX0KLQotCXByb3RlY3RlZCBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSBnZXRCZWhhdmlvdXJEZWxlZ2F0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlpZiAoYmVoYXZpb3VyRGVsZWdhdGUgIT0gbnVsbCkKLQkJCXJldHVybiBiZWhhdmlvdXJEZWxlZ2F0ZTsKLQkJCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKGJlaGF2aW91ckRlbGVnYXRlID09IG51bGwpCi0JCQkJYmVoYXZpb3VyRGVsZWdhdGUgPSBzZXJ2ZXIuZ2V0QmVoYXZpb3VyRGVsZWdhdGUobW9uaXRvcik7Ci0JCX0KLQkJcmV0dXJuIGJlaGF2aW91ckRlbGVnYXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGJlaGF2aW91ciBkZWxlZ2F0ZSBpcyBjYWNoZWQgZnJvbSB0aGUgb3JpZ2luYWwgc2VydmVyCi0JCWJlaGF2aW91ckRlbGVnYXRlID0gbnVsbDsKLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHdvcmtpbmdDb3B5RGVsZWdhdGUgIT0gbnVsbCkKLQkJCXdvcmtpbmdDb3B5RGVsZWdhdGUuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBJU2VydmVyIHNhdmUoYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLnNhdmluZ1Rhc2ssIGdldE5hbWUoKSkpOwotCQkKLQkJaWYgKCFmb3JjZSAmJiBnZXRPcmlnaW5hbCgpICE9IG51bGwpCi0JCQl3Y2gudmFsaWRhdGVUaW1lc3RhbXAoKChTZXJ2ZXIpZ2V0T3JpZ2luYWwoKSkuZ2V0VGltZXN0YW1wKCkpOwotCQkKLQkJaW50IHRpbWVzdGFtcCA9IGdldFRpbWVzdGFtcCgpOwotCQltYXAucHV0KFBST1BfVElNRVNUQU1QLCBJbnRlZ2VyLnRvU3RyaW5nKHRpbWVzdGFtcCsxKSk7Ci0JCQotCQlpZiAoc2VydmVyID09IG51bGwpIHsKLQkJCXNlcnZlciA9IG5ldyBTZXJ2ZXIoZmlsZSk7Ci0JCQlzZXJ2ZXIuc2V0U2VydmVyU3RhdGUoc2VydmVyU3RhdGUpOwotCQkJc2VydmVyLnB1Ymxpc2hMaXN0ZW5lcnMgPSBwdWJsaXNoTGlzdGVuZXJzOwotCQkJc2VydmVyLm5vdGlmaWNhdGlvbk1hbmFnZXIgPSBub3RpZmljYXRpb25NYW5hZ2VyOwotCQl9Ci0JCQotCQlpZiAoZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSkgewotCQkJSUZvbGRlciBmb2xkZXIgPSBnZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoZm9sZGVyID09IG51bGwpIHsKLQkJCQlmb2xkZXIgPSBTZXJ2ZXJUeXBlLmdldFNlcnZlclByb2plY3QoKS5nZXRGb2xkZXIoZ2V0TmFtZSgpICsgIi1jb25maWciKTsKLQkJCQlpZiAoIWZvbGRlci5leGlzdHMoKSkKLQkJCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQlzZXRTZXJ2ZXJDb25maWd1cmF0aW9uKGZvbGRlcik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXNlcnZlci5zZXRJbnRlcm5hbCh0aGlzKTsKLQkJc2VydmVyLmRvU2F2ZShtb25pdG9yKTsKLQkJaWYgKGdldFNlcnZlclR5cGUoKSAhPSBudWxsICYmIGdldFNlcnZlclR5cGUoKS5oYXNTZXJ2ZXJDb25maWd1cmF0aW9uKCkpIHsKLQkJCUlGb2xkZXIgZm9sZGVyID0gZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCQkJaWYgKGZvbGRlciAhPSBudWxsKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IGZvbGRlci5nZXRQcm9qZWN0KCk7Ci0JCQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiAhcHJvamVjdC5leGlzdHMoKSkgewotCQkJCQlwcm9qZWN0LmNyZWF0ZShudWxsKTsKLQkJCQkJcHJvamVjdC5vcGVuKG51bGwpOwotCQkJCQlTZXJ2ZXJQbHVnaW4uZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCkuc2V0U2VydmVyUHJvamVjdCh0cnVlLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpCi0JCQkJCWZvbGRlci5jcmVhdGUoSVJlc291cmNlLkZPUkNFLCB0cnVlLCBudWxsKTsKLQkJCX0KLQkJfQotCQlpZiAoZ2V0V29ya2luZ0NvcHlEZWxlZ2F0ZShtb25pdG9yKSAhPSBudWxsKQotCQkJZ2V0V29ya2luZ0NvcHlEZWxlZ2F0ZShtb25pdG9yKS5zYXZlQ29uZmlndXJhdGlvbihtb25pdG9yKTsKLQkJd2NoLnNldERpcnR5KGZhbHNlKTsKLQkJCi0JCWlmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkKLQkJCWF1dG9QdWJsaXNoKCk7Ci0JCQotCQlyZXR1cm4gc2VydmVyOwotCX0KLQotCXB1YmxpYyBJU2VydmVyIHNhdmVBbGwoYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChydW50aW1lICE9IG51bGwgJiYgcnVudGltZS5pc1dvcmtpbmdDb3B5KCkpIHsKLQkJCUlSdW50aW1lV29ya2luZ0NvcHkgd2MgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgcnVudGltZTsKLQkJCXdjLnNhdmUoZm9yY2UsIG1vbml0b3IpOwotCQl9Ci0JCQotCQlyZXR1cm4gc2F2ZShmb3JjZSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgc2VydmVyLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyIGNhbm5vdCBiZSBudWxsIik7Ci0JCXdjaC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBzZXJ2ZXIuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGlzdGVuZXIgY2Fubm90IGJlIG51bGwiKTsKLQkJd2NoLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBhIHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIG9sZCB2YWx1ZQotCSAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJd2NoLmZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTZXJ2ZXJMaXN0ZW5lcihJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyLmFkZFNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJZWxzZQotCQkJc3VwZXIuYWRkU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNlcnZlckxpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlzZXJ2ZXIucmVtb3ZlU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQllbHNlCi0JCQlzdXBlci5yZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHVibGlzaExpc3RlbmVyKElQdWJsaXNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyLmFkZFB1Ymxpc2hMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWVsc2UKLQkJCXN1cGVyLmFkZFB1Ymxpc2hMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHVibGlzaExpc3RlbmVyKElQdWJsaXNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyLnJlbW92ZVB1Ymxpc2hMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWVsc2UKLQkJCXN1cGVyLnJlbW92ZVB1Ymxpc2hMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UnVudGltZShJUnVudGltZSBydW50aW1lKSB7Ci0JCXRoaXMucnVudGltZSA9IHJ1bnRpbWU7Ci0JCWlmIChydW50aW1lICE9IG51bGwpCi0JCQlzZXRBdHRyaWJ1dGUoUlVOVElNRV9JRCwgcnVudGltZS5nZXRJZCgpKTsKLQkJZWxzZQotCQkJc2V0QXR0cmlidXRlKFJVTlRJTUVfSUQsIChTdHJpbmcpbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UnVudGltZUlkKFN0cmluZyBydW50aW1lSWQpIHsKLQkJc2V0QXR0cmlidXRlKFJVTlRJTUVfSUQsIHJ1bnRpbWVJZCk7Ci0JCXJlc29sdmUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlciNtb2RpZnlNb2R1bGUob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGUpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5TW9kdWxlcyhJTW9kdWxlW10gYWRkLCBJTW9kdWxlW10gcmVtb3ZlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gbnVsbCBjaGVja3MgYXJlIGluIGNhbk1vZGlmeU1vZHVsZXMKLQkJSVN0YXR1cyBzdGF0dXMgPSBjYW5Nb2RpZnlNb2R1bGVzKGFkZCwgcmVtb3ZlLCBtb25pdG9yKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQkKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy50YXNrTW9kaWZ5TW9kdWxlcyk7Ci0JCQlnZXRXb3JraW5nQ29weURlbGVnYXRlKG1vbml0b3IpLm1vZGlmeU1vZHVsZXMoYWRkLCByZW1vdmUsIG1vbml0b3IpOwotCQkJd2NoLnNldERpcnR5KHRydWUpOwotCQkJCi0JCQkvLyB0cmlnZ2VyIGxvYWQgb2YgbW9kdWxlcyBsaXN0Ci0JCQlzeW5jaHJvbml6ZWQgKG1vZHVsZXNMb2NrKXsKLQkJCQlnZXRNb2R1bGVzV2l0aG91dExvY2soKTsKLQkJCQlpZiAoYWRkICE9IG51bGwpIHsKLQkJCQkJaW50IHNpemUgPSBhZGQubGVuZ3RoOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJaWYgKCFtb2R1bGVzLmNvbnRhaW5zKGFkZFtpXSkpIHsKLQkJCQkJCQltb2R1bGVzLmFkZChhZGRbaV0pOwotCQkJCQkJCXJlc2V0U3RhdGUobmV3IElNb2R1bGVbXSB7IGFkZFtpXSB9LCBtb25pdG9yKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAocmVtb3ZlICE9IG51bGwpIHsKLQkJCQkJaW50IHNpemUgPSByZW1vdmUubGVuZ3RoOwotCQkJCQlleHRlcm5hbE1vZHVsZXMgPSBnZXRFeHRlcm5hbE1vZHVsZXMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCWlmIChtb2R1bGVzLmNvbnRhaW5zKHJlbW92ZVtpXSkpIHsKLQkJCQkJCQltb2R1bGVzLnJlbW92ZShyZW1vdmVbaV0pOwotCQkJCQkJCXJlc2V0U3RhdGUobmV3IElNb2R1bGVbXSB7IHJlbW92ZVtpXSB9LCBtb25pdG9yKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChleHRlcm5hbE1vZHVsZXMgIT0gbnVsbCAmJiBleHRlcm5hbE1vZHVsZXMuY29udGFpbnMocmVtb3ZlW2ldKSkgewotCQkJCQkJCWV4dGVybmFsTW9kdWxlcy5yZW1vdmUocmVtb3ZlW2ldKTsKLQkJCQkJCQlyZXNldFN0YXRlKG5ldyBJTW9kdWxlW10geyByZW1vdmVbaV0gfSwgbW9uaXRvcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLy8gY29udmVydCB0byBhdHRyaWJ1dGUKLQkJCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kdWxlcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJSU1vZHVsZSBtb2R1bGUgPSAoSU1vZHVsZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKG1vZHVsZS5nZXROYW1lKCkpOwotCQkJCQlzYi5hcHBlbmQoIjo6Iik7Ci0JCQkJCXNiLmFwcGVuZChtb2R1bGUuZ2V0SWQoKSk7Ci0JCQkJCUlNb2R1bGVUeXBlIG10ID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKTsKLQkJCQkJaWYgKG10ICE9IG51bGwpIHsKLQkJCQkJCXNiLmFwcGVuZCgiOjoiKTsKLQkJCQkJCXNiLmFwcGVuZChtdC5nZXRJZCgpKTsKLQkJCQkJCXNiLmFwcGVuZCgiOjoiKTsKLQkJCQkJCXNiLmFwcGVuZChtdC5nZXRWZXJzaW9uKCkpOwotCQkJCQl9Ci0JCQkJCWxpc3QuYWRkKHNiLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCQlzZXRBdHRyaWJ1dGUoTU9EVUxFX0xJU1QsIGxpc3QpOwotCQkJfQotCi0JCQlyZXNldE9wdGlvbmFsUHVibGlzaE9wZXJhdGlvbnMoKTsKLQkJCXJlc2V0UHJlZmVycmVkUHVibGlzaE9wZXJhdGlvbnMoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJdGhyb3cgY2U7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgbW9kaWZ5TW9kdWxlKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJfQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCAiIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldFN0YXRlKElNb2R1bGVbXSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlLCBQVUJMSVNIX1NUQVRFX1VOS05PV04pOwotCQlzZXRNb2R1bGVTdGF0ZShtb2R1bGUsIElTZXJ2ZXIuU1RBVEVfVU5LTk9XTik7Ci0JCXNldE1vZHVsZVJlc3RhcnRTdGF0ZShtb2R1bGUsIGZhbHNlKTsKLQkJc2V0TW9kdWxlU3RhdHVzKG1vZHVsZSwgbnVsbCk7Ci0JCXRyeSB7Ci0JCQlJTW9kdWxlW10gY2hpbGRyZW4gPSBnZXRDaGlsZE1vZHVsZXMobW9kdWxlLCBtb25pdG9yKTsKLQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJaW50IHNpemUyID0gbW9kdWxlLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSU1vZHVsZVtdIGNoaWxkID0gbmV3IE1vZHVsZVtzaXplMiArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkobW9kdWxlLCAwLCBjaGlsZCwgMCwgc2l6ZTIpOwotCQkJCWNoaWxkW3NpemUyXSA9IGNoaWxkcmVuW2ldOwotCQkJCXJlc2V0UHVibGlzaFN0YXRlKGNoaWxkLCBtb25pdG9yKTsKLQkJCQlzZXRNb2R1bGVTdGF0ZShtb2R1bGUsIElTZXJ2ZXIuU1RBVEVfVU5LTk9XTik7Ci0JCQkJc2V0TW9kdWxlUmVzdGFydFN0YXRlKG1vZHVsZSwgZmFsc2UpOwotCQkJCXNldE1vZHVsZVN0YXR1cyhtb2R1bGUsIG51bGwpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAZGVwcmVjYXRlZCB1c2UgcmVzZXRTdGF0ZSgpIGluc3RlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNldFB1Ymxpc2hTdGF0ZShJTW9kdWxlW10gbW9kdWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSwgUFVCTElTSF9TVEFURV9VTktOT1dOKTsKLQkJdHJ5IHsKLQkJCUlNb2R1bGVbXSBjaGlsZHJlbiA9IGdldENoaWxkTW9kdWxlcyhtb2R1bGUsIG1vbml0b3IpOwotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlpbnQgc2l6ZTIgPSBtb2R1bGUubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJTW9kdWxlW10gY2hpbGQgPSBuZXcgTW9kdWxlW3NpemUyICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShtb2R1bGUsIDAsIGNoaWxkLCAwLCBzaXplMik7Ci0JCQkJY2hpbGRbc2l6ZTJdID0gY2hpbGRyZW5baV07Ci0JCQkJcmVzZXRQdWJsaXNoU3RhdGUoY2hpbGQsIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZWZhdWx0cyBmb3IgdGhpcyBzZXJ2ZXIsIGluY2x1ZGluZyB0aGUgbmFtZS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlCi0JICogY2FsbGVkIHdoZW4gY3JlYXRpbmcgYSBzZXJ2ZXIsIG9yIHdoZW4gYW55IG1ham9yIHNldHRpbmdzIChlLmcuIHJ1bnRpbWUsIGhvc3QpCi0JICogY2hhbmdlLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJU2VydmVyVXRpbC5zZXRTZXJ2ZXJEZWZhdWx0TmFtZSh0aGlzKTsKLQkJCWdldFdvcmtpbmdDb3B5RGVsZWdhdGUobW9uaXRvcikuc2V0RGVmYXVsdHMobW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgc2V0RGVmYXVsdHMoKSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW5hbWVGaWxlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSAhPSBudWxsKSB7Ci0JCQlJRm9sZGVyIGZvbGRlciA9IGdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKLQkJCUlGb2xkZXIgZm9sZGVyMiA9IFNlcnZlclR5cGUuZ2V0U2VydmVyUHJvamVjdCgpLmdldEZvbGRlcihnZXROYW1lKCkgKyAiLWNvbmZpZyIpOwotCQkJZm9sZGVyLm1vdmUoZm9sZGVyMi5nZXRGdWxsUGF0aCgpLCB0cnVlLCB0cnVlLCBtb25pdG9yKTsKLQkJCXNldFNlcnZlckNvbmZpZ3VyYXRpb24oZm9sZGVyMik7Ci0JCQlzYXZlKHRydWUsIG1vbml0b3IpOwotCQl9Ci0JCQotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlJRmlsZSBmaWxlMiA9IFNlcnZlclV0aWwuZ2V0VW51c2VkU2VydmVyRmlsZShmaWxlLmdldFByb2plY3QoKSwgdGhpcyk7Ci0JCQlmaWxlLm1vdmUoZmlsZTIuZ2V0RnVsbFBhdGgoKSwgdHJ1ZSwgdHJ1ZSwgbW9uaXRvcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFB1Ymxpc2ggdG8gdGhlIHNlcnZlciB1c2luZyB0aGUgcHJvZ3Jlc3MgbW9uaXRvci4gVGhlIHJlc3VsdCBvZiB0aGUKLQkgKiBwdWJsaXNoIG9wZXJhdGlvbiBpcyByZXR1cm5lZCBhcyBhbiBJU3RhdHVzLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHB1Ymxpc2goaW50IGtpbmQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlyZXR1cm4gc2VydmVyLnB1Ymxpc2goa2luZCwgbW9uaXRvcik7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUHVibGlzaGluZywgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHVibGlzaChpbnQga2luZCwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZXMyLCBJQWRhcHRhYmxlIGluZm8sIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCXNlcnZlci5wdWJsaXNoKGtpbmQsIG1vZHVsZXMyLCBpbmZvLCBsaXN0ZW5lcik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbGlzdGVuZXIuZG9uZShuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUHVibGlzaGluZywgbnVsbCkpOwotCX0KLQotCXB1YmxpYyBJTGF1bmNoIGdldExhdW5jaCgpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZlci5nZXRMYXVuY2goKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElMYXVuY2hDb25maWd1cmF0aW9uIGdldExhdW5jaENvbmZpZ3VyYXRpb24oYm9vbGVhbiBjcmVhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlyZXR1cm4gc2VydmVyLmdldExhdW5jaENvbmZpZ3VyYXRpb24oY3JlYXRlLCBtb25pdG9yKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VydmVyIHJlc3RhcnQgc3RhdGUuCi0JICoKLQkgKiBAcGFyYW0gc3RhdGUgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlclJlc3RhcnRTdGF0ZShib29sZWFuIHN0YXRlKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5zZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoc3RhdGUpOwotCQllbHNlCi0JCQlzdXBlci5zZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoc3RhdGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVNlcnZlciNnZXRBZGFwdGVyKENsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmICh3b3JraW5nQ29weURlbGVnYXRlICE9IG51bGwpIHsKLQkJCWlmIChhZGFwdGVyLmlzSW5zdGFuY2Uod29ya2luZ0NvcHlEZWxlZ2F0ZSkpCi0JCQkJcmV0dXJuIHdvcmtpbmdDb3B5RGVsZWdhdGU7Ci0JCX0KLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWlmIChhZGFwdGVyLmlzSW5zdGFuY2UoZGVsZWdhdGUpKQotCQkJCXJldHVybiBkZWxlZ2F0ZTsKLQkJfQotCQlpZiAoYmVoYXZpb3VyRGVsZWdhdGUgIT0gbnVsbCkgewotCQkJaWYgKGFkYXB0ZXIuaXNJbnN0YW5jZShiZWhhdmlvdXJEZWxlZ2F0ZSkpCi0JCQkJcmV0dXJuIGJlaGF2aW91ckRlbGVnYXRlOwotCQl9Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyI2xvYWRBZGFwdGVyKENsYXNzLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBPYmplY3QgbG9hZEFkYXB0ZXIoQ2xhc3MgYWRhcHRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldFdvcmtpbmdDb3B5RGVsZWdhdGUobW9uaXRvcik7Ci0JCWlmIChhZGFwdGVyLmlzSW5zdGFuY2Uod29ya2luZ0NvcHlEZWxlZ2F0ZSkpCi0JCQlyZXR1cm4gd29ya2luZ0NvcHlEZWxlZ2F0ZTsKLQkJCi0JCWdldERlbGVnYXRlKG1vbml0b3IpOwotCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKGRlbGVnYXRlKSkKLQkJCXJldHVybiBkZWxlZ2F0ZTsKLQkJCi0JCWdldEJlaGF2aW91ckRlbGVnYXRlKG1vbml0b3IpOwotCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKGJlaGF2aW91ckRlbGVnYXRlKSkKLQkJCXJldHVybiBiZWhhdmlvdXJEZWxlZ2F0ZTsKLQkJCi0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmxvYWRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBvcnQgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZyb20gdGhlIGdpdmVuIHJ1bnRpbWUuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUyCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAZGVwcmVjYXRlZCBzaG91bGQgdXNlIGltcG9ydFJ1bnRpbWVDb25maWd1cmF0aW9uKCkgaW5zdGVhZAotCSAqLwotCXB1YmxpYyB2b2lkIGltcG9ydENvbmZpZ3VyYXRpb24oSVJ1bnRpbWUgcnVudGltZTIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJZ2V0V29ya2luZ0NvcHlEZWxlZ2F0ZShtb25pdG9yKS5pbXBvcnRDb25maWd1cmF0aW9uKHJ1bnRpbWUyLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSBpbXBvcnRDb25maWd1cmF0aW9uKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW1wb3J0IHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBnaXZlbiBydW50aW1lLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lMiBhIHNlcnZlciBydW50aW1lCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbnkgcHJvYmxlbSBpbXBvcnRpbmcgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAgICBmcm9tIHRoZSBydW50aW1lCi0JICovCi0JcHVibGljIHZvaWQgaW1wb3J0UnVudGltZUNvbmZpZ3VyYXRpb24oSVJ1bnRpbWUgcnVudGltZTIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJZ2V0V29ya2luZ0NvcHlEZWxlZ2F0ZShtb25pdG9yKS5pbXBvcnRSdW50aW1lQ29uZmlndXJhdGlvbihydW50aW1lMiwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ29yZUV4Y2VwdGlvbiBjYWxsaW5nIGRlbGVnYXRlIGltcG9ydENvbmZpZ3VyYXRpb24oKSAiICsgdG9TdHJpbmcoKSwKLQkJCQkJCWNlKTsKLQkJCX0KLQkJCXRocm93IGNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIGltcG9ydENvbmZpZ3VyYXRpb24oKSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbE1vZHVsZXMoSU1vZHVsZVtdIG1vZHVsZXMpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyLnNldEV4dGVybmFsTW9kdWxlcyhtb2R1bGVzKTsKLQkJc3VwZXIuc2V0RXh0ZXJuYWxNb2R1bGVzKG1vZHVsZXMpOwotCX0KLQotCXB1YmxpYyBMaXN0PElNb2R1bGU+IGdldEV4dGVybmFsTW9kdWxlcygpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZlci5nZXRFeHRlcm5hbE1vZHVsZXMoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEV4dGVybmFsTW9kdWxlcygpOwotCX0KLQotCS8qCi0JICogQnJlYWsgY29ubmVjdGlvbiB3aXRoIHRoZSBvcmlnaW5hbCBzZXJ2ZXIgc28gdGhhdCB0aGlzIHdvcmtpbmcgY29weSBjYW4KLQkgKiBiZSBkdXBsaWNhdGVkLiBUaGUgbmFtZSAqbXVzdCogYmUgc2V0IGFmdGVyd2FyZHMgdG8gY2hhbmdlIHRoZSBpZC4gCi0JICovCi0JcHVibGljIHZvaWQgZGlzYXNzb2NpYXRlKCkgewotCQlzZXJ2ZXIgPSBudWxsOwotCQlpZiAoZ2V0QXR0cmlidXRlKFBST1BfTE9DS0VELCBmYWxzZSkpCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9MT0NLRUQsIGZhbHNlKTsKLQkJaWYgKGdldEF0dHJpYnV0ZShQUk9QX0lEX1NFVCwgZmFsc2UpKQotCQkJc2V0QXR0cmlidXRlKFBST1BfSURfU0VULCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiBhIGdpdmVuIGF0dHJpYnV0ZSBjYW4gYmUgbW9kaWZpZWQsIHRocm93cyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgb3RoZXJ3aXNlIAotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2FuTW9kaWZ5QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKXsKLQkJaWYgKGF0dHJpYnV0ZU5hbWUgIT0gbnVsbCAmJiAKLQkJCQlQUk9QX1RJTUVTVEFNUC5lcXVhbHNJZ25vcmVDYXNlKGF0dHJpYnV0ZU5hbWUpKQkJCQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5tb2RpZmlhYmxlIGF0dHJpYnV0ZTogIisgYXR0cmlidXRlTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTZXJ2ZXJXb3JraW5nQ29weSAiICsgZ2V0SWQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU3RhcnRTZXJ2ZXJKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1N0YXJ0U2VydmVySm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMWEyZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU3RhcnRTZXJ2ZXJKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBBIGpvYiBmb3Igc3RhcnRpbmcgdGhlIHNlcnZlci4KLSAqIAotICogQGRlcHJlY2F0ZWQgLSB1c2UgQVBJIGRpcmVjdGx5LCBpdCB3aWxsIGtpY2sgb2ZmIGpvYnMgYXMgcmVxdWlyZWQKLSAqLwotcHVibGljIGNsYXNzIFN0YXJ0U2VydmVySm9iIGV4dGVuZHMgQ2hhaW5lZEpvYiB7Ci0JcHJvdGVjdGVkIFN0cmluZyBsYXVuY2hNb2RlOwotCi0JcHVibGljIFN0YXJ0U2VydmVySm9iKElTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy5qb2JTdGFydGluZywgc2VydmVyLmdldE5hbWUoKSksIHNlcnZlcik7Ci0JCXRoaXMubGF1bmNoTW9kZSA9IGxhdW5jaE1vZGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5qb2JzLkludGVybmFsSm9iI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZpbmFsIElTdGF0dXNbXSBzdGF0dXMgPSBuZXcgSVN0YXR1c1sxXTsKLQkJZ2V0U2VydmVyKCkuc3RhcnQobGF1bmNoTW9kZSwgbmV3IElTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG9uZShJU3RhdHVzIHJlc3VsdCkgewotCQkJCXN0YXR1c1swXSA9IHJlc3VsdDsKLQkJCX0KLQkJfSk7Ci0JCQotCQl3aGlsZSAoc3RhdHVzWzBdID09IG51bGwgJiAhbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JCWlmIChzdGF0dXNbMF0gIT0gbnVsbCkKLQkJCXJldHVybiBzdGF0dXNbMF07Ci0JCQotCQlnZXRTZXJ2ZXIoKS5zdG9wKHRydWUsIG51bGwpOwotCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1N0b3BTZXJ2ZXJKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1N0b3BTZXJ2ZXJKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5NjkzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TdG9wU2VydmVySm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogQSBqb2IgZm9yIHN0b3BwaW5nIHRoZSBzZXJ2ZXIuCi0gKiAKLSAqIEBkZXByZWNhdGVkIC0gdXNlIEFQSSBkaXJlY3RseSwgaXQgd2lsbCBraWNrIG9mZiBqb2JzIGFzIHJlcXVpcmVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdG9wU2VydmVySm9iIGV4dGVuZHMgQ2hhaW5lZEpvYiB7Ci0JcHVibGljIFN0b3BTZXJ2ZXJKb2IoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJc3VwZXIoTkxTLmJpbmQoTWVzc2FnZXMuam9iU3RvcHBpbmcsIHNlcnZlci5nZXROYW1lKCkpLCBzZXJ2ZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuam9icy5JbnRlcm5hbEpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmaW5hbCBJU3RhdHVzW10gc3RhdHVzID0gbmV3IElTdGF0dXNbMV07Ci0JCWdldFNlcnZlcigpLnN0b3AoZmFsc2UsIG5ldyBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvbmUoSVN0YXR1cyByZXN1bHQpIHsKLQkJCQlzdGF0dXNbMF0gPSByZXN1bHQ7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJd2hpbGUgKHN0YXR1c1swXSA9PSBudWxsICYgIW1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzWzBdOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmFlZmM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kZWJ1Zy5EZWJ1Z09wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRlYnVnLkRlYnVnT3B0aW9uc0xpc3RlbmVyOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFjZSBpbXBsZW1lbnRzIERlYnVnT3B0aW9uc0xpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoImRkL01NL3l5IEhIOm1tLnNzLlNTUyIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBsb2dnZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLQkvLyB0cmFjaW5nIGVuYWJsZW1lbnQgZmxhZ3MKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gQ09ORklHID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIElORk8gPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gV0FSTklORyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBTRVZFUkUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gRklORVIgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gRklORVNUID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIFJFU09VUkNFUyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBFWFRFTlNJT05fUE9JTlQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gTElTVEVORVJTID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIFJVTlRJTUVfVEFSR0VUID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIFBFUkZPUk1BTkNFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIFBVQkxJU0hJTkcgPSBmYWxzZTsKLQotCS8vIHRyYWNpbmcgbGV2ZWxzLiBPbmUgbW9zdCBleGlzdCBmb3IgZWFjaCBkZWJ1ZyBvcHRpb24KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFJJTkdfQ09ORklHID0gIi9jb25maWciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSSU5HX0lORk8gPSAiL2luZm8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSSU5HX1dBUk5JTkcgPSAiL3dhcm5pbmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSSU5HX1NFVkVSRSA9ICIvc2V2ZXJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUUklOR19GSU5FUiA9ICIvZmluZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSSU5HX0ZJTkVTVCA9ICIvZmluZXN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUUklOR19SRVNPVVJDRVMgPSAiL3Jlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFJJTkdfRVhURU5TSU9OX1BPSU5UID0gIi9leHRlbnNpb25fcG9pbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSSU5HX0xJU1RFTkVSUyA9ICIvbGlzdGVuZXJzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUUklOR19SVU5USU1FX1RBUkdFVCA9ICIvcnVudGltZV90YXJnZXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSSU5HX1BFUkZPUk1BTkNFID0gIi9wZXJmb3JtYW5jZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFJJTkdfUFVCTElTSElORyA9ICIvcHVibGlzaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUcmFjZSBjb25zdHJ1Y3Rvci4gVGhpcyBzaG91bGQgbmV2ZXIgYmUgZXhwbGljaXRseSBjYWxsZWQgYnkgY2xpZW50cyBhbmQgaXMgdXNlZCB0byByZWdpc3RlciB0aGlzIGNsYXNzIHdpdGggdGhlCi0JICoge0BsaW5rIERlYnVnT3B0aW9uc30gc2VydmljZS4KLQkgKi8KLQlwdWJsaWMgVHJhY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZQotCSAqIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kZWJ1Zy5EZWJ1Z09wdGlvbnNMaXN0ZW5lciNvcHRpb25zQ2hhbmdlZChvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGVidWcuRGVidWdPcHRpb25zKQotCSAqLwotCXB1YmxpYyB2b2lkIG9wdGlvbnNDaGFuZ2VkKERlYnVnT3B0aW9ucyBvcHRpb25zKSB7Ci0JCVRyYWNlLkNPTkZJRyA9IG9wdGlvbnMuZ2V0Qm9vbGVhbk9wdGlvbihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lEICsgVHJhY2UuU1RSSU5HX0NPTkZJRywgZmFsc2UpOwotCQlUcmFjZS5JTkZPID0gb3B0aW9ucy5nZXRCb29sZWFuT3B0aW9uKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQgKyBUcmFjZS5TVFJJTkdfSU5GTywgZmFsc2UpOwotCQlUcmFjZS5XQVJOSU5HID0gb3B0aW9ucy5nZXRCb29sZWFuT3B0aW9uKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQgKyBUcmFjZS5TVFJJTkdfV0FSTklORywgZmFsc2UpOwotCQlUcmFjZS5TRVZFUkUgPSBvcHRpb25zLmdldEJvb2xlYW5PcHRpb24oU2VydmVyUGx1Z2luLlBMVUdJTl9JRCArIFRyYWNlLlNUUklOR19TRVZFUkUsIGZhbHNlKTsKLQkJVHJhY2UuRklORVIgPSBvcHRpb25zLmdldEJvb2xlYW5PcHRpb24oU2VydmVyUGx1Z2luLlBMVUdJTl9JRCArIFRyYWNlLlNUUklOR19GSU5FUiwgZmFsc2UpOwotCQlUcmFjZS5GSU5FU1QgPSBvcHRpb25zLmdldEJvb2xlYW5PcHRpb24oU2VydmVyUGx1Z2luLlBMVUdJTl9JRCArIFRyYWNlLlNUUklOR19GSU5FU1QsIGZhbHNlKTsKLQkJVHJhY2UuUkVTT1VSQ0VTID0gb3B0aW9ucy5nZXRCb29sZWFuT3B0aW9uKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQgKyBUcmFjZS5TVFJJTkdfUkVTT1VSQ0VTLCBmYWxzZSk7Ci0JCVRyYWNlLkVYVEVOU0lPTl9QT0lOVCA9IG9wdGlvbnMuZ2V0Qm9vbGVhbk9wdGlvbihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lEICsgVHJhY2UuU1RSSU5HX0VYVEVOU0lPTl9QT0lOVCwgZmFsc2UpOwotCQlUcmFjZS5MSVNURU5FUlMgPSBvcHRpb25zLmdldEJvb2xlYW5PcHRpb24oU2VydmVyUGx1Z2luLlBMVUdJTl9JRCArIFRyYWNlLlNUUklOR19MSVNURU5FUlMsIGZhbHNlKTsKLQkJVHJhY2UuUlVOVElNRV9UQVJHRVQgPSBvcHRpb25zLmdldEJvb2xlYW5PcHRpb24oU2VydmVyUGx1Z2luLlBMVUdJTl9JRCArIFRyYWNlLlNUUklOR19SVU5USU1FX1RBUkdFVCwgZmFsc2UpOwotCQlUcmFjZS5QRVJGT1JNQU5DRSA9IG9wdGlvbnMuZ2V0Qm9vbGVhbk9wdGlvbihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lEICsgVHJhY2UuU1RSSU5HX1BFUkZPUk1BTkNFLCBmYWxzZSk7Ci0JCVRyYWNlLlBVQkxJU0hJTkcgPSBvcHRpb25zLmdldEJvb2xlYW5PcHRpb24oU2VydmVyUGx1Z2luLlBMVUdJTl9JRCArIFRyYWNlLlNUUklOR19QVUJMSVNISU5HLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBUaGUgdHJhY2luZyBsZXZlbC4KLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gdHJhY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoZmluYWwgU3RyaW5nIGxldmVsLCBTdHJpbmcgcykgewotCi0JCVRyYWNlLnRyYWNlKGxldmVsLCBzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgVGhlIHRyYWNpbmcgbGV2ZWwuCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIHRyYWNlCi0JICogQHBhcmFtIHQKLQkgKiAgICAgICAgICAgIEEge0BsaW5rIFRocm93YWJsZX0gdG8gdHJhY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoZmluYWwgU3RyaW5nIGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJaWYgKHMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChUcmFjZS5TVFJJTkdfU0VWRVJFLmVxdWFscyhsZXZlbCkpIHsKLQkJCWlmICghbG9nZ2VkLmNvbnRhaW5zKHMpKSB7Ci0JCQkJU2VydmVyUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIHMsIHQpKTsKLQkJCQlsb2dnZWQuYWRkKHMpOwotCQkJfQotCQl9Ci0JCWlmIChTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpKSB7Ci0JCQlmaW5hbCBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQpOwotCQkJc2IuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCXNiLmFwcGVuZChsZXZlbCk7Ci0JCQlzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2IuYXBwZW5kKHNkZi5mb3JtYXQobmV3IERhdGUoKSkpOwotCQkJc2IuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCXNiLmFwcGVuZChzKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsKLQkJCWlmICh0ICE9IG51bGwpIHsKLQkJCQl0LnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvVXBkYXRlU2VydmVySm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9VcGRhdGVTZXJ2ZXJKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMyYjVhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9VcGRhdGVTZXJ2ZXJKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyQmVoYXZpb3VyRGVsZWdhdGU7Ci0vKioKLSAqIEFjdGlvbiB0byB1cGRhdGUgYSBzZXJ2ZXIncyBzdGF0dXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVTZXJ2ZXJKb2IgZXh0ZW5kcyBKb2IgewotCS8qKgotCSAqIEFuIGFjdGlvbiB0byB1cGRhdGUgdGhlIHN0YXR1cyBvZiBhIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICovCi0JcHJpdmF0ZSBJU2VydmVyW10gc2VydmVyczsKLQotCXB1YmxpYyBVcGRhdGVTZXJ2ZXJKb2IoSVNlcnZlcltdIHNlcnZlcnMyKSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLmpvYlVwZGF0aW5nU2VydmVycyk7Ci0JCXRoaXMuc2VydmVycyA9IHNlcnZlcnMyOwkKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZvciAoSVNlcnZlciBzZXJ2ZXIgOiBzZXJ2ZXJzKXsKLQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKSB7Ci0JCQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmpvYlVwZGF0ZVNlcnZlciwgc2VydmVyLmdldE5hbWUoKSkpOwotCQkJCXNlcnZlci5sb2FkQWRhcHRlcihTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5jbGFzcywgbW9uaXRvcik7CQotCQkJfQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Xb3JraW5nQ29weUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvV29ya2luZ0NvcHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2MGQzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Xb3JraW5nQ29weUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgV29ya2luZ0NvcHlIZWxwZXIgewotCXByb3RlY3RlZCBCYXNlIGJhc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEaXJ0eTsKLQotCS8vIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMKLQlwcml2YXRlIHRyYW5zaWVudCBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IHByb3BlcnR5TGlzdGVuZXJzOwotCi0JcHVibGljIFdvcmtpbmdDb3B5SGVscGVyKEJhc2UgYmFzZSkgewotCQl0aGlzLmJhc2UgPSBiYXNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgaW50IHZhbHVlKSB7Ci0JCWludCBjdXJyZW50ID0gYmFzZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgMCk7Ci0JCWlmIChiYXNlLmlzQXR0cmlidXRlU2V0KGF0dHJpYnV0ZU5hbWUpICYmIGN1cnJlbnQgPT0gdmFsdWUpCi0JCQlyZXR1cm47Ci0JCQotCQlpc0RpcnR5ID0gdHJ1ZTsKLQkJYmFzZS5tYXAucHV0KGF0dHJpYnV0ZU5hbWUsIEludGVnZXIudG9TdHJpbmcodmFsdWUpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoYXR0cmlidXRlTmFtZSwgbmV3IEludGVnZXIoY3VycmVudCksIG5ldyBJbnRlZ2VyKHZhbHVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCWJvb2xlYW4gY3VycmVudCA9IGJhc2UuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIGZhbHNlKTsKLQkJaWYgKGJhc2UuaXNBdHRyaWJ1dGVTZXQoYXR0cmlidXRlTmFtZSkgJiYgY3VycmVudCA9PSB2YWx1ZSkKLQkJCXJldHVybjsKLQkJCi0JCWlzRGlydHkgPSB0cnVlOwotCQliYXNlLm1hcC5wdXQoYXR0cmlidXRlTmFtZSwgQm9vbGVhbi50b1N0cmluZyh2YWx1ZSkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChhdHRyaWJ1dGVOYW1lLCBuZXcgQm9vbGVhbihjdXJyZW50KSwgbmV3IEJvb2xlYW4odmFsdWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgY3VycmVudCA9IGJhc2UuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIChTdHJpbmcpbnVsbCk7Ci0JCWlmIChiYXNlLmlzQXR0cmlidXRlU2V0KGF0dHJpYnV0ZU5hbWUpICYmIGN1cnJlbnQgIT0gbnVsbCAmJiBjdXJyZW50LmVxdWFscyh2YWx1ZSkpCi0JCQlyZXR1cm47Ci0JCQotCQlpc0RpcnR5ID0gdHJ1ZTsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQliYXNlLm1hcC5yZW1vdmUoYXR0cmlidXRlTmFtZSk7Ci0JCWVsc2UKLQkJCWJhc2UubWFwLnB1dChhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KGF0dHJpYnV0ZU5hbWUsIGN1cnJlbnQsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIExpc3Q8U3RyaW5nPiB2YWx1ZSkgewotCQlMaXN0IGN1cnJlbnQgPSBiYXNlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCAoTGlzdDxTdHJpbmc+KW51bGwpOwotCQlpZiAoYmFzZS5pc0F0dHJpYnV0ZVNldChhdHRyaWJ1dGVOYW1lKSAmJiBjdXJyZW50ICE9IG51bGwgJiYgY3VycmVudC5lcXVhbHModmFsdWUpKQotCQkJcmV0dXJuOwotCQkKLQkJaXNEaXJ0eSA9IHRydWU7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJYmFzZS5tYXAucmVtb3ZlKGF0dHJpYnV0ZU5hbWUpOwotCQllbHNlCi0JCQliYXNlLm1hcC5wdXQoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChhdHRyaWJ1dGVOYW1lLCBjdXJyZW50LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBNYXAgdmFsdWUpIHsKLQkJTWFwIGN1cnJlbnQgPSBiYXNlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCAoTWFwKW51bGwpOwotCQlpZiAoYmFzZS5pc0F0dHJpYnV0ZVNldChhdHRyaWJ1dGVOYW1lKSAmJiBjdXJyZW50ICE9IG51bGwgJiYgY3VycmVudC5lcXVhbHModmFsdWUpKQotCQkJcmV0dXJuOwotCQkKLQkJaXNEaXJ0eSA9IHRydWU7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJYmFzZS5tYXAucmVtb3ZlKGF0dHJpYnV0ZU5hbWUpOwotCQllbHNlCi0JCQliYXNlLm1hcC5wdXQoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChhdHRyaWJ1dGVOYW1lLCBjdXJyZW50LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoQmFzZS5QUk9QX05BTUUsIG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2tlZChib29sZWFuIGIpIHsKLQkJc2V0QXR0cmlidXRlKEJhc2UuUFJPUF9MT0NLRUQsIGIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByaXZhdGUoYm9vbGVhbiBiKSB7Ci0JCXNldEF0dHJpYnV0ZShCYXNlLlBST1BfUFJJVkFURSwgYik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weSNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gaXNEaXJ0eTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVRpbWVzdGFtcChpbnQgdGltZXN0YW1wKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChiYXNlLmdldFRpbWVzdGFtcCgpICE9IHRpbWVzdGFtcCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgSVNlcnZlcldvcmtpbmdDb3B5LlNBVkVfQ09ORkxJQ1QsIE1lc3NhZ2VzLmVycm9yV29ya2luZ0NvcHlUaW1lc3RhbXAsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBzZXJ2ZXIuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChwcm9wZXJ0eUxpc3RlbmVycyA9PSBudWxsKQotCQkJcHJvcGVydHlMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+KDIpOwotCQlwcm9wZXJ0eUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoaXMgc2VydmVyLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocHJvcGVydHlMaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCXByb3BlcnR5TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRmlyZSBhIHByb3BlcnR5IGNoYW5nZSBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIGEgcHJvcGVydHkgbmFtZQotCSAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgb2xkIHZhbHVlCi0JICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlpZiAocHJvcGVydHlMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkKLQkJUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCA9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMsIHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJdHJ5IHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvcGVydHlMaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQl0cnkgewotCQkJCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJbGlzdGVuZXIucHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBmaXJpbmcgcHJvcGVydHkgY2hhbmdlIGV2ZW50IiwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGluIHByb3BlcnR5IGV2ZW50IiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREaXJ0eShib29sZWFuIGRpcnR5KSB7Ci0JCWlzRGlydHkgPSBkaXJ0eTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNmQ5YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvWE1MTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLS8qKgotICogQSBNZW1lbnRvIGlzIGEgY2xhc3MgaW5kZXBlbmRlbnQgY29udGFpbmVyIGZvciBwZXJzaXN0ZW5jZQotICogaW5mby4gIEl0IGlzIGEgcmVmbGVjdGlvbiBvZiAzIHN0b3JhZ2UgcmVxdWlyZW1lbnRzLgotICoKLSAqIDEpICAgV2UgbmVlZCB0aGUgYWJpbGl0eSB0byBwZXJzaXN0IGFuIG9iamVjdCBhbmQgcmVzdG9yZSBpdC4gIAotICogMikgICBUaGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtYXkgYmUgYWJzZW50LiAgSWYgc28gd2Ugd291bGQgCi0gKiAgICAgIGxpa2UgdG8gc2tpcCB0aGUgb2JqZWN0IGFuZCBrZWVwIHJlYWRpbmcuIAotICogMykgICBUaGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtYXkgY2hhbmdlLiAgSWYgc28gdGhlIG5ldyBjbGFzcyAKLSAqICAgICAgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCB0aGUgb2xkIHBlcnNpc3RlbmNlIGluZm8uCi0gKgotICogV2UgY291bGQgYXNrIHRoZSBvYmplY3RzIHRvIHNlcmlhbGl6ZSB0aGVtc2VsdmVzIGludG8gYW4gCi0gKiBPYmplY3RPdXRwdXRTdHJlYW0sIERhdGFPdXRwdXRTdHJlYW0sIG9yIEhhc2h0YWJsZS4gIEhvd2V2ZXIgCi0gKiBhbGwgb2YgdGhlc2UgYXBwcm9hY2hlcyBmYWlsIHRvIG1lZXQgdGhlIHNlY29uZCByZXF1aXJlbWVudC4KLSAqCi0gKiBNZW1lbnRvIHN1cHBvcnRzIGJpbmFyeSBwZXJzaXN0YW5jZSB3aXRoIGEgdmVyc2lvbiBJRC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhNTE1lbWVudG8gaW1wbGVtZW50cyBJTWVtZW50byB7Ci0JcHJpdmF0ZSBEb2N1bWVudCBmYWN0b3J5OwotCXByaXZhdGUgRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogQW5zd2VyIGEgbWVtZW50byBmb3IgdGhlIGRvY3VtZW50IGFuZCBlbGVtZW50LiAgRm9yIHNpbXBsaWNpdHkKLQkgKiB5b3Ugc2hvdWxkIHVzZSBjcmVhdGVSZWFkUm9vdCBhbmQgY3JlYXRlV3JpdGVSb290IHRvIGNyZWF0ZSB0aGUgaW5pdGlhbAotCSAqIG1lbWVudG9zIG9uIGEgZG9jdW1lbnQuCi0JICovCi0JcHJpdmF0ZSBYTUxNZW1lbnRvKERvY3VtZW50IGRvYywgRWxlbWVudCBlbCkgewotCQlmYWN0b3J5ID0gZG9jOwotCQllbGVtZW50ID0gZWw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIElNZW1lbnRvIGNyZWF0ZUNoaWxkKFN0cmluZyB0eXBlKSB7Ci0JCUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQodHlwZSk7Ci0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIERvY3VtZW50IGZyb20gYSBSZWFkZXIgYW5kIGFuc3dlciBhIHJvb3QgbWVtZW50byBmb3IgcmVhZGluZyAKLQkgKiBhIGRvY3VtZW50LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgWE1MTWVtZW50byBjcmVhdGVSZWFkUm9vdChJbnB1dFN0cmVhbSBpbikgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQlEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCWRvY3VtZW50ID0gcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbikpOwotCQkJTm9kZSBub2RlID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotCQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhkb2N1bWVudCwgKEVsZW1lbnQpIG5vZGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYSByb290IG1lbWVudG8gZm9yIHdyaXRpbmcgYSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSBhIHR5cGUKLQkgKiBAcmV0dXJuIGEgbWVtZW50bwotCSAqLwotCXB1YmxpYyBzdGF0aWMgWE1MTWVtZW50byBjcmVhdGVXcml0ZVJvb3QoU3RyaW5nIHR5cGUpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQ7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudCA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotCQkJRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKTsKLQkJCWRvY3VtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpOwotCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGRvY3VtZW50LCBlbGVtZW50KTsgICAgICAgICAgICAKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIElNZW1lbnRvIGdldENoaWxkKFN0cmluZyB0eXBlKSB7Ci0JCS8vIEdldCB0aGUgbm9kZXMuCi0JCU5vZGVMaXN0IG5vZGVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkKLQkJLy8gRmluZCB0aGUgZmlyc3Qgbm9kZSB3aGljaCBpcyBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KLQkJZm9yIChpbnQgblggPSAwOyBuWCA8IHNpemU7IG5YICsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKG5YKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCUVsZW1lbnQgZWxlbWVudDIgPSAoRWxlbWVudClub2RlOwotCQkJCWlmIChlbGVtZW50Mi5nZXROb2RlTmFtZSgpLmVxdWFscyh0eXBlKSkKLQkJCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGVsZW1lbnQyKTsKLQkJCX0KLQkJfQotCQotCQkvLyBBIGNoaWxkIHdhcyBub3QgZm91bmQuCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyBJTWVtZW50byBbXSBnZXRDaGlsZHJlbihTdHJpbmcgdHlwZSkgewotCQkvLyBHZXQgdGhlIG5vZGVzLgotCQlOb2RlTGlzdCBub2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOwotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuIG5ldyBJTWVtZW50b1swXTsKLQkKLQkJLy8gRXh0cmFjdCBlYWNoIG5vZGUgd2l0aCBnaXZlbiB0eXBlLgotCQlMaXN0PEVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnQ+KHNpemUpOwotCQlmb3IgKGludCBuWCA9IDA7IG5YIDwgc2l6ZTsgblggKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oblgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJRWxlbWVudCBlbGVtZW50MiA9IChFbGVtZW50KW5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQyLmdldE5vZGVOYW1lKCkuZXF1YWxzKHR5cGUpKQotCQkJCQlsaXN0LmFkZChlbGVtZW50Mik7Ci0JCQl9Ci0JCX0KLQkKLQkJLy8gQ3JlYXRlIGEgbWVtZW50byBmb3IgZWFjaCBub2RlLgotCQlzaXplID0gbGlzdC5zaXplKCk7Ci0JCUlNZW1lbnRvIFtdIHJlc3VsdHMgPSBuZXcgSU1lbWVudG9bc2l6ZV07Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgc2l6ZTsgeCArKykgewotCQkJcmVzdWx0c1t4XSA9IG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGxpc3QuZ2V0KHgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoaXMgbWVtZW50byBhcyBhIGJ5dGUgYXJyYXkuCi0JICoKLQkgKiBAcmV0dXJuIGJ5dGVbXQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0Q29udGVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlzYXZlKG91dCk7Ci0JCXJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGlucHV0IHN0cmVhbSBmb3Igd3JpdGluZyB0byB0aGUgZGlzayB3aXRoIGEgbG9jYWwgbG9jYWxlLgotCSAqCi0JICogQHJldHVybiBqYXZhLmlvLklucHV0U3RyZWFtCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJc2F2ZShvdXQpOwotCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC50b0J5dGVBcnJheSgpKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgRmxvYXQgZ2V0RmxvYXQoU3RyaW5nIGtleSkgewotCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoa2V5KTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAKLQkJU3RyaW5nIHN0clZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBGbG9hdChzdHJWYWx1ZSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldEludGVnZXIoU3RyaW5nIGtleSkgewotCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoa2V5KTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAKLQkJU3RyaW5nIHN0clZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHN0clZhbHVlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoa2V5KTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAKLQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE5hbWVzKCkgewotCQlOYW1lZE5vZGVNYXAgbWFwID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWludCBzaXplID0gbWFwLmdldExlbmd0aCgpOwotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTm9kZSBub2RlID0gbWFwLml0ZW0oaSk7Ci0JCQlTdHJpbmcgbmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCWxpc3QuYWRkKG5hbWUpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIExvYWRzIGEgbWVtZW50byBmcm9tIHRoZSBnaXZlbiBmaWxlbmFtZS4KLQkgKgotCSAqIEBwYXJhbSBpbiBqYXZhLmlvLklucHV0U3RyZWFtCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS51aS5JTWVtZW50bwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1lbWVudG8gbG9hZE1lbWVudG8oSW5wdXRTdHJlYW0gaW4pIHsKLQkJcmV0dXJuIGNyZWF0ZVJlYWRSb290KGluKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBhIG1lbWVudG8gZnJvbSB0aGUgZ2l2ZW4gZmlsZW5hbWUuCi0JICoKLQkgKiBAcGFyYW0gZmlsZW5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UudWkuSU1lbWVudG8KLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNZW1lbnRvIGxvYWRNZW1lbnRvKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQl0cnkgewotCQkJaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVuYW1lKSk7Ci0JCQlyZXR1cm4gWE1MTWVtZW50by5jcmVhdGVSZWFkUm9vdChpbik7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEludGVnZXIoU3RyaW5nIGtleSwgaW50IG4pIHsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcudmFsdWVPZihuKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIHZvaWQgcHV0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNhdmUgdGhpcyBNZW1lbnRvIHRvIGEgV3JpdGVyLgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHNhdmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvcyk7Ci0JCVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGZhY3RvcnkpOwotCQl0cnkgewotCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7Ci0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCAiVVRGLTgiKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFufWluZGVudC1hbW91bnQiLCAiMiIpOwotCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IChJT0V4Y2VwdGlvbikgKG5ldyBJT0V4Y2VwdGlvbigpLmluaXRDYXVzZShlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgbWVtZW50byB0byB0aGUgZ2l2ZW4gZmlsZS4KLQkgKgotCSAqIEBwYXJhbSBmaWxlbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZVRvRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIHcgPSBudWxsOwotCQl0cnkgewotCQkJdyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSkpOwotCQkJc2F2ZSh3KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHNhdmVUb1N0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXNhdmUob3V0KTsKLQkJcmV0dXJuIG91dC50b1N0cmluZygiVVRGLTgiKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvI2dldEJvb2xlYW4oU3RyaW5nKQotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIGtleSkgewotCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoa2V5KTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgc3RyVmFsdWUgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCWlmICgidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShzdHJWYWx1ZSkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCXJldHVybiBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvI3B1dEJvb2xlYW4oU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgewotCQllbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIHZhbHVlID8gInRydWUiIDogImZhbHNlIik7Ci0JfQotCi0JLyoqCi0gICAgKiBSZXR1cm5zIHRoZSBUZXh0IG5vZGUgb2YgdGhlIG1lbWVudG8uIEVhY2ggbWVtZW50byBpcyBhbGxvd2VkIG9ubHkgCi0gICAgKiBvbmUgVGV4dCBub2RlLgotICAgICogCi0gICAgKiBAcmV0dXJuIHRoZSBUZXh0IG5vZGUgb2YgdGhlIG1lbWVudG8sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0gICAgKiB0aGUgbWVtZW50byBoYXMgbm8gVGV4dCBub2RlLgotICAgICovCi0gICBwcml2YXRlIFRleHQgZ2V0VGV4dE5vZGUoKSB7Ci0gICAgICAgLy8gR2V0IHRoZSBub2Rlcy4KLSAgICAgICBOb2RlTGlzdCBub2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgIGludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgaWYgKHNpemUgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLSAgICAgICBmb3IgKGludCBuWCA9IDA7IG5YIDwgc2l6ZTsgblgrKykgewotICAgICAgICAgICBOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKG5YKTsKLSAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBUZXh0KSB7Ci0gICAgICAgICAgICAgICByZXR1cm4gKFRleHQpIG5vZGU7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgLy8gYSBUZXh0IG5vZGUgd2FzIG5vdCBmb3VuZAotICAgICAgIHJldHVybiBudWxsOwotICAgfQotICAKLQkvKiAobm9uLUphdmFkb2MpCi0gICAgKi8KLSAgIHB1YmxpYyB2b2lkIHB1dFRleHREYXRhKFN0cmluZyBkYXRhKSB7Ci0gICAgICAgVGV4dCB0ZXh0Tm9kZSA9IGdldFRleHROb2RlKCk7Ci0gICAgICAgaWYgKHRleHROb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgdGV4dE5vZGUgPSBmYWN0b3J5LmNyZWF0ZVRleHROb2RlKGRhdGEpOwotCQkJLy8gQWx3YXlzIGFkZCB0aGUgdGV4dCBub2RlIGFzIHRoZSBmaXJzdCBjaGlsZCAoZml4ZXMgYnVnIDkzNzE4KSAKLQkJCWVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRleHROb2RlLCBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgdGV4dE5vZGUuc2V0RGF0YShkYXRhKTsKLSAgICAgICB9Ci0gICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvZmFjZXRzL0ZhY2V0TWFwcGluZ1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9GYWNldE1hcHBpbmdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlODdjZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvZmFjZXRzL0ZhY2V0TWFwcGluZ1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLmZhY2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIFRoZSBtYWluIHNlcnZlciB0b29saW5nIHBsdWdpbiBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIEZhY2V0TWFwcGluZ1V0aWwgZXh0ZW5kcyBQbHVnaW4gewotCS8vCWNhY2hlZCBjb3B5IG9mIGFsbCBydW50aW1lIGNvbXBvbmVudCBwcm92aWRlcnMKLQlwcml2YXRlIHN0YXRpYyBMaXN0PFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXI+IHJ1bnRpbWVDb21wb25lbnRQcm92aWRlcnM7Ci0KLQkvLwljYWNoZWQgY29weSBvZiBhbGwgcnVudGltZSBmYWNldCBtYXBwaW5ncwotCXByaXZhdGUgc3RhdGljIExpc3Q8UnVudGltZUZhY2V0TWFwcGluZz4gcnVudGltZUZhY2V0TWFwcGluZ3M7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBydW50aW1lIGZhY2V0IG1hcHBpbmcgaW5zdGFuY2VzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBydW50aW1lIGZhY2V0IG1hcHBpbmcgaW5zdGFuY2VzCi0JICogICAge0BsaW5rIFJ1bnRpbWVGYWNldE1hcHBpbmd9Ci0JICovCi0JcHVibGljIHN0YXRpYyBSdW50aW1lRmFjZXRNYXBwaW5nW10gZ2V0UnVudGltZUZhY2V0TWFwcGluZygpIHsKLQkJaWYgKHJ1bnRpbWVGYWNldE1hcHBpbmdzID09IG51bGwpCi0JCQlsb2FkUnVudGltZUZhY2V0TWFwcGluZygpOwotCQkKLQkJUnVudGltZUZhY2V0TWFwcGluZ1tdIHJmbSA9IG5ldyBSdW50aW1lRmFjZXRNYXBwaW5nW3J1bnRpbWVGYWNldE1hcHBpbmdzLnNpemUoKV07Ci0JCXJ1bnRpbWVGYWNldE1hcHBpbmdzLnRvQXJyYXkocmZtKTsKLQkJcmV0dXJuIHJmbTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VzIHRoZSBydW50aW1lIGNvbXBvbmVudCBwcm92aWRlcihzKSB0aGF0IHN1cHBvcnRzIHRoZSBnaXZlbiBydW50aW1lIHRvIGFkZAotCSAqIGFkZGl0aW9uYWwgcnVudGltZSBjb21wb25lbnRzIHRvIHRoZSBsaXN0LgotCSAqIFRoZSBydW50aW1lVHlwZSBtYXkgbm90IGJlIG51bGwuCi0JICoKLQkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKLQkgKiBAcGFyYW0gY29tcG9uZW50cyB0aGUgZXhpc3RpbmcgbGlzdCBvZiBjb21wb25lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEZhY2V0UnVudGltZUNvbXBvbmVudHMoSVJ1bnRpbWUgcnVudGltZSwgTGlzdDxJUnVudGltZUNvbXBvbmVudD4gY29tcG9uZW50cykgewotCQlpZiAocnVudGltZSA9PSBudWxsIHx8IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJaWYgKHJ1bnRpbWVDb21wb25lbnRQcm92aWRlcnMgPT0gbnVsbCkKLQkJCWxvYWRSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJzKCk7Ci0JCQotCQlJdGVyYXRvcjxSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJXcmFwcGVyPiBpdGVyYXRvciA9IHJ1bnRpbWVDb21wb25lbnRQcm92aWRlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlciBydW50aW1lQ29tcG9uZW50UHJvdmlkZXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAocnVudGltZUNvbXBvbmVudFByb3ZpZGVyLnN1cHBvcnRzUnVudGltZVR5cGUocnVudGltZS5nZXRSdW50aW1lVHlwZSgpKSkgewotCQkJCUxpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGxpc3QgPSBydW50aW1lQ29tcG9uZW50UHJvdmlkZXIuZ2V0Q29tcG9uZW50cyhydW50aW1lKTsKLQkJCQlpZiAobGlzdCAhPSBudWxsKQotCQkJCQljb21wb25lbnRzLmFkZEFsbChsaXN0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIHJ1bnRpbWUgY29tcG9uZW50IHByb3ZpZGVycy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkUnVudGltZUNvbXBvbmVudFByb3ZpZGVycygpIHsKLQkJaWYgKHJ1bnRpbWVDb21wb25lbnRQcm92aWRlcnMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKFRyYWNlLkNPTkZJRykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0NPTkZJRywgIi0+LSBMb2FkaW5nIC5ydW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlcnMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQl9Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJydW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlcnMiKTsKLQkJCi0JCS8vIGxvYWQgbmV3IHdzdCBleHRlbnNpb24gcG9pbnQKLQkJTGlzdDxSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJXcmFwcGVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJXcmFwcGVyPihjZi5sZW5ndGgpOwotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA6IGNmKSB7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKG5ldyBSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJXcmFwcGVyKGNlKSk7Ci0JCQkJaWYgKFRyYWNlLkNPTkZJRykgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfQ09ORklHLCAiICBMb2FkZWQgcnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXI6ICIgKyBjZS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLAotCQkJCQkJCSIgIENvdWxkIG5vdCBsb2FkIHJ1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVyOiAiICsgY2UuZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGxvYWQgb2xkIGpzdCBleHRlbnNpb24gcG9pbnQKLQkJY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcnMiKTsKLQkJCi0JCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlIDogY2YpIHsKLQkJCXRyeSB7Ci0JCQkJbGlzdC5hZGQobmV3IFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXIoY2UpKTsKLQkJCQlpZiAoVHJhY2UuQ09ORklHKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19DT05GSUcsICIgIExvYWRlZCBydW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlcjogIiArIGNlLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsCi0JCQkJCQkJIiAgQ291bGQgbm90IGxvYWQgcnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXI6ICIgKyBjZS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlydW50aW1lQ29tcG9uZW50UHJvdmlkZXJzID0gbGlzdDsKLQkJCi0JCWlmIChUcmFjZS5DT05GSUcpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19DT05GSUcsICItPC0gRG9uZSBsb2FkaW5nIC5ydW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlcnMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgcnVudGltZSBmYWNldCBtYXBwaW5ncy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkUnVudGltZUZhY2V0TWFwcGluZygpIHsKLQkJaWYgKHJ1bnRpbWVGYWNldE1hcHBpbmdzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChUcmFjZS5DT05GSUcpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19DT05GSUcsICItPi0gTG9hZGluZyAucnVudGltZUZhY2V0TWFwcGluZyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCX0KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lRmFjZXRNYXBwaW5ncyIpOwotCQkKLQkJTGlzdDxSdW50aW1lRmFjZXRNYXBwaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxSdW50aW1lRmFjZXRNYXBwaW5nPihjZi5sZW5ndGgpOwotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA6IGNmKSB7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKG5ldyBSdW50aW1lRmFjZXRNYXBwaW5nKGNlKSk7Ci0JCQkJaWYgKFRyYWNlLkNPTkZJRykgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfQ09ORklHLAotCQkJCQkJCSIgIExvYWRlZCBydW50aW1lRmFjZXRNYXBwaW5nOiAiICsgY2UuZ2V0QXR0cmlidXRlKCJydW50aW1lVHlwZUlkIikpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBydW50aW1lRmFjZXRNYXBwaW5nOiAiICsgY2UuZ2V0QXR0cmlidXRlKCJpZCIpLAotCQkJCQkJCXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlydW50aW1lRmFjZXRNYXBwaW5ncyA9IGxpc3Q7Ci0JCQotCQlpZiAoVHJhY2UuQ09ORklHKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfQ09ORklHLCAiLTwtIERvbmUgbG9hZGluZyAucnVudGltZUZhY2V0TWFwcGluZyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JCX0KLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9GYWNldFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9GYWNldFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwZWFmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvRmFjZXRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuZmFjZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLlJ1bnRpbWVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBmYWNldCBydW50aW1lcyBhbmQgc2VydmVyIHJ1bnRpbWVzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFsbCBpdHMgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIHN0YXRpYyBtZW1iZXJzLgotICogSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3IgaW5zdGFudGlhdGVkLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjZXRVdGlsIHsKLQkvKioKLQkgKiBTdGF0aWMgdXRpbGl0eSBjbGFzcyAtIGNhbm5vdCBjcmVhdGUgYW4gaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBGYWNldFV0aWwoKSB7Ci0JCS8vIGNhbid0IGNyZWF0ZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciBydW50aW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBmYWNldCBydW50aW1lLCBvciBudWxsCi0JICogaWYgbm9uZSBjb3VsZCBiZSBmb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIGZhY2V0IHJ1bnRpbWUKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgcnVudGltZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBmYWNldCBydW50aW1lLCBvcgotCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgY291bGQgYmUgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZSBnZXRSdW50aW1lKG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWUgcnVudGltZSkgewotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJU3RyaW5nIGlkID0gcnVudGltZS5nZXRQcm9wZXJ0eSgiaWQiKTsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCWZvciAoSVJ1bnRpbWUgciA6IHJ1bnRpbWVzKSB7Ci0JCQlpZiAoaWQuZXF1YWxzKHIuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIHI7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY2V0IHJ1bnRpbWUgdGhhdCBjb3JyZXNwb25kcyB0byBhIHNlcnZlciBydW50aW1lLCBvciBudWxsCi0JICogaWYgbm9uZSBjb3VsZCBiZSBmb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHNlcnZlciBydW50aW1lCi0JICogQHJldHVybiB0aGUgZmFjZXQgcnVudGltZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzZXJ2ZXIgcnVudGltZSwgb3IKLQkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGNvdWxkIGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBnZXRSdW50aW1lKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCVN0cmluZyBpZCA9IHJ1bnRpbWUuZ2V0SWQoKTsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVNldCBydW50aW1lcyA9IFJ1bnRpbWVNYW5hZ2VyLmdldFJ1bnRpbWVzKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcnVudGltZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBydW50aW1lMiA9IChvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaWQuZXF1YWxzKHJ1bnRpbWUyLmdldFByb3BlcnR5KCJpZCIpKSkKLQkJCQlyZXR1cm4gcnVudGltZTI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGUgZmFjZXRzIG9uIGEgcHJvamVjdCBhcmUgc3VwcG9ydGVkIGJ5IGEgZ2l2ZW4gc2VydmVyLiBSZXR1cm5zCi0JICogYW4gT0sgc3RhdHVzIGlmIHRoZSBzZXJ2ZXIncyBydW50aW1lIHN1cHBvcnRzIHRoZSBwcm9qZWN0J3MgZmFjZXRzLCBhbmQgYW4KLQkgKiBFUlJPUiBzdGF0dXMgKHdpdGggbWVzc2FnZSkgaWYgaXQgZG9lc24ndC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHJldHVybiBPSyBzdGF0dXMgaWYgdGhlIHNlcnZlcidzIHJ1bnRpbWUgc3VwcG9ydHMgdGhlIHByb2plY3QncyBmYWNldHMsIGFuZCBhbgotCSAqICAgIEVSUk9SIHN0YXR1cyAod2l0aCBtZXNzYWdlKSBpZiBpdCBkb2Vzbid0Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJU3RhdHVzIHZlcmlmeUZhY2V0cyhJUHJvamVjdCBwcm9qZWN0LCBJU2VydmVyIHNlcnZlcikgewotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvck5vUnVudGltZSwgbnVsbCk7Ci0JCUlSdW50aW1lIHJ1bnRpbWUgPSBzZXJ2ZXIuZ2V0UnVudGltZSgpOwotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JOb1J1bnRpbWUsIG51bGwpOwotCQkKLQkJb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBydW50aW1lMiA9IGdldFJ1bnRpbWUocnVudGltZSk7Ci0JCQotCQlpZiAocnVudGltZTIgPT0gbnVsbCkgLy8gYnVnIDE1MDE5NCAtIHdoYXQgZG8gd2UgZG8gaWYgdGhlIGZhY2V0IHJ1bnRpbWUgZG9lc24ndCBleGlzdCB5ZXQKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkKLQkJdHJ5IHsKLQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmFjZXRlZFByb2plY3QuZ2V0UHJvamVjdEZhY2V0cygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXQgPSAoSVByb2plY3RGYWNldFZlcnNpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoIXJ1bnRpbWUyLnN1cHBvcnRzKGZhY2V0KSkKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JGYWNldCwgZmFjZXQuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0TGFiZWwoKSwgZmFjZXQuZ2V0VmVyc2lvblN0cmluZygpKSwgbnVsbCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXJldHVybiBjZS5nZXRTdGF0dXMoKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBydW50aW1lIGlzIGJlaW5nIHRhcmdldGVkIGJ5IHRoZSBmYWNldAotCSAqIGZyYW1ld29yaywgYW5kIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBydW50aW1lIGlzIGluIHVzZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1J1bnRpbWVUYXJnZXRlZChJUnVudGltZSBydW50aW1lKSB7Ci0JCXRyeSB7Ci0JCQlvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lIHJ1bnRpbWUyID0gZ2V0UnVudGltZShydW50aW1lKTsKLQkJCQotCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCWlmIChwcm9qZWN0cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChJUHJvamVjdCBwcm9qZWN0IDogcHJvamVjdHMpIHsKLQkJCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCkgewotCQkJCQkJU2V0PG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU+IHNldCA9IGZhY2V0ZWRQcm9qZWN0LmdldFRhcmdldGVkUnVudGltZXMoKTsKLQkJCQkJCWlmIChzZXQgIT0gbnVsbCAmJiBzZXQuY29udGFpbnMocnVudGltZTIpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkNvdWxkIG5vdCBkZXRlcm1pbmUgaWYgcnVudGltZSBpcyBpbiB1c2UiLCB0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcnVudGltZSBmcm9tIHRoZSB0YXJnZXQgb2YgYWxsIHByb2plY3RzLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIGEgcnVudGltZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBmYWlsZWQgZm9yIGFueSByZWFzb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlVGFyZ2V0cyhJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWUgcnVudGltZTIgPSBnZXRSdW50aW1lKHJ1bnRpbWUpOwotCQkJCi0JCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQkJaWYgKHByb2plY3RzICE9IG51bGwpIHsKLQkJCQlmb3IgKElQcm9qZWN0IHByb2plY3QgOiBwcm9qZWN0cykgewotCQkJCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQkJCWlmIChmYWNldGVkUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCQlTZXQ8b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZT4gc2V0ID0gZmFjZXRlZFByb2plY3QuZ2V0VGFyZ2V0ZWRSdW50aW1lcygpOwotCQkJCQkJaWYgKHNldCAhPSBudWxsICYmIHNldC5jb250YWlucyhydW50aW1lMikpCi0JCQkJCQkJZmFjZXRlZFByb2plY3QucmVtb3ZlVGFyZ2V0ZWRSdW50aW1lKHJ1bnRpbWUyLCBtb25pdG9yKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJdGhyb3cgY2U7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiQ291bGQgbm90IHJlbW92ZSBydW50aW1lIHRhcmdldCIsIHQpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9SdW50aW1lQnJpZGdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvUnVudGltZUJyaWRnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmIwYjdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9SdW50aW1lQnJpZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gU3VwcG9ydCBmb3IgYWxsIHNlcnZlciB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5mYWNldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZVR5cGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZUJyaWRnZSBpbXBsZW1lbnRzIElSdW50aW1lQnJpZGdlIHsKLQlwcm90ZWN0ZWQgc3RhdGljIE1hcDxTdHJpbmcsIExpc3Q8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPj4gbWFwcGluZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPj4oKTsKLQotCXN0YXRpYyB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIGlkLCBTdHJpbmcgaWQyLCBTdHJpbmcgdmVyc2lvbikgewotCQlMaXN0PElSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4gbGlzdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlsaXN0ID0gbWFwcGluZ3MuZ2V0KGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCQotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPigyKTsKLQkJCi0JCXRyeSB7Ci0JCQlsaXN0LmFkZChSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lQ29tcG9uZW50VHlwZShpZDIpLmdldFZlcnNpb24odmVyc2lvbikpOwotCQkJbWFwcGluZ3MucHV0KGlkLCBsaXN0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0aWFsaXplKCkgewotCQkvLyBhZGQgcnVudGltZSBtYXBwaW5ncwotCQlJUnVudGltZVR5cGVbXSBydW50aW1lVHlwZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVUeXBlcygpOwotCQlpbnQgc2l6ZSA9IHJ1bnRpbWVUeXBlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlSdW50aW1lVHlwZSBydCA9IChSdW50aW1lVHlwZSkgcnVudGltZVR5cGVzW2ldOwotCQkJU3RyaW5nIGNvbXBvbmVudCA9IHJ0LmdldEZhY2V0UnVudGltZUNvbXBvbmVudCgpOwotCQkJU3RyaW5nIHZlcnNpb24gPSBydC5nZXRGYWNldFJ1bnRpbWVWZXJzaW9uKCk7Ci0JCQlpZiAoY29tcG9uZW50ICE9IG51bGwgJiYgISIiLmVxdWFscyhjb21wb25lbnQpICYmIHZlcnNpb24gIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHZlcnNpb24pKQotCQkJCWFkZE1hcHBpbmcocnQuZ2V0SWQoKSwgY29tcG9uZW50LCB2ZXJzaW9uKTsKLQkJfQotCQkKLQkJLy8gYWRkIGV4dGVuc2lvbiBtYXBwaW5ncwotCQlSdW50aW1lRmFjZXRNYXBwaW5nW10gcmZtcyA9IEZhY2V0TWFwcGluZ1V0aWwuZ2V0UnVudGltZUZhY2V0TWFwcGluZygpOwotCQlzaXplID0gcmZtcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJYWRkTWFwcGluZyhyZm1zW2ldLmdldFJ1bnRpbWVUeXBlSWQoKSwgcmZtc1tpXS5nZXRSdW50aW1lQ29tcG9uZW50KCksIHJmbXNbaV0uZ2V0VmVyc2lvbigpKTsKLQkJCi0JCS8vIGdlbmVyaWMgcnVudGltZXMKLQkJYWRkTWFwcGluZygib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MzMjMiLCAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MiLCAiMy4yLjMiKTsKLQotCQlhZGRNYXBwaW5nKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hczQiLCAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuam9uYXMiLCAiNC4wIik7Ci0JCQotCQlhZGRNYXBwaW5nKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5vcmFjbGUxMDEzIiwgIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLm9yYWNsZSIsICIxMC4xLjMiKTsKLQkJCi0JCWFkZE1hcHBpbmcoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLndlYnNwaGVyZS42IiwgIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLndlYnNwaGVyZSIsICI2LjAiKTsKLQl9Ci0KLQlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0RXhwb3J0ZWRSdW50aW1lTmFtZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCVNldDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4ocnVudGltZXMubGVuZ3RoKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcnVudGltZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBydW50aW1lc1tpXTsKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKTsKLQkJCWlmIChydW50aW1lVHlwZSAhPSBudWxsICYmIG1hcHBpbmdzLmNvbnRhaW5zS2V5KHJ1bnRpbWVUeXBlLmdldElkKCkpKSB7Ci0JCQkJcmVzdWx0LmFkZChydW50aW1lLmdldElkKCkpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJU3R1YiBicmlkZ2UoU3RyaW5nIG5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJcmV0dXJuIG5ldyBTdHViKG5hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFN0dWIgZXh0ZW5kcyBJUnVudGltZUJyaWRnZS5TdHViIHsKLQkJcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLQkJcHVibGljIFN0dWIoU3RyaW5nIGlkKSB7Ci0JCQl0aGlzLmlkID0gaWQ7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdDxJUnVudGltZUNvbXBvbmVudD4gZ2V0UnVudGltZUNvbXBvbmVudHMoKSB7Ci0JCQlMaXN0PElSdW50aW1lQ29tcG9uZW50PiBjb21wb25lbnRzID0gbmV3IEFycmF5TGlzdDxJUnVudGltZUNvbXBvbmVudD4oMik7Ci0JCQlmaW5hbCBJUnVudGltZSBydW50aW1lID0gZmluZFJ1bnRpbWUoIHRoaXMuaWQgKTsKLQkJCQotCQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gY29tcG9uZW50czsKLQkJCQotCQkJLy8gZGVmaW5lIHNlcnZlciBydW50aW1lIGNvbXBvbmVudAotCQkJTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KDUpOwotCQkJaWYgKHJ1bnRpbWUuZ2V0TG9jYXRpb24oKSAhPSBudWxsKQotCQkJCXByb3BlcnRpZXMucHV0KCJsb2NhdGlvbiIsIHJ1bnRpbWUuZ2V0TG9jYXRpb24oKS50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQkJZWxzZQotCQkJCXByb3BlcnRpZXMucHV0KCJsb2NhdGlvbiIsICIiKTsKLQkJCXByb3BlcnRpZXMucHV0KCJuYW1lIiwgcnVudGltZS5nZXROYW1lKCkpOwotCQkJcHJvcGVydGllcy5wdXQoImlkIiwgcnVudGltZS5nZXRJZCgpKTsKLQkJCWlmIChydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkgIT0gbnVsbCkgewotCQkJCXByb3BlcnRpZXMucHV0KCJ0eXBlIiwgcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldE5hbWUoKSk7Ci0JCQkJcHJvcGVydGllcy5wdXQoInR5cGUtaWQiLCBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSk7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZyB0eXBlSWQgPSBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLQkJCWlmIChtYXBwaW5ncy5jb250YWluc0tleSh0eXBlSWQpKSB7Ci0JCQkJQXJyYXlMaXN0IGxpc3QgPSAoQXJyYXlMaXN0KSBtYXBwaW5ncy5nZXQodHlwZUlkKTsKLQkJCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCUlSdW50aW1lQ29tcG9uZW50VmVyc2lvbiBtYXBwZWQgPSAoSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uKSBsaXN0LmdldChpKTsKLQkJCQkJY29tcG9uZW50cy5hZGQoUnVudGltZU1hbmFnZXIuY3JlYXRlUnVudGltZUNvbXBvbmVudChtYXBwZWQsIHByb3BlcnRpZXMpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUZhY2V0TWFwcGluZ1V0aWwuYWRkRmFjZXRSdW50aW1lQ29tcG9uZW50cyhydW50aW1lLCBjb21wb25lbnRzKTsKLQkJCQotCQkJcmV0dXJuIGNvbXBvbmVudHM7Ci0JCX0KLQotCQlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQcm9wZXJ0aWVzKCkgewotCQkJZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWUgcnVudGltZSA9IGZpbmRSdW50aW1lKCB0aGlzLmlkICk7Ci0JCQlpZiAocnVudGltZSAhPSBudWxsKSB7Ci0JCQkJcHJvcHMucHV0KCJpZCIsIHJ1bnRpbWUuZ2V0SWQoKSk7Ci0JCQkJcHJvcHMucHV0KCJsb2NhbGl6ZWQtbmFtZSIsIHJ1bnRpbWUuZ2V0TmFtZSgpKTsKLQkJCQlTdHJpbmcgcyA9ICgoUnVudGltZSlydW50aW1lKS5nZXRBdHRyaWJ1dGUoImFsdGVybmF0ZS1uYW1lcyIsIChTdHJpbmcpbnVsbCk7Ci0JCQkJaWYgKHMgIT0gbnVsbCkKLQkJCQkgICAgcHJvcHMucHV0KCJhbHRlcm5hdGUtbmFtZXMiLCBzKTsKLQkJCX0KLQkJCXJldHVybiBwcm9wczsKLQkJfQotCQkKLQkJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgICAgICBmaW5hbCBJUnVudGltZSBydW50aW1lID0gZmluZFJ1bnRpbWUoIHRoaXMuaWQgKTsKLSAgICAgICAgICAgIGlmKCBydW50aW1lICE9IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bnRpbWUudmFsaWRhdGUoIG1vbml0b3IgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOyAKLQkJfQotCQkKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVJ1bnRpbWUgZmluZFJ1bnRpbWUoIGZpbmFsIFN0cmluZyBpZCApCi0JCXsKLQkgICAgICAgIElSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JICAgICAgICBpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQotCSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkgICAgICAgICAgICBpZiAocnVudGltZXNbaV0uZ2V0SWQoKS5lcXVhbHMoaWQpKQotCSAgICAgICAgICAgICAgICByZXR1cm4gcnVudGltZXNbaV07Ci0JICAgICAgICAgICAgaWYgKHJ1bnRpbWVzW2ldLmdldE5hbWUoKS5lcXVhbHMoaWQpKQotCSAgICAgICAgICAgICAgICByZXR1cm4gcnVudGltZXNbaV07Ci0KLQkgICAgICAgIH0KLQkgICAgICAgIHJldHVybiBudWxsOwotCSAgICB9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9SdW50aW1lQ29tcG9uZW50UHJvdmlkZXJXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGQ1M2RmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9SdW50aW1lQ29tcG9uZW50UHJvdmlkZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuZmFjZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXIgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBSdW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlckRlbGVnYXRlIGRlbGVnYXRlOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHJ1bnRpbWUgY29tcG9uZW50IGhhbmRsZXIuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lVHlwZUlkcygpIHsKLQkJdHJ5IHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW50aW1lVHlwZUlkcyIpLCAiLCIpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkKLQkJCQkJbGlzdC5hZGQoc3RyLnRyaW0oKSk7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkocyk7Ci0JCQlyZXR1cm4gczsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IHBhcnNlIHJ1bnRpbWUgdHlwZSBpZHM6ICIgKyBlbGVtZW50KTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzZXJ2ZXIgcmVzb3VyY2UgdHlwZSAoZ2l2ZW4gYnkgdGhlCi0JICogaWQpIGNhbiBiZSBvcGVuZWQgd2l0aCB0aGlzIGVkaXRvci4gVGhpcyByZXN1bHQgaXMgYmFzZWQgb24KLQkgKiB0aGUgcmVzdWx0IG9mIHRoZSBnZXRTZXJ2ZXJSZXNvdXJjZXMoKSBtZXRob2QuCi0JICoKLQkgKiBAcGFyYW0gcnVudGltZVR5cGUgYSBydW50aW1lIHR5cGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1J1bnRpbWVUeXBlKElSdW50aW1lVHlwZSBydW50aW1lVHlwZSkgewotCQlpZiAocnVudGltZVR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGlkID0gcnVudGltZVR5cGUuZ2V0SWQoKTsKLQkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmdbXSBzID0gZ2V0UnVudGltZVR5cGVJZHMoKTsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWludCBzaXplID0gcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoc1tpXS5lbmRzV2l0aCgiKiIpKSB7Ci0JCQkJaWYgKGlkLmxlbmd0aCgpID49IHNbaV0ubGVuZ3RoKCkgJiYgaWQuc3RhcnRzV2l0aChzW2ldLnN1YnN0cmluZygwLCBzW2ldLmxlbmd0aCgpIC0gMSkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoaWQuZXF1YWxzKHNbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIExvYWRzIHRoZSBkZWxlZ2F0ZSBjbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgUnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsZWdhdGUgPSAoUnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlTZXJ2ZXJQbHVnaW4ubG9nRXh0ZW5zaW9uRmFpbHVyZSh0b1N0cmluZygpLCB0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJ1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVyRGVsZWdhdGUjZ2V0UnVudGltZUNvbXBvbmVudHMoSVJ1bnRpbWUpCi0JICovCi0JcHVibGljIExpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGdldENvbXBvbmVudHMoSVJ1bnRpbWUgcnVudGltZSkgewotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5nZXRSdW50aW1lQ29tcG9uZW50cyhydW50aW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVNlcnZlclBsdWdpbi5sb2dFeHRlbnNpb25GYWlsdXJlKHRvU3RyaW5nKCksIGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlclsiICsgZ2V0SWQoKSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvZmFjZXRzL1J1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9SdW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDNjM2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvZmFjZXRzL1J1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLmZhY2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci0vKioKLSAqIEEgcnVudGltZSBjb21wb25lbnQgcHJvdmlkZXIgY2FuIHByb3ZpZGUgYWRkaXRpb25hbCBydW50aW1lIGNvbXBvbmVudHMgZm9yIGEgZmFjZXQgcnVudGltZS4KLSAqIFRoaXMgcHJvdmlkZXIgaXMgc2NvcGVkIGJ5IHJ1bnRpbWUgdHlwZSBhbmQgbWF5IHByb3ZpZGUgY29tcG9uZW50cyBmb3IgbXVsdGlwbGUKLSAqIHJ1bnRpbWUgaW5zdGFuY2VzLgotICogPHA+Ci0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5pbnRlcm5hbFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIAotICogQHBsYW5uZWRmb3IgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSdW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlckRlbGVnYXRlIHsKLQlwdWJsaWMgUnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZSgpIHsKLQkJLy8gZGVmYXVsdCBjb25zdHJ1Y3RvcgotCX0KLQotCS8qKgotCSAqIEFkZCBydW50aW1lIGNvbXBvbmVudHMgdG8gdGhlIGdpdmVuIHJ1bnRpbWUuIENvbXBvbmVudHMgc2hvdWxkIGJlIGNyZWF0ZWQgYnkgY2FsbGluZwotCSAqIFJ1bnRpbWVNYW5hZ2VyLmNyZWF0ZVJ1bnRpbWVDb21wb25lbnQoSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uLCBNYXApCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgYSBzZXJ2ZXIgcnVudGltZQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHJ1bnRpbWVzLCBvciBhbiBlbXB0eSBsaXN0IG9yIG51bGwgaWYgdGhlcmUgYXJlIG5vIGFkZGl0aW9uYWwgY29tcG9uZW50cwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBMaXN0PElSdW50aW1lQ29tcG9uZW50PiBnZXRSdW50aW1lQ29tcG9uZW50cyhJUnVudGltZSBydW50aW1lKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvUnVudGltZUZhY2V0TWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvZmFjZXRzL1J1bnRpbWVGYWNldE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyZTllYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvUnVudGltZUZhY2V0TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuZmFjZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lRmFjZXRNYXBwaW5nIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHJ1bnRpbWUgZmFjZXQgbWFwcGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqLwotCXB1YmxpYyBSdW50aW1lRmFjZXRNYXBwaW5nKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVUeXBlSWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgicnVudGltZVR5cGVJZCIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInZlcnNpb24iKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUNvbXBvbmVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW50aW1lLWNvbXBvbmVudCIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUnVudGltZUZhY2V0TWFwcGluZ1siICsgZ2V0SWQoKSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvU2VydmVyTG9jYXRvckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9TZXJ2ZXJMb2NhdG9yRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgyZjgxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9TZXJ2ZXJMb2NhdG9yRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotLyoqCi0gKiBBIHNlcnZlciBsb2NhdG9yIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGxvY2F0ZSBvciBzZWFyY2ggZm9yIGFkZGl0aW9uYWwKLSAqIHNlcnZlciBvZiBhIHBhcnRpY3VsYXIgdHlwZSwgb24gYSBwYXJ0aWN1bGFyIGhvc3QuCi0gKiA8cD4KLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgb25seSBieSBjbGllbnRzCi0gKiB0byBleHRlbmQgdGhlIDxjb2RlPnNlcnZlckxvY2F0b3JzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJMb2NhdG9yRGVsZWdhdGUgewotCS8qKgotCSAqIEEgY2FsbGJhY2sgbGlzdGVuZXIgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJU2VydmVyU2VhcmNoTGlzdGVuZXIgewotCQkvKioKLQkJICogQ2FsbGVkIHdoZW4gYSBuZXcgc2VydmVyIGlzIGZvdW5kIGJ5IHRoZSBsb2NhdG9yLgotCQkgKiBUaGUgc2VydmVyIG11c3QgbmV2ZXIgYmUgbnVsbC4KLQkJICogCi0JCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHJ1bnRpbWUgdGhhdCB3YXMgZm91bmQuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXJ2ZXJGb3VuZChJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyBmb3Igc2VydmVycy4gCi0JICogSXQgdXNlcyB0aGUgY2FsbGJhY2sgbGlzdGVuZXIgdG8gcmVwb3J0IHNlcnZlcnMgdGhhdCBhcmUgZm91bmQuCi0JICogCi0JICogQHBhcmFtIGhvc3QgYSBob3N0IHN0cmluZyBjb25mb3JtaW5nIHRvIFJGQyAyNzMyCi0JICogQHBhcmFtIGxpc3RlbmVyIGEgbGlzdGVuZXIgdG8gcmVwb3J0IHN0YXR1cyB0bwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZWFyY2hGb3JTZXJ2ZXJzKFN0cmluZyBob3N0LCBJU2VydmVyU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvdGFyL1RhckVudHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC90YXIvVGFyRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiZDg1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC90YXIvVGFyRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwudGFyOwotLyoqCi0gKiBSZXByZXNlbnRhdGlvbiBvZiBhIGZpbGUgaW4gYSB0YXIgYXJjaGl2ZS4KLSAqIDxwPgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5kYXRhdHJhbnNmZXIuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYXJFbnRyeSBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIGxvbmcgbW9kZSwgdGltZSwgc2l6ZTsKLQlwcml2YXRlIGludCB0eXBlOwotCWludCBmaWxlcG9zOwotCi0JLyoqCi0JICogRW50cnkgdHlwZSBmb3Igbm9ybWFsIGZpbGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEUgPSAnMCc7Ci0KLQkvKioKLQkgKiBFbnRyeSB0eXBlIGZvciBkaXJlY3Rvcmllcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RPUlkgPSAnNSc7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFRhckVudHJ5IGZvciBhIGZpbGUgb2YgdGhlIGdpdmVuIG5hbWUgYXQgdGhlCi0JICogZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGZpbGUuCi0JICogCi0JICogQHBhcmFtIG5hbWUgZmlsZW5hbWUKLQkgKiBAcGFyYW0gcG9zIHBvc2l0aW9uIGluIHRoZSBmaWxlIGluIGJ5dGVzCi0JICovCi0JVGFyRW50cnkoU3RyaW5nIG5hbWUsIGludCBwb3MpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJbW9kZSA9IDA2NDQ7Ci0JCXR5cGUgPSBGSUxFOwotCQlmaWxlcG9zID0gcG9zOwotCQl0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLyAxMDAwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBUYXJFbnRyeSBmb3IgYSBmaWxlIG9mIHRoZSBnaXZlbiBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lIGZpbGVuYW1lCi0JICovCi0JcHVibGljIFRhckVudHJ5KFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMobmFtZSwgLTEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBmaWxlLCBvbmUgb2YgRklMRSwgTElOSywgU1lNX0xJTkssCi0JICogQ0hBUl9ERVZJQ0UsIEJMT0NLX0RFVklDRSwgRElSRUNUT1JZIG9yIEZJRk8uCi0JICogCi0JICogQHJldHVybiBmaWxlIHR5cGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldEZpbGVUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RlIG9mIHRoZSBmaWxlIGluIFVOSVggcGVybWlzc2lvbnMgZm9ybWF0LgotCSAqIAotCSAqIEByZXR1cm4gZmlsZSBtb2RlCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TW9kZSgpIHsKLQkJcmV0dXJuIG1vZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGZpbGVuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBmaWxlIGluIGJ5dGVzLgotCSAqIAotCSAqIEByZXR1cm4gZmlsZXNpemUKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRTaXplKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgZmlsZSBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkKLQkgKiAxc3QgMTk3MC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRpbWUKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRUaW1lKCkgewotCQlyZXR1cm4gdGltZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0eXBlIG9mIHRoZSBmaWxlLCBvbmUgb2YgRklMRSwgTElOSywgU1lNTElOSywgQ0hBUl9ERVZJQ0UsCi0JICogQkxPQ0tfREVWSUNFLCBvciBESVJFQ1RPUlkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlVHlwZShpbnQgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGUgb2YgdGhlIGZpbGUgaW4gVU5JWCBwZXJtaXNzaW9ucyBmb3JtYXQuCi0JICogCi0JICogQHBhcmFtIG1vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RlKGxvbmcgbW9kZSkgewotCQl0aGlzLm1vZGUgPSBtb2RlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNpemUgb2YgdGhlIGZpbGUgaW4gYnl0ZXMuCi0JICogCi0JICogQHBhcmFtIHNpemUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXplKGxvbmcgc2l6ZSkgewotCQl0aGlzLnNpemUgPSBzaXplOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSBmaWxlIGluIHNlY29uZHMgc2luY2UgSmFudWFyeQotCSAqIDFzdCAxOTcwLgotCSAqIAotCSAqIEBwYXJhbSB0aW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGltZShsb25nIHRpbWUpIHsKLQkJdGhpcy50aW1lID0gdGltZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvdGFyL1RhckV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvdGFyL1RhckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTNiMWZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL3Rhci9UYXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC50YXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotLyoqCi0gKiBFeGNlcHRpb24gZ2VuZXJhdGVkIHVwb24gZW5jb3VudGVyaW5nIGNvcnJ1cHRlZCB0YXIgZmlsZXMuCi0gKiA8cD4KLSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVGFyRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewotCS8qKgotCSAqIEdlbmVyYXRlZCBzZXJpYWwgdmVyc2lvbiBVSUQgZm9yIHRoaXMgY2xhc3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjg4NjY3MTI1NDUxODg1MzUyOEw7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgVGFyRXhjZXB0aW9uIHdpdGhvdXQgYSBkZXRhaWwgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBUYXJFeGNlcHRpb24oKSB7Ci0gICAgCXN1cGVyKCk7Ci0gICAgfQotCQotCS8qKgotICAgICAqIENvbnN0cnVjdHMgYSBUYXJFeGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcyB0aGUgZGV0YWlsIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBUYXJFeGNlcHRpb24oU3RyaW5nIHMpIHsKLSAgICAJc3VwZXIocyk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL3Rhci9UYXJGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC90YXIvVGFyRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDk3NDc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL3Rhci9UYXJGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLnRhcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtOwotLyoqCi0gKiBSZWFkcyBhIC50YXIgb3IgLnRhci5neiBhcmNoaXZlIGZpbGUsIHByb3ZpZGluZyBhbiBpbmRleCBlbnVtZXJhdGlvbgotICogYW5kIGFsbG93cyBmb3IgYWNjZXNzaW5nIGFuIElucHV0U3RyZWFtIGZvciBhcmJpdHJhcnkgZmlsZXMgaW4gdGhlCi0gKiBhcmNoaXZlLgotICogPHA+Ci0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2Zlci4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFRhckZpbGUgewotCXByaXZhdGUgRmlsZSBmaWxlOwotCXByb3RlY3RlZCBUYXJJbnB1dFN0cmVhbSBlbnRyeUVudW1lcmF0aW9uU3RyZWFtOwotCXByb3RlY3RlZCBUYXJFbnRyeSBjdXJFbnRyeTsKLQlwcml2YXRlIFRhcklucHV0U3RyZWFtIGVudHJ5U3RyZWFtOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBUYXJGaWxlIGZvciB0aGUgZ2l2ZW4gZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEB0aHJvd3MgVGFyRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBUYXJGaWxlKEZpbGUgZmlsZSkgdGhyb3dzIFRhckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQl0aGlzLmZpbGUgPSBmaWxlOwotCi0JCUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJLy8gRmlyc3QsIGNoZWNrIGlmIGl0J3MgYSBHWklQSW5wdXRTdHJlYW0uCi0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBHWklQSW5wdXRTdHJlYW0oaW4pOwotCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWYgaXQgaXMgbm90IGNvbXByZXNzZWQgd2UgY2xvc2UKLQkJCS8vdGhlIG9sZCBvbmUgYW5kIHJlY3JlYXRlCi0JCQlpbi5jbG9zZSgpOwkJCi0JCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCX0KLQkJZW50cnlFbnVtZXJhdGlvblN0cmVhbSA9IG5ldyBUYXJJbnB1dFN0cmVhbShpbik7Ci0JCWN1ckVudHJ5ID0gZW50cnlFbnVtZXJhdGlvblN0cmVhbS5nZXROZXh0RW50cnkoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2xvc2UgdGhlIHRhciBmaWxlIGlucHV0IHN0cmVhbS4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBmaWxlIGNhbm5vdCBiZSBzdWNjZXNzZnVsbHkgY2xvc2VkCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnRyeUVudW1lcmF0aW9uU3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFRhckZpbGUgZm9yIHRoZSBnaXZlbiBwYXRoIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHRocm93cyBUYXJFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFRhckZpbGUoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgVGFyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMobmV3IEZpbGUoZmlsZW5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIGNhdGFsb2d1aW5nIHRoZSB0YXIgYXJjaGl2ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGVudW1lcmF0aW9uIG9mIGFsbCBmaWxlcyBpbiB0aGUgYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBlbnRyaWVzKCkgewotCQlyZXR1cm4gbmV3IEVudW1lcmF0aW9uKCkgewkJCQotCQkJcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCQkJCXJldHVybiAoY3VyRW50cnkgIT0gbnVsbCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0JCQkJVGFyRW50cnkgb2xkRW50cnkgPSBjdXJFbnRyeTsKLQkJCQl0cnkgewotCQkJCQljdXJFbnRyeSA9IGVudHJ5RW51bWVyYXRpb25TdHJlYW0uZ2V0TmV4dEVudHJ5KCk7Ci0JCQkJfSBjYXRjaChUYXJFeGNlcHRpb24gZSkgewotCQkJCQljdXJFbnRyeSA9IG51bGw7Ci0JCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWN1ckVudHJ5ID0gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIG9sZEVudHJ5OwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgSW5wdXRTdHJlYW0gZm9yIHRoZSBnaXZlbiBmaWxlIGluIHRoZSB0YXIgYXJjaGl2ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZW50cnkKLQkgKiBAcmV0dXJuIGFuIGlucHV0IHN0cmVhbSBmb3IgdGhlIGdpdmVuIGZpbGUKLQkgKiBAdGhyb3dzIFRhckV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oVGFyRW50cnkgZW50cnkpIHRocm93cyBUYXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYoZW50cnlTdHJlYW0gPT0gbnVsbCB8fCAhZW50cnlTdHJlYW0uc2tpcFRvRW50cnkoZW50cnkpKSB7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQkvLyBGaXJzdCwgY2hlY2sgaWYgaXQncyBhIEdaSVBJbnB1dFN0cmVhbS4KLQkJCXRyeSB7Ci0JCQkJaW4gPSBuZXcgR1pJUElucHV0U3RyZWFtKGluKTsKLQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJCX0KLQkJCWVudHJ5U3RyZWFtID0gbmV3IFRhcklucHV0U3RyZWFtKGluLCBlbnRyeSkgewotCQkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQkJCQkvLyBJZ25vcmUgY2xvc2UoKSBzaW5jZSB3ZSB3YW50IHRvIHJldXNlIHRoZSBzdHJlYW0uCi0JCQkJfQotCQkJfTsKLQkJfQotCQlpZihlbnRyeVN0cmVhbSA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImh1aD8iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBlbnRyeVN0cmVhbTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoIG5hbWUgb2YgdGhlIGZpbGUgdGhpcyBhcmNoaXZlIHJlcHJlc2VudHMuCi0JICogCi0JICogQHJldHVybiBwYXRoCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZmlsZS5nZXRQYXRoKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL3Rhci9UYXJJbnB1dFN0cmVhbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvdGFyL1RhcklucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYWEzYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvdGFyL1RhcklucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLnRhcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotLyoqCi0gKiBJbnB1dCBzdHJlYW0gZm9yIHJlYWRpbmcgZmlsZXMgaW4gdXN0YXIgZm9ybWF0ICh0YXIpIGNvbXBhdGlibGUKLSAqIHdpdGggdGhlIHNwZWNpZmljYXRpb24gaW4gSUVFRSBTdGQgMTAwMy4xLTIwMDEuICBBbHNvIHN1cHBvcnRzCi0gKiBsb25nIGZpbGVuYW1lcyBlbmNvZGVkIHVzaW5nIHRoZSBHTlUgQExvbmdMaW5rIGV4dGVuc2lvbi4KLSAqIDxwPgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5kYXRhdHJhbnNmZXIuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYXJJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIHsKLQlwcml2YXRlIGludCBuZXh0RW50cnkgPSAwOwotCXByaXZhdGUgaW50IG5leHRFT0YgPSAwOwotCXByaXZhdGUgaW50IGZpbGVwb3MgPSAwOwotCXByaXZhdGUgaW50IGJ5dGVzcmVhZCA9IDA7Ci0JcHJpdmF0ZSBUYXJFbnRyeSBmaXJzdEVudHJ5ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBsb25nTGlua05hbWUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0YXIgaW5wdXQgc3RyZWFtIG9uIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIGluIGlucHV0IHN0cmVhbQotCSAqIEB0aHJvd3MgVGFyRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBUYXJJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIFRhckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlzdXBlcihpbik7Ci0KLQkJLy8gUmVhZCBpbiB0aGUgZmlyc3QgVGFyRW50cnkgdG8gbWFrZSBzdXJlCi0JCS8vIHRoZSBpbnB1dCBpcyBhIHZhbGlkIHRhciBmaWxlIHN0cmVhbS4KLQkJZmlyc3RFbnRyeSA9IGdldE5leHRFbnRyeSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyB0YXIgaW5wdXQgc3RyZWFtLCBza2lwcGluZyBhaGVhZCB0byB0aGUgZ2l2ZW4gZW50cnkKLQkgKiBpbiB0aGUgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW4gaW5wdXQgc3RyZWFtCi0JICogQHBhcmFtIGVudHJ5IHNraXBzIHRvIHRoaXMgZW50cnkgaW4gdGhlIGZpbGUKLQkgKiBAdGhyb3dzIFRhckV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlUYXJJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbiwgVGFyRW50cnkgZW50cnkpIHRocm93cyBUYXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIoaW4pOwotCQlza2lwVG9FbnRyeShlbnRyeSk7Ci0JfQotCi0JLyoqCi0JICogIFRoZSBjaGVja3N1bSBvZiBhIHRhciBmaWxlIGhlYWRlciBpcyBzaW1wbHkgdGhlIHN1bSBvZiB0aGUgYnl0ZXMgaW4KLQkgKiAgdGhlIGhlYWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gaGVhZGVyCi0JICogQHJldHVybiBjaGVja3N1bQotCSAqLwotCXByaXZhdGUgbG9uZyBoZWFkZXJDaGVja3N1bShieXRlW10gaGVhZGVyKSB7Ci0JCWxvbmcgc3VtID0gMDsKLQkJZm9yKGludCBpID0gMDsgaSA8IDUxMjsgaSsrKSB7Ci0JCQlzdW0gKz0gaGVhZGVyW2ldICYgMHhmZjsKLQkJfQotCQlyZXR1cm4gc3VtOwotCX0KLQotCS8qKgotCSAqIFNraXBzIGFoZWFkIHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgZ2l2ZW4gZW50cnkgaW4gdGhlIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGVudHJ5Ci0JICogQHJldHVybnMgZmFsc2UgaWYgdGhlIGVudHJ5IGhhcyBhbHJlYWR5IGJlZW4gcGFzc2VkCi0JICogQHRocm93cyBUYXJFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JYm9vbGVhbiBza2lwVG9FbnRyeShUYXJFbnRyeSBlbnRyeSkgdGhyb3dzIFRhckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpbnQgYnl0ZXN0b3NraXAgPSBlbnRyeS5maWxlcG9zIC0gYnl0ZXNyZWFkOwotCQlpZihieXRlc3Rvc2tpcCA8IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl3aGlsZShieXRlc3Rvc2tpcCA+IDApIHsKLQkJCWxvbmcgcmV0ID0gaW4uc2tpcChieXRlc3Rvc2tpcCk7Ci0JCQlpZihyZXQgPCAwKSB7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJlYXJseSBlbmQgb2Ygc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJ5dGVzdG9za2lwIC09IHJldDsKLQkJCWJ5dGVzcmVhZCArPSByZXQ7Ci0JCX0KLQkJZmlsZXBvcyA9IGVudHJ5LmZpbGVwb3M7Ci0JCW5leHRFbnRyeSA9IDA7Ci0JCW5leHRFT0YgPSAwOwotCQkvLyBSZWFkIG5leHQgaGVhZGVyIHRvIHNlZWsgdG8gZmlsZSBkYXRhLgotCQlnZXROZXh0RW50cnkoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBoZWFkZXIgY2hlY2tzdW0gaXMgY29ycmVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gaGVhZGVyCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgaGVhZGVyIGhhcyBhIHZhbGlkIGNoZWNrc3VtCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRUYXJIZWFkZXIoYnl0ZVtdIGhlYWRlcikgewotCQlsb25nIGZpbGVDaGVja3N1bSwgY2FsY3VsYXRlZENoZWNrc3VtOwotCQlpbnQgcG9zLCBpOwotCQkKLQkJcG9zID0gMTQ4OwotCQlTdHJpbmdCdWZmZXIgY2hlY2tzdW1TdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvcihpID0gMDsgaSA8IDg7IGkrKykgewotCQkJaWYoaGVhZGVyW3BvcyArIGldID09ICcgJykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYoaGVhZGVyW3BvcyArIGldID09IDAgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KChjaGFyKSBoZWFkZXJbcG9zICsgaV0pKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljaGVja3N1bVN0cmluZy5hcHBlbmQoKGNoYXIpIGhlYWRlcltwb3MgKyBpXSk7Ci0JCX0KLQkJaWYoY2hlY2tzdW1TdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmKGNoZWNrc3VtU3RyaW5nLmNoYXJBdCgwKSAhPSAnMCcpIHsKLQkJCWNoZWNrc3VtU3RyaW5nLmluc2VydCgwLCAnMCcpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmaWxlQ2hlY2tzdW0gPSBMb25nLmRlY29kZShjaGVja3N1bVN0cmluZy50b1N0cmluZygpKS5sb25nVmFsdWUoKTsKLQkJfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkvL1RoaXMgaXMgbm90IHZhbGlkIGlmIGl0IGNhbm5vdCBiZSBwYXJzZWQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIEJsYW5rIG91dCB0aGUgY2hlY2tzdW0uCi0JCWZvcihpID0gMDsgaSA8IDg7IGkrKykgewotCQkJaGVhZGVyW3BvcyArIGldID0gJyAnOwotCQl9Ci0JCWNhbGN1bGF0ZWRDaGVja3N1bSA9IGhlYWRlckNoZWNrc3VtKGhlYWRlcik7Ci0KLQkJcmV0dXJuIChmaWxlQ2hlY2tzdW0gPT0gY2FsY3VsYXRlZENoZWNrc3VtKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXh0IGVudHJ5IGluIHRoZSB0YXIgZmlsZS4gIERvZXMgbm90IGhhbmRsZQotCSAqIEdOVSBATG9uZ0xpbmsgZXh0ZW5zaW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXh0IGVudHJ5IGluIHRoZSB0YXIgZmlsZQotCSAqIEB0aHJvd3MgVGFyRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCVRhckVudHJ5IGdldE5leHRFbnRyeUludGVybmFsKCkgdGhyb3dzIFRhckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlieXRlW10gaGVhZGVyID0gbmV3IGJ5dGVbNTEyXTsKLQkJaW50IHBvcyA9IDA7Ci0JCWludCBpOwotCi0JCWlmKGZpcnN0RW50cnkgIT0gbnVsbCkgewotCQkJVGFyRW50cnkgZW50cnlSZXR1cm4gPSBmaXJzdEVudHJ5OwotCQkJZmlyc3RFbnRyeSA9IG51bGw7Ci0JCQlyZXR1cm4gZW50cnlSZXR1cm47Ci0JCX0KLQotCQl3aGlsZShuZXh0RW50cnkgPiAwKSB7Ci0JCQlsb25nIHJldCA9IGluLnNraXAobmV4dEVudHJ5KTsKLQkJCWlmKHJldCA8IDApIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oImVhcmx5IGVuZCBvZiBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJbmV4dEVudHJ5IC09IHJldDsKLQkJCWJ5dGVzcmVhZCArPSByZXQ7Ci0JCX0KLQotCQlpbnQgYnl0ZXN0b3JlYWQgPSA1MTI7Ci0JCXdoaWxlKGJ5dGVzdG9yZWFkID4gMCkgewotCQkJaW50IHJldCA9IHN1cGVyLnJlYWQoaGVhZGVyLCA1MTIgLSBieXRlc3RvcmVhZCwgYnl0ZXN0b3JlYWQpOwotCQkJaWYoIHJldCA8IDAgKSB7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJlYXJseSBlbmQgb2Ygc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJ5dGVzdG9yZWFkIC09IHJldDsKLQkJCWJ5dGVzcmVhZCArPSByZXQ7Ci0JCX0KLQotCQkvLyBJZiB3ZSBoYXZlIGEgaGVhZGVyIG9mIGFsbCB6ZXJvcywgdGhpcyBtYXJrcyB0aGUgZW5kIG9mIHRoZSBmaWxlLgotCQlpZihoZWFkZXJDaGVja3N1bShoZWFkZXIpID09IDApIHsKLQkJCS8vIFdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotCQkJaWYoZmlsZXBvcyA+IDApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJLy8gSW52YWxpZCBzdHJlYW0uCi0JCQl0aHJvdyBuZXcgVGFyRXhjZXB0aW9uKCJub3QgaW4gdGFyIGZvcm1hdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCS8vIFZhbGlkYXRlIGNoZWNrc3VtLgotCQlpZighaXNWYWxpZFRhckhlYWRlcihoZWFkZXIpKSB7Ci0JCQl0aHJvdyBuZXcgVGFyRXhjZXB0aW9uKCJub3QgaW4gdGFyIGZvcm1hdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl3aGlsZSAocG9zIDwgMTAwICYmIGhlYWRlcltwb3NdICE9IDApIHsKLQkJCXBvcysrOwotCQl9Ci0JCVN0cmluZyBuYW1lID0gbmV3IFN0cmluZyhoZWFkZXIsIDAsIHBvcywgIlVURjgiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBQcmVwZW5kIHRoZSBwcmVmaXggaGVyZS4KLQkJcG9zID0gMzQ1OwotCQlpZihoZWFkZXJbcG9zXSAhPSAwKSB7Ci0JCQl3aGlsZSAocG9zIDwgNTAwICYmIGhlYWRlcltwb3NdICE9IDApIHsKLQkJCQlwb3MrKzsKLQkJCX0KLQkJCVN0cmluZyBwcmVmaXggPSBuZXcgU3RyaW5nKGhlYWRlciwgMzQ1LCBwb3MgLSAzNDUsICJVVEY4Iik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBwcmVmaXggKyAiLyIgKyBuYW1lOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCVRhckVudHJ5IGVudHJ5OwotCQlpZihsb25nTGlua05hbWUgIT0gbnVsbCkgewotCQkJZW50cnkgPSBuZXcgVGFyRW50cnkobG9uZ0xpbmtOYW1lLCBmaWxlcG9zKTsKLQkJCWxvbmdMaW5rTmFtZSA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQllbnRyeSA9IG5ldyBUYXJFbnRyeShuYW1lLCBmaWxlcG9zKTsKLQkJfQotCQlpZihoZWFkZXJbMTU2XSAhPSAwKSB7Ci0JCQllbnRyeS5zZXRGaWxlVHlwZShoZWFkZXJbMTU2XSk7Ci0JCX0KLQkJCi0JCXBvcyA9IDEwMDsKLQkJU3RyaW5nQnVmZmVyIG1vZGUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvcihpID0gMDsgaSA8IDg7IGkrKykgewotCQkJaWYoaGVhZGVyW3BvcyArIGldID09IDApIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmKGhlYWRlcltwb3MgKyBpXSA9PSAnICcpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCW1vZGUuYXBwZW5kKChjaGFyKSBoZWFkZXJbcG9zICsgaV0pOwotCQl9Ci0JCWlmKG1vZGUubGVuZ3RoKCkgPiAwICYmIG1vZGUuY2hhckF0KDApICE9ICcwJykgewotCQkJbW9kZS5pbnNlcnQoMCwgJzAnKTsKLQkJfQotCQl0cnkgewotCQkJbG9uZyBmaWxlTW9kZSA9IExvbmcuZGVjb2RlKG1vZGUudG9TdHJpbmcoKSkubG9uZ1ZhbHVlKCk7Ci0JCQllbnRyeS5zZXRNb2RlKGZpbGVNb2RlKTsKLQkJfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7IC8vIFRPRE8KLQkJCXRocm93IG5ldyBUYXJFeGNlcHRpb24oIlRhckltcG9ydF9pbnZhbGlkX3Rhcl9mb3JtYXQiICsgbmZlKTsKLQkJfQotCQkKLQkJcG9zID0gMTAwICsgMjQ7Ci0JCVN0cmluZ0J1ZmZlciBzaXplID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IoaSA9IDA7IGkgPCAxMjsgaSsrKSB7Ci0JCQlpZihoZWFkZXJbcG9zICsgaV0gPT0gMCkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYoaGVhZGVyW3BvcyArIGldID09ICcgJykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJc2l6ZS5hcHBlbmQoKGNoYXIpIGhlYWRlcltwb3MgKyBpXSk7Ci0JCX0KLQkJaWYoc2l6ZS5jaGFyQXQoMCkgIT0gJzAnKSB7Ci0JCQlzaXplLmluc2VydCgwLCAnMCcpOwotCQl9Ci0JCWludCBmaWxlU2l6ZTsKLQkJdHJ5IHsKLQkJCWZpbGVTaXplID0gSW50ZWdlci5kZWNvZGUoc2l6ZS50b1N0cmluZygpKS5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsgLy8gVE9ETwotCQkJdGhyb3cgbmV3IFRhckV4Y2VwdGlvbigiRGF0YVRyYW5zZmVyTWVzc2FnZXMuVGFySW1wb3J0X2ludmFsaWRfdGFyX2Zvcm1hdCIgKyBuZmUpOwotCQl9Ci0KLQkJZW50cnkuc2V0U2l6ZShmaWxlU2l6ZSk7Ci0JCW5leHRFT0YgPSBmaWxlU2l6ZTsKLQkJaWYoZmlsZVNpemUgJSA1MTIgPiAwKSB7Ci0JCQluZXh0RW50cnkgPSBmaWxlU2l6ZSArICg1MTIgLSAoZmlsZVNpemUgJSA1MTIpKTsKLQkJfSBlbHNlIHsKLQkJCW5leHRFbnRyeSA9IGZpbGVTaXplOwotCQl9Ci0JCWZpbGVwb3MgKz0gKG5leHRFbnRyeSArIDUxMik7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlcyBhaGVhZCB0byB0aGUgbmV4dCBmaWxlIGluIHRoZSB0YXIgYXJjaGl2ZSBhbmQgcmV0dXJucwotCSAqIGEgVGFyRW50cnkgb2JqZWN0IGRlc2NyaWJpbmcgaXQuCi0JICogCi0JICogQHJldHVybiB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgdGFyIGZpbGUKLQkgKiBAdGhyb3dzIFRhckV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgVGFyRW50cnkgZ2V0TmV4dEVudHJ5KCkgdGhyb3dzIFRhckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlUYXJFbnRyeSBlbnRyeSA9IGdldE5leHRFbnRyeUludGVybmFsKCk7Ci0KLQkJaWYoZW50cnkgIT0gbnVsbCAmJiBlbnRyeS5nZXROYW1lKCkuZXF1YWxzKCIuLy4vQExvbmdMaW5rIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gVGhpcyBpcyBhIEdOVSBleHRlbnNpb24gZm9yIGRvaW5nIGxvbmcgZmlsZW5hbWVzLgotCQkJLy8gV2UgZ2V0IGEgZmlsZSBjYWxsZWQgLi8uL0BMb25nTGluayB3aGljaCBqdXN0IGNvbnRhaW5zCi0JCQkvLyB0aGUgcmVhbCBwYXRobmFtZS4KLQkJCWJ5dGVbXSBsb25nTmFtZURhdGEgPSBuZXcgYnl0ZVsoaW50KSBlbnRyeS5nZXRTaXplKCldOwotCQkJaW50IGJ5dGVzcmVhZDIgPSAwOwotCQkJd2hpbGUgKGJ5dGVzcmVhZDIgPCBsb25nTmFtZURhdGEubGVuZ3RoKSB7Ci0JCQkJaW50IGN1ciA9IHJlYWQobG9uZ05hbWVEYXRhLCBieXRlc3JlYWQyLCBsb25nTmFtZURhdGEubGVuZ3RoIC0gYnl0ZXNyZWFkMik7Ci0JCQkJaWYgKGN1ciA8IDApIHsKLQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJlYXJseSBlbmQgb2Ygc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJYnl0ZXNyZWFkMiArPSBjdXI7Ci0JCQl9Ci0KLQkJCWludCBwb3MgPSAwOwotCQkJd2hpbGUgKHBvcyA8IGxvbmdOYW1lRGF0YS5sZW5ndGggJiYgbG9uZ05hbWVEYXRhW3Bvc10gIT0gMCkgewotCQkJCXBvcysrOwotCQkJfQotCQkJbG9uZ0xpbmtOYW1lID0gbmV3IFN0cmluZyhsb25nTmFtZURhdGEsIDAsIHBvcywgIlVURjgiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGdldE5leHRFbnRyeUludGVybmFsKCk7Ci0JCX0KLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYobmV4dEVPRiA9PSAwKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYobGVuID4gbmV4dEVPRikgewotCQkJbGVuID0gbmV4dEVPRjsKLQkJfQotCQlpbnQgc2l6ZSA9IHN1cGVyLnJlYWQoYiwgb2ZmLCBsZW4pOwotCQluZXh0RW50cnkgLT0gc2l6ZTsKLQkJbmV4dEVPRiAtPSBzaXplOwotCQlieXRlc3JlYWQgKz0gc2l6ZTsKLQkJcmV0dXJuIHNpemU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbSNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlieXRlW10gZGF0YSA9IG5ldyBieXRlWzFdOwotCQlpbnQgc2l6ZSA9IHJlYWQoZGF0YSwgMCwgMSk7Ci0JCWlmIChzaXplIDwgMCkgewotCQkJcmV0dXJuIHNpemU7Ci0JCX0KLQkJcmV0dXJuIGRhdGFbMF07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0NsaWVudERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9DbGllbnREZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDAzMWRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0NsaWVudERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogQSBsYXVuY2hhYmxlIGNsaWVudCBpcyBhIGNsaWVudCBzaWRlIGFwcGxpY2F0aW9uIG9yIHRlc3QgaGFybmVzcyB0aGF0IGNhbgotICogYmUgbGF1bmNoZWQgKHJ1bikgYWdhaW5zdCBhIHJlc291cmNlIHJ1bm5pbmcgb24gYSBzZXJ2ZXIuCi0gKiA8cD4KLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgb25seSBieSBjbGllbnRzCi0gKiB0byBleHRlbmQgdGhlIDxjb2RlPmNsaWVudHM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xpZW50RGVsZWdhdGUgewotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGxhdW5jaGFibGUgY2FuIGJlIHJ1biBieSB0aGlzIGNsaWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgY2xpZW50IGlzIGJlaW5nIHJ1biBhZ2FpbnN0Ci0JICogQHBhcmFtIGxhdW5jaGFibGUgdGhlIG9iamVjdCB0byBydW4gb24gdGhlIHNlcnZlcgotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIHRoZSBsYXVuY2ggbW9kZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNsaWVudCBzdXBwb3J0cyB0aGlzIGNvbWJpbmF0aW9uLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSVNlcnZlciBzZXJ2ZXIsIE9iamVjdCBsYXVuY2hhYmxlLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBvciBleGVjdXRlcyBvbiB0aGUgbGF1bmNoYWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgY2xpZW50IGlzIGJlaW5nIHJ1biBhZ2FpbnN0Ci0JICogQHBhcmFtIGxhdW5jaGFibGUgdGhlIG9iamVjdCB0byBydW4gb24gdGhlIHNlcnZlcgotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIHRoZSBsYXVuY2ggbW9kZQotCSAqIEBwYXJhbSBsYXVuY2ggdGhlIGxhdW5jaCBvZiB0aGUgc2VydmVyLCBpZiBhdmFpbGFibGUKLQkgKiBAcmV0dXJuIHN0YXR1cyBpbmRpY2F0aW5nIHdoYXQgKGlmIGFueXRoaW5nKSB3ZW50IHdyb25nCi0JICovCi0JcHVibGljIGFic3RyYWN0IElTdGF0dXMgbGF1bmNoKElTZXJ2ZXIgc2VydmVyLCBPYmplY3QgbGF1bmNoYWJsZSwgU3RyaW5nIGxhdW5jaE1vZGUsIElMYXVuY2ggbGF1bmNoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JTW9kdWxlRmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSU1vZHVsZUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhY2M1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JTW9kdWxlRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLS8qKgotICogQSBmaWxlIHdpdGhpbiBhIG1vZHVsZS4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVGaWxlIGV4dGVuZHMgSU1vZHVsZVJlc291cmNlIHsKLQkvKioKLQkgKiBSZXR1cm5zIGEgbW9kaWZpY2F0aW9uIHN0YW1wLiBXaGVuZXZlciB0aGUgbW9kaWZpY2F0aW9uCi0JICogc3RhbXAgY2hhbmdlcywgdGhlcmUgbWF5IGhhdmUgYmVlbiBhIGNoYW5nZSB0byB0aGUgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2RpZmljYXRpb24gc3RhbXAKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0lNb2R1bGVGb2xkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0lNb2R1bGVGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE3ZTAxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JTW9kdWxlRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsOwotLyoqCi0gKiBBIGZvbGRlciB3aXRoaW4gYSBtb2R1bGUuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kdWxlRm9sZGVyIGV4dGVuZHMgSU1vZHVsZVJlc291cmNlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZW1iZXJzIChjb250ZW50cykgb2YgdGhpcyBmb2xkZXIuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBtb2R1bGUgcmVzb3VyY2VzIGNvbnRhaW5lZCBpbiB0aGlzIGZvbGRlcgotCSAqLwotCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSU1vZHVsZVJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JTW9kdWxlUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M2OTY2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JTW9kdWxlUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0vKioKLSAqIEEgcmVzb3VyY2UgKGZpbGUgb3IgZm9sZGVyKSB3aXRoaW4gYSBtb2R1bGUuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kdWxlUmVzb3VyY2UgZXh0ZW5kcyBJQWRhcHRhYmxlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgcmVsYXRpdmUgcGF0aCB0byB0aGlzIHJlc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSByZWxhdGl2ZSBwYXRoIHRvIHRoaXMgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHJlc291cmNlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSU1vZHVsZVJlc291cmNlRGVsdGEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0lNb2R1bGVSZXNvdXJjZURlbHRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NDUwODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSU1vZHVsZVJlc291cmNlRGVsdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0vKioKLSAqIEEgbW9kdWxlIHJlc291cmNlIGRlbHRhLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZHVsZVJlc291cmNlRGVsdGEgewotCS8qKgotCSAqIEtpbmQgY29uc3RhbnQgKHZhbHVlIDApIGZvciBubyBjaGFuZ2UuCi0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fQ0hBTkdFID0gMDsKLQotCS8qKgotCSAqIEtpbmQgY29uc3RhbnQgKHZhbHVlIDEpIGZvciBhZGRlZCByZXNvdXJjZXMuCi0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQURERUQgPSAxOwotCi0JLyoqCi0JICogS2luZCBjb25zdGFudCAodmFsdWUgMikgZm9yIGNoYW5nZWQgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRUQgPSAyOwotCi0JLyoqCi0JICogS2luZCBjb25zdGFudCAodmFsdWUgMykgZm9yIHJlbW92ZWQgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRUQgPSAzOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIHJlc291cmNlIHJlcHJlc2VudGVkIGJ5IHRoaXMgZGVsdGEuCi0JICogCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGUgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVJlc291cmNlIGdldE1vZHVsZVJlc291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBraW5kIG9mIHRoaXMgcmVzb3VyY2UgZGVsdGEuCi0JICogTm9ybWFsbHksIG9uZSBvZiA8Y29kZT5BRERFRDwvY29kZT4sIAotCSAqIDxjb2RlPlJFTU9WRUQ8L2NvZGU+LCA8Y29kZT5DSEFOR0VEPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBraW5kIG9mIHRoaXMgcmVzb3VyY2UgZGVsdGEKLQkgKiAKLQkgKiBAc2VlIElNb2R1bGVSZXNvdXJjZURlbHRhI0FEREVECi0JICogQHNlZSBJTW9kdWxlUmVzb3VyY2VEZWx0YSNSRU1PVkVECi0JICogQHNlZSBJTW9kdWxlUmVzb3VyY2VEZWx0YSNDSEFOR0VECi0JICovCi0JcHVibGljIGludCBnZXRLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG1vZHVsZSByZXNvdXJjZSBkZWx0YXMgZm9yIGFsbCBjaGlsZHJlbiBvZiB0aGlzIHJlc291cmNlIAotCSAqIHdoaWNoIHdlcmUgYWRkZWQsIHJlbW92ZWQsIG9yIGNoYW5nZWQuIFJldHVybnMgYW4gZW1wdHkKLQkgKiBhcnJheSBpZiB0aGVyZSBhcmUgbm8gYWZmZWN0ZWQgY2hpbGRyZW4uCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCwgZnVsbHkgZXF1aXZhbGVudCB0bzoKLQkgKiA8cHJlPgotCSAqICAgZ2V0QWZmZWN0ZWRDaGlsZHJlbihBRERFRCB8IFJFTU9WRUQgfCBDSEFOR0VELCBJUmVzb3VyY2UuTk9ORSk7Ci0JICogPC9wcmU+Ci0JICogPC9wPgotCSAqCi0JICogQHJldHVybiB0aGUgcmVzb3VyY2UgZGVsdGFzIGZvciBhbGwgYWZmZWN0ZWQgY2hpbGRyZW4KLQkgKiBAc2VlIElNb2R1bGVSZXNvdXJjZURlbHRhI0FEREVECi0JICogQHNlZSBJTW9kdWxlUmVzb3VyY2VEZWx0YSNSRU1PVkVECi0JICogQHNlZSBJTW9kdWxlUmVzb3VyY2VEZWx0YSNDSEFOR0VECi0JICovCi0JcHVibGljIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZS1yZWxhdGl2ZSBwYXRoIG9mIHRoaXMgcmVzb3VyY2UgZGVsdGEuCi0JICogUmV0dXJucyB0aGUgZW1wdHkgcGF0aCBmb3IgcmVzb3VyY2VzIGluIHRoZSBtb2R1bGUgcm9vdC4KLQkgKiA8cD4KLQkgKiBBIHJlc291cmNlJ3MgbW9kdWxlLXJlbGF0aXZlIHBhdGggaW5kaWNhdGVzIHRoZSByb3V0ZSBmcm9tIHRoZSBtb2R1bGUKLQkgKiB0byB0aGUgcmVzb3VyY2UuIFdpdGhpbiBhIG1vZHVsZSwgdGhlcmUgaXMgZXhhY3RseSBvbmUgc3VjaCBwYXRoCi0JICogZm9yIGFueSBnaXZlbiByZXNvdXJjZS4gVGhlIHJldHVybmVkIHBhdGggbmV2ZXIgaGFzIGEgdHJhaWxpbmcgc2VwYXJhdG9yLgotCSAqIDwvcD4KLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUtcmVsYXRpdmUgcGF0aCBvZiB0aGlzIHJlc291cmNlIGRlbHRhCi0JICogQHNlZSBJTW9kdWxlUmVzb3VyY2UjZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSVVSTFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JVVJMUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg1NzNlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JVVJMUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgYSBzZXJ2ZXIgZGVsZWdhdGUgdGhhdCBjYW4gcHJvdmlkZSBVUkxzIGZvciBhIG1vZHVsZSBwdWJsaXNoZWQKLSAqIHRvIHRoZSBzZXJ2ZXIuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVVJMUHJvdmlkZXIgewotCS8qKgotCSAqIFJldHVybiB0aGUgYmFzZSBVUkwgb2YgdGhpcyBtb2R1bGUgb24gdGhlIHNlcnZlci4gKGUuZy4gCi0JICogImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9teVByb2plY3QiKSAKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwgaWYgdGhpcyBzZXJ2ZXIgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGNvbmZpZ3VyYXRpb24KLQkgKiBvciBpZiB0aGUgc2VydmVyIGlzIG5vdCBydW5uaW5nLiBUaGUgcmV0dXJuZWQgVVJMIG11c3Qgbm90IGVuZCBpbiBhIHRyYWlsaW5nCi0JICogc2xhc2guCi0JICogPC9wPgotCSAqIDxwPgotCSAqIElmIHRoZSBtb2R1bGUgaXMgbnVsbCwgdGhlIHJldHVybmVkIFVSTCB3aWxsIGp1c3QgYmUgdG8gdGhlIHJvb3Qgb2YKLQkgKiB0aGUgc2VydmVyIChlLmcuICJodHRwOi8vbG9jYWxob3N0OjgwODAiKQotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbW9kdWxlIGlzIG5vdCBhbHJlYWR5IGFkZGVkIHRvIHRoZSBzZXJ2ZXIsIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4KLQkgKiBhcyBjbG9zZSBhbiBhcHByb3hpbWF0aW9uIGFzIHBvc3NpYmxlLiAoZm9yIGluc3RhbmNlLCBmb3IgYSBKMkVFIHdlYiBwcm9qZWN0Ci0JICogaXQgbWF5IHVzZSB0aGUgcHJvamVjdCdzIGNvbnRleHQgcm9vdCwgd2hpY2ggbWF5IG5vdCBiZSB0aGUgc2FtZSB3aGVuIGRlcGxveWVkCi0JICogdG8gYSBzZXJ2ZXIpCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSBjb20uaWJtLmV0b29scy5zZXJ2ZXIuY29yZS5JTW9kdWxlCi0JICogQHJldHVybiBqYXZhLm5ldC5VUkwKLQkgKi8KLQlwdWJsaWMgVVJMIGdldE1vZHVsZVJvb3RVUkwoSU1vZHVsZSBtb2R1bGUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0lVUkxQcm92aWRlcjIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0lVUkxQcm92aWRlcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MxMWQ2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JVVJMUHJvdmlkZXIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIHByb3ZpZGluZyBVUkxzIGZvciBhIG1vZHVsZSBwdWJsaXNoZWQKLSAqIHRvIHRoZSBzZXJ2ZXIuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVVJMUHJvdmlkZXIyIGV4dGVuZHMgSVVSTFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFJldHVybnMgYSBVUkwgKGUuZy4gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9teVByb2plY3QvbXlTZXJ2bGV0IikgdGhhdCBjYW4gYmUgdXNlZCB0byBsYXVuY2gKLQkgKiBhIGJyb3dzZXIgcG9pbnRpbmcgdG8gYSBzcGVjaWZpYyByZXNvdXJjZSBpbnNpZGUgYSBtb2R1bGUuICAgIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldExhdW5jaGFibGVVUkwoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSW50ZXJuYWxJbml0aWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSW50ZXJuYWxJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmU0NDFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0ludGVybmFsSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1vZHVsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLS8qKgotICogVGhpcyBpcyBhbiBpbnRlcm5hbCB1dGlsaXR5IGNsYXNzIHRoYXQgaXMgdXNlZCBieSB0aGUgc2VydmVyIGZyYW1ld29yay4KLSAqIEl0IGlzIG5vdCBBUEkgYW5kIHNob3VsZCBuZXZlciBiZSB1c2VkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRlcm5hbEluaXRpYWxpemVyIHsKLQkvKioKLQkgKiBJbnRlcm5hbCBtZXRob2QgLSBkbyBub3QgY2FsbC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsZWdhdGUKLQkgKiBAcGFyYW0gbmV3U2VydmVyCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZVNlcnZlckRlbGVnYXRlKFNlcnZlckRlbGVnYXRlIGRlbGVnYXRlLCBTZXJ2ZXIgbmV3U2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZGVsZWdhdGUuaW5pdGlhbGl6ZShuZXdTZXJ2ZXIsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsIG1ldGhvZCAtIGRvIG5vdCBjYWxsLgotCSAqIAotCSAqIEBwYXJhbSBkZWxlZ2F0ZQotCSAqIEBwYXJhbSBuZXdTZXJ2ZXIKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUgZGVsZWdhdGUsIFNlcnZlciBuZXdTZXJ2ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlkZWxlZ2F0ZS5pbml0aWFsaXplKG5ld1NlcnZlciwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwgbWV0aG9kIC0gZG8gbm90IGNhbGwuCi0JICogCi0JICogQHBhcmFtIGRlbGVnYXRlCi0JICogQHBhcmFtIG5ld1J1bnRpbWUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplUnVudGltZURlbGVnYXRlKFJ1bnRpbWVEZWxlZ2F0ZSBkZWxlZ2F0ZSwgUnVudGltZSBuZXdSdW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZGVsZWdhdGUuaW5pdGlhbGl6ZShuZXdSdW50aW1lLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCBtZXRob2QgLSBkbyBub3QgY2FsbC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsZWdhdGUKLQkgKiBAcGFyYW0gbmV3TW9kdWxlRmFjdG9yeQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVNb2R1bGVGYWN0b3J5RGVsZWdhdGUoTW9kdWxlRmFjdG9yeURlbGVnYXRlIGRlbGVnYXRlLCBNb2R1bGVGYWN0b3J5IG5ld01vZHVsZUZhY3RvcnksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlkZWxlZ2F0ZS5pbml0aWFsaXplKG5ld01vZHVsZUZhY3RvcnksIG1vbml0b3IpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9MYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9MYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZmQ0ZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBUaGlzIGludGVyZmFjZSwgdHlwaWNhbGx5IGltcGxlbWVudGVkIGJ5IHRoZSBzZXJ2ZXIgY29kZSwgY29udmVydHMgZnJvbQotICogYW4gSU1vZHVsZUFydGlmYWN0IHRvIGFuIG9iamVjdCBsYXVuY2hhYmxlIG9uIHRoZSBzZXJ2ZXIuCi0gKiAKLSAqIDxwPlRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbGF1bmNoYWJsZUFkYXB0ZXIgZXh0ZW5zaW9uIHBvaW50LjwvcD4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+bGF1bmNoYWJsZUFkYXB0ZXJzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUgewotCS8qKgotCSAqIFJldHVybnMgYSBsYXVuY2hhYmxlIG9iamVjdCBmcm9tIHRoaXMgbW9kdWxlIGFydGlmYWN0LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgotCSAqIEBwYXJhbSBtb2R1bGVBcnRpZmFjdCBhIG1vZHVsZSBhcnRpZmFjdAotCSAqIFtpc3N1ZTogaWYgdGhlIGxhdW5jaGFibGUgb2JqZWN0IGNhbm5vdCBiZSBmb3VuZCwgc2hvdWxkIGl0IHRocm93IGEgQ29yZUV4Y3BldGlvbiBvciByZXR1cm4gbnVsbD9dCi0JICogQHJldHVybiB0aGUgbGF1bmNoYWJsZSBvYmplY3QKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGRvaW5nIHRoZSBjb252ZXJzaW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRMYXVuY2hhYmxlKElTZXJ2ZXIgc2VydmVyLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL01vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9Nb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTk1NDc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL01vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci0vKioKLSAqIEEgbW9kdWxlIGFydGlmYWN0IGFkYXB0ZXIgY29udmVydHMgZnJvbSBzb21lIHZpZXcncyBtb2RlbAotICogb2JqZWN0IGludG8gYSBtb2R1bGUgYXJ0aWZhY3QgdGhhdCBpcyByZWNvZ25pemVkIGJ5IG9uZSBvcgotICogbW9yZSBzZXJ2ZXIgdHlwZXMuCi0gKiAKLSAqIDxwPlRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gKiBleHRlbnNpb24gcG9pbnQuPC9wPgotICogPHA+Ci0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlIHsKLQkvKioKLQkgKiBDb252ZXJ0cyBmcm9tIGFuIGFyYml0cmFyeSBvYmplY3QgdG8gYW4gbW9kdWxlIGFydGlmYWN0LgotCSAqCi0JICogQHBhcmFtIG9iaiBhbiBhcmJpdHJhcnkgb2JqZWN0IGZyb20gYSB2aWV3IG9yIGVkaXRvcgotCSAqIEByZXR1cm4gYW4gbW9kdWxlIGFydGlmYWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzCi0JICogICAgYWRhcHRlciBkb2VzIG5vdCByZWNvZ25pemUgb3IgY2Fubm90IGFkYXB0IHRoZSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZUFydGlmYWN0KE9iamVjdCBvYmopOwotCi0JLyoqCi0JICogQ29udmVydHMgZnJvbSBhbiBhcmJpdHJhcnkgb2JqZWN0IHRvIGFuIG1vZHVsZSBhcnRpZmFjdC4KLQkgKgotCSAqIEBwYXJhbSBvYmogYW4gYXJiaXRyYXJ5IG9iamVjdCBmcm9tIGEgdmlldyBvciBlZGl0b3IKLQkgKiBAcmV0dXJuIGFuIG1vZHVsZSBhcnRpZmFjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcwotCSAqICAgIGFkYXB0ZXIgZG9lcyBub3QgcmVjb2duaXplIG9yIGNhbm5vdCBhZGFwdCB0aGUgb2JqZWN0Ci0JICovCi0JcHVibGljIElNb2R1bGVBcnRpZmFjdFtdIGdldE1vZHVsZUFydGlmYWN0cyhPYmplY3Qgb2JqKSB7Ci0JCUlNb2R1bGVBcnRpZmFjdCBhcnRpZmFjdCA9IGdldE1vZHVsZUFydGlmYWN0KG9iaik7Ci0JCWlmIChhcnRpZmFjdCAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBJTW9kdWxlQXJ0aWZhY3RbXSB7IGFydGlmYWN0IH07Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9Nb2R1bGVBcnRpZmFjdERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9Nb2R1bGVBcnRpZmFjdERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjM2M4NTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotLyoqCi0gKiBBIG1vZHVsZSBhcnRpZmFjdCBpcyBhIHJlc291cmNlIHdpdGhpbiBhIG1vZHVsZSwgd2hpY2ggY2FuIGJlIGxhdW5jaGVkCi0gKiBvbiB0aGUgc2VydmVyLiBFeGFtcGxlcyBvZiBtb2R1bGUgYXJ0aWZhY3RzIGFyZSBzZXJ2bGV0cywgSFRNTCBwYWdlcywKLSAqIG9yIEVKQiBiZWFucy4KLSAqIDxwPgotICogT2JqZWN0cyB0aGF0IHByb3ZpZGUgYW4gYWRhcHRlciB0byB0aGlzIHR5cGUgd2lsbCBiZSBjb25zaWRlcmVkIGJ5IHRoZQotICogY29udGV4dHVhbCBSdW4gb24gU2VydmVyIGxhdW5jaCBzdXBwb3J0LiAgCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgc2hvdWxkIHByb3ZpZGUgYSBkZWZhdWx0IChuby1hcmcpIGNvbnN0cnVjdG9yLCBpbXBsZW1lbnQKLSAqIHRoZSBzZXJpYWxpemUvZGVzZXJpYWxpemUgbWV0aG9kcywgYW5kIHByb3ZpZGUgYSB1c2VmdWwgbmFtZS4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUgaW1wbGVtZW50cyBJTW9kdWxlQXJ0aWZhY3QgewotCXByaXZhdGUgSU1vZHVsZSBtb2R1bGU7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbW9kdWxlIGFydGlmYWN0LgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZShJTW9kdWxlIG1vZHVsZSkgewotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbW9kdWxlIGFydGlmYWN0LgotCSAqLwotCXB1YmxpYyBNb2R1bGVBcnRpZmFjdERlbGVnYXRlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZHVsZUFydGlmYWN0I2dldE1vZHVsZSgpCi0JICovCi0JcHVibGljIElNb2R1bGUgZ2V0TW9kdWxlKCkgewotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB1c2VyLXByZXNlbnRhYmxlIG5hbWUgZm9yIHRoaXMgYXJ0aWZhY3QuCi0JICogCi0JICogQHJldHVybiBhIHVzZXItcHJlc2VudGFibGUgbmFtZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2VyaWFsaXplIHRoaXMgb2JqZWN0IGludG8gYSBzdHJpbmcuCi0JICogIAotCSAqIEByZXR1cm4gYSBzZXJpYWxpemVkIHN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgc2VyaWFsaXplKCkgewotCQlyZXR1cm4gbW9kdWxlLmdldElkKCk7Ci0JfQotCi0JLyoqCi0JICogRGVzZXJpYWxpemUgdGhpcyBvYmplY3QgZnJvbSBhIHNlcmlhbGl6ZWQgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzIGEgc2VyaWFsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHZvaWQgZGVzZXJpYWxpemUoU3RyaW5nIHMpIHsKLQkJdGhpcy5tb2R1bGUgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZShzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTW9kdWxlRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL01vZHVsZURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMTQ0YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTW9kdWxlRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBBIG1vZHVsZSBkZWxlZ2F0ZSBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgZGlzY292ZXJpbmcgaW5mb3JtYXRpb24KLSAqIGFib3V0IGluZGl2aWR1YWwgbW9kdWxlcy4gTW9kdWxlcyBhcmUgcmV0dXJuZWQgZnJvbSBtb2R1bGUgZmFjdG9yeQotICogZGVsZWdhdGVzOyB0aGVpciBkZWxlZ2F0ZXMgYXJlIGNyZWF0ZWQgd2hlbgotICogTW9kdWxlRmFjdG9yeURlbGVnYXRlLmNyZWF0ZU1vZHVsZSgpIGlzIGNhbGxlZC4KLSAqIDxwPgotICogV2hlbiB0aGUgbW9kdWxlIG5lZWRzIHRvIGJlIGdpdmVuIGEgZGVsZWdhdGUsIHRoZSBkZWxlZ2F0ZSBjbGFzcwotICogc3BlY2lmaWVkIGZvciB0aGUgbW9kdWxlIGlzIGluc3RhbnRpYXRlZCB3aXRoIGEgMC1hcmd1bWVudAotICogY29uc3RydWN0b3IuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIE1vZHVsZSBkZWxlZ2F0ZXMgbWF5IGtlZXAgc3RhdGUgaW4gaW5zdGFuY2UgZmllbGRzLCBidXQgdGhhdCBzdGF0ZSBpcwotICogdHJhbnNpZW50IGFuZCB3aWxsIG5vdCBiZSBwZXJzaXN0ZWQgYWNyb3NzIHdvcmtiZW5jaCBzZXNzaW9ucy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+bW9kdWxlRmFjdG9yaWVzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUKLSAqIEBzZWUgTW9kdWxlRmFjdG9yeURlbGVnYXRlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2R1bGVEZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJTW9kdWxlIG1vZHVsZTsKLQotCS8qKgotCSAqIERlbGVnYXRlcyBtdXN0IGhhdmUgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE1vZHVsZURlbGVnYXRlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBtb2R1bGUgZGVsZWdhdGUgd2l0aCBpdHMgbGlmZS1sb25nIG1vZHVsZSBpbnN0YW5jZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TW9kdWxlIHRoZSBtb2R1bGUgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBpbml0aWFsaXplKElNb2R1bGUgbmV3TW9kdWxlKSB7Ci0JCXRoaXMubW9kdWxlID0gbmV3TW9kdWxlOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBtb2R1bGUgZGVsZWdhdGUuIFRoaXMgbWV0aG9kIGdpdmVzIGRlbGVnYXRlcyBhIGNoYW5jZQotCSAqIHRvIGRvIHRoZWlyIG93biBpbml0aWFsaXphdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIHRoYXQgdGhpcyBtb2R1bGUgZGVsZWdhdGUgY29ycmVzcG9uZHMgdG8uCi0JICogCi0JICogQHJldHVybiB0aGUgbW9kdWxlCi0JICovCi0JcHVibGljIElNb2R1bGUgZ2V0TW9kdWxlKCkgewotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGlzIG1vZHVsZSBpbnN0YW5jZS4gU3ViY2xhc3NlcyBzaG91bGQKLQkgKiBvdmVycmlkZSBhbmQgY2FsbCBzdXBlci52YWxpZGF0ZSgpIGZvciBiYXNpYyB2YWxpZGF0aW9uLiAKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHdlYiBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsuCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhpcwotCSAqICAgbW9kdWxlIGlzIHZhbGlkLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcwotCSAqICAgd3Jvbmcgd2l0aCBpdAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJU3RhdHVzIHZhbGlkYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGlsZCBtb2R1bGVzIG9mIHRoaXMgbW9kdWxlLgotCSAqCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIGNoaWxkIG1vZHVsZXMKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcygpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggcmVsYXRpdmUgdG8gaXRzIHBhcmVudCBvZiB0aGUgZ2l2ZW4gbW9kdWxlIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBhcHBsaWNhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBtIGEgbW9kdWxlIHdpdGhpbiB0aGlzIGFwcGxpY2F0aW9uCi0JICogQHJldHVybiB0aGUgcGF0aCBvZiB0aGUgZ2l2ZW4gbW9kdWxlIHdpdGggcmVzcGVjdCB0byB0aGUgcGFyZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcGF0aCBjb3VsZAotCSAqICAgIG5vdCBiZSBmb3VuZAotCSAqLwkKLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoSU1vZHVsZSBtKXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgYXJyYXkgb2YgbW9kdWxlIGFydGlmYWN0cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgY29udGFpbmluZyB0aGUgbW9kdWxlIHJlc291cmNlcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGdldHRpbmcgdGhlIG1lbWJlcnMKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSU1vZHVsZVJlc291cmNlW10gbWVtYmVycygpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL01vZHVsZUZhY3RvcnlEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTW9kdWxlRmFjdG9yeURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTdjYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTW9kdWxlRmFjdG9yeURlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5Nb2R1bGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci0vKioKLSAqIEEgbW9kdWxlIGZhY3RvcnkgZGVsZWdhdGUgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGRpc2NvdmVyaW5nCi0gKiBtb2R1bGVzLiBBIG1vZHVsZSBmYWN0b3J5IGRlbGVnYXRlIGlzIHNwZWNpZmllZCBieSB0aGUKLSAqIDxjb2RlPmNsYXNzPC9jb2RlPiBhdHRyaWJ1dGUgb2YgYSA8Y29kZT5tb2R1bGVGYWN0b3JpZXM8L2NvZGU+IGV4dGVuc2lvbi4KLSAqIDxwPgotICogV2hlbiB0aGUgbW9kdWxlIGZhY3RvcnkgbmVlZHMgdG8gYmUgZ2l2ZW4gYSBkZWxlZ2F0ZSwgdGhlIGRlbGVnYXRlIGNsYXNzCi0gKiBzcGVjaWZpZWQgZm9yIHRoZSBtb2R1bGUgZmFjdG9yeSBpcyBpbnN0YW50aWF0ZWQgd2l0aCBhIDAtYXJndW1lbnQKLSAqIGNvbnN0cnVjdG9yLgotICogPC9wPgotICogPHA+Ci0gKiBNb2R1bGUgZmFjdG9yeSBkZWxlZ2F0ZXMgbWF5IGtlZXAgc3RhdGUgaW4gaW5zdGFuY2UgZmllbGRzLCBidXQgdGhhdCBzdGF0ZSBpcwotICogdHJhbnNpZW50IGFuZCB3aWxsIG5vdCBiZSBwZXJzaXN0ZWQgYWNyb3NzIHdvcmtiZW5jaCBzZXNzaW9ucy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+bW9kdWxlRmFjdG9yaWVzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUKLSAqIEBzZWUgTW9kdWxlRGVsZWdhdGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBNb2R1bGVGYWN0b3J5IGZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBEZWxlZ2F0ZXMgbXVzdCBoYXZlIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBNb2R1bGVGYWN0b3J5RGVsZWdhdGUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIG1vZHVsZSBmYWN0b3J5IGRlbGVnYXRlIHdpdGggaXRzIGxpZmUtbG9uZyBtb2R1bGUKLQkgKiBmYWN0b3J5IGluc3RhbmNlLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuZXdGYWN0b3J5IHRoZSBtb2R1bGUgZmFjdG9yeSBpbnN0YW5jZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKi8KLQlmaW5hbCB2b2lkIGluaXRpYWxpemUoTW9kdWxlRmFjdG9yeSBuZXdGYWN0b3J5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmFjdG9yeSA9IG5ld0ZhY3Rvcnk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIG1vZHVsZSBmYWN0b3J5IGRlbGVnYXRlLiBUaGlzIG1ldGhvZCBnaXZlcyBkZWxlZ2F0ZXMgYSBjaGFuY2UKLQkgKiB0byBkbyB0aGVpciBvd24gaW5pdGlhbGl6YXRpb24uCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsuCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgZmFjdG9yeS4KLQkgKiBFYWNoIGZhY3RvcnkgaGFzIGEgZGlzdGluY3QgaWQsIGZpeGVkIGZvciBpdHMgbGlmZXRpbWUuIElkcyBhcmUgaW50ZW5kZWQgdG8KLQkgKiBiZSB1c2VkIGludGVybmFsbHkgYXMga2V5czsgdGhleSBhcmUgbm90IGludGVuZGVkIHRvIGJlIHNob3duIHRvIGVuZCB1c2Vycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IGlkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGZhY3RvcnkuZ2V0SWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGNhY2hlIG9mIG1vZHVsZXMgcmV0dXJuZWQgYnkgZ2V0TW9kdWxlcygpLiBEZWxlZ2F0ZXMgY2FuIGNhbGwgdGhpcwotCSAqIG1ldGhvZCBpZiB0aGV5IGtub3cgdGhhdCB0aGUgcmVzdWx0cyBvZiBnZXRNb2R1bGVzKCkgaXMgaW52YWxpZCBhbmQgc2hvdWxkIGJlCi0JICogcmVmcmVzaGVkLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGFuZCBuZXZlciBjYWxsZWQgYnkgdGhlCi0JICogICAgZnJhbWV3b3JrLiBJdCBzaG91bGRuJ3QgYmUgcGFydCBvZiB0aGUgcHVibGljIEFQSSwgYnV0IHN1YmNsYXNzZXMgYXJlIHN0aWxsCi0JICogICAgd2VsY29tZSB0byBwcm92aWRlIHRoZWlyIG93biBtZXRob2QgdG8gY2xlYXIgdGhlIGNhY2hlLgotCSAqIEBzZWUgI2dldE1vZHVsZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyTW9kdWxlQ2FjaGUoKSB7Ci0JCS8vIGlnbm9yZQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBtb2R1bGUgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gc3RhdGljIGluZm9ybWF0aW9uLiBUaGlzIG1ldGhvZCBpcyB1c2VkCi0JICogYnkgbW9kdWxlIGZhY3RvcnkgZGVsZWdhdGVzIHRvIGNyZWF0ZSBtb2R1bGUgaW5zdGFuY2VzLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgbW9kdWxlIGlkCi0JICogQHBhcmFtIG5hbWUgdGhlIG1vZHVsZSBuYW1lCi0JICogQHBhcmFtIHR5cGUgdGhlIG1vZHVsZSB0eXBlIGlkCi0JICogQHBhcmFtIHZlcnNpb24gdGhlIG1vZHVsZSB2ZXJzaW9uIGlkCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdGhhdCB0aGUgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbgotCSAqIEByZXR1cm4gYSBtb2R1bGUgaW5zdGFuY2UKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSU1vZHVsZSBjcmVhdGVNb2R1bGUoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgTW9kdWxlKGZhY3RvcnksIGlkLCBuYW1lLCB0eXBlLCB2ZXJzaW9uLCBwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtb2R1bGUgZGVsZWdhdGUgZm9yIGEgbW9kdWxlIHdpdGggdGhlIGdpdmVuIGluZm9ybWF0aW9uLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgY2xpZW50IG5lZWRzIHRvIGFjY2VzcyB0aGUgbW9kdWxlIGRlbGVnYXRlCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBtb2R1bGUuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSBkZWxlZ2F0ZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBNb2R1bGVEZWxlZ2F0ZSBnZXRNb2R1bGVEZWxlZ2F0ZShJTW9kdWxlIG1vZHVsZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIG1vZHVsZXMgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkuIAotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vcm1hbGx5IGNhbGxlZCBieSB0aGUgd2ViIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIChvdGhlciB0aGFuIHRoZSBkZWxlZ2F0ZSkgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBtb2R1bGVzIHtAbGluayBJTW9kdWxlfQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJTW9kdWxlW10gZ2V0TW9kdWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBtb2R1bGVzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5IHRoYXQgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlCi0JICogZ2l2ZW4gcHJvamVjdC4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3QgbmVlZAotCSAqIHRvIGZpbHRlciB0aHJvdWdoIHRoZSBlbnRpcmUgcHJvamVjdCBsaXN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vcm1hbGx5IGNhbGxlZCBieSB0aGUgd2ViIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIChvdGhlciB0aGFuIHRoZSBkZWxlZ2F0ZSkgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBtb2R1bGVzIHtAbGluayBJTW9kdWxlfQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldE1vZHVsZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlJTW9kdWxlW10gbW9kdWxlcyA9IGdldE1vZHVsZXMoKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBtb2R1bGVzICE9IG51bGwpIHsKLQkJCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4obW9kdWxlcy5sZW5ndGgpOwotCQkJaW50IHNpemUgPSBtb2R1bGVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKHByb2plY3QuZXF1YWxzKG1vZHVsZXNbaV0uZ2V0UHJvamVjdCgpKSkKLQkJCQkJbGlzdC5hZGQobW9kdWxlc1tpXSk7Ci0JCQl9Ci0JCQkKLQkJCUlNb2R1bGVbXSBtID0gbmV3IElNb2R1bGVbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KG0pOwotCQkJcmV0dXJuIG07Ci0JCX0KLQkJCi0JCXJldHVybiBuZXcgSU1vZHVsZVswXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkgdGhhdCBoYXMgdGhlIGdpdmVuIGlkLCBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIG1vZHVsZSB3aXRoIHRoZSBnaXZlbiBpZC4gVGhlIGlkIG11c3QKLQkgKiBub3QgYmUgbnVsbC4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGRvIG5vdCBuZWVkIHRvIHNlYXJjaAotCSAqIHRocm91Z2ggdGhlIGVudGlyZSBwcm9qZWN0IGxpc3QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vcm1hbGx5IGNhbGxlZCBieSB0aGUgd2ViIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIChvdGhlciB0aGFuIHRoZSBkZWxlZ2F0ZSkgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBpZCBhIG1vZHVsZSBpZAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSB3aXRoIHRoZSBnaXZlbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gbW9kdWxlCi0JICogICAgY291bGQgYmUgZm91bmQge0BsaW5rIElNb2R1bGV9Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBJTW9kdWxlIGZpbmRNb2R1bGUoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJTW9kdWxlW10gbW9kdWxlcyA9IGdldE1vZHVsZXMoKTsKLQkJaWYgKG1vZHVsZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBtb2R1bGVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU3RyaW5nIGlkMiA9IG1vZHVsZXNbaV0uZ2V0SWQoKTsKLQkJCQlpbnQgaW5kZXggPSBpZDIuaW5kZXhPZigiOiIpOwotCQkJCWlmIChpbmRleCA+PSAwKQotCQkJCQlpZDIgPSBpZDIuc3Vic3RyaW5nKGluZGV4KzEpOwotCQkJCQotCQkJCWlmIChpZC5lcXVhbHMoaWQyKSkKLQkJCQkJcmV0dXJuIG1vZHVsZXNbaV07Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBBbGVydHMgdGhlIHNlcnZlciB0b29scyBmcmFtZXdvcmsgdGhhdCB0aGlzIGZhY3RvcnkncyBsaXN0IG9mIG1vZHVsZXMKLQkgKiBoYXMgY2hhbmdlZCwgYW5kIGNhY2hlcyBtYXkgbm8gbG9uZ2VyIGJlIGFjY3VyYXRlIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vZHVsZXNDaGFuZ2VkKCkgewotCQlJU2VydmVyW10gYWxsU2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlmb3IoIGludCBpID0gMDsgaSA8IGFsbFNlcnZlcnMubGVuZ3RoOyBpKysgKSB7Ci0JCQkoKFNlcnZlcilhbGxTZXJ2ZXJzW2ldKS5jbGVhck1vZHVsZUNhY2hlKCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUHVibGlzaENvbnRyb2xsZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUHVibGlzaENvbnRyb2xsZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWY0NmNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1B1Ymxpc2hDb250cm9sbGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0vKioKLSAqIEEgY29udHJvbGxlciBhbGxvd3MgdG8gaW50ZWplY3QgYSBkaWZmZXJlbnQgcG9pbnRzIG9mIHRoZSBwdWJsaXNoIGFjdGlvbiAgCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFB1Ymxpc2hDb250cm9sbGVyRGVsZWdhdGUgewotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBvcGVyYXRpb24uIFRoZSBsYWJlbCBhbmQgZGVzY3JpcHRpb24gbXVzdCBiZSBzdXBwbGllZAotCSAqIGJ5IG92ZXJyaWRpbmcgdGhlIGdldExhYmVsKCkgYW5kIGdldERlc2NyaXB0aW9uKCkgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaENvbnRyb2xsZXJEZWxlZ2F0ZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUHVibGlzaFJlcXVpcmVkKElTZXJ2ZXIgc2VydmVyLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUHVibGlzaE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUHVibGlzaE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2Q1YzFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1B1Ymxpc2hPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7Ci0vKioKLSAqIEFuIG9wZXJhdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgZHVyaW5nIHB1Ymxpc2hpbmcuIAotICogCi0gKiBbaXNzdWU6IEVZIEl0IGlzIG5vdCBjbGVhciB0byBtZSB0aGF0IHdoZW4gdGhpcyB0YXNrIHdpbGwgYmUgcnVuLiBXaWxsIHRoZSBwbGFjZSB3aGVyZSB0aGUKLSAqIHRhc2sgaXMgYmVpbmcgcnVuIGRlcGVuZCBvbiB0aGUgc2VydmVyLCBlLmcuIHRoZSBUREMgdGFza3MgZm9yIHRoZSB2NiBzZXJ2ZXIgc2hvdWxkIGJlIHJ1bgotICogYWZ0ZXIgdGhlIHNlcnZlciBpcyBzdGFydGVkIHRoZSBtb2R1bGVzIGFyZSBhZGRlZCB0byB0aGUgc2VydmVyOyBob3dldmVyLCB0aGUgRUpCIGRlcGxveSB0YXNrCi0gKiBtYWtlcyBtb3JlIHNlbnNlIHRvIGJlIHJ1biBiZWZvcmUgYWRkaW5nIHRoZSBwcm9qZWN0IHRvIHRoZSBzZXJ2ZXIuXQotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQdWJsaXNoT3BlcmF0aW9uIHsKLQlwcml2YXRlIFRhc2tNb2RlbCBtb2RlbDsKLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotICAgLyoqCi0JICogT3BlcmF0aW9uIGtpbmQgY29uc3RhbnQgKHZhbHVlIDApIGluZGljYXRpbmcgdGhhdCB0aGUgb3BlcmF0aW9uCi0JICogZG9lcyBub3QgbmVlZCBiZSBleGVjdXRlZC4KLQkgKiAKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05BTCA9IDA7Ci0KLQkvKioKLQkgKiBPcGVyYXRpb24ga2luZCBjb25zdGFudCAodmFsdWUgMSkgaW5kaWNhdGluZyB0aGF0IHRoZSBvcGVyYXRpb24KLQkgKiBzaG91bGQgYmUgZXhlY3V0ZWQuCi0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFRkVSUkVEID0gMTsKLQotCS8qKgotCSAqIE9wZXJhdGlvbiBraW5kIGNvbnN0YW50ICh2YWx1ZSAyKSBpbmRpY2F0aW5nIHRoYXQgdGhlIG9wZXJhdGlvbgotCSAqIG11c3QgYmUgZXhlY3V0ZWQuCi0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUlSRUQgPSAyOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IG9wZXJhdGlvbi4gVGhlIGxhYmVsIGFuZCBkZXNjcmlwdGlvbiBtdXN0IGJlIHN1cHBsaWVkCi0JICogYnkgb3ZlcnJpZGluZyB0aGUgZ2V0TGFiZWwoKSBhbmQgZ2V0RGVzY3JpcHRpb24oKSBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3BlcmF0aW9uKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IG9wZXJhdGlvbiB3aXRoIHRoZSBnaXZlbiBsYWJlbCBhbmQgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIGxhYmVsIGEgdHJhbnNsYXRlZCBsYWJlbCBmb3IgdGhlIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiB0aGUgb3BlcmF0aW9uIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcGVyYXRpb24oU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUga2luZCBvZiB0aGlzIG9wZXJhdGlvbi4gT3BlcmF0aW9ucyBjYW4gZWl0aGVyIGJlIE9QVElPTkFMCi0JICogKGRvIG5vdCBoYXZlIHRvIGJlIGV4ZWN1dGVkKSwgUFJFRkVSUkVEIChzaG91bGQgYmUgZXhlY3V0ZWQpLCBvcgotCSAqIFJFUVVJUkVEIChtdXN0IGJlIGV4ZWN1dGVkKS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9uZSBvZiB0aGUga2luZCBjb25zdGFudHMgKGUuZy4gPGNvZGU+UkVRVUlSRUQ8L2NvZGU+KQotCSAqICAgIGRlY2xhcmVkIG9uIHtAbGluayBQdWJsaXNoT3BlcmF0aW9ufQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIE9QVElPTkFMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9yZGVyIChpbmRleC9wcmlvcml0eSkgb2YgdGhlIHRhc2sgdGhhdCB3aWxsIGJlIHJ1bi4gVGhlIHRhc2sgd2l0aAotCSAqIGEgc21hbGxlciBvcmRlciB2YWx1ZSB3aWxsIGJlIHJ1biBiZWZvcmUgdGhlIHRhc2sgd2l0aCBhIGJpZ2dlciBvcmRlciB2YWx1ZS4KLQkgKiBGb3IgdGFza3MgdGhhdCBoYXZlIHRoZSBzYW1lIG9yZGVyIHZhbHVlLCB0aGUgb3JkZXIgb2YgcnVubmluZyB0aG9zZSB0YXNrIGFyZSAKLQkgKiBub3QgZ3VhcmFudGVlZC4gIAotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9yZGVyIChpbmRleC9wcmlvcml0eSkgb2YgdGhlIHRhc2sgdGhhdCB3aWxsIGJlIHJ1bi4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldE9yZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBsYWJlbCBmb3IgdGhpcyBvcGVyYXRpb24uCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgbGFiZWwgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgbGFiZWwgZm9yIHRoaXMgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIGRlc2NyaXB0aW9uIGZvciB0aGlzIG9wZXJhdGlvbi4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhpcyBkZXNjcmlwdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YXNrIG1vZGVsLgotCSAqIDxwPgotCSAqIEEgdGFzayBtb2RlbCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3ZlcmFsbCB0YXNrIGZsb3cgYW5kIGFsbG93cwotCSAqIHRhc2tzIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBkYXRhLiBJdHMgdXNhZ2UgYWxsb3dzIG11bHRpcGxlIHRhc2tzIHRvIGJlCi0JICogY2hhaW5lZCB0b2dldGhlciBhbmQgc2hhcmUgZGF0YSBmcm9tIHRoZSBvdXRwdXQgb2Ygb25lIHRhc2sgdG8gdGhlIGlucHV0Ci0JICogb2YgYW5vdGhlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgdGFzayBtb2RlbAotCSAqIEBzZWUgI3NldFRhc2tNb2RlbChUYXNrTW9kZWwpCi0JICovCi0JcHVibGljIFRhc2tNb2RlbCBnZXRUYXNrTW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRhc2sgbW9kZWwuCi0JICogPHA+Ci0JICogQSB0YXNrIG1vZGVsIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvdmVyYWxsIHRhc2sgZmxvdyBhbmQgYWxsb3dzCi0JICogdGFza3MgdG8gc3RvcmUgYW5kIHJldHJpZXZlIGRhdGEuIEl0cyB1c2FnZSBhbGxvd3MgbXVsdGlwbGUgdGFza3MgdG8gYmUKLQkgKiBjaGFpbmVkIHRvZ2V0aGVyIGFuZCBzaGFyZSBkYXRhIGZyb20gdGhlIG91dHB1dCBvZiBvbmUgdGFzayB0byB0aGUgaW5wdXQKLQkgKiBvZiBhbm90aGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdGFza01vZGVsIHRoZSB0YXNrIG1vZGVsCi0JICogQHNlZSAjZ2V0VGFza01vZGVsKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrTW9kZWwoVGFza01vZGVsIHRhc2tNb2RlbCkgewotCQl0aGlzLm1vZGVsID0gdGFza01vZGVsOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgKHBlcmZvcm0pIHRoZSBvcGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEBwYXJhbSBpbmZvIHRoZSBJQWRhcHRhYmxlIChvciA8Y29kZT5udWxsPC9jb2RlPikgcHJvdmlkZWQgYnkgdGhlCi0JICogICAgY2FsbGVyIGluIG9yZGVyIHRvIHN1cHBseSBVSSBpbmZvcm1hdGlvbiBmb3IgcHJvbXB0aW5nIHRoZQotCSAqICAgIHVzZXIgaWYgbmVjZXNzYXJ5LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAotCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpdCBzaG91bGQgbWluaW1hbGx5IGNvbnRhaW4gYW4gYWRhcHRlcgotCSAqICAgIGZvciB0aGUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwuY2xhc3MuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIHRhc2sKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9QdWJsaXNoVGFza0RlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9QdWJsaXNoVGFza0RlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NTI3MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUHVibGlzaFRhc2tEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBBIHB1Ymxpc2ggdGFzayBkZWxlZ2F0ZS4KLSAqIAotICogPHA+VGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBwdWJsaXNoVGFzayBleHRlbnNpb24gcG9pbnQuPC9wPgotICogPHA+Ci0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5wdWJsaXNoVGFzazwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQdWJsaXNoVGFza0RlbGVnYXRlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXNrcyB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgZHVyaW5nIHB1Ymxpc2hpbmcuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyCi0JICogQHBhcmFtIG1vZHVsZXMgYSBsaXN0IGNvbnRhaW5pbmcgSU1vZHVsZSBhcnJheXMKLQkgKiBAcmV0dXJuIHRoZSB0YXNrcyB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgb24gdGhlIHNlcnZlci4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wZXJhdGlvbltdIGdldFRhc2tzKElTZXJ2ZXIgc2VydmVyLCBMaXN0IG1vZHVsZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFza3MgdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIGR1cmluZyBwdWJsaXNoaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgotCSAqIEBwYXJhbSBtb2R1bGVzIGEgbGlzdCBjb250YWluaW5nIElNb2R1bGUgYXJyYXlzCi0JICogQHBhcmFtIGtpbmQgb25lIG9mIHRoZSBJU2VydmVyLlBVQkxJU0hfWFggY29uc3RhbnRzLgotCSAqIEBwYXJhbSBraW5kTGlzdCBvbmUgb2YgdGhlIElTZXJ2ZXIgcHVibGlzaCBjaGFuZ2UgY29uc3RhbnRzLgotCSAqIEByZXR1cm4gdGhlIHRhc2tzIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBvbiB0aGUgc2VydmVyLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3BlcmF0aW9uW10gZ2V0VGFza3MoSVNlcnZlciBzZXJ2ZXIsIGludCBraW5kLCBMaXN0IG1vZHVsZXMsIExpc3Qga2luZExpc3QpIHsKLQkJcmV0dXJuIGdldFRhc2tzKHNlcnZlciwgbW9kdWxlcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1B1Ymxpc2hlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9QdWJsaXNoZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODM2OGMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1B1Ymxpc2hlckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLS8qKgotICogQW4gb3BlcmF0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBkdXJpbmcgcHVibGlzaGluZy4gCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFB1Ymxpc2hlckRlbGVnYXRlIHsKLQlwcml2YXRlIFRhc2tNb2RlbCBtb2RlbDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBvcGVyYXRpb24uIFRoZSBsYWJlbCBhbmQgZGVzY3JpcHRpb24gbXVzdCBiZSBzdXBwbGllZAotCSAqIGJ5IG92ZXJyaWRpbmcgdGhlIGdldExhYmVsKCkgYW5kIGdldERlc2NyaXB0aW9uKCkgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaGVyRGVsZWdhdGUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRhc2sgbW9kZWwuCi0JICogPHA+Ci0JICogQSB0YXNrIG1vZGVsIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvdmVyYWxsIHRhc2sgZmxvdyBhbmQgYWxsb3dzCi0JICogdGFza3MgdG8gc3RvcmUgYW5kIHJldHJpZXZlIGRhdGEuIEl0cyB1c2FnZSBhbGxvd3MgbXVsdGlwbGUgdGFza3MgdG8gYmUKLQkgKiBjaGFpbmVkIHRvZ2V0aGVyIGFuZCBzaGFyZSBkYXRhIGZyb20gdGhlIG91dHB1dCBvZiBvbmUgdGFzayB0byB0aGUgaW5wdXQKLQkgKiBvZiBhbm90aGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0YXNrIG1vZGVsCi0JICogQHNlZSAjc2V0VGFza01vZGVsKFRhc2tNb2RlbCkKLQkgKi8KLQlwdWJsaWMgVGFza01vZGVsIGdldFRhc2tNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdGFzayBtb2RlbC4KLQkgKiA8cD4KLQkgKiBBIHRhc2sgbW9kZWwgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG92ZXJhbGwgdGFzayBmbG93IGFuZCBhbGxvd3MKLQkgKiB0YXNrcyB0byBzdG9yZSBhbmQgcmV0cmlldmUgZGF0YS4gSXRzIHVzYWdlIGFsbG93cyBtdWx0aXBsZSB0YXNrcyB0byBiZQotCSAqIGNoYWluZWQgdG9nZXRoZXIgYW5kIHNoYXJlIGRhdGEgZnJvbSB0aGUgb3V0cHV0IG9mIG9uZSB0YXNrIHRvIHRoZSBpbnB1dAotCSAqIG9mIGFub3RoZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0YXNrTW9kZWwgdGhlIHRhc2sgbW9kZWwKLQkgKiBAc2VlICNnZXRUYXNrTW9kZWwoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhc2tNb2RlbChUYXNrTW9kZWwgdGFza01vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSB0YXNrTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSAocGVyZm9ybSkgdGhlIG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiBwdWJsaXNoIGJlaW5nIHJlcXVlc3RlZC4gVmFsaWQgdmFsdWVzIGFyZToKLQkgKiAgICA8dWw+Ci0JICogICAgPGxpPjxjb2RlPlBVQkxJU0hfRlVMTDwvY29kZT4tIGluZGljYXRlcyBhIGZ1bGwgcHVibGlzaC48L2xpPgotCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0lOQ1JFTUVOVEFMPC9jb2RlPi0gaW5kaWNhdGVzIGEgaW5jcmVtZW50YWwgcHVibGlzaC4KLQkgKiAgICA8bGk+PGNvZGU+UFVCTElTSF9DTEVBTjwvY29kZT4tIGluZGljYXRlcyBhIGNsZWFuIHJlcXVlc3QuIENsZWFuIHRocm93cwotCSAqICAgICAgb3V0IGFsbCBzdGF0ZSBhbmQgY2xlYW5zIHVwIHRoZSBtb2R1bGUgb24gdGhlIHNlcnZlciBiZWZvcmUgZG9pbmcgYQotCSAqICAgICAgZnVsbCBwdWJsaXNoLgotCSAqICAgIDwvdWw+Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEBwYXJhbSBpbmZvIHRoZSBJQWRhcHRhYmxlIChvciA8Y29kZT5udWxsPC9jb2RlPikgcHJvdmlkZWQgYnkgdGhlCi0JICogICAgY2FsbGVyIGluIG9yZGVyIHRvIHN1cHBseSBVSSBpbmZvcm1hdGlvbiBmb3IgcHJvbXB0aW5nIHRoZQotCSAqICAgIHVzZXIgaWYgbmVjZXNzYXJ5LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAotCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpdCBzaG91bGQgbWluaW1hbGx5IGNvbnRhaW4gYW4gYWRhcHRlcgotCSAqICAgIGZvciB0aGUgU2hlbGwgY2xhc3MuCi0JICogQHJldHVybiBzdGF0dXMgaW5kaWNhdGluZyB3aGF0IChpZiBhbnl0aGluZykgd2VudCB3cm9uZwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZXhlY3V0aW5nIHRoZSB0YXNrCi0JICovCi0JcHVibGljIGFic3RyYWN0IElTdGF0dXMgZXhlY3V0ZShpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2NoZWR1bGluZyBydWxlIHRoYXQgaXMgcmVxdWlyZWQgZm9yIGV4ZWN1dGluZyB0aGUgcHVibGlzaGVyIGRlbGVnYXRlLiBUaGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudAotCSAqIHJ1bGUgZGVmaW5lZCBvbiB0aGUgcHVibGlzaGluZyBqb2IuCi0JICogCi0JICogQHJldHVybiBBIHtAbGluayBJU2NoZWR1bGluZ1J1bGV9IGZvciB0aGUgam9iIHRoYXQgZGVmaW5lcyBob3cgdGhpcyBwdWJsaXNoZXIgY2FuIGV4ZWN1dGUgaW4gdGhlIHB1Ymxpc2hpbmcgam9iLgotCSAqICAgICAgICAgQSA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZSBtYXkgYmUgcmV0dXJuZWQgaWYgdGhlIHB1Ymxpc2hpbmcgam9iIGRvZXMgbm90IGhhdmUgYW55IHJ1bGUgZGVmaW5lZC4KLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRSdWxlKCkgewotCi0JCXJldHVybiBKb2IuZ2V0Sm9iTWFuYWdlcigpLmN1cnJlbnRSdWxlKCk7Ci0JfQotCi0JLyoqCi0JICogQWNjZXNzb3IgdG8gZmluZCBvdXQgaWYgdGhpcyBwdWJsaXNoZXIgZGVsZWdhdGUgbW9kaWZpZWQgYW55IG1vZHVsZXMgdGhhdCBhcmUgcHVibGlzaGVkIG9uIHRoZSBzZXJ2ZXIuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHVibGlzaGVyIG1vZGlmaWVkIHRoZSBjb250ZW50cyBvZiBhbnkgbW9kdWxlcyB0aGF0IGFyZSBwdWJsaXNoZWQgb24gdGhlIHNlcnZlci4KLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RpZnlNb2R1bGVzKCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBY2Nlc3NvciB0byBhY3F1aXJlIHRoZSBsaXN0IG9mIHtAbGluayBJTW9kdWxlfSBlbnRyaWVzIHRoYXQgd2VyZSBtb2RpZmllZCBieSB0aGUgcHVibGlzaGVyLiAgQnkgZGVmYXVsdCwgaXQgd2lsbAotCSAqIHJldHVybiBhbGwgbW9kdWxlcyBwdWJsaXNoZWQgdG8gdGhlIHNlcnZlcgotCSAqIAotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2Yge0BsaW5rIElNb2R1bGV9IGVudHJpZXMgdGhhdCB3ZXJlIG1vZGlmaWVkIGJ5IHRoZSBwdWJsaXNoZXIKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIExpc3Q8SU1vZHVsZVtdPiBnZXRNb2RpZmllZE1vZHVsZXMoKSB7Ci0KLQkJcmV0dXJuIChMaXN0PElNb2R1bGVbXT4pIHRoaXMubW9kZWwuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX01PRFVMRVMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9SdW50aW1lRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1J1bnRpbWVEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTJhZmM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1J1bnRpbWVEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci0vKioKLSAqIEEgcnVudGltZSBkZWxlZ2F0ZSBwcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHZhcmlvdXMgCi0gKiBnZW5lcmljIGFuZCBzZXJ2ZXItdHlwZS1zcGVjaWZpYyBvcGVyYXRpb25zIGZvciBhIHNwZWNpZmljIHR5cGUgb2YgcnVudGltZS4KLSAqIEEgcnVudGltZSBkZWxlZ2F0ZSBpcyBzcGVjaWZpZWQgYnkgdGhlCi0gKiA8Y29kZT5jbGFzczwvY29kZT4gYXR0cmlidXRlIG9mIGEgPGNvZGU+cnVudGltZVR5cGVzPC9jb2RlPiBleHRlbnNpb24uCi0gKiA8cD4KLSAqIFdoZW4gdGhlIHJ1bnRpbWUgaW5zdGFuY2UgbmVlZHMgdG8gYmUgZ2l2ZW4gYSBkZWxlZ2F0ZSwgdGhlIGRlbGVnYXRlIGNsYXNzCi0gKiBzcGVjaWZpZWQgZm9yIHRoZSBydW50aW1lIHR5cGUgaXMgaW5zdGFudGlhdGVkIHdpdGggYSAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0gKiBhbmQgcHJpbWVkIHdpdGggPGNvZGU+ZGVsZWdhdGUuaW5pdGlhbGl6ZShydW50aW1lKTwvY29kZT4sIAotICogd2hpY2ggaXQgaXMgZXhwZWN0ZWQgdG8gaGFuZyBvbiB0by4gTGF0ZXIsIHdoZW4KLSAqIDxjb2RlPmRlbGVnYXRlLmRpc3Bvc2UoKTwvY29kZT4gaXMgY2FsbGVkIGFzIHRoZSBydW50aW1lIGluc3RhbmNlIGlzCi0gKiBiZWluZyBkaXNjYXJkZWQsIHRoZSBkZWxlZ2F0ZSBpcyBleHBlY3RlZCB0byBsZXQgZ28gb2YgdGhlIHJ1bnRpbWUgaW5zdGFuY2UuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFJ1bnRpbWVEZWxlZ2F0ZSBzdXBwb3J0cyBhbiBvcGVuLWVuZGVkIHNldCBvZiBhdHRyaWJ1dGUtdmFsdWUgcGFpcnMuIEFsbAotICogc3RhdGUgc3RvcmVkIGluIHRoaXMgbWFubmVyIHdpbGwgYmUgc2F2ZWQgd2hlbiB0aGUgcnVudGltZSB3b3JraW5nIGNvcHkgaXMKLSAqIHNhdmVkLCBhbmQgcGVyc2lzdGVkIGFjcm9zcyB3b3JrYmVuY2ggc2Vzc2lvbnMuCi0gKiBSdW50aW1lIGRlbGVnYXRlcyBtYXkga2VlcCBzdGF0ZSBpbiBpbnN0YW5jZSBmaWVsZHMsIGJ1dCB0aGF0IHN0YXRlIGlzCi0gKiB0cmFuc2llbnQgYW5kIHdpbGwgbm90IGJlIHBlcnNpc3RlZCBhY3Jvc3Mgd29ya2JlbmNoIHNlc3Npb25zLiBUbyBzYXZlIHN0YXRlCi0gKiBhY3Jvc3Mgd29ya2JlbmNoIHNlc3Npb25zLCBpdCBtdXN0IGJlIHBlcnNpc3RlZCB1c2luZyB0aGUgYXR0cmlidXRlcy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+cnVudGltZVR5cGVzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgSVJ1bnRpbWUKLSAqIEBzZWUgSVJ1bnRpbWVXb3JraW5nQ29weQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUnVudGltZURlbGVnYXRlIHsKLQlwcml2YXRlIFJ1bnRpbWUgcnVudGltZTsKLQlwcml2YXRlIFJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lV0M7Ci0JCi0JLyoqCi0JICogRGVsZWdhdGVzIG11c3QgaGF2ZSBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgUnVudGltZURlbGVnYXRlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBydW50aW1lIGRlbGVnYXRlIHdpdGggaXRzIGxpZmUtbG9uZyBydW50aW1lIGluc3RhbmNlLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuZXdSdW50aW1lIHRoZSBydW50aW1lIGluc3RhbmNlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqLwotCWZpbmFsIHZvaWQgaW5pdGlhbGl6ZShSdW50aW1lIG5ld1J1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlydW50aW1lID0gbmV3UnVudGltZTsKLQkJaWYgKHJ1bnRpbWUgaW5zdGFuY2VvZiBSdW50aW1lV29ya2luZ0NvcHkpCi0JCQlydW50aW1lV0MgPSAoUnVudGltZVdvcmtpbmdDb3B5KSBydW50aW1lOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBydW50aW1lIGRlbGVnYXRlLiBUaGlzIG1ldGhvZCBnaXZlcyBkZWxlZ2F0ZXMgYSBjaGFuY2UKLQkgKiB0byBkbyB0aGVpciBvd24gaW5pdGlhbGl6YXRpb24uCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsuCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgdGhhdCB0aGlzIHJ1bnRpbWUgZGVsZWdhdGUgY29ycmVzcG9uZHMgdG8uCi0JICogCi0JICogQHJldHVybiB0aGUgcnVudGltZQotCSAqLwotCXB1YmxpYyBmaW5hbCBJUnVudGltZSBnZXRSdW50aW1lKCkgewotCQlyZXR1cm4gcnVudGltZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBydW50aW1lIHdvcmtpbmcgY29weSB0aGF0IHRoaXMgcnVudGltZSBkZWxlZ2F0ZSBjb3JyZXNwb25kcyB0by4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBydW50aW1lCi0JICovCi0JcHVibGljIGZpbmFsIElSdW50aW1lV29ya2luZ0NvcHkgZ2V0UnVudGltZVdvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gcnVudGltZVdDOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGlzIHJ1bnRpbWUgaW5zdGFuY2UuIFN1YmNsYXNzZXMgc2hvdWxkCi0JICogb3ZlcnJpZGUgYW5kIGNhbGwgc3VwZXIudmFsaWRhdGUoKSBmb3IgYmFzaWMgdmFsaWRhdGlvbi4gCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSB3ZWIgc2VydmVyIGNvcmUgZnJhbWV3b3JrLAotCSAqIGluIHJlc3BvbnNlIHRvIGEgY2FsbCB0byA8Y29kZT5JUnVudGltZS52YWxpZGF0ZShJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT4uCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhpcwotCSAqIHJ1bnRpbWUgaXMgdmFsaWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzCi0JICogd3Jvbmcgd2l0aCBpdAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkgewotCQlpZiAocnVudGltZS5nZXROYW1lKCkgPT0gbnVsbCB8fCBydW50aW1lLmdldE5hbWUoKS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JSdW50aW1lTmFtZSwgbnVsbCk7Ci0JCQotCQlpZiAoaXNOYW1lSW5Vc2UoKSkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yRHVwbGljYXRlUnVudGltZU5hbWUsIG51bGwpOwotCQkKLQkJSVBhdGggcGF0aCA9IHJ1bnRpbWUuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmlzRW1wdHkoKSkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsKLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGN1cnJlbnQgbmFtZSBpcyBhbHJlYWR5IGluIHVzZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBuYW1lIGlzIGluIHVzZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc05hbWVJblVzZSgpIHsKLQkJSVJ1bnRpbWUgb3JpZyA9IHJ1bnRpbWU7Ci0JCWlmIChydW50aW1lV0MgIT0gbnVsbCkKLQkJCW9yaWcgPSBydW50aW1lV0MuZ2V0T3JpZ2luYWwoKTsKLQkJCi0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCWlmIChydW50aW1lcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKG9yaWcgIT0gcnVudGltZXNbaV0gJiYgcnVudGltZS5nZXROYW1lKCkuZXF1YWxzKHJ1bnRpbWVzW2ldLmdldE5hbWUoKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGludC12YWx1ZWQgYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZQotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZShTdHJpbmcsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgaW50IGdldEF0dHJpYnV0ZShTdHJpbmcgaWQsIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIHJ1bnRpbWUuZ2V0QXR0cmlidXRlKGlkLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYm9vbGVhbi12YWx1ZWQgYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZQotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZShTdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZ2V0QXR0cmlidXRlKFN0cmluZyBpZCwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIHJ1bnRpbWUuZ2V0QXR0cmlidXRlKGlkLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgU3RyaW5nLXZhbHVlZCBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlCi0JICogQHNlZSAjc2V0QXR0cmlidXRlKFN0cmluZywgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBpZCwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gcnVudGltZS5nZXRBdHRyaWJ1dGUoaWQsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBMaXN0LXZhbHVlZCBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlCi0JICogQHNlZSAjc2V0QXR0cmlidXRlKFN0cmluZywgTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBMaXN0PFN0cmluZz4gZGVmYXVsdFZhbHVlKSB7Ci0JCXJldHVybiBydW50aW1lLmdldEF0dHJpYnV0ZShpZCwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIE1hcC12YWx1ZWQgYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZQotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZShTdHJpbmcsIE1hcCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTWFwIGdldEF0dHJpYnV0ZShTdHJpbmcgaWQsIE1hcCBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIHJ1bnRpbWUuZ2V0QXR0cmlidXRlKGlkLCBkZWZhdWx0VmFsdWUpOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwb3NlcyBvZiB0aGlzIHJ1bnRpbWUgZGVsZWdhdGUuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSB3ZWIgc2VydmVyIGNvcmUgZnJhbWV3b3JrLgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEltcGxlbWVudGF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gbGV0IGdvIG9mIHRoZSBkZWxlZ2F0ZSdzIHJlZmVyZW5jZQotCSAqIHRvIHRoZSBydW50aW1lLCBkZXJlZ2lzdGVyIGxpc3RlbmVycywgZXRjLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBydW50aW1lIHdpdGggZGVmYXVsdCB2YWx1ZXMuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuCi0JICogYSBuZXcgcnVudGltZSBpcyBjcmVhdGVkIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIGJlIGluaXRpYWxpemVkIHdpdGgKLQkgKiBtZWFuaW5nZnVsIHZhbHVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGludGVnZXItdmFsdWVkIGF0dHJpYnV0ZSBvZiB0aGlzCi0JICogZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGUoU3RyaW5nLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBpZCwgaW50IHZhbHVlKSB7Ci0JCXJ1bnRpbWVXQy5zZXRBdHRyaWJ1dGUoaWQsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGJvb2xlYW4tdmFsdWVkIGF0dHJpYnV0ZSBvZiB0aGlzCi0JICogZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGUoU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgaWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcnVudGltZVdDLnNldEF0dHJpYnV0ZShpZCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nLXZhbHVlZCBhdHRyaWJ1dGUgb2YgdGhpcwotCSAqIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlKFN0cmluZywgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgaWQsIFN0cmluZyB2YWx1ZSkgewotCQlydW50aW1lV0Muc2V0QXR0cmlidXRlKGlkLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBsaXN0LXZhbHVlZCBhdHRyaWJ1dGUgb2YgdGhpcwotCSAqIGVsZW1lbnQuIFRoZSBsaXN0IG1heSBvbmx5IGNvbnRhaW4gU3RyaW5nIHZhbHVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGUoU3RyaW5nLCBMaXN0KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgaWQsIExpc3Q8U3RyaW5nPiB2YWx1ZSkgewotCQlydW50aW1lV0Muc2V0QXR0cmlidXRlKGlkLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBtYXAtdmFsdWVkIGF0dHJpYnV0ZSBvZiB0aGlzCi0JICogZWxlbWVudC4gVGhlIG1hcCBtYXkgb25seSBjb250YWluIFN0cmluZyB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlKFN0cmluZywgTWFwKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgaWQsIE1hcCB2YWx1ZSkgewotCQlydW50aW1lV0Muc2V0QXR0cmlidXRlKGlkLCB2YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUnVudGltZUxvY2F0b3JEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUnVudGltZUxvY2F0b3JEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmE5MDI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1J1bnRpbWVMb2NhdG9yRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotLyoqCi0gKiBBIHJ1bnRpbWUgbG9jYXRvciBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBsb2NhdGUgb3Igc2VhcmNoIGZvciBhZGRpdGlvbmFsCi0gKiBydW50aW1lcyBvZiBhIHBhcnRpY3VsYXIgdHlwZS4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+cnVudGltZUxvY2F0b3JzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJ1bnRpbWVMb2NhdG9yRGVsZWdhdGUgewotCS8qKgotCSAqIEEgY2FsbGJhY2sgbGlzdGVuZXIgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MuCi0JICogCi0JICogQHNpbmNlIDEuMAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVTZWFyY2hMaXN0ZW5lciB7Ci0JCS8qKgotCQkgKiBDYWxsZWQgd2hlbiBhIG5ldyBydW50aW1lIGlzIGZvdW5kIGJ5IHRoZSBsb2NhdG9yLgotCQkgKiBUaGUgcnVudGltZSBtdXN0IG5ldmVyIGJlIG51bGwuCi0JCSAqIAotCQkgKiBAcGFyYW0gcnVudGltZSB0aGUgcnVudGltZSB0aGF0IHdhcyBmb3VuZC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bnRpbWVGb3VuZChJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUpOwotCX0KLQotCS8qKgotCSAqIFNlYXJjaGVzIGZvciBsb2NhbCBydW50aW1lcy4gCi0JICogSXQgdXNlcyB0aGUgY2FsbGJhY2sgbGlzdGVuZXIgdG8gcmVwb3J0IHJ1bnRpbWVzIHRoYXQgYXJlIGZvdW5kLgotCSAqIFRoZSBwYXRoIGNvbnRhaW5zIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmb2xkZXIgdG8gc2VhcmNoIGluLAotCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHNlYXJjaCB0aGUgZW50aXJlIG1hY2hpbmUuCi0JICogCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gc2VhcmNoIGZvciBydW50aW1lcyBpbgotCSAqIEBwYXJhbSBsaXN0ZW5lciBhIGxpc3RlbmVyIHRvIHJlcG9ydCBzdGF0dXMgdG8KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2VhcmNoRm9yUnVudGltZXMoSVBhdGggcGF0aCwgSVJ1bnRpbWVTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9SdW50aW1lVGFyZ2V0SGFuZGxlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9SdW50aW1lVGFyZ2V0SGFuZGxlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MTM5MmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUnVudGltZVRhcmdldEhhbmRsZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVGFyZ2V0SGFuZGxlcjsKLS8qKgotICogQSBydW50aW1lIHRhcmdldCBoYW5kbGVyIGlzIHVzZWQgd2hlbiBhc3NvY2lhdGluZyBhIHJ1bnRpbWUgd2l0aAotICogYSBwYXJ0aWN1bGFyIHByb2plY3QuIEl0IGhhcyB0aGUgYWJpbGl0eSB0byBtYWtlIGFueSBjaGFuZ2VzIGl0IHJlcXVpcmVzCi0gKiBvbiB0aGUgcHJvamVjdHMgLSBhZGRpbmcgb3IgcmVtb3ZpbmcgZmlsZXMsIHNldHRpbmcgdXAgdGhlIGNsYXNzcGF0aCwgZXRjLgotICogPHA+Ci0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5ydW50aW1lVGFyZ2V0SGFuZGxlcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDwvcD4KLSAqIDxwPgotICogCi0gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSdW50aW1lVGFyZ2V0SGFuZGxlckRlbGVnYXRlIHsKLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgcnVudGltZSB0YXJnZXQgaGFuZGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3SGFuZGxlciB0aGUgbmV3IGhhbmRsZXIKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBpbml0aWFsaXplKElSdW50aW1lVGFyZ2V0SGFuZGxlciBuZXdIYW5kbGVyKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHVzZSBkZXByZWNhdGVkIGNvZGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBydW50aW1lIHRhcmdldCBoYW5kbGVyIHRoYXQgdGhpcyBkZWxlZ2F0ZSBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICogCi0JICogQHJldHVybiB0aGUgcnVudGltZSB0YXJnZXQgaGFuZGxlcgotCSAqLwotCXB1YmxpYyBJUnVudGltZVRhcmdldEhhbmRsZXIgZ2V0UnVudGltZVRhcmdldEhhbmRsZXIoKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHVzZSBkZXByZWNhdGVkIGNvZGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHJ1bnRpbWUgdGFyZ2V0IG9uIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRvIHNldCB0aGUgcnVudGltZSBvbgotCSAqIEBwYXJhbSBydW50aW1lIHRoZSB0YXJnZXQgcnVudGltZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gdGhyb3duIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBzZXR0aW5nIHRoZSBydW50aW1lCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UnVudGltZVRhcmdldChJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBydW50aW1lIHRhcmdldCBmcm9tIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRvIHJlbW92ZSB0aGUgcnVudGltZSBmcm9tCi0JICogQHBhcmFtIHJ1bnRpbWUgdGhlIHRhcmdldCBydW50aW1lCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlbW92aW5nIHRoZSBydW50aW1lCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlUnVudGltZVRhcmdldChJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1NlcnZlckJlaGF2aW91ckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWIyNThlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1NlcnZlckJlaGF2aW91ckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuKjsKLS8qKgotICogQSBzZXJ2ZXIgZGVsZWdhdGUgcHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB2YXJpb3VzIAotICogZ2VuZXJpYyBhbmQgc2VydmVyLXR5cGUtc3BlY2lmaWMgb3BlcmF0aW9ucyBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIHNlcnZlci4KLSAqIEEgc2VydmVyIGRlbGVnYXRlIGlzIHNwZWNpZmllZCBieSB0aGUKLSAqIDxjb2RlPmNsYXNzPC9jb2RlPiBhdHRyaWJ1dGUgb2YgYSA8Y29kZT5zZXJ2ZXJUeXBlczwvY29kZT4gZXh0ZW5zaW9uLgotICogPHA+Ci0gKiBXaGVuIHRoZSBzZXJ2ZXIgaW5zdGFuY2UgbmVlZHMgdG8gYmUgZ2l2ZW4gYSBkZWxlZ2F0ZSwgdGhlIGRlbGVnYXRlIGNsYXNzCi0gKiBzcGVjaWZpZWQgZm9yIHRoZSBzZXJ2ZXIgdHlwZSBpcyBpbnN0YW50aWF0ZWQgd2l0aCBhIDAtYXJndW1lbnQgY29uc3RydWN0b3IKLSAqIGFuZCBwcmltZWQgd2l0aCA8Y29kZT5kZWxlZ2F0ZS5pbml0aWFsaXplKCgoSVNlcnZlclN0YXRlKXNlcnZlcik8L2NvZGU+LCAKLSAqIHdoaWNoIGl0IGlzIGV4cGVjdGVkIHRvIGhhbmcgb24gdG8uIExhdGVyLCB3aGVuCi0gKiA8Y29kZT5kZWxlZ2F0ZS5kaXNwb3NlKCk8L2NvZGU+IGlzIGNhbGxlZCBhcyB0aGUgc2VydmVyIGluc3RhbmNlIGlzCi0gKiBiZWluZyBkaXNjYXJkZWQsIHRoZSBkZWxlZ2F0ZSBpcyBleHBlY3RlZCB0byBsZXQgZ28gb2YgdGhlIHNlcnZlciBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqIDxwPgotICogU2VydmVyIGRlbGVnYXRlcyBtYXkga2VlcCBzdGF0ZSBpbiBpbnN0YW5jZSBmaWVsZHMsIGJ1dCB0aGF0IHN0YXRlIGlzCi0gKiB0cmFuc2llbnQgYW5kIHdpbGwgbm90IGJlIHBlcnNpc3RlZCBhY3Jvc3Mgd29ya2JlbmNoIHNlc3Npb25zLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5zZXJ2ZXJUeXBlczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogPC9wPgotICogCi0gKiBAbm9pbXBsZW1lbnQKLSAqIEBzZWUgSVNlcnZlcgotICogQHNlZSBJU2VydmVyV29ya2luZ0NvcHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlIHsKLQlwcml2YXRlIFNlcnZlciBzZXJ2ZXI7Ci0KLQkvKioKLQkgKiBQdWJsaXNoIGtpbmQgY29uc3RhbnQgKHZhbHVlIDApIGZvciBubyBjaGFuZ2UuCi0JICogCi0JICogQHNlZSAjcHVibGlzaE1vZHVsZShpbnQsIGludCwgSU1vZHVsZVtdLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0NIQU5HRSA9IDA7Ci0KLQkvKioKLQkgKiBQdWJsaXNoIGtpbmQgY29uc3RhbnQgKHZhbHVlIDEpIGZvciBhZGRlZCByZXNvdXJjZXMuCi0JICogCi0JICogQHNlZSAjcHVibGlzaE1vZHVsZShpbnQsIGludCwgSU1vZHVsZVtdLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFEREVEID0gMTsKLQotCS8qKgotCSAqIFB1Ymxpc2gga2luZCBjb25zdGFudCAodmFsdWUgMikgZm9yIGNoYW5nZWQgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBzZWUgI3B1Ymxpc2hNb2R1bGUoaW50LCBpbnQsIElNb2R1bGVbXSwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VEID0gMjsKLQotCS8qKgotCSAqIFB1Ymxpc2gga2luZCBjb25zdGFudCAodmFsdWUgMykgZm9yIHJlbW92ZWQgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBzZWUgI3B1Ymxpc2hNb2R1bGUoaW50LCBpbnQsIElNb2R1bGVbXSwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVEID0gMzsKLQotCS8qKgotCSAqIERlbGVnYXRlcyBtdXN0IGhhdmUgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBzZXJ2ZXIgZGVsZWdhdGUgd2l0aCBpdHMgbGlmZS1sb25nIHNlcnZlciBpbnN0YW5jZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3U2VydmVyIHRoZSBzZXJ2ZXIgaW5zdGFuY2UKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICovCi0JZmluYWwgdm9pZCBpbml0aWFsaXplKFNlcnZlciBuZXdTZXJ2ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzZXJ2ZXIgPSBuZXdTZXJ2ZXI7Ci0JCWluaXRpYWxpemUobW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBzZXJ2ZXIgZGVsZWdhdGUuIFRoaXMgbWV0aG9kIGdpdmVzIGRlbGVnYXRlcyBhIGNoYW5jZQotCSAqIHRvIGRvIHRoZWlyIG93biBpbml0aWFsaXphdGlvbi4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgc2VydmVyIHN0YXRlIGlzIGluaXRpYWxseSB1bmtub3duLCB0aGlzIG1ldGhvZCBzaG91bGQgYXR0ZW1wdAotCSAqIHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlciBhbmQgdXBkYXRlIHRoZSBzdGF0ZS4gT24gc2VydmVycyB3aGVyZSB0aGUKLQkgKiBzdGF0ZSBtYXkgY2hhbmdlLCB0aGlzIGlzIGFsc28gYW4gZXhjZWxsZW50IHBsYWNlIHRvIGNyZWF0ZSBhIGJhY2tncm91bmQKLQkgKiB0aHJlYWQgdGhhdCB3aWxsIGNvbnN0YW50bHkgcGluZyB0aGUgc2VydmVyIChvciBoYXZlIGEgbGlzdGVuZXIpIHRvCi0JICogdXBkYXRlIHRoZSBzZXJ2ZXIgc3RhdGUgYXMgY2hhbmdlcyBvY2N1ci4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsuCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgdGhhdCB0aGlzIHNlcnZlciBkZWxlZ2F0ZSBjb3JyZXNwb25kcyB0by4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgZmluYWwgSVNlcnZlciBnZXRTZXJ2ZXIoKSB7Ci0JCXJldHVybiBzZXJ2ZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGlzIHNlcnZlci4KLQkgKgotCSAqIEBwYXJhbSBzdGF0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc2VydmVyLCBvbmUgb2YgdGhlIHN0YXRlCi0JICogICAgY29uc3RhbnRzIGRlZmluZWQgYnkge0BsaW5rIElTZXJ2ZXJ9Ci0JICogQHNlZSBJU2VydmVyI2dldFNlcnZlclN0YXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRTZXJ2ZXJTdGF0ZShpbnQgc3RhdGUpIHsKLQkJc2VydmVyLnNldFNlcnZlclN0YXRlKHN0YXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBJTGF1bmNoTWFuYWdlciBtb2RlIHRoYXQgdGhlIHNlcnZlciBpcyBydW5uaW5nIGluLiBUaGUgc2VydmVyCi0JICogaW1wbGVtZW50YXRpb24gd2lsbCBhdXRvbWF0aWNhbGx5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiB0byBjbGllbnRzCi0JICogd2hlbiB0aGUgc2VydmVyIGlzIHN0b3BwZWQsIHNvIHlvdSBvbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSBtb2RlIHdoZW4KLQkgKiBpdCBjaGFuZ2VzLgotCSAqIAotCSAqIEBwYXJhbSBtb2RlIHRoZSBtb2RlIGluIHdoaWNoIGEgc2VydmVyIGlzIHJ1bm5pbmcsIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMKLQkgKiAgICBkZWZpbmVkIGJ5IHtAbGluayBJTGF1bmNoTWFuYWdlcn0KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRNb2RlKFN0cmluZyBtb2RlKSB7Ci0JCXNlcnZlci5zZXRNb2RlKG1vZGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIExhdW5jaCBvbiB0aGUgc2VydmVyIG9iamVjdC4gCi0JICogIAotCSAqIEBwYXJhbSBsYXVuY2gKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRMYXVuY2goSUxhdW5jaCBsYXVuY2gpIHsKLQkJc2VydmVyLnNldExhdW5jaChsYXVuY2gpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzZXJ2ZXIgcmVzdGFydCBzdGF0ZS4KLQkgKgotCSAqIEBwYXJhbSBzdGF0ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VydmVyIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCwKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFNlcnZlclJlc3RhcnRTdGF0ZShib29sZWFuIHN0YXRlKSB7Ci0JCXNlcnZlci5zZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoc3RhdGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlcnZlciBwdWJsaXNoIHN0YXRlLgotCSAqCi0JICogQHBhcmFtIHN0YXRlIHRoZSBjdXJyZW50IHB1Ymxpc2ggc3RhdGUgb2YgdGhlIHNlcnZlciwgb25lIG9mIHRoZQotCSAqICAgIHB1Ymxpc2ggY29uc3RhbnRzIGRlZmluZWQgYnkge0BsaW5rIElTZXJ2ZXJ9Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0U2VydmVyUHVibGlzaFN0YXRlKGludCBzdGF0ZSkgewotCQlzZXJ2ZXIuc2V0U2VydmVyUHVibGlzaFN0YXRlKHN0YXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBIb29rIHRvIGZpcmUgYW4gZXZlbnQgd2hlbiBhIG1vZHVsZSBzdGF0ZSBjaGFuZ2VzLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqIEBwYXJhbSBzdGF0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbW9kdWxlLCBvbmUgb2YgdGhlIHN0YXRlCi0JICogICAgY29uc3RhbnRzIGRlZmluZWQgYnkge0BsaW5rIElTZXJ2ZXJ9Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0TW9kdWxlU3RhdGUoSU1vZHVsZVtdIG1vZHVsZSwgaW50IHN0YXRlKSB7Ci0JCXNlcnZlci5zZXRNb2R1bGVTdGF0ZShtb2R1bGUsIHN0YXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2R1bGUgcHVibGlzaCBzdGF0ZS4KLQkgKgotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqIEBwYXJhbSBzdGF0ZSB0aGUgY3VycmVudCBwdWJsaXNoIHN0YXRlIG9mIHRoZSBtb2R1bGUsIG9uZSBvZiB0aGUKLQkgKiAgICBwdWJsaXNoIGNvbnN0YW50cyBkZWZpbmVkIGJ5IHtAbGluayBJU2VydmVyfQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldE1vZHVsZVB1Ymxpc2hTdGF0ZShJTW9kdWxlW10gbW9kdWxlLCBpbnQgc3RhdGUpIHsKLQkJc2VydmVyLnNldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUsIHN0YXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2R1bGUgcmVzdGFydCBzdGF0ZS4KLQkgKgotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqIEBwYXJhbSBzdGF0ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbW9kdWxlIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCwKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldE1vZHVsZVJlc3RhcnRTdGF0ZShJTW9kdWxlW10gbW9kdWxlLCBib29sZWFuIHN0YXRlKSB7Ci0JCXNlcnZlci5zZXRNb2R1bGVSZXN0YXJ0U3RhdGUobW9kdWxlLCBzdGF0ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VydmVyJ3MgZXh0ZXJuYWwgbW9kdWxlcy4KLQkgKgotCSAqIEBwYXJhbSBtb2R1bGVzIHRoZSByb290IGV4dGVybmFsIG1vZHVsZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEV4dGVybmFsTW9kdWxlcyhJTW9kdWxlW10gbW9kdWxlcykgewotCQlzZXJ2ZXIuc2V0RXh0ZXJuYWxNb2R1bGVzKG1vZHVsZXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZXh0ZXJuYWwgbW9kdWxlIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIHN0YXRpYyBpbmZvcm1hdGlvbi4gQW4gZXh0ZXJuYWwgbW9kdWxlIGlzIGEgdW5pdCBvZiAiY29udGVudCIKLQkgKiB0aGF0IGlzIGFscmVhZHkgcHVibGlzaGVkIHRvIHRoZSBzZXJ2ZXIsIGFuZCB0aGF0IGRvZXNuJ3QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqICAKLQkgKiBAcGFyYW0gaWQgdGhlIG1vZHVsZSBpZAotCSAqIEBwYXJhbSBuYW1lIHRoZSBtb2R1bGUgbmFtZQotCSAqIEBwYXJhbSB0eXBlIHRoZSBtb2R1bGUgdHlwZSBpZAotCSAqIEBwYXJhbSB2ZXJzaW9uIHRoZSBtb2R1bGUgdmVyc2lvbiBpZAotCSAqIEBwYXJhbSBtb2R1bGVEZWxlZ2F0ZSB0aGUgTW9kdWxlRGVsZWdhdGUgd2hpY2ggd2lsbCBhY3QgYXMgYSBoZWxwZXIgb2YgdGhlIG1vZHVsZSAKLQkgKiBAcmV0dXJuIGEgbW9kdWxlIGluc3RhbmNlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElNb2R1bGUgY3JlYXRlRXh0ZXJuYWxNb2R1bGUoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uLCBNb2R1bGVEZWxlZ2F0ZSBtb2R1bGVEZWxlZ2F0ZSkgewotCQlJTW9kdWxlIG1vZHVsZSA9IG5ldyBFeHRlcm5hbE1vZHVsZShpZCwgbmFtZSwgdHlwZSwgdmVyc2lvbiwgbW9kdWxlRGVsZWdhdGUpOwotCQlzZXRNb2R1bGVQdWJsaXNoU3RhdGUobmV3IElNb2R1bGUgW10ge21vZHVsZX0sIElTZXJ2ZXIuUFVCTElTSF9TVEFURV9OT05FKTsKLQkJcmV0dXJuIG1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBvZiB0aGlzIHNlcnZlciBkZWxlZ2F0ZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJbXBsZW1lbnRhdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGxldCBnbyBvZiB0aGUgZGVsZWdhdGUncyByZWZlcmVuY2UKLQkgKiB0byB0aGUgc2VydmVyLCBkZXJlZ2lzdGVyIGxpc3RlbmVycywgZXRjLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogTWV0aG9kcyBjYWxsZWQgdG8gbm90aWZ5IHRoYXQgcHVibGlzaGluZyBpcyBhYm91dCB0byBiZWdpbi4KLQkgKiBUaGlzIGFsbG93cyB0aGUgc2VydmVyIHRvIG9wZW4gYSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIKLQkgKiBvciBnZXQgYW55IGdsb2JhbCBpbmZvcm1hdGlvbiByZWFkeS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yaywKLQkgKiBpbiByZXNwb25zZSB0byBhIGNhbGwgdG8gPGNvZGU+SVNlcnZlci5wdWJsaXNoKCk8L2NvZGU+LgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gc3RhcnRpbmcgdGhlIHB1Ymxpc2gKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoU3RhcnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBQdWJsaXNoIHRoZSBzZXJ2ZXIuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmssCi0JICogaW4gcmVzcG9uc2UgdG8gYSBjYWxsIHRvIDxjb2RlPklTZXJ2ZXIucHVibGlzaCgpPC9jb2RlPi4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0ga2luZCBvbmUgb2YgdGhlIElTZXJ2ZXIuUFVCTElTSF9YWCBjb25zdGFudHMuIFZhbGlkIHZhbHVlcyBhcmUKLQkgKiAgICA8dWw+Ci0JICogICAgPGxpPjxjb2RlPlBVQkxJU0hfRlVMTDwvY29kZT4tIGluZGljYXRlcyBhIGZ1bGwgcHVibGlzaC48L2xpPgotCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0lOQ1JFTUVOVEFMPC9jb2RlPi0gaW5kaWNhdGVzIGEgaW5jcmVtZW50YWwgcHVibGlzaC4KLQkgKiAgICA8bGk+PGNvZGU+UFVCTElTSF9BVVRPPC9jb2RlPi0gaW5kaWNhdGVzIGFuIGF1dG9tYXRpYyBpbmNyZW1lbnRhbCBwdWJsaXNoLjwvbGk+Ci0JICogICAgPGxpPjxjb2RlPlBVQkxJU0hfQ0xFQU48L2NvZGU+LSBpbmRpY2F0ZXMgYSBjbGVhbiByZXF1ZXN0LiBDbGVhbiB0aHJvd3MKLQkgKiAgICAgIG91dCBhbGwgc3RhdGUgYW5kIGNsZWFucyB1cCB0aGUgbW9kdWxlIG9uIHRoZSBzZXJ2ZXIgYmVmb3JlIGRvaW5nIGEKLQkgKiAgICAgIGZ1bGwgcHVibGlzaC4KLQkgKiAgICA8L3VsPgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHB1Ymxpc2hpbmcgdGhlIHNlcnZlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hTZXJ2ZXIoaW50IGtpbmQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUHVibGlzaCBhIHNpbmdsZSBtb2R1bGUgdG8gdGhlIHNlcnZlci4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yaywKLQkgKiBpbiByZXNwb25zZSB0byBhIGNhbGwgdG8gPGNvZGU+SVNlcnZlci5wdWJsaXNoKCk8L2NvZGU+LgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIElmIHRoZSBkZWx0YUtpbmQgaXMgSVNlcnZlci5SRU1PVkVELCB0aGUgbW9kdWxlIG1heSBoYXZlIGJlZW4gY29tcGxldGVseQotCSAqIGRlbGV0ZWQgYW5kIGRvZXMgbm90IGV4aXN0IGFueW1vcmUuIEluIHRoaXMgY2FzZSwgYSBkdW1teSBtb2R1bGUgKHdpdGggdGhlCi0JICogY29ycmVjdCBpZCkgd2lsbCBiZSBwYXNzZWQgdG8gdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgY2xpZW50cyBpbXBsZW1lbnRpbmcgdGhpcyBtZXRob2QgYmUgcmVzcG9uc2libGUgZm9yCi0JICogc2V0dGluZyB0aGUgbW9kdWxlIHN0YXRlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0ga2luZCBvbmUgb2YgdGhlIElTZXJ2ZXIuUFVCTElTSF9YWCBjb25zdGFudHMuIFZhbGlkIHZhbHVlcyBhcmU6Ci0JICogICAgPHVsPgotCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0ZVTEw8L2NvZGU+LSBpbmRpY2F0ZXMgYSBmdWxsIHB1Ymxpc2guPC9saT4KLQkgKiAgICA8bGk+PGNvZGU+UFVCTElTSF9JTkNSRU1FTlRBTDwvY29kZT4tIGluZGljYXRlcyBhIGluY3JlbWVudGFsIHB1Ymxpc2guCi0JICogICAgPGxpPjxjb2RlPlBVQkxJU0hfQVVUTzwvY29kZT4tIGluZGljYXRlcyBhbiBhdXRvbWF0aWMgaW5jcmVtZW50YWwgcHVibGlzaC48L2xpPgotCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0NMRUFOPC9jb2RlPi0gaW5kaWNhdGVzIGEgY2xlYW4gcmVxdWVzdC4gQ2xlYW4gdGhyb3dzCi0JICogICAgICBvdXQgYWxsIHN0YXRlIGFuZCBjbGVhbnMgdXAgdGhlIG1vZHVsZSBvbiB0aGUgc2VydmVyIGJlZm9yZSBkb2luZyBhCi0JICogICAgICBmdWxsIHB1Ymxpc2guCi0JICogICAgPC91bD4KLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gcHVibGlzaAotCSAqIEBwYXJhbSBkZWx0YUtpbmQgb25lIG9mIHRoZSBJU2VydmVyIHB1Ymxpc2ggY2hhbmdlIGNvbnN0YW50cy4gVmFsaWQgdmFsdWVzIGFyZToKLQkgKiAgICA8dWw+Ci0JICogICAgPGxpPjxjb2RlPkFEREVEPC9jb2RlPi0gaW5kaWNhdGVzIHRoZSBtb2R1bGUgaGFzIGp1c3QgYmVlbiBhZGRlZCB0byB0aGUgc2VydmVyCi0JICogICAgICBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgcHVibGlzaC4KLQkgKiAgICA8bGk+PGNvZGU+Tk9fQ0hBTkdFPC9jb2RlPi0gaW5kaWNhdGVzIHRoYXQgbm90aGluZyBoYXMgY2hhbmdlZCBpbiB0aGUgbW9kdWxlCi0JICogICAgICBzaW5jZSB0aGUgbGFzdCBwdWJsaXNoLjwvbGk+Ci0JICogICAgPGxpPjxjb2RlPkNIQU5HRUQ8L2NvZGU+LSBpbmRpY2F0ZXMgdGhhdCB0aGUgbW9kdWxlIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UKLQkgKiAgICAgIHRoZSBsYXN0IHB1Ymxpc2guIENhbGwgPGNvZGU+Z2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YSgpPC9jb2RlPiBmb3IKLQkgKiAgICAgIGRldGFpbHMgb2YgdGhlIGNoYW5nZS4KLQkgKiAgICA8bGk+PGNvZGU+UkVNT1ZFRDwvY29kZT4tIGluZGljYXRlcyB0aGUgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgYW5kIHNob3VsZCBiZQotCSAqICAgICAgcmVtb3ZlZC9jbGVhbmVkIHVwIGZyb20gdGhlIHNlcnZlci4KLQkgKiAgICA8L3VsPgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHB1Ymxpc2hpbmcgdGhlIG1vZHVsZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hNb2R1bGUoaW50IGtpbmQsIGludCBkZWx0YUtpbmQsIElNb2R1bGVbXSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBieSBkZWZhdWx0LCBhc3N1bWUgdGhlIG1vZHVsZSBoYXMgcHVibGlzaGVkIHN1Y2Nlc3NmdWxseS4KLQkJLy8gdGhpcyB3aWxsIHVwZGF0ZSB0aGUgcHVibGlzaCBzdGF0ZSBhbmQgZGVsdGEgY29ycmVjdGx5Ci0JCXNldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUsIElTZXJ2ZXIuUFVCTElTSF9TVEFURV9OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2RzIGNhbGxlZCB0byBub3RpZnkgdGhhdCBwdWJsaXNoaW5nIGhhcyBmaW5pc2hlZC4KLQkgKiBUaGUgc2VydmVyIGNhbiBjbG9zZSBhbnkgb3BlbiBjb25uZWN0aW9ucyB0byB0aGUgc2VydmVyCi0JICogYW5kIGRvIGFueSBjbGVhbnVwIG9wZXJhdGlvbnMuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmssCi0JICogaW4gcmVzcG9uc2UgdG8gYSBjYWxsIHRvIDxjb2RlPklTZXJ2ZXIucHVibGlzaCgpPC9jb2RlPi4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHN0b3BwaW5nIHRoZSBwdWJsaXNoCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVibGlzaEZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIENvbmZpZ3VyZSB0aGUgZ2l2ZW4gbGF1bmNoIGNvbmZpZ3VyYXRpb24gdG8gc3RhcnQgdGhpcyBzZXJ2ZXIuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlcgotCSAqIHRoZSBzZXJ2ZXIgaXMgc3RhcnRlZCB0byBlbnN1cmUgdGhhdCB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gaXMgYWNjdXJhdGUgYW5kIHVwIHRvIGRhdGUuCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBibGluZGx5IHVwZGF0ZSB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gaW4gY2FzZXMgd2hlcmUgdGhlIHVzZXIgaGFzCi0JICogYWNjZXNzIHRvIGNoYW5nZSB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gYnkgaGFuZC4KLQkgKiAKLQkgKiBAcGFyYW0gd29ya2luZ0NvcHkgYSBsYXVuY2ggY29uZmlndXJhdGlvbiB3b3JraW5nIGNvcHkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIHNldHRpbmcgdXAgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXR1cExhdW5jaENvbmZpZ3VyYXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3b3JraW5nQ29weSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXN0YXJ0IHRoaXMgc2VydmVyIHVzaW5nIGEgbW9yZSBvcHRpbWl6ZWQgYmVoYXZpb3IgdGhhbiBhIGZ1bGwgc3RvcAotCSAqIGFuZCBzdGFydC4gVGhlIHNlcnZlciBzaG91bGQgdXNlIHRoZSBzZXJ2ZXIgbGlzdGVuZXIgdG8gbm90aWZ5IHByb2dyZXNzLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZmluZCBvdXQgaWYgdGhlcmUgaXMgYW4gb3B0aW1pemVkIHBhdGggdG8gcmVzdGFydAotCSAqIHRoZSBzZXJ2ZXIgdGhhdCdzIGJldHRlciB0aGFuIGEgZnVsbCBzdG9wIGFuZCBzdGFydCAobGF1bmNoKS4gSWYgdGhpcwotCSAqIG1ldGhvZCB0aHJvd3MgYSBDb3JlRXhjZXB0aW9uIHdpdGggYSBzdGF0dXMgY29kZSBvZiAtMSwgaXQgaXMgYSBzaWduCi0JICogdGhhdCBlaXRoZXIgdGhlcmUgaXMgbm8gb3B0aW1pemVkIHBhdGgsIG9yIHRoYXQgdGhlIHBhdGggaGFzIGZhaWxlZCwKLQkgKiBhbmQgaW4gZWl0aGVyIGNhc2UgdGhlIGZyYW1ld29yayB3aWxsIHVzZSB0aGUgcmVndWxhciBzdG9wL3N0YXJ0Ci0JICogYmVoYXZpb3IuCi0JICogCi0JICogQHBhcmFtIGxhdW5jaE1vZGUgdGhlIG1vZGUgdG8gcmVzdGFydCBpbiwgb25lIG9mIHRoZSBtb2RlIGNvbnN0YW50cwotCSAqICAgIGRlZmluZWQgYnkge0BsaW5rIElMYXVuY2hNYW5hZ2VyfQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHJlc3RhcnRpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0YXJ0KFN0cmluZyBsYXVuY2hNb2RlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAtMSwgIlJlc3RhcnQgbm90IHN1cHBvcnRlZCIsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG1vZHVsZSBjYW4gYmUgcmVzdGFydGVkLgotCSAqIDxwPgotCSAqIFRoaXMgY2FsbCBzaG91bGQgY29tcGxldGUgcmVhc29uYWJseSBmYXN0IGFuZCBub3QgcmVxdWlyZSBjb21tdW5pY2F0aW9uCi0JICogd2l0aCB0aGUgKHBvdGVudGlhbGx5IHJlbW90ZSkgc2VydmVyLiBJZiBjb21tdW5pY2F0aW9uIGlzIHJlcXVpcmVkIGl0Ci0JICogc2hvdWxkIGJlIGRvbmUgYXN5bmNocm9ub3VzbHkgYW5kIHRoaXMgbWV0aG9kIHNob3VsZCBlaXRoZXIgZmFpbCB1bnRpbAotCSAqIHRoYXQgaXMgY29tcGxldGUgb3Igc3VjY2VlZCBhbmQgaGFuZGxlIGZhaWx1cmUgaW4gdGhlIHh4TW9kdWxlIG1ldGhvZHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIG1vZHVsZSBjYW4gYmUKLQkgKiAgICByZXN0YXJ0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogICAgCi0JICogQGRlcHJlY2F0ZWQgaW5zdGVhZCB1c2UgY2FuUmVzdGFydE1vZHVsZSwgY2FuUHVibGlzaE1vZHVsZSAgIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNvbnRyb2xNb2R1bGUoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbW9kdWxlIGNhbiBiZSByZXN0YXJ0ZWQuCi0JICogPHA+Ci0JICogVGhpcyBjYWxsIHNob3VsZCBjb21wbGV0ZSByZWFzb25hYmx5IGZhc3QgYW5kIG5vdCByZXF1aXJlIGNvbW11bmljYXRpb24KLQkgKiB3aXRoIHRoZSAocG90ZW50aWFsbHkgcmVtb3RlKSBzZXJ2ZXIuIElmIGNvbW11bmljYXRpb24gaXMgcmVxdWlyZWQgaXQKLQkgKiBzaG91bGQgYmUgZG9uZSBhc3luY2hyb25vdXNseSBhbmQgdGhpcyBtZXRob2Qgc2hvdWxkIGVpdGhlciBmYWlsIHVudGlsCi0JICogdGhhdCBpcyBjb21wbGV0ZSBvciBzdWNjZWVkIGFuZCBoYW5kbGUgZmFpbHVyZSBpbiB0aGUgeHhNb2R1bGUgbWV0aG9kcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gbW9kdWxlIGNhbiBiZQotCSAqICAgIHJlc3RhcnRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiAgICAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXN0YXJ0TW9kdWxlKElNb2R1bGVbXSBtb2R1bGUpewotCQlyZXR1cm4gY2FuQ29udHJvbE1vZHVsZShtb2R1bGUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG1vZHVsZSBjYW4gYmUgcHVibGlzaGVkLgotCSAqIDxwPgotCSAqIFRoaXMgY2FsbCBzaG91bGQgY29tcGxldGUgcmVhc29uYWJseSBmYXN0IGFuZCBub3QgcmVxdWlyZSBjb21tdW5pY2F0aW9uCi0JICogd2l0aCB0aGUgKHBvdGVudGlhbGx5IHJlbW90ZSkgc2VydmVyLiBJZiBjb21tdW5pY2F0aW9uIGlzIHJlcXVpcmVkIGl0Ci0JICogc2hvdWxkIGJlIGRvbmUgYXN5bmNocm9ub3VzbHkgYW5kIHRoaXMgbWV0aG9kIHNob3VsZCBlaXRoZXIgZmFpbCB1bnRpbAotCSAqIHRoYXQgaXMgY29tcGxldGUgb3Igc3VjY2VlZCBhbmQgaGFuZGxlIGZhaWx1cmUgaW4gdGhlIHh4TW9kdWxlIG1ldGhvZHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIG1vZHVsZSBjYW4gYmUKLQkgKiAgICBwdWJsaXNoZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogICAgCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUHVibGlzaE1vZHVsZShJTW9kdWxlW10gbW9kdWxlKXsKLQkJcmV0dXJuIGNhbkNvbnRyb2xNb2R1bGUobW9kdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbgotCSAqIGJlIHN0YXJ0ZWQgaW4gdGhlIGdpdmVuIG1vZGUuCi0JICogPHA+Ci0JICogVGhpcyBjYWxsIHNob3VsZCBjb21wbGV0ZSByZWFzb25hYmx5IGZhc3QgYW5kIG5vdCByZXF1aXJlIGNvbW11bmljYXRpb24KLQkgKiB3aXRoIHRoZSAocG90ZW50aWFsbHkgcmVtb3RlKSBzZXJ2ZXIuIElmIGNvbW11bmljYXRpb24gaXMgcmVxdWlyZWQgaXQKLQkgKiBzaG91bGQgYmUgZG9uZSBhc3luY2hyb25vdXNseSBhbmQgdGhpcyBtZXRob2Qgc2hvdWxkIGVpdGhlciBmYWlsIHVudGlsCi0JICogdGhhdCBpcyBjb21wbGV0ZSBvciBzdWNjZWVkIGFuZCBoYW5kbGUgZmFpbHVyZSBkdXJpbmcgc3RhcnQuCi0JICogPC9wPjxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLAotCSAqIGluIHJlc3BvbnNlIHRvIGEgY2FsbCB0byA8Y29kZT5JU2VydmVyLmNhblN0YXJ0KCk8L2NvZGU+LgotCSAqIFRoZSBmcmFtZXdvcmsgaGFzIGFscmVhZHkgZmlsdGVyZWQgb3V0IG9idmlvdXNseSBpbnZhbGlkIHNpdHVhdGlvbnMsCi0JICogc3VjaCBhcyBzdGFydGluZyBhIHNlcnZlciB0aGF0IGlzIGFscmVhZHkgcnVubmluZy4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBhIG1vZGUgaW4gd2hpY2ggYSBzZXJ2ZXIgY2FuIGJlIGxhdW5jaGVkLAotCSAqICAgIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMgZGVmaW5lZCBieQotCSAqICAgIHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfQotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgc2VydmVyIGNhbgotCSAqICAgIGJlIHN0YXJ0ZWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aHkgaXQgY2FuJ3QKLSAgICAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5TdGFydChTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbgotCSAqIGJlIHJlc3RhcnRlZCBpbiB0aGUgZ2l2ZW4gbW9kZS4gTm90ZSB0aGF0IG9ubHkgc2VydmVycwotCSAqIHRoYXQgYXJlIGN1cnJlbnRseSBydW5uaW5nIGNhbiBiZSByZXN0YXJ0ZWQuCi0JICogPHA+Ci0JICogVGhpcyBjYWxsIHNob3VsZCBjb21wbGV0ZSByZWFzb25hYmx5IGZhc3QgYW5kIG5vdCByZXF1aXJlIGNvbW11bmljYXRpb24KLQkgKiB3aXRoIHRoZSAocG90ZW50aWFsbHkgcmVtb3RlKSBzZXJ2ZXIuIElmIGNvbW11bmljYXRpb24gaXMgcmVxdWlyZWQgaXQKLQkgKiBzaG91bGQgYmUgZG9uZSBhc3luY2hyb25vdXNseSBhbmQgdGhpcyBtZXRob2Qgc2hvdWxkIGVpdGhlciBmYWlsIHVudGlsCi0JICogdGhhdCBpcyBjb21wbGV0ZSBvciBzdWNjZWVkIGFuZCBoYW5kbGUgZmFpbHVyZSBkdXJpbmcgcmVzdGFydC4KLQkgKiA8L3A+PHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmssCi0JICogaW4gcmVzcG9uc2UgdG8gYSBjYWxsIHRvIDxjb2RlPklTZXJ2ZXIuY2FuUmVzdGFydCgpPC9jb2RlPi4KLQkgKiBUaGUgZnJhbWV3b3JrIGhhcyBhbHJlYWR5IGZpbHRlcmVkIG91dCBvYnZpb3VzbHkgaW52YWxpZCBzaXR1YXRpb25zLAotCSAqIHN1Y2ggYXMgcmVzdGFydGluZyBhIHN0b3BwZWQgc2VydmVyLgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlIGEgbW9kZSBpbiB3aGljaCBhIHNlcnZlciBjYW4gYmUgbGF1bmNoZWQsCi0JICogICAgb25lIG9mIHRoZSBtb2RlIGNvbnN0YW50cyBkZWZpbmVkIGJ5Ci0JICogICAge0BsaW5rIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXJ9Ci0JICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgY2FuCi0JICogICAgYmUgcmVzdGFydGVkLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2h5IGl0IGNhbid0Ci0gICAgKiBAc2luY2UgMS4xCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuUmVzdGFydChTdHJpbmcgbW9kZSkgewotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbgotCSAqIGJlIHN0b3BwZWQuCi0JICogU2VydmVycyBjYW4gYmUgc3RvcHBlZCBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBzdG9wcGVkIGFuZCBpZgotCSAqIHRoZXkgYmVsb25nIHRvIGEgc3RhdGUtc2V0IHRoYXQgY2FuIGJlIHN0b3BwZWQuCi0JICogPHA+Ci0JICogVGhpcyBjYWxsIHNob3VsZCBjb21wbGV0ZSByZWFzb25hYmx5IGZhc3QgYW5kIG5vdCByZXF1aXJlIGNvbW11bmljYXRpb24KLQkgKiB3aXRoIHRoZSAocG90ZW50aWFsbHkgcmVtb3RlKSBzZXJ2ZXIuIElmIGNvbW11bmljYXRpb24gaXMgcmVxdWlyZWQgaXQKLQkgKiBzaG91bGQgYmUgZG9uZSBhc3luY2hyb25vdXNseSBhbmQgdGhpcyBtZXRob2Qgc2hvdWxkIGVpdGhlciBmYWlsIHVudGlsCi0JICogdGhhdCBpcyBjb21wbGV0ZSBvciBzdWNjZWVkIGFuZCBoYW5kbGUgZmFpbHVyZSBkdXJpbmcgc3RvcC4KLQkgKiA8L3A+PHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmssCi0JICogaW4gcmVzcG9uc2UgdG8gYSBjYWxsIHRvIDxjb2RlPklTZXJ2ZXIuY2FuU3RvcCgpPC9jb2RlPi4KLQkgKiBUaGUgZnJhbWV3b3JrIGhhcyBhbHJlYWR5IGZpbHRlcmVkIG91dCBvYnZpb3VzbHkgaW52YWxpZCBzaXR1YXRpb25zLAotCSAqIHN1Y2ggYXMgc3RvcHBpbmcgYSBzZXJ2ZXIgdGhhdCBpcyBhbHJlYWR5IHN0b3BwZWQuCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgY2FuCi0JICogICBiZSBzdG9wcGVkLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2h5IGl0IGNhbid0Ci0gICAgKiBAc2luY2UgMS4xCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuU3RvcCgpIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2VydmVyIGlzIGluIGEgc3RhdGUgdGhhdCBpdCBjYW4KLQkgKiBiZSBwdWJsaXNoZWQgdG8uCi0JICogPHA+Ci0JICogVGhpcyBjYWxsIHNob3VsZCBjb21wbGV0ZSByZWFzb25hYmx5IGZhc3QgYW5kIG5vdCByZXF1aXJlIGNvbW11bmljYXRpb24KLQkgKiB3aXRoIHRoZSAocG90ZW50aWFsbHkgcmVtb3RlKSBzZXJ2ZXIuIElmIGNvbW11bmljYXRpb24gaXMgcmVxdWlyZWQgaXQKLQkgKiBzaG91bGQgYmUgZG9uZSBhc3luY2hyb25vdXNseSBhbmQgdGhpcyBtZXRob2Qgc2hvdWxkIGVpdGhlciBmYWlsIHVudGlsCi0JICogdGhhdCBpcyBjb21wbGV0ZSBvciBzdWNjZWVkIGFuZCBoYW5kbGUgZmFpbHVyZSBkdXJpbmcgcHVibGlzaC4KLQkgKiA8L3A+PHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmssCi0JICogaW4gcmVzcG9uc2UgdG8gYSBjYWxsIHRvIDxjb2RlPklTZXJ2ZXIuY2FuUHVibGlzaCgpPC9jb2RlPi4KLQkgKiBUaGUgZnJhbWV3b3JrIGhhcyBhbHJlYWR5IGZpbHRlcmVkIG91dCBvYnZpb3VzbHkgaW52YWxpZCBzaXR1YXRpb25zLAotCSAqIHN1Y2ggYXMgcHVibGlzaGluZyB0byBhIHNlcnZlciBpbiB0aGUgd3JvbmcgbW9kZS4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhlIHNlcnZlciBjYW4KLQkgKiAgIGJlIHB1Ymxpc2hlZCB0bywgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3JvbmcKLSAgICAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5QdWJsaXNoKCkgewotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgdGhlIGdpdmVuIG1vZHVsZSBvbiB0aGUgc2VydmVyLiBTZWUgdGhlIHNwZWNpZmljYXRpb24gb2YgCi0JICoge0BsaW5rIElTZXJ2ZXIjc3RhcnRNb2R1bGUoSU1vZHVsZVtdLCBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcil9Ci0JICogZm9yIGZ1cnRoZXIgZGV0YWlscy4gCi0JICogPHA+Ci0JICogVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCB1cGRhdGUgdGhlIG1vZHVsZSBzeW5jIHN0YXRlIGFuZCBmaXJlCi0JICogYW4gZXZlbnQgZm9yIHRoZSBtb2R1bGUuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtb2R1bGUgZG9lcyBub3QgZXhpc3Qgb24KLQkgKiB0aGUgc2VydmVyLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFNpbmNlIHRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cywgaXMgdGhlcmUKLQkgKiBhbnkgbmVlZCBmb3IgdGhlIHByb2dyZXNzIG1vbml0b3I/XQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gYmUgc3RhcnRlZAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHRyeWluZyB0byByZXN0YXJ0IHRoZSBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydE1vZHVsZShJTW9kdWxlW10gbW9kdWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFN0b3BzIHRoZSBnaXZlbiBtb2R1bGUgb24gdGhlIHNlcnZlci4gU2VlIHRoZSBzcGVjaWZpY2F0aW9uIG9mIAotCSAqIHtAbGluayBJU2VydmVyI3N0b3BNb2R1bGUoSU1vZHVsZVtdLCBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcil9Ci0JICogZm9yIGZ1cnRoZXIgZGV0YWlscy4gCi0JICogPHA+Ci0JICogVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCB1cGRhdGUgdGhlIG1vZHVsZSBzeW5jIHN0YXRlIGFuZCBmaXJlCi0JICogYW4gZXZlbnQgZm9yIHRoZSBtb2R1bGUuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtb2R1bGUgZG9lcyBub3QgZXhpc3Qgb24KLQkgKiB0aGUgc2VydmVyLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFNpbmNlIHRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cywgaXMgdGhlcmUKLQkgKiBhbnkgbmVlZCBmb3IgdGhlIHByb2dyZXNzIG1vbml0b3I/XQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gYmUgc3RvcHBlZAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHRyeWluZyB0byByZXN0YXJ0IHRoZSBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wTW9kdWxlKElNb2R1bGVbXSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmVzdGFydHMgdGhlIGdpdmVuIG1vZHVsZSBvbiB0aGUgc2VydmVyLiBTZWUgdGhlIHNwZWNpZmljYXRpb24gb2YgCi0JICoge0BsaW5rIElTZXJ2ZXIjcmVzdGFydE1vZHVsZShJTW9kdWxlW10sIElTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyKX0KLQkgKiBmb3IgZnVydGhlciBkZXRhaWxzLiAKLQkgKiA8cD4KLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIHVwZGF0ZSB0aGUgbW9kdWxlIHN5bmMgc3RhdGUgYW5kIGZpcmUKLQkgKiBhbiBldmVudCBmb3IgdGhlIG1vZHVsZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1vZHVsZSBkb2VzIG5vdCBleGlzdCBvbgotCSAqIHRoZSBzZXJ2ZXIuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogU2luY2UgdGhpcyBtZXRob2QgaXMgYXN5bmNocm9ub3VzLCBpcyB0aGVyZQotCSAqIGFueSBuZWVkIGZvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvcj9dCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0byBiZSBzdG9wcGVkCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgdHJ5aW5nIHRvIHJlc3RhcnQgdGhlIG1vZHVsZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RhcnRNb2R1bGUoSU1vZHVsZVtdIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN0b3BNb2R1bGUobW9kdWxlLCBtb25pdG9yKTsKLQkJc3RhcnRNb2R1bGUobW9kdWxlLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBTaHV0cyBkb3duIGFuZCBzdG9wcyB0aGlzIHNlcnZlci4gVGhlIHNlcnZlciBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBtZXRob2QKLQkgKiBxdWlja2x5IGFuZCB1c2UgdGhlIHNlcnZlciBsaXN0ZW5lciB0byBub3RpZnkgc2h1dGRvd24gcHJvZ3Jlc3MuCi0JICogPHA+IAotCSAqIElmIGZvcmNlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXQgd2lsbCBhdHRlbXB0IHRvIHN0b3AgdGhlIHNlcnZlcgotCSAqIG5vcm1hbGx5L2dyYWNlZnVsbHkuIElmIGZvcmNlIGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIHRoZSBzZXJ2ZXIKLQkgKiBwcm9jZXNzIHdpbGwgYmUgdGVybWluYXRlZCBhbnkgd2F5IHRoYXQgaXQgY2FuLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFRoZXJlIGlzIG5vIHdheSB0byBjb21tdW5pY2F0ZSBmYWlsdXJlIHRvIHRoZQotCSAqIGNsaWVudC4gR2l2ZW4gdGhhdCB0aGlzIG9wZXJhdGlvbiBjYW4gZ28gYXdyeSwgdGhlcmUgcHJvYmFibHkKLQkgKiBzaG91bGQgYmUgYSBtZWNoYW5pc20gdGhhdCBhbGxvd3MgZmFpbGluZyBhc3luYyBvcGVyYXRpb25zCi0JICogdG8gYmUgZGlhZ25vc2VkLl0KLQkgKiA8L3A+Ci0JICogQHBhcmFtIGZvcmNlIDxjb2RlPnRydWU8L2NvZGU+IHRvIGtpbGwgdGhlIHNlcnZlciwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgdG8gc3RvcCBub3JtYWxseQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0b3AoYm9vbGVhbiBmb3JjZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IG1vZHVsZSByZXNvdXJjZXMuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBtb2R1bGUncyByZXNvdXJjZXMKLQkgKi8KLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlW10gZ2V0UmVzb3VyY2VzKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJcmV0dXJuIHNlcnZlci5nZXRSZXNvdXJjZXMobW9kdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHB1Ymxpc2hlZCB0byB0aGUgc2VydmVyLgotCSAqIAotCSAqIDxwPgotCSAqIElmIHRoZSBtb2R1bGUgaGFzIGp1c3QgYmVlbiBhZGRlZCB0byB0aGUgc2VydmVyLCBhbiBlbXB0eSBsaXN0IHdpbGwKLQkgKiBiZSByZXR1cm5lZC4gSWYgdGhlIG1vZHVsZSBoYXMgbmV2ZXIgZXhpc3RlZCBvbiB0aGUgc2VydmVyLCBhIENvcmVFeGNlcHRpb24KLQkgKiB3aWxsIGJlIHRocm93bi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBwdWJsaXNoZWQgbW9kdWxlIHJlc291cmNlCi0JICovCi0JcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZVtdIGdldFB1Ymxpc2hlZFJlc291cmNlcyhJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0UHVibGlzaGVkUmVzb3VyY2VzKG1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVsdGEgb2YgdGhlIGN1cnJlbnQgbW9kdWxlIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbgotCSAqIHB1Ymxpc2hlZCBjb21wYXJlZCB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbW9kdWxlLgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBwdWJsaXNoIHJlc291cmNlIGRlbHRhCi0JICovCi0JcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YShtb2R1bGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRoYXQgdGhlIHJlcXVlc3RlciBjYW4gdXNlCi0JICogdGhyb3VnaG91dCBpdCdzIGxpZmVjeWNsZS4gVGhpcyBpcyBwcmltYXJpbHkgdG8gYmUgdXNlZCBieQotCSAqIHNlcnZlcnMgZm9yIHdvcmtpbmcgZGlyZWN0b3JpZXMsIHNlcnZlciBzcGVjaWZpYwotCSAqIGZpbGVzLCBldGMuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgZGlyZWN0b3J5IHdpbGwgcmV0dXJuIHRoZSBzYW1lIGRpcmVjdG9yeSBvbgotCSAqIGVhY2ggdXNlIG9mIHRoZSB3b3JrYmVuY2guIElmIHRoZSBkaXJlY3RvcnkgaXMgbm90IHJlcXVlc3RlZAotCSAqIG92ZXIgYSBwZXJpb2Qgb2YgdGltZSwgdGhlIGRpcmVjdG9yeSBtYXkgYmUgZGVsZXRlZCBhbmQgYQotCSAqIG5ldyBvbmUgd2lsbCBiZSBhc3NpZ25lZCBvbiB0aGUgbmV4dCByZXF1ZXN0LiBGb3IgdGhpcwotCSAqIHJlYXNvbiwgYSBzZXJ2ZXIgbWF5IHdhbnQgdG8gcmVxdWVzdCB0aGUgdGVtcCBkaXJlY3Rvcnkgb24KLQkgKiBzdGFydHVwIGlmIGl0IHdhbnRzIHRvIHN0b3JlIGZpbGVzIHRoZXJlLiBJbiBhbnkgY2FzZSwgdGhlCi0JICogc2VydmVyIHNob3VsZCBoYXZlIGEgYmFja3VwIHBsYW4gdG8gcmVmaWxsIHRoZSBkaXJlY3RvcnkKLQkgKiBpbiBjYXNlIGl0IGhhcyBiZWVuIGRlbGV0ZWQgc2luY2UgbGFzdCB1c2UuPC9wPgotCSAqCi0JICogQHJldHVybiBhIHRlbXBvcmFyeSBkaXJlY3RvcnkKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0VGVtcERpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHNlcnZlci5nZXRUZW1wRGlyZWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB0aGUgcmVxdWVzdGVyIGNhbiB1c2UKLQkgKiB0aHJvdWdob3V0IGl0J3MgbGlmZWN5Y2xlLiBUaGlzIGlzIHByaW1hcmlseSB0byBiZSB1c2VkIGJ5Ci0JICogc2VydmVycyBmb3Igd29ya2luZyBkaXJlY3Rvcmllcywgc2VydmVyIHNwZWNpZmljCi0JICogZmlsZXMsIGV0Yy4KLQkgKiA8cD4KLQkgKiBBcyBsb25nIGFzIHRoZSBzYW1lIGtleSBpcyB1c2VkIHRvIGNhbGwgdGhpcyBtZXRob2Qgb24KLQkgKiBlYWNoIHVzZSBvZiB0aGUgd29ya2JlbmNoLCB0aGlzIG1ldGhvZCBkaXJlY3Rvcnkgd2lsbCByZXR1cm4KLQkgKiB0aGUgc2FtZSBkaXJlY3RvcnkuIElmIHJlY3ljbGluZyBpcyBlbmFibGVkIGFuZCB0aGUgZGlyZWN0b3J5Ci0JICogaXMgbm90IHJlcXVlc3RlZCBvdmVyIGEgcGVyaW9kIG9mIHRpbWUsIHRoZSBkaXJlY3RvcnkgbWF5IGJlCi0JICogZGVsZXRlZCBhbmQgYSBuZXcgb25lIHdpbGwgYmUgYXNzaWduZWQgb24gdGhlIG5leHQgcmVxdWVzdC4KLQkgKiBJZiB0aGlzIGJlaGF2aW9yIGlzIG5vdCBkZXNpcmVkLCByZWN5Y2xpbmcgc2hvdWxkIGJlIGRpc2FibGVkLjwvcD4KLQkgKgotCSAqIEBwYXJhbSByZWN5Y2xlIHRydWUgaWYgZGlyZWN0b3J5IG1heSBiZSBkZWxldGVkIGlmIG5vdCB1c2VkCi0JICogb3ZlciBhIHBlcmlvZCBvZiB0aW1lCi0JICogQHJldHVybiBhIHRlbXBvcmFyeSBkaXJlY3RvcnkKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0VGVtcERpcmVjdG9yeShib29sZWFuIHJlY3ljbGUpIHsKLQkJcmV0dXJuIHNlcnZlci5nZXRUZW1wRGlyZWN0b3J5KHJlY3ljbGUpOwotCX0KLQotCS8qKgotCSAqIFNldCBhIGdsb2JhbCBzdGF0dXMgb24gdGhlIHNlcnZlci4KLQkgKiAgCi0JICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0U2VydmVyU3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCXNlcnZlci5zZXRTZXJ2ZXJTdGF0dXMoc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYSBzdGF0dXMgb24gYSBzcGVjaWZpYyBtb2R1bGUuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCi0JICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0TW9kdWxlU3RhdHVzKElNb2R1bGVbXSBtb2R1bGUsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCXNlcnZlci5zZXRNb2R1bGVTdGF0dXMobW9kdWxlLCBzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIFB1Ymxpc2ggdG8gdGhlIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0ga2luZCB0aGUgcHVibGlzaCBraW5kCi0JICogQHBhcmFtIG1vZHVsZXMKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHBhcmFtIGluZm8KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdWJsaXNoKGludCBraW5kLCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaW5mbzIgPSBpbmZvOwotCQlJU3RhdHVzIHN0YXR1cyA9IHB1Ymxpc2goa2luZCwgbW9uaXRvcik7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLk9LICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuQ0FOQ0VMKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQl9Ci0KLQlwcml2YXRlIElBZGFwdGFibGUgaW5mbzI7Ci0KLQkvKnB1YmxpYyB2b2lkIHB1Ymxpc2gyKGludCBraW5kLCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLS0+LS0gUHVibGlzaGluZyB0byBzZXJ2ZXI6ICIgKyB0b1N0cmluZygpICsgIiAtLT4tLSIpOwotCQkKLQkJaWYgKGdldFNlcnZlcigpLmdldFNlcnZlclR5cGUoKS5oYXNSdW50aW1lKCkgJiYgZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUHVibGlzaE5vUnVudGltZSwgbnVsbCkpOwotCQkKLQkJZmluYWwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZUxpc3QgPSBnZXRBbGxNb2R1bGVzKCk7Ci0JCWFkZFJlbW92ZWRNb2R1bGVzKG1vZHVsZUxpc3QsIG51bGwpOwotCQkKLQkJUHVibGlzaE9wZXJhdGlvbltdIHRhc2tzID0gZ2V0VGFza3Moa2luZCwgbW9kdWxlTGlzdCwgbnVsbCk7Ci0JCWludCBzaXplID0gMjAwMCArIDM1MDAgKiBtb2R1bGVMaXN0LnNpemUoKSArIDUwMCAqIHRhc2tzLmxlbmd0aDsKLQkJCi0JCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJbW9uaXRvci5iZWdpblRhc2soTkxTLmJpbmQoTWVzc2FnZXMucHVibGlzaGluZywgZ2V0U2VydmVyKCkuZ2V0TmFtZSgpKSwgc2l6ZSk7Ci0JCQotCQlNdWx0aVN0YXR1cyB0ZW1wTXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOwotCQkKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQkKLQkJdHJ5IHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlN0YXJ0aW5nIHB1Ymxpc2giKTsKLQkJCXB1Ymxpc2hTdGFydChQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDAwKSk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCS8vIGV4ZWN1dGUgcHVibGlzaGVycwotCQkJZXhlY3V0ZVB1Ymxpc2hlcnMoa2luZCwgbW9kdWxlcywgbW9uaXRvciwgaW5mbyk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCS8vIHB1Ymxpc2ggdGhlIHNlcnZlcgotCQkJcHVibGlzaFNlcnZlcihraW5kLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDAwKSk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCS8vIHB1Ymxpc2ggbW9kdWxlcwotCQkJSXNwdWJsaXNoTW9kdWxlcyhraW5kLCBtb2R1bGVMaXN0LCBtb25pdG9yKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCQotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLklORk8sICJDb3JlRXhjZXB0aW9uIHB1Ymxpc2hpbmcgdG8gIiArIHRvU3RyaW5nKCksIGNlKTsKLQkJCXRocm93IGNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcHVibGlzaGluZyAgdG8gIiArIHRvU3RyaW5nKCksIGUpOwotCQkJdGVtcE11bHRpLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUHVibGlzaGluZywgZSkpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gZW5kIHRoZSBwdWJsaXNoaW5nCi0JCQl0cnkgewotCQkJCXB1Ymxpc2hGaW5pc2goUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgNTAwKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuSU5GTywgIkNvcmVFeGNlcHRpb24gcHVibGlzaGluZyB0byAiICsgdG9TdHJpbmcoKSwgY2UpOwotCQkJCXRlbXBNdWx0aS5hZGQoY2UuZ2V0U3RhdHVzKCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBzdG9wcGluZyBwdWJsaXNoIHRvICIgKyB0b1N0cmluZygpLCBlKTsKLQkJCQl0ZW1wTXVsdGkuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoaW5nLCBlKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi0tPC0tIERvbmUgcHVibGlzaGluZyAtLTwtLSIpOwotCQkKLQkJaWYgKHRlbXBNdWx0aS5nZXRDaGlsZHJlbigpLmxlbmd0aCA9PSAxKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24odGVtcE11bHRpLmdldENoaWxkcmVuKClbMF0pOwotCQkKLQkJTXVsdGlTdGF0dXMgbXVsdGkgPSBudWxsOwotCQlpZiAodGVtcE11bHRpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSykKLQkJCXJldHVybjsKLQkJZWxzZSBpZiAodGVtcE11bHRpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5JTkZPKQotCQkJbXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMucHVibGlzaGluZ1N0YXR1c0luZm8sIG51bGwpOwotCQllbHNlIGlmICh0ZW1wTXVsdGkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpCi0JCQltdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5wdWJsaXNoaW5nU3RhdHVzV2FybmluZywgbnVsbCk7Ci0JCWVsc2UgaWYgKHRlbXBNdWx0aS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQltdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5wdWJsaXNoaW5nU3RhdHVzRXJyb3IsIG51bGwpOwotCQkKLQkJaWYgKG11bHRpICE9IG51bGwpCi0JCQltdWx0aS5hZGRBbGwodGVtcE11bHRpKTsKLQl9Ki8KLQotCXByaXZhdGUgTGlzdDxJbnRlZ2VyPiBjb21wdXRlRGVsdGEoZmluYWwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZUxpc3QpIHsKLQotCQlmaW5hbCBMaXN0PEludGVnZXI+IGRlbHRhS2luZExpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0JCWZpbmFsIEl0ZXJhdG9yPElNb2R1bGVbXT4gaXRlcmF0b3IgPSBtb2R1bGVMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlNb2R1bGVbXSBtb2R1bGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaGFzQmVlblB1Ymxpc2hlZChtb2R1bGUpKSB7Ci0JCQkJSU1vZHVsZSBtID0gbW9kdWxlW21vZHVsZS5sZW5ndGggLSAxXTsKLQkJCQlpZiAoKG0uZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgIW0uZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKQotCQkJCQkJfHwgZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YShtb2R1bGUpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCWRlbHRhS2luZExpc3QuYWRkKG5ldyBJbnRlZ2VyKFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLk5PX0NIQU5HRSkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZGVsdGFLaW5kTGlzdC5hZGQobmV3IEludGVnZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuQ0hBTkdFRCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWRlbHRhS2luZExpc3QuYWRkKG5ldyBJbnRlZ2VyKFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLkFEREVEKSk7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5hZGRSZW1vdmVkTW9kdWxlcyhtb2R1bGVMaXN0LCBudWxsKTsKLQkJd2hpbGUgKGRlbHRhS2luZExpc3Quc2l6ZSgpIDwgbW9kdWxlTGlzdC5zaXplKCkpIHsKLQkJCWRlbHRhS2luZExpc3QuYWRkKG5ldyBJbnRlZ2VyKFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLlJFTU9WRUQpKTsKLQkJfQotCQlyZXR1cm4gZGVsdGFLaW5kTGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogUHVibGlzaCB0byB0aGUgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBraW5kIHRoZSBwdWJsaXNoIGtpbmQKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiB0aGUgcHVibGlzaCBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwdWJsaXNoKGludCBraW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIi0tPi0tIFB1Ymxpc2hpbmcgdG8gc2VydmVyOiAiICsgZ2V0U2VydmVyKCkudG9TdHJpbmcoKSArICIgLS0+LS0iKTsKLQkJfQotCQkKLQkJaWYgKGdldFNlcnZlcigpLmdldFNlcnZlclR5cGUoKS5oYXNSdW50aW1lKCkgJiYgZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclB1Ymxpc2hOb1J1bnRpbWUsIG51bGwpOwotCQkKLQkJZmluYWwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZUxpc3QgPSBnZXRBbGxNb2R1bGVzKCk7Ci0JCUxpc3Q8SW50ZWdlcj4gZGVsdGFLaW5kTGlzdCA9IHRoaXMuY29tcHV0ZURlbHRhKG1vZHVsZUxpc3QpOwotCQkKLQkJUHVibGlzaE9wZXJhdGlvbltdIHRhc2tzID0gZ2V0VGFza3Moa2luZCwgbW9kdWxlTGlzdCwgZGVsdGFLaW5kTGlzdCk7Ci0JCWludCBzaXplID0gMjAwMCArIDM1MDAgKiBtb2R1bGVMaXN0LnNpemUoKSArIDUwMCAqIHRhc2tzLmxlbmd0aDsKLQkJCi0JCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJU3RyaW5nIG1haW5UYXNrTXNnID0gTkxTLmJpbmQoTWVzc2FnZXMucHVibGlzaGluZywgZ2V0U2VydmVyKCkuZ2V0TmFtZSgpKTsKLQkJbW9uaXRvci5iZWdpblRhc2sobWFpblRhc2tNc2csIHNpemUpOwotCQkKLQkJTXVsdGlTdGF0dXMgdGVtcE11bHRpID0gbmV3IE11bHRpU3RhdHVzKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsKLQkJCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCi0JCXRyeSB7Ci0JCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIlN0YXJ0aW5nIHB1Ymxpc2giKTsKLQkJCX0KLQkJCXB1Ymxpc2hTdGFydChQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDAwKSk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkKLQkJCS8vIGV4ZWN1dGUgdGFza3MKLQkJCU11bHRpU3RhdHVzIHRhc2tTdGF0dXMgPSBwZXJmb3JtVGFza3ModGFza3MsIG1vbml0b3IpOwotCQkJbW9uaXRvci5zZXRUYXNrTmFtZShtYWluVGFza01zZyk7Ci0JCQlpZiAodGFza1N0YXR1cyAhPSBudWxsICYmICF0YXNrU3RhdHVzLmlzT0soKSkKLQkJCQl0ZW1wTXVsdGkuYWRkQWxsKHRhc2tTdGF0dXMpOwotCQkJCi0JCQkvLyBleGVjdXRlIHB1Ymxpc2hlcnMKLQkJCXRhc2tTdGF0dXMgPSBleGVjdXRlUHVibGlzaGVycyhraW5kLCBtb2R1bGVMaXN0LCBkZWx0YUtpbmRMaXN0LCBtb25pdG9yLCBpbmZvMik7Ci0JCQltb25pdG9yLnNldFRhc2tOYW1lKG1haW5UYXNrTXNnKTsKLQkJCWlmICh0YXNrU3RhdHVzICE9IG51bGwgJiYgIXRhc2tTdGF0dXMuaXNPSygpKQotCQkJCXRlbXBNdWx0aS5hZGRBbGwodGFza1N0YXR1cyk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkKLQkJCS8vIHB1Ymxpc2ggdGhlIHNlcnZlcgotCQkJcHVibGlzaFNlcnZlcihraW5kLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDAwKSk7Ci0JCQltb25pdG9yLnNldFRhc2tOYW1lKG1haW5UYXNrTXNnKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQotCQkJLy8gcHVibGlzaCBtb2R1bGVzCi0JCQlwdWJsaXNoTW9kdWxlcyhraW5kLCBtb2R1bGVMaXN0LCBkZWx0YUtpbmRMaXN0LCB0ZW1wTXVsdGksIG1vbml0b3IpOwotCQkJCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCi0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJaWYgKFRyYWNlLklORk8pIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfSU5GTywgIkNvcmVFeGNlcHRpb24gcHVibGlzaGluZyB0byAiICsgdG9TdHJpbmcoKSwgY2UpOwotCQkJfQotCQkJcmV0dXJuIGNlLmdldFN0YXR1cygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBwdWJsaXNoaW5nICB0byAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQl9Ci0JCQl0ZW1wTXVsdGkuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoaW5nLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBlbmQgdGhlIHB1Ymxpc2hpbmcKLQkJCXRyeSB7Ci0JCQkJcHVibGlzaEZpbmlzaChQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCA1MDApKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlpZiAoVHJhY2UuSU5GTykgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfSU5GTywgIkNvcmVFeGNlcHRpb24gcHVibGlzaGluZyB0byAiICsgdG9TdHJpbmcoKSwgY2UpOwotCQkJCX0KLQkJCQl0ZW1wTXVsdGkuYWRkKGNlLmdldFN0YXR1cygpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3Igc3RvcHBpbmcgcHVibGlzaCB0byAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQkJfQotCQkJCXRlbXBNdWx0aS5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclB1Ymxpc2hpbmcsIGUpKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIi0tPC0tIERvbmUgcHVibGlzaGluZyAtLTwtLSIpOwotCQl9Ci0JCQotCQlpZiAodGVtcE11bHRpLmdldENoaWxkcmVuKCkubGVuZ3RoID09IDEpCi0JCQlyZXR1cm4gdGVtcE11bHRpLmdldENoaWxkcmVuKClbMF07Ci0JCQotCQlNdWx0aVN0YXR1cyBtdWx0aSA9IG51bGw7Ci0JCWlmICh0ZW1wTXVsdGkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCWVsc2UgaWYgKHRlbXBNdWx0aS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuSU5GTykKLQkJCW11bHRpID0gbmV3IE11bHRpU3RhdHVzKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLnB1Ymxpc2hpbmdTdGF0dXNJbmZvLCBudWxsKTsKLQkJZWxzZSBpZiAodGVtcE11bHRpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKQotCQkJbXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMucHVibGlzaGluZ1N0YXR1c1dhcm5pbmcsIG51bGwpOwotCQllbHNlIGlmICh0ZW1wTXVsdGkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJbXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMucHVibGlzaGluZ1N0YXR1c0Vycm9yLCBudWxsKTsKLQkJCi0JCWlmIChtdWx0aSAhPSBudWxsKQotCQkJbXVsdGkuYWRkQWxsKHRlbXBNdWx0aSk7Ci0JCQotCQlyZXR1cm4gbXVsdGk7Ci0JfQotCi0JLypwcml2YXRlIHZvaWQgcHJpbnRNb2R1bGUoSU1vZHVsZVJlc291cmNlW10gcmVzLCBTdHJpbmcgaW5kKSB7Ci0JCWludCBzaXplID0gcmVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChyZXNbaV0gaW5zdGFuY2VvZiBJTW9kdWxlRm9sZGVyKSB7Ci0JCQkJSU1vZHVsZUZvbGRlciBmID0gKElNb2R1bGVGb2xkZXIpIHJlc1tpXTsKLQkJCQlwcmludE1vZHVsZShmLm1lbWJlcnMoKSwgaW5kICsgIiAgIik7Ci0JCQl9IGVsc2UgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLklORk8sIGluZCArIHJlc1tpXS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JfSovCi0KLQkvKioKLQkgKiBQdWJsaXNoIGEgc2luZ2xlIG1vZHVsZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2luZCBhIHB1Ymxpc2gga2luZAotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcGFyYW0gZGVsdGFLaW5kIHRoZSBkZWx0YSBraW5kCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gdGhlIHN0YXR1cwotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHB1Ymxpc2hNb2R1bGUoaW50IGtpbmQsIElNb2R1bGVbXSBtb2R1bGUsIGludCBkZWx0YUtpbmQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiLS0+LS0gUHVibGlzaGluZyBtb2R1bGUiKTsKLQkJfQotCQkKLQkJaW50IHNpemUgPSBtb2R1bGUubGVuZ3RoOwotCQlJTW9kdWxlIG0gPSBtb2R1bGVbc2l6ZSAtIDFdOwotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiTW9kdWxlOiAiICsgbSk7Ci0JCX0KLQkJbW9uaXRvci5iZWdpblRhc2soTkxTLmJpbmQoTWVzc2FnZXMucHVibGlzaGluZ01vZHVsZSwgbS5nZXROYW1lKCkpLCAxMDAwKTsKLQkJCi0JCXRyeSB7Ci0JCQlwdWJsaXNoTW9kdWxlKGtpbmQsIGRlbHRhS2luZCwgbW9kdWxlLCBtb25pdG9yKTsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlyZXR1cm4gY2UuZ2V0U3RhdHVzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclB1Ymxpc2hpbmcsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIi0tPC0tIERvbmUgcHVibGlzaGluZyBtb2R1bGUiKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIG1vZHVsZSBoYXMgYmVlbiBwdWJsaXNoZWQsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIG1vZHVsZSBoYXMgYmVlbiBwdWJsaXNoZWQsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNCZWVuUHVibGlzaGVkKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJcmV0dXJuIHNlcnZlci5nZXRTZXJ2ZXJQdWJsaXNoSW5mbygpLmhhc01vZHVsZVB1Ymxpc2hJbmZvKG1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyByZW1vdmVkIG1vZHVsZXMuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZUxpc3QgYSBsaXN0IG9mIG1vZHVsZXMKLQkgKiBAcGFyYW0ga2luZExpc3QgZGVwcmVjYXRlZCwgc2hvdWxkIGJlIG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZW1vdmVkTW9kdWxlcyhMaXN0PElNb2R1bGVbXT4gbW9kdWxlTGlzdCwgTGlzdDxJbnRlZ2VyPiBraW5kTGlzdCkgewotCQlzZXJ2ZXIuZ2V0U2VydmVyUHVibGlzaEluZm8oKS5hZGRSZW1vdmVkTW9kdWxlcyhtb2R1bGVMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHN0b3JlZCBwdWJsaXNoIGluZm8gZm9yIHRoZSBnaXZlbiBtb2R1bGUuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgc2hvdWxkIG5ldmVyIG5lZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiBXaWxsIGJlIHJlbW92ZWQKLQkgKiAgICBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFdUUAotCSAqIEBwYXJhbSBkZWx0YUtpbmQgYSBwdWJsaXNoIGRlbHRhIGtpbmQKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHVibGlzaEluZm8oaW50IGRlbHRhS2luZCwgSU1vZHVsZVtdIG1vZHVsZSkgewotCQkvLyBUT0RPIHJlbW92ZQotCX0KLQotCS8qKgotCSAqIFB1Ymxpc2hlcyB0aGUgZ2l2ZW4gbW9kdWxlcy4gUmV0dXJucyB0cnVlIGlmIHRoZSBwdWJsaXNoaW5nCi0JICogc2hvdWxkIGNvbnRpbnVlLCBvciBmYWxzZSBpZiBwdWJsaXNoaW5nIGhhcyBmYWlsZWQgb3IgaXMgY2FuY2VsZWQuCi0JICogCi0JICogVXNlcyA1MDAgdGlja3MgcGx1cyAzNTAwIHRpY2tzIHBlciBtb2R1bGUKLQkgKiAKLQkgKiBAcGFyYW0ga2luZCB0aGUgcHVibGlzaCBraW5kCi0JICogQHBhcmFtIG1vZHVsZXMgYSBsaXN0IG9mIG1vZHVsZXMKLQkgKiBAcGFyYW0gZGVsdGFLaW5kMiBhIGxpc3Qgb2YgZGVsdGEga2luZHMKLQkgKiBAcGFyYW0gbXVsdGkgYSBtdWx0aXN0YXR1cyB0byBhZGQgdGhlIHN0YXR1cyB0bwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoTW9kdWxlcyhpbnQga2luZCwgTGlzdCBtb2R1bGVzLCBMaXN0IGRlbHRhS2luZDIsIE11bHRpU3RhdHVzIG11bHRpLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vZHVsZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWludCBzaXplID0gbW9kdWxlcy5zaXplKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBwdWJsaXNoIG1vZHVsZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCS8vIHNob3VsZCBza2lwIHRoaXMgcHVibGlzaAotCQkJSU1vZHVsZVtdIG1vZHVsZSA9IChJTW9kdWxlW10pIG1vZHVsZXMuZ2V0KGkpOwotCQkJSU1vZHVsZSBtID0gbW9kdWxlW21vZHVsZS5sZW5ndGggLSAxXTsKLQkJCWlmKHNob3VsZElnbm9yZVB1Ymxpc2hSZXF1ZXN0KG0pKQotCQkJCWNvbnRpbnVlOwotCQkJCi0JCQlpbnQga2luZDIgPSBraW5kOwotCQkJaWYgKGdldFNlcnZlcigpLmdldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUpID09IElTZXJ2ZXIuUFVCTElTSF9TVEFURV9VTktOT1dOKQotCQkJCWtpbmQyID0gSVNlcnZlci5QVUJMSVNIX0ZVTEw7Ci0JCQkKLQkJCS8qaW50IGRlbHRhS2luZCA9IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLkFEREVEOwotCQkJaWYgKGhhc0JlZW5QdWJsaXNoZWQobW9kdWxlKSkgewotCQkJCWlmIChnZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKG1vZHVsZSkubGVuZ3RoID09IDApCi0JCQkJCWRlbHRhS2luZCA9IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLk5PX0NIQU5HRTsKLQkJCQllbHNlCi0JCQkJCWRlbHRhS2luZCA9IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLkNIQU5HRUQ7Ci0JCQl9IC8vIFRPRE8gUkVNT1ZFRCovCi0JCQkKLQkJCUlTdGF0dXMgc3RhdHVzID0gcHVibGlzaE1vZHVsZShraW5kMiwgbW9kdWxlLCAoKEludGVnZXIpZGVsdGFLaW5kMi5nZXQoaSkpLmludFZhbHVlKCksIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDMwMDApKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKLQkJCQltdWx0aS5hZGQoc3RhdHVzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIG1vZHVsZSBzaG91bGQgYmUgaWdub3JlIGR1cmluZyB0aGUgcHVibGlzaAotCSAqIEBwYXJhbSBtCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZElnbm9yZVB1Ymxpc2hSZXF1ZXN0KElNb2R1bGUgbSkgewotCQlyZXR1cm4gKG0uZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgIW0uZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHVibGlzaCB0YXNrcyB0aGF0IGhhdmUgYmVlbiB0YXJnZXRlZCB0byB0aGlzIHNlcnZlci4KLQkgKiBUaGVzZSB0YXNrcyBzaG91bGQgYmUgcnVuIGR1cmluZyBwdWJsaXNoaW5nLgotCSAqIAotCSAqIEBwYXJhbSBraW5kIG9uZSBvZiB0aGUgSVNlcnZlci5QVUJMSVNIX1hYIGNvbnN0YW50cwotCSAqIEBwYXJhbSBtb2R1bGVMaXN0IGEgbGlzdCBvZiBtb2R1bGVzCi0JICogQHBhcmFtIGtpbmRMaXN0IGxpc3Qgb2Ygb25lIG9mIHRoZSBJU2VydmVyIHB1Ymxpc2ggY2hhbmdlIGNvbnN0YW50cwotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBJT3B0aW9uYWxUYXNrcwotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQdWJsaXNoT3BlcmF0aW9uW10gZ2V0VGFza3MoaW50IGtpbmQsIExpc3QgbW9kdWxlTGlzdCwgTGlzdCBraW5kTGlzdCkgewotCQlyZXR1cm4gc2VydmVyLmdldFRhc2tzKGtpbmQsIG1vZHVsZUxpc3QsIGtpbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHB1Ymxpc2hlcnMuCi0JICogCi0JICogQHBhcmFtIGtpbmQgdGhlIHB1Ymxpc2gga2luZAotCSAqIEBwYXJhbSBtb2R1bGVzIHRoZSBsaXN0IG9mIG1vZHVsZXMKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHBhcmFtIGluZm8gdGhlIElBZGFwdGFibGUgKG9yIDxjb2RlPm51bGw8L2NvZGU+KSBwcm92aWRlZCBieSB0aGUKLQkgKiAgICBjYWxsZXIgaW4gb3JkZXIgdG8gc3VwcGx5IFVJIGluZm9ybWF0aW9uIGZvciBwcm9tcHRpbmcgdGhlCi0JICogICAgdXNlciBpZiBuZWNlc3NhcnkuIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LAotCSAqICAgIGl0IHNob3VsZCBtaW5pbWFsbHkgY29udGFpbiBhbiBhZGFwdGVyIGZvciB0aGUKLQkgKiAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbC5jbGFzcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjEKLQkgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSAKLQkgKiB7QGxpbmsgI2V4ZWN1dGVQdWJsaXNoZXJzKGludCwgTGlzdCwgTGlzdCwgSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSl9Ci0JICovCi0JcHJvdGVjdGVkIE11bHRpU3RhdHVzIGV4ZWN1dGVQdWJsaXNoZXJzKGludCBraW5kLCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGV4ZWN1dGVQdWJsaXNoZXJzKGtpbmQsIG1vZHVsZXMsIG51bGwsIG1vbml0b3IsIGluZm8pOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgcHVibGlzaGVycy4gSWYgYSBwdWJsaXNoZXIgbW9kaWZpZWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBtb2R1bGUgKHdoaWNoIGlzIGRldGVybWluZWQgYnkgdGhlCi0JICoge0BsaW5rIFB1Ymxpc2hlckRlbGVnYXRlfSkgdGhlbiB0aGUgZGVsdGEgbGlzdCBpcyByZWJ1aWxkLgotCSAqIAotCSAqIEBwYXJhbSBraW5kCi0JICogICAgICAgICAgICB0aGUgcHVibGlzaCBraW5kCi0JICogQHBhcmFtIG1vZHVsZXMKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIG1vZHVsZXMuIFRoZSBjb250ZW50cyBvZiB0aGlzIHtAbGluayBMaXN0fSBtYXkgY2hhbmdlIGlmIHRoZSBwdWJsaXNoZXIgbW9kaWZpZXMgY29kZS4KLQkgKiBAcGFyYW0gZGVsdGFLaW5kcwotCSAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgZGVsdGEga2luZCB0aGF0IG1hcHMgdG8gdGhlIGxpc3Qgb2YgbW9kdWxlcy4gVGhlIGNvbnRlbnRzIG9mIHRoaXMge0BsaW5rIExpc3R9IG1heSBjaGFuZ2UKLQkgKiAgICAgICAgICAgIGlmIHRoZSBwdWJsaXNoZXIgbW9kaWZpZXMgY29kZS4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcyByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcGFyYW0gaW5mbwotCSAqICAgICAgICAgICAgdGhlIElBZGFwdGFibGUgKG9yIDxjb2RlPm51bGw8L2NvZGU+KSBwcm92aWRlZCBieSB0aGUgY2FsbGVyIGluIG9yZGVyIHRvIHN1cHBseSBVSSBpbmZvcm1hdGlvbiBmb3IKLQkgKiAgICAgICAgICAgIHByb21wdGluZyB0aGUgdXNlciBpZiBuZWNlc3NhcnkuIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LCBpdCBzaG91bGQgbWluaW1hbGx5Ci0JICogICAgICAgICAgICBjb250YWluIGFuIGFkYXB0ZXIgZm9yIHRoZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbC5jbGFzcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwcm90ZWN0ZWQgTXVsdGlTdGF0dXMgZXhlY3V0ZVB1Ymxpc2hlcnMoaW50IGtpbmQsIExpc3Q8SU1vZHVsZVtdPiBtb2R1bGVzLCBMaXN0PEludGVnZXI+IGRlbHRhS2luZHMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVB1Ymxpc2hlcltdIHB1Ymxpc2hlcnMgPSAoKFNlcnZlcilnZXRTZXJ2ZXIoKSkuZ2V0RW5hYmxlZFB1Ymxpc2hlcnMoKTsKLQkJaW50IHNpemUgPSBwdWJsaXNoZXJzLmxlbmd0aDsKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIkV4ZWN1dGluZyBwdWJsaXNoZXJzOiAiICsgc2l6ZSk7Ci0JCX0KLQkJCi0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCU11bHRpU3RhdHVzIG11bHRpID0gbmV3IE11bHRpU3RhdHVzKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLnRhc2tQZXJmb3JtaW5nLCBudWxsKTsKLQkJCi0JCVRhc2tNb2RlbCB0YXNrTW9kZWwgPSBuZXcgVGFza01vZGVsKCk7Ci0JCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSLCBnZXRTZXJ2ZXIoKSk7Ci0JCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfTU9EVUxFUywgbW9kdWxlcyk7Ci0JCWlmIChkZWx0YUtpbmRzICE9IG51bGwpIHsKLQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfREVMVEFfS0lORFMsIGRlbHRhS2luZHMpOwotCQl9Ci0JCQotCQlib29sZWFuIHB1Ymxpc2hlck1vZGlmaWVkQ29kZSA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJUHVibGlzaGVyIHB1YiA9IHB1Ymxpc2hlcnNbaV07Ci0JCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMudGFza1BlcmZvcm1pbmcsIHB1Yi5nZXROYW1lKCkpKTsKLQkJCXRyeSB7Ci0JCQkJcHViLnNldFRhc2tNb2RlbCh0YXNrTW9kZWwpOwotCQkJCUlTdGF0dXMgcHViU3RhdHVzID0gcHViLmV4ZWN1dGUoa2luZCwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgNTAwKSwgaW5mbyk7Ci0JCQkJaWYoIXB1Ymxpc2hlck1vZGlmaWVkQ29kZSkgewotCQkJCQkvLyBJZiBhIHB1Ymxpc2hlciBoYXMgbW9kaWZpZWQgbW9kdWxlcyB0aGVuIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBrZWVwIGNoZWNraW5nIG90aGVyIHB1Ymxpc2hlcnMuCi0JCQkJCXB1Ymxpc2hlck1vZGlmaWVkQ29kZSA9IHB1Yi5pc01vZGlmeU1vZHVsZXMoKTsKLQkJCQl9Ci0JCQkJbXVsdGkuYWRkKHB1YlN0YXR1cyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiUHVibGlzaGVyIGZhaWxlZCIsIGNlKTsKLQkJCQl9Ci0JCQkJdGhyb3cgY2U7Ci0JCQl9Ci0JCQkKLQkJCS8vIHJldHVybiBlYXJseSBpZiB0aGUgbW9uaXRvciBoYXMgYmVlbiBjYW5jZWxlZAotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybiBtdWx0aTsKLQkJfQotCQlpZiAocHVibGlzaGVyTW9kaWZpZWRDb2RlKSB7Ci0JCQkvLyByZS1jcmVhdGUgdGhlIGRlbHRhIGxpc3QgYXMgYXQgbGVhc3Qgb25lIHB1Ymxpc2hlciBoYXMgY2hhbmdlZCB0aGUgY29udGVudHMgb2YgdGhlIHB1Ymxpc2hlZCBtb2R1bGVzLgotCQkJZGVsdGFLaW5kcyA9IHRoaXMuY29tcHV0ZURlbHRhKG1vZHVsZXMpOwotCQl9Ci0JCW1vbml0b3Iuc3ViVGFzaygiIik7Ci0JCXJldHVybiBtdWx0aTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgbW9kdWxlcyB0aGF0IGFyZSBvbiB0aGUgc2VydmVyLCBpbmNsdWRpbmcgcm9vdAotCSAqIG1vZHVsZXMgYW5kIGFsbCB0aGVpciBjaGlsZHJlbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBJTW9kdWxlW11zCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8SU1vZHVsZVtdPiBnZXRBbGxNb2R1bGVzKCkgewotCQlyZXR1cm4gc2VydmVyLmdldEFsbE1vZHVsZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtIChleGVjdXRlKSBhbGwgdGhlIGdpdmVuIHRhc2tzLgotCSAqIAotCSAqIEBwYXJhbSB0YXNrcyBhbiBhcnJheSBvZiB0YXNrcwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMKLQkgKi8KLQlwcm90ZWN0ZWQgTXVsdGlTdGF0dXMgcGVyZm9ybVRhc2tzKFB1Ymxpc2hPcGVyYXRpb25bXSB0YXNrcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWludCBzaXplID0gdGFza3MubGVuZ3RoOwotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiUGVyZm9ybWluZyB0YXNrczogIiArIHNpemUpOwotCQl9Ci0JCQotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlNdWx0aVN0YXR1cyBtdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy50YXNrUGVyZm9ybWluZywgbnVsbCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJUHVibGlzaE9wZXJhdGlvbiB0YXNrID0gdGFza3NbaV07Ci0JCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMudGFza1BlcmZvcm1pbmcsIHRhc2sudG9TdHJpbmcoKSkpOwotCQkJdHJ5IHsKLQkJCQl0YXNrLmV4ZWN1dGUoUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgNTAwKSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiVGFzayBmYWlsZWQiLCBjZSk7Ci0JCQkJfQotCQkJCW11bHRpLmFkZChjZS5nZXRTdGF0dXMoKSk7Ci0JCQl9Ci0JCQkKLQkJCS8vIHJldHVybiBlYXJseSBpZiB0aGUgbW9uaXRvciBoYXMgYmVlbiBjYW5jZWxlZAotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybiBtdWx0aTsKLQkJfQotCQkKLQkJbW9uaXRvci5zdWJUYXNrKCIiKTsKLQkJcmV0dXJuIG11bHRpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHJlc291cmNlcyBjaGFuZ2Ugd2l0aGluIHRoZSB3b3Jrc3BhY2UuCi0JICogVGhpcyBnaXZlcyB0aGUgc2VydmVyIGFuIG9wcG9ydHVuaXR5IHRvIHVwZGF0ZSB0aGUgc2VydmVyIG9yIG1vZHVsZQotCSAqIHJlc3RhcnQgc3RhdGUuCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlUmVzb3VyY2VDaGFuZ2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvU2VydmVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1NlcnZlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNGQ0MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvU2VydmVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcldvcmtpbmdDb3B5OwotLyoqCi0gKiBBIHNlcnZlciBkZWxlZ2F0ZSBwcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHZhcmlvdXMgCi0gKiBnZW5lcmljIGFuZCBzZXJ2ZXItdHlwZS1zcGVjaWZpYyBvcGVyYXRpb25zIGZvciBhIHNwZWNpZmljIHR5cGUgb2Ygc2VydmVyLgotICogQSBzZXJ2ZXIgZGVsZWdhdGUgaXMgc3BlY2lmaWVkIGJ5IHRoZQotICogPGNvZGU+Y2xhc3M8L2NvZGU+IGF0dHJpYnV0ZSBvZiBhIDxjb2RlPnNlcnZlclR5cGVzPC9jb2RlPiBleHRlbnNpb24uCi0gKiA8cD4KLSAqIFdoZW4gdGhlIHNlcnZlciBpbnN0YW5jZSBuZWVkcyB0byBiZSBnaXZlbiBhIGRlbGVnYXRlLCB0aGUgZGVsZWdhdGUgY2xhc3MKLSAqIHNwZWNpZmllZCBmb3IgdGhlIHNlcnZlciB0eXBlIGlzIGluc3RhbnRpYXRlZCB3aXRoIGEgMC1hcmd1bWVudCBjb25zdHJ1Y3RvcgotICogYW5kIHByaW1lZCB3aXRoIDxjb2RlPmRlbGVnYXRlLmluaXRpYWxpemUoKChJU2VydmVyU3RhdGUpc2VydmVyKTwvY29kZT4sIAotICogd2hpY2ggaXQgaXMgZXhwZWN0ZWQgdG8gaGFuZyBvbiB0by4gTGF0ZXIsIHdoZW4KLSAqIDxjb2RlPmRlbGVnYXRlLmRpc3Bvc2UoKTwvY29kZT4gaXMgY2FsbGVkIGFzIHRoZSBzZXJ2ZXIgaW5zdGFuY2UgaXMKLSAqIGJlaW5nIGRpc2NhcmRlZCwgdGhlIGRlbGVnYXRlIGlzIGV4cGVjdGVkIHRvIGxldCBnbyBvZiB0aGUgc2VydmVyIGluc3RhbmNlLgotICogPC9wPgotICogPHA+Ci0gKiBTZXJ2ZXJEZWxlZ2F0ZSBzdXBwb3J0cyBhbiBvcGVuLWVuZGVkIHNldCBvZiBhdHRyaWJ1dGUtdmFsdWUgcGFpcnMuIEFsbAotICogc3RhdGUgc3RvcmVkIGluIHRoaXMgbWFubmVyIHdpbGwgYmUgc2F2ZWQgd2hlbiB0aGUgc2VydmVyIHdvcmtpbmcgY29weSBpcwotICogc2F2ZWQsIGFuZCBwZXJzaXN0ZWQgYWNyb3NzIHdvcmtiZW5jaCBzZXNzaW9ucy4KLSAqIFNlcnZlciBkZWxlZ2F0ZXMgbWF5IGtlZXAgc3RhdGUgaW4gaW5zdGFuY2UgZmllbGRzLCBidXQgdGhhdCBzdGF0ZSBpcwotICogdHJhbnNpZW50IGFuZCB3aWxsIG5vdCBiZSBwZXJzaXN0ZWQgYWNyb3NzIHdvcmtiZW5jaCBzZXNzaW9ucy4gVG8gc2F2ZQotICogc3RhdGUgYWNyb3NzIHdvcmtiZW5jaCBzZXNzaW9ucywgaXQgbXVzdCBiZSBwZXJzaXN0ZWQgdXNpbmcgdGhlCi0gKiBhdHRyaWJ1dGVzLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5zZXJ2ZXJUeXBlczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogPC9wPgotICogCi0gKiBAc2VlIElTZXJ2ZXIKLSAqIEBzZWUgSVNlcnZlcldvcmtpbmdDb3B5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJEZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBTZXJ2ZXIgc2VydmVyOwotCXByaXZhdGUgU2VydmVyV29ya2luZ0NvcHkgc2VydmVyV0M7Ci0KLQkvKioKLQkgKiBEZWxlZ2F0ZXMgbXVzdCBoYXZlIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJEZWxlZ2F0ZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgc2VydmVyIGRlbGVnYXRlIHdpdGggaXRzIGxpZmUtbG9uZyBzZXJ2ZXIgaW5zdGFuY2UuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsuCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5ld1NlcnZlciB0aGUgc2VydmVyIGluc3RhbmNlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqLwotCWZpbmFsIHZvaWQgaW5pdGlhbGl6ZShTZXJ2ZXIgbmV3U2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc2VydmVyID0gbmV3U2VydmVyOwotCQlpZiAobmV3U2VydmVyIGluc3RhbmNlb2YgU2VydmVyV29ya2luZ0NvcHkpCi0JCQlzZXJ2ZXJXQyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgbmV3U2VydmVyOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCQotCS8qKgotCSAqIFNwZWNpZnkgdGhlIGxvY2tpbmcgcnVsZSB0byBiZSB1c2VkIGR1cmluZyBhIHB1Ymxpc2guCi0JICogQHJldHVybiB0cnVlIGlmIG9ubHkgYWZmZWN0ZWQgcHJvamVjdHMgYXJlIGxvY2tlZCBkdXJpbmcgYSBwdWJsaXNoLiBmYWxzZSBpZiB0aGUgZW50aXJlIHdvcmtzcGFjZQotCSAqIG5lZWRzIHRvIGJlIGxvY2tlZCBkdXJpbmcgYSBwdWJsaXNoLiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzZVByb2plY3RTcGVjaWZpY1NjaGVkdWxpbmdSdWxlT25QdWJsaXNoKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBzZXJ2ZXIgZGVsZWdhdGUuIFRoaXMgbWV0aG9kIGdpdmVzIGRlbGVnYXRlcyBhIGNoYW5jZQotCSAqIHRvIGRvIHRoZWlyIG93biBpbml0aWFsaXphdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIHRoYXQgdGhpcyBzZXJ2ZXIgZGVsZWdhdGUgY29ycmVzcG9uZHMgdG8uCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIGZpbmFsIElTZXJ2ZXIgZ2V0U2VydmVyKCkgewotCQlyZXR1cm4gc2VydmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciB3b3JraW5nIGNvcHkgdGhhdCB0aGlzIHNlcnZlciBkZWxlZ2F0ZSBjb3JyZXNwb25kcyB0by4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgZmluYWwgSVNlcnZlcldvcmtpbmdDb3B5IGdldFNlcnZlcldvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gc2VydmVyV0M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBpbnQtdmFsdWVkIGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUKLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGUoU3RyaW5nLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGludCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0QXR0cmlidXRlKGlkLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYm9vbGVhbi12YWx1ZWQgYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZQotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZShTdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZ2V0QXR0cmlidXRlKFN0cmluZyBpZCwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIHNlcnZlci5nZXRBdHRyaWJ1dGUoaWQsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBTdHJpbmctdmFsdWVkIGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUKLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGUoU3RyaW5nLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0QXR0cmlidXRlKGlkLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgTGlzdC12YWx1ZWQgYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZQotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZShTdHJpbmcsIExpc3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3QgZ2V0QXR0cmlidXRlKFN0cmluZyBpZCwgTGlzdDxTdHJpbmc+IGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gc2VydmVyLmdldEF0dHJpYnV0ZShpZCwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIE1hcC12YWx1ZWQgYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZQotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZShTdHJpbmcsIE1hcCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTWFwIGdldEF0dHJpYnV0ZShTdHJpbmcgaWQsIE1hcCBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIHNlcnZlci5nZXRBdHRyaWJ1dGUoaWQsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhpcyBzZXJ2ZXIgZGVsZWdhdGUuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSB3ZWIgc2VydmVyIGNvcmUgZnJhbWV3b3JrLgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEltcGxlbWVudGF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gbGV0IGdvIG9mIHRoZSBkZWxlZ2F0ZSdzIHJlZmVyZW5jZQotCSAqIHRvIHRoZSBzZXJ2ZXIsIGRlcmVnaXN0ZXIgbGlzdGVuZXJzLCBldGMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBtb2R1bGUgbW9kaWZpY2F0aW9ucyBjb3VsZCBiZSBtYWRlIHRvIHRoaXMKLQkgKiBzZXJ2ZXIgYXQgdGhpcyB0aW1lLiBTZWUgdGhlIHNwZWNpZmljYXRpb24gb2YKLQkgKiB7QGxpbmsgSVNlcnZlckF0dHJpYnV0ZXMjY2FuTW9kaWZ5TW9kdWxlcyhJTW9kdWxlW10sIElNb2R1bGVbXSwgSVByb2dyZXNzTW9uaXRvcil9Ci0JICogZm9yIGZ1cnRoZXIgZGV0YWlscy4gCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSB3ZWIgc2VydmVyIGNvcmUgZnJhbWV3b3JrIGluIHJlc3BvbnNlIHRvCi0JICogYSBjYWxsIHRvIDxjb2RlPklTZXJ2ZXIuY2FuTW9kaWZ5TW9kdWxlczwvY29kZT4uIEl0IHNob3VsZCByZXR1cm4gcXVpY2tseQotCSAqIHdpdGhvdXQgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyLiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhZGQgYSBwb3NzaWJseS1lbXB0eSBsaXN0IG9mIG1vZHVsZXMgdG8gYWRkCi0JICogQHBhcmFtIHJlbW92ZSBhIHBvc3NpYmx5LWVtcHR5IGxpc3Qgb2YgbW9kdWxlcyB0byByZW1vdmUKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhlIG1vZHVsZXMKLQkgKiAgIGNhbiBiZSBtb2RpZmllZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoeSB0aGV5IGNhbid0Ci0JICogQHNlZSBJU2VydmVyQXR0cmlidXRlcyNjYW5Nb2RpZnlNb2R1bGVzKElNb2R1bGVbXSwgSU1vZHVsZVtdLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJU3RhdHVzIGNhbk1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGlsZCBtb2R1bGUocykgb2YgdGhpcyBtb2R1bGUuIElmIHRoaXMgbW9kdWxlIGNvbnRhaW5zIG90aGVyCi0JICogbW9kdWxlcywgaXQgc2hvdWxkIGxpc3QgdGhvc2UgbW9kdWxlcy4gSWYgbm90LCBpdCBzaG91bGQgcmV0dXJuIGFuIGVtcHR5Ci0JICogbGlzdC4KLQkgKiAKLQkgKiA8cD5UaGlzIG1ldGhvZCBzaG91bGQgb25seSByZXR1cm4gdGhlIGRpcmVjdCBjaGlsZHJlbi4gVG8gb2J0YWluIHRoZSBmdWxsCi0JICogdHJlZSBvZiBtb2R1bGVzIGlmIHRoZXkgYXJlIG11bHRpcGxlIGxldmVscyBkZWVwLCB0aGlzIG1ldGhvZCBtYXkgYmUKLQkgKiByZWN1cnNpdmVseSBjYWxsZWQgb24gdGhlIGNoaWxkcmVuLjwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICogQHJldHVybiB0aGUgY2hpbGQgbW9kdWxlcwotCSAqIEBzZWUgSVNlcnZlckF0dHJpYnV0ZXMjZ2V0Q2hpbGRNb2R1bGVzKElNb2R1bGVbXSwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcyhJTW9kdWxlW10gbW9kdWxlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBtb2R1bGUocykgb2YgdGhpcyBtb2R1bGUuIFdoZW4gZGV0ZXJtaW5pbmcgaWYgYSBnaXZlbgotCSAqIHByb2plY3QgY2FuIHJ1biBvbiBhIHNlcnZlciwgdGhpcyBtZXRob2Qgd2lsbCBiZSB1c2VkIHRvIGZpbmQgdGhlIGFjdHVhbAotCSAqIG1vZHVsZShzKSB0aGF0IG1heSBiZSBydW4gb24gdGhlIHNlcnZlci4gRm9yIGluc3RhbmNlLCBhIFdlYiBtb2R1bGUgbWF5Ci0JICogcmV0dXJuIGEgbGlzdCBvZiBFQVIgbW9kdWxlcyB0aGF0IGl0IGlzIGNvbnRhaW5lZCBpbiBpZiB0aGUgc2VydmVyIG9ubHkKLQkgKiBzdXBwb3J0cyBjb25maWd1cmluZyBFQVIgbW9kdWxlcy4gSWYgdGhlIHNlcnZlciBzdXBwb3J0cyBydW5uaW5nIGEgbW9kdWxlCi0JICogZGlyZWN0bHksIHRoZSByZXR1cm5lZCBhcnJheSBzaG91bGQgY29udGFpbiB0aGUgbW9kdWxlLgotCSAqIAotCSAqIDxwPklmIHRoZSBtb2R1bGUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIG9yCi0JICogYW4gZW1wdHkgYXJyYXkuIElmIHRoZSB0eXBlIGlzIG5vcm1hbGx5IHN1cHBvcnRlZCBidXQgdGhlcmUgaXMgYQotCSAqIGNvbmZpZ3VyYXRpb24gcHJvYmxlbSBvciBtaXNzaW5nIHBhcmVudCwgZXRjLiwgdGhpcyBtZXRob2Qgd2lsbCBmaXJlIGEKLQkgKiBDb3JlRXhjZXB0aW9uIHRoYXQgbWF5IHRoZW4gYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLjwvcD4KLQkgKiAKLQkgKiA8cD5JZiBpdCBkb2VzIHJldHVybiB2YWxpZCBwYXJlbnQocyksIHRoaXMgbWV0aG9kIHdpbGwgYWx3YXlzIHJldHVybgotCSAqIHRoZSB0b3Btb3N0IHBhcmVudCBtb2R1bGUocyksIGV2ZW4gaWYgdGhlcmUgYXJlIGEgZmV3IGxldmVscwotCSAqIChhIGhlaXJhcmNoeSkgb2YgbW9kdWxlcy48L3A+Ci0JICogCi0JICogW2lzc3VlOiBzaG91bGQgdGhlIHBhcmFtZXRlciBiZSBJTW9kdWxlW10/XQotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHBvc3NpYmxlIHJvb3QgbW9kdWxlcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbnl0aGluZyB3ZW50IHdyb25nCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckF0dHJpYnV0ZXMjZ2V0Um9vdE1vZHVsZXMoSU1vZHVsZSwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSU1vZHVsZVtdIGdldFJvb3RNb2R1bGVzKElNb2R1bGUgbW9kdWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgU2VydmVyUG9ydHMgdGhhdCB0aGlzIHNlcnZlciBoYXMuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIncyBwb3J0cwotCSAqLwotCXB1YmxpYyBTZXJ2ZXJQb3J0W10gZ2V0U2VydmVyUG9ydHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgc2VydmVyIHdpdGggZGVmYXVsdCB2YWx1ZXMuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuCi0JICogYSBuZXcgc2VydmVyIGlzIGNyZWF0ZWQgc28gdGhhdCB0aGUgc2VydmVyIGNhbiBiZSBpbml0aWFsaXplZCB3aXRoCi0JICogbWVhbmluZ2Z1bCB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgaW50ZWdlci12YWx1ZWQgYXR0cmlidXRlIG9mIHRoaXMKLQkgKiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZShTdHJpbmcsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBpbnQgdmFsdWUpIHsKLQkJc2VydmVyV0Muc2V0QXR0cmlidXRlKGlkLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBib29sZWFuLXZhbHVlZCBhdHRyaWJ1dGUgb2YgdGhpcwotCSAqIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlKFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXNlcnZlcldDLnNldEF0dHJpYnV0ZShpZCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nLXZhbHVlZCBhdHRyaWJ1dGUgb2YgdGhpcwotCSAqIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlKFN0cmluZywgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgaWQsIFN0cmluZyB2YWx1ZSkgewotCQlzZXJ2ZXJXQy5zZXRBdHRyaWJ1dGUoaWQsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGxpc3QtdmFsdWVkIGF0dHJpYnV0ZSBvZiB0aGlzCi0JICogZWxlbWVudC4gVGhlIGxpc3QgbWF5IG9ubHkgY29udGFpbiBTdHJpbmcgdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZShTdHJpbmcsIExpc3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBpZCwgTGlzdDxTdHJpbmc+IHZhbHVlKSB7Ci0JCXNlcnZlcldDLnNldEF0dHJpYnV0ZShpZCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgbWFwLXZhbHVlZCBhdHRyaWJ1dGUgb2YgdGhpcwotCSAqIGVsZW1lbnQuIFRoZSBtYXAgbWF5IG9ubHkgY29udGFpbiBTdHJpbmcgdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZShTdHJpbmcsIE1hcCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBNYXAgdmFsdWUpIHsKLQkJc2VydmVyV0Muc2V0QXR0cmlidXRlKGlkLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZpZXMgdGhlIGxpc3Qgb2YgbW9kdWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZlci4KLQkgKiBTZWUgdGhlIHNwZWNpZmljYXRpb24gb2YKLQkgKiB7QGxpbmsgSVNlcnZlcldvcmtpbmdDb3B5I21vZGlmeU1vZHVsZXMoSU1vZHVsZVtdLCBJTW9kdWxlW10sIElQcm9ncmVzc01vbml0b3IpfQotCSAqIGZvciBmdXJ0aGVyIGRldGFpbHMuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSB3ZWIgc2VydmVyIGNvcmUgZnJhbWV3b3JrLAotCSAqIGluIHJlc3BvbnNlIHRvIGEgY2FsbCB0byA8Y29kZT5JU2VydmVyV29ya2luZ0NvcHkubW9kaWZ5TW9kdWxlczwvY29kZT4uCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHVwZGF0ZSB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gKGlmIGFueSkKLQkgKiBvciB1cGRhdGUgdGhlIGRlbGVnYXRlcyBpbnRlcm5hbCBzdGF0ZS4gTm90ZSB0aGF0IHRoZSBhY3R1YWwgbGlzdAotCSAqIG9mIG1vZHVsZXMgaXMgc3RvcmVkIG9uIHRoZSBzZXJ2ZXIgYW5kIGNhbiBiZSBhY2Nlc3NlZCBhdCBhbnkgdGltZQotCSAqIHVzaW5nIHNlcnZlci5nZXRNb2R1bGVzKCkuIGdldE1vZHVsZXMoKSB3aWxsIG5vdCBiZSB1cGRhdGVkIHVudGlsCi0JICogYWZ0ZXIgdGhpcyBtZXRob2Qgc3VjY2Vzc2Z1bGx5IHJldHVybnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZlci4gQWZ0ZXIgc2F2aW5nLAotCSAqIHB1Ymxpc2goKSBjYW4gYmUgdXNlZCB0byBzeW5jIHVwIHdpdGggdGhlIHNlcnZlci4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gYWRkIGEgcG9zc2libHktZW1wdHkgbGlzdCBvZiBtb2R1bGVzIHRvIGFkZAotCSAqIEBwYXJhbSByZW1vdmUgYSBwb3NzaWJseS1lbXB0eSBsaXN0IG9mIG1vZHVsZXMgdG8gcmVtb3ZlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgY2hhbmdlcyBhcmUgbm90IGFsbG93ZWQgb3IgY291bGQgbm90Ci0JICogICAgYmUgcHJvY2Vzc2VkCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgbW9kaWZ5TW9kdWxlcyhJTW9kdWxlW10gYWRkLCBJTW9kdWxlW10gcmVtb3ZlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGltcG9ydCB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZ2l2ZW4KLQkgKiBydW50aW1lLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIGEgc2VydmVyIHJ1bnRpbWUKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQGRlcHJlY2F0ZWQgc2hvdWxkIHVzZSBpbXBvcnRSdW50aW1lQ29uZmlndXJhdGlvbiAod2hpY2ggY2FuIHRocm93IGEKLQkgKiAgICBDb3JlRXhjZXB0aW9uKSBpbnN0ZWFkCi0JICovCi0JcHVibGljIHZvaWQgaW1wb3J0Q29uZmlndXJhdGlvbihJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWltcG9ydFJ1bnRpbWVDb25maWd1cmF0aW9uKHJ1bnRpbWUsIG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBpbXBvcnQgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZyb20gdGhlIGdpdmVuCi0JICogcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHNlcnZlciBydW50aW1lCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbnkgcHJvYmxlbSBpbXBvcnRpbmcgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAgICBmcm9tIHRoZSBydW50aW1lCi0JICovCi0JcHVibGljIHZvaWQgaW1wb3J0UnVudGltZUNvbmZpZ3VyYXRpb24oSVJ1bnRpbWUgcnVudGltZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIHNob3VsZCBiZSBzYXZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gc2F2aW5nCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUNvbmZpZ3VyYXRpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZvbGRlciBoYXMgY2hhbmdlZC4KLQkgKiBJdCBnaXZlcyB0aGUgc2VydmVyIGEgY2hhbmNlIHRvIHRocm93IG91dCBhbnkgb2xkIGRhdGEgYW5kIGJlIHJlYWR5IHRvCi0JICogcmVsb2FkIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiB3aGVuIGl0IGlzIG5lZWRlZCBuZXh0LgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25DaGFuZ2VkKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBmZTQxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uLy9hcGlzdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPlNQSSBzdXBwb3J0IGZvciB0aGUgc2VydmVyIHRvb2xzIGZyYW1ld29yay48L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5UaGUgY2xhc3NlcyBpbiB0aGlzIHBhY2thZ2Ugd291bGQgdHlwaWNhbGx5IGJlIGV4dGVuZGVkIG9yIHVzZWQgYnkKLVNQSSBjbGllbnRzIG9mIHRoZSBzZXJ2ZXIgdG9vbHMgZnJhbWV3b3JrIHdobyBhcmUgcHJvdmlkaW5nIGEgbmV3IHNlcnZlcgotdHlwZSwgcnVudGltZSB0eXBlLCBvciBvdGhlciBleHRlbnNpb24uIFRoZXNlIGRlbGVnYXRlcyBhcmUgbmV2ZXIgdmlzaWJsZQotdG8gcmVndWxhciBBUEkgY2xpZW50cyB1bmxlc3MgZXhwbGljaXRseSBleHBvc2VkIGJ5IHRoZSBwcm92aWRlci48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5UaGUgbWFqb3JpdHkgb2YgdGhlc2UgY2xhc3NlcyBhcmUgZGVsZWdhdGVzIHRvIGltcGxlbWVudCBvbmUgb2YgdGhlCi1leHRlbnNpb24gcG9pbnRzLiBWaWV3IHRoZSBleHRlbnNpb24gcG9pbnQgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlcgotZGV0YWlscy48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTMxMjAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotPGhlYWQ+Ci0JPCEtLSAgRXNjYXBlIHRvIHRoZSByb290IG9mIHlvdXIgc291cmNlIGZvbGRlciAgLS0+Ci0JPG1ldGEKLQkJbmFtZT0icm9vdCIKLQkJY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotCTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxhYnN0cmFjdD5TUEkgc3VwcG9ydCBmb3IgdGhlIHNlcnZlciB0b29scyBmcmFtZXdvcmsuPC9hYnN0cmFjdD4KLQotPHA+VGhlIGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIHdvdWxkIHR5cGljYWxseSBiZSBleHRlbmRlZCBvciB1c2VkIGJ5Ci1TUEkgY2xpZW50cyBvZiB0aGUgc2VydmVyIHRvb2xzIGZyYW1ld29yayB3aG8gYXJlIHByb3ZpZGluZyBhIG5ldyBzZXJ2ZXIKLXR5cGUsIHJ1bnRpbWUgdHlwZSwgb3Igb3RoZXIgZXh0ZW5zaW9uLiBUaGVzZSBkZWxlZ2F0ZXMgYXJlIG5ldmVyIHZpc2libGUKLXRvIHJlZ3VsYXIgQVBJIGNsaWVudHMgdW5sZXNzIGV4cGxpY2l0bHkgZXhwb3NlZCBieSB0aGUgcHJvdmlkZXIuPC9wPgotCi08cD5UaGUgbWFqb3JpdHkgb2YgdGhlc2UgY2xhc3NlcyBhcmUgZGVsZWdhdGVzIHRvIGltcGxlbWVudCBvbmUgb2YgdGhlCi1leHRlbnNpb24gcG9pbnRzLiBWaWV3IHRoZSBleHRlbnNpb24gcG9pbnQgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlcgotZGV0YWlscy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNmNkYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8vYXBpc3R5bGVzLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD5UaGUgbWFpbiBzZXJ2ZXIgdG9vbHMgZnJhbWV3b3JrIGNsaWVudCBBUEkuPC9wPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+U2VydmVyQ29yZSBpcyB0aGUgbWFpbiBlbnRyeS1wb2ludCBhbmQgcHJvdmlkZXMgYWNjZXNzIHRvIG1vc3Qgb2YgdGhlCi1yZW1haW5pbmcgQVBJLiBGcm9tIGhlcmUsIHlvdSBjYW4gZ2V0IHRoZSBleGlzdGluZyBzZXJ2ZXIgcnVudGltZXMgYW5kCi1zZXJ2ZXJzLCBnZXQgdGhlIGF2YWlsYWJsZSBzZXJ2ZXIgdHlwZXMsIGFuZCBhY2Nlc3MgaW50ZXJmYWNlcyBmb3IgYWxsCi1leHRlbnNpb24gcG9pbnRzLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPlNlcnZlclV0aWwgcHJvdmlkZXMgdXRpbGl0eSBhbmQgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZGVhbGluZyB3aXRoCi1zZXJ2ZXIgdG9vbHMuIEl0IHByb3ZpZGVzIGVhc3kgYWNjZXNzIHRvIG1vZHVsZXMsIHNlcnZlciBydW50aW1lcywgYW5kCi13aGF0IGNvbWJpbmF0aW9ucyBhcmUgc3VwcG9ydGVkIChlLmcuIHdoaWNoIHJ1bnRpbWVzIGNhbiBiZSB1c2VkIHRvCi10YXJnZXQgYSBwYXJ0aWN1bGFyIHByb2plY3QpLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPklSdW50aW1lIGFuZCBJU2VydmVyIGFyZSB0aGUgdHdvIG1haW4gQVBJIG9iamVjdHMuIElSdW50aW1lIGlzIHVzZWQKLXRvIHRhcmdldCBwcm9qZWN0cyB0byBhIHBhcnRpY3VsYXIgc2VydmVyIGluc3RhbGxhdGlvbiBhbmQgY29tcGlsZS9idWlsZAotYWdhaW5zdCB0aGVtLiBXaGVuIGEgcnVudGltZSBpcyB0YXJnZXR0ZWQgdG8gYSBwYXJ0aWN1bGFyIHJ1bnRpbWUsCi1hbGwgb2YgdGhlIGFwcGxpY2FibGUgSVJ1bnRpbWVUYXJnZXRIYW5kbGVyIGV4dGVuc2lvbnMgYXJlIGNhbGxlZCB0bwotc2V0IHRoZSBjbGFzc3BhdGggb3IgbW9kaWZ5IG90aGVyIHByb2plY3Qgc2V0dGluZ3MgZm9yIHRoZSBydW50aW1lLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPklTZXJ2ZXIgaXMgdGhlIG1haW4gc2VydmVyIGNsYXNzIHRoYXQgY2xpZW50cyBjYW4gdXNlIHRvIHN0YXJ0L3N0b3AKLWFuZCBwdWJsaXNoIHRvIHNlcnZlcnMuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+SU1vZHVsZXMgcHJvdmlkZSB0aGUgImNvbnRlbnQiIHRoYXQgY2FuIGJlIHB1Ymxpc2hlZCB0byBzZXJ2ZXJzLgotU2VlIHRoZSBzZXJ2ZXIgdG9vbHMgQVBJIG92ZXJ2aWV3IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMjU0ZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci08aGVhZD4KLQk8IS0tICBFc2NhcGUgdG8gdGhlIHJvb3Qgb2YgeW91ciBzb3VyY2UgZm9sZGVyICAtLT4KLQk8bWV0YQotCQluYW1lPSJyb290IgotCQljb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0JPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotPGFic3RyYWN0PlRoZSBtYWluIHNlcnZlciB0b29scyBmcmFtZXdvcmsgY2xpZW50IEFQSS48L2Fic3RyYWN0PgotCi08cD5TZXJ2ZXJDb3JlIGlzIHRoZSBtYWluIGVudHJ5LXBvaW50IGFuZCBwcm92aWRlcyBhY2Nlc3MgdG8gbW9zdCBvZiB0aGUKLXJlbWFpbmluZyBBUEkuIEZyb20gaGVyZSwgeW91IGNhbiBnZXQgdGhlIGV4aXN0aW5nIHNlcnZlciBydW50aW1lcyBhbmQKLXNlcnZlcnMsIGdldCB0aGUgYXZhaWxhYmxlIHNlcnZlciB0eXBlcywgYW5kIGFjY2VzcyBpbnRlcmZhY2VzIGZvciBhbGwKLWV4dGVuc2lvbiBwb2ludHMuPC9wPgotCi08cD5TZXJ2ZXJVdGlsIHByb3ZpZGVzIHV0aWxpdHkgYW5kIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGRlYWxpbmcgd2l0aAotc2VydmVyIHRvb2xzLiBJdCBwcm92aWRlcyBlYXN5IGFjY2VzcyB0byBtb2R1bGVzLCBzZXJ2ZXIgcnVudGltZXMsIGFuZAotd2hhdCBjb21iaW5hdGlvbnMgYXJlIHN1cHBvcnRlZCAoZS5nLiB3aGljaCBydW50aW1lcyBjYW4gYmUgdXNlZCB0bwotdGFyZ2V0IGEgcGFydGljdWxhciBwcm9qZWN0KS48L3A+Ci0KLTxwPklSdW50aW1lIGFuZCBJU2VydmVyIGFyZSB0aGUgdHdvIG1haW4gQVBJIG9iamVjdHMuIElSdW50aW1lIGlzIHVzZWQKLXRvIHRhcmdldCBwcm9qZWN0cyB0byBhIHBhcnRpY3VsYXIgc2VydmVyIGluc3RhbGxhdGlvbiBhbmQgY29tcGlsZS9idWlsZAotYWdhaW5zdCB0aGVtLiBXaGVuIGEgcnVudGltZSBpcyB0YXJnZXR0ZWQgdG8gYSBwYXJ0aWN1bGFyIHJ1bnRpbWUsCi1hbGwgb2YgdGhlIGFwcGxpY2FibGUgSVJ1bnRpbWVUYXJnZXRIYW5kbGVyIGV4dGVuc2lvbnMgYXJlIGNhbGxlZCB0bwotc2V0IHRoZSBjbGFzc3BhdGggb3IgbW9kaWZ5IG90aGVyIHByb2plY3Qgc2V0dGluZ3MgZm9yIHRoZSBydW50aW1lLjwvcD4KLQotPHA+SVNlcnZlciBpcyB0aGUgbWFpbiBzZXJ2ZXIgY2xhc3MgdGhhdCBjbGllbnRzIGNhbiB1c2UgdG8gc3RhcnQvc3RvcAotYW5kIHB1Ymxpc2ggdG8gc2VydmVycy48L3A+Ci0KLTxwPklNb2R1bGVzIHByb3ZpZGUgdGhlICJjb250ZW50IiB0aGF0IGNhbiBiZSBwdWJsaXNoZWQgdG8gc2VydmVycy4KLVNlZSB0aGUgc2VydmVyIHRvb2xzIEFQSSBvdmVydmlldyBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL0h0dHBMYXVuY2hhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL0h0dHBMYXVuY2hhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYTEyMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9IdHRwTGF1bmNoYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JVVJMUHJvdmlkZXIyOwotLyoqCi0gKiBBbiBIVFRQIGxhdW5jaGFibGUgb2JqZWN0LiBFbmNhcHN1bGF0ZXMgYSBsYXVuY2ggb2YgYSBVUkwgZm9yIHRoZSBSdW4gb24gU2VydmVyCi0gKiBzdXBwb3J0LgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIdHRwTGF1bmNoYWJsZSB7Ci0JcHJpdmF0ZSBJVVJMUHJvdmlkZXIyIHVybFByb3ZpZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIHNvbWV0aGluZyBhY2Nlc3NpYmxlIHZpYSBIVFRQLgotCSAqIAotCSAqIEBwYXJhbSB1cmwgdGhlIFVSTCB0byB0aGUgb2JqZWN0Ci0JICovCi0JcHVibGljIEh0dHBMYXVuY2hhYmxlKGZpbmFsIFVSTCB1cmwpIHsKLQkJdGhpcy51cmxQcm92aWRlciA9IG5ldyBJVVJMUHJvdmlkZXIyKCkgewotCQkJcHVibGljIFVSTCBnZXRNb2R1bGVSb290VVJMKElNb2R1bGUgbW9kdWxlKXsKLQkJCQlyZXR1cm4gdXJsOwotCQkJfQotCQkJcHVibGljIFVSTCBnZXRMYXVuY2hhYmxlVVJMKCkgewotCQkJCXJldHVybiBnZXRNb2R1bGVSb290VVJMKG51bGwpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBIdHRwTGF1bmNoYWJsZShJVVJMUHJvdmlkZXIyIHVybFByb3ZpZGVyKXsKLQkJdGhpcy51cmxQcm92aWRlciA9IHVybFByb3ZpZGVyOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFVSTCB0byB0aGUgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFVSTCB0byB0aGUgb2JqZWN0Ci0JICovCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7Ci0JCXJldHVybiB1cmxQcm92aWRlci5nZXRMYXVuY2hhYmxlVVJMKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiSHR0cExhdW5jaGFibGVbdXJsUHJvdmlkZXI9IiArIHVybFByb3ZpZGVyICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL0lTdGF0aWNXZWIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvSVN0YXRpY1dlYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzQ3MWE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvSVN0YXRpY1dlYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbDsKLS8qKgotICogQSBzdGF0aWMgV2ViIG1vZHVsZSB0aGF0IGNvdWxkIGJlIGRlcGxveWVkIHRvIEFwYWNoZSBvciBhbm90aGVyCi0gKiBIVFRQIHNlcnZlci4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdGF0aWNXZWIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRleHQgcm9vdCBvZiB0aGUgV2ViLgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFJvb3QoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL01vZHVsZUZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvTW9kdWxlRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjNhNDBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvTW9kdWxlRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZpbGU7Ci0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJTW9kdWxlRmlsZX0gZm9yIHBoeXNpY2FsIGZpbGVzIG9uIGRpc2sgb3IgaW4gdGhlCi0gKiB3b3Jrc3BhY2UuCi0gKgotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlRmlsZSBpbXBsZW1lbnRzIElNb2R1bGVGaWxlIHsKLQlwcml2YXRlIElGaWxlIGZpbGU7Ci0JcHJpdmF0ZSBGaWxlIGZpbGUyOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBJUGF0aCBwYXRoOwotCXByaXZhdGUgbG9uZyBzdGFtcCA9IC0xOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHdvcmtzcGFjZSBtb2R1bGUgZmlsZSB3aXRoIHRoZSBjdXJyZW50IG1vZGlmaWNhdGlvbiBzdGFtcC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZSBhIGZpbGUgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEBwYXJhbSBuYW1lIGEgbmFtZQotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRoZSBmaWxlCi0JICovCi0JcHVibGljIE1vZHVsZUZpbGUoSUZpbGUgZmlsZSwgU3RyaW5nIG5hbWUsIElQYXRoIHBhdGgpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCXN0YW1wID0gZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpICsgZmlsZS5nZXRMb2NhbFRpbWVTdGFtcCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZXh0ZXJuYWwgbW9kdWxlIGZpbGUgd2l0aCB0aGUgY3VycmVudCBtb2RpZmljYXRpb24gc3RhbXAuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBwYXRoCi0JICovCi0JcHVibGljIE1vZHVsZUZpbGUoRmlsZSBmaWxlLCBTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl0aGlzLmZpbGUyID0gZmlsZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJaWYgKGZpbGUyICE9IG51bGwpCi0JCQlzdGFtcCA9IGZpbGUyLmxhc3RNb2RpZmllZCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBtb2R1bGUgZmlsZSB3aXRoIGEgc3BlY2lmaWMgbW9kaWZpY2F0aW9uIHN0YW1wIGFuZCBubwotCSAqIGZpbGUgcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gc3RhbXAKLQkgKi8KLQlwdWJsaWMgTW9kdWxlRmlsZShTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCwgbG9uZyBzdGFtcCkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCQl0aGlzLnN0YW1wID0gc3RhbXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHdvcmtzcGFjZSBtb2R1bGUgZmlsZSB3aXRoIGEgc3BlY2lmaWMgbW9kaWZpY2F0aW9uIHN0YW1wLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBzdGFtcAotCSAqIEBkZXByZWNhdGVkIHVzZSBvbmUgb2YgdGhlIHRvcCB0d28gY29uc3RydWN0b3JzIGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgTW9kdWxlRmlsZShJRmlsZSBmaWxlLCBTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCwgbG9uZyBzdGFtcCkgewotCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCQl0aGlzLnN0YW1wID0gc3RhbXA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGaWxlI2dldE1vZGlmaWNhdGlvblN0YW1wKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpIHsKLQkJcmV0dXJuIHN0YW1wOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2UjZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkgewotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSB0aGlzKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJTW9kdWxlRmlsZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlJTW9kdWxlRmlsZSBtZiA9IChJTW9kdWxlRmlsZSkgb2JqOwotCQlpZiAoIW5hbWUuZXF1YWxzKG1mLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghcGF0aC5lcXVhbHMobWYuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gbmFtZS5oYXNoQ29kZSgpICogMzcgKyBwYXRoLmhhc2hDb2RlKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGNsKSB7Ci0JCWlmIChJRmlsZS5jbGFzcy5lcXVhbHMoY2wpKQotCQkJcmV0dXJuIGZpbGU7Ci0JCWlmIChGaWxlLmNsYXNzLmVxdWFscyhjbCkpCi0JCQlyZXR1cm4gZmlsZTI7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiTW9kdWxlRmlsZSBbIiArIG5hbWUgKyAiLCAiICsgcGF0aCArICIsICIgKyBzdGFtcCArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Nb2R1bGVGb2xkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvTW9kdWxlRm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMDMzNjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Nb2R1bGVGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2U7Ci0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJTW9kdWxlRm9sZGVyfSBmb3IgcGh5c2ljYWwgZm9sZGVycyBvbiBkaXNrIG9yIGluIHRoZQotICogd29ya3NwYWNlLgotICoKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZUZvbGRlciBpbXBsZW1lbnRzIElNb2R1bGVGb2xkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIElNb2R1bGVSZXNvdXJjZVtdIEVNUFRZX1JFU09VUkNFX0FSUkFZID0gbmV3IElNb2R1bGVSZXNvdXJjZVswXTsKLQotCXByaXZhdGUgSUNvbnRhaW5lciBjb250YWluZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIElQYXRoIHBhdGg7Ci0JcHJpdmF0ZSBJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG1vZHVsZSBmb2xkZXIuCi0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lciB0aGUgY29udGFpbmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3IgdW5rbm93biBjb250YWluZXIKLQkgKiBAcGFyYW0gbmFtZSBhIG5hbWUKLQkgKiBAcGFyYW0gcGF0aCB0aGUgbW9kdWxlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGZvbGRlcgotCSAqLwotCXB1YmxpYyBNb2R1bGVGb2xkZXIoSUNvbnRhaW5lciBjb250YWluZXIsIFN0cmluZyBuYW1lLCBJUGF0aCBwYXRoKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1lbWJlcnMgKGNvbnRlbnRzKSBvZiB0aGlzIGZvbGRlci4KLQkgKiAKLQkgKiBAcGFyYW0gbWVtYmVycyB0aGUgbWVtYmVycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lbWJlcnMoSU1vZHVsZVJlc291cmNlW10gbWVtYmVycykgewotCQl0aGlzLm1lbWJlcnMgPSBtZW1iZXJzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2UjZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkgewotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGb2xkZXIjbWVtYmVycygpCi0JICovCi0JcHVibGljIElNb2R1bGVSZXNvdXJjZVtdIG1lbWJlcnMoKSB7Ci0JCWlmIChtZW1iZXJzID09IG51bGwpCi0JCQlyZXR1cm4gRU1QVFlfUkVTT1VSQ0VfQVJSQVk7Ci0JCXJldHVybiBtZW1iZXJzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gdGhpcykKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgTW9kdWxlRm9sZGVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCU1vZHVsZUZvbGRlciBtZiA9IChNb2R1bGVGb2xkZXIpIG9iajsKLQkJaWYgKCFuYW1lLmVxdWFscyhtZi5uYW1lKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFwYXRoLmVxdWFscyhtZi5wYXRoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIG5hbWUuaGFzaENvZGUoKSAqIDM3ICsgcGF0aC5oYXNoQ29kZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBjbCkgewotCQlpZiAoSUNvbnRhaW5lci5jbGFzcy5lcXVhbHMoY2wpIHx8IElGb2xkZXIuY2xhc3MuZXF1YWxzKGNsKSkKLQkJCXJldHVybiBjb250YWluZXI7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiTW9kdWxlRm9sZGVyIFsiICsgbmFtZSArICIsICIgKyBwYXRoICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL051bGxNb2R1bGVBcnRpZmFjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9OdWxsTW9kdWxlQXJ0aWZhY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4MjA4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL051bGxNb2R1bGVBcnRpZmFjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdERlbGVnYXRlOwotLyoqCi0gKiBBIGR1bW15IG1vZHVsZSBhcnRpZmFjdC4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTnVsbE1vZHVsZUFydGlmYWN0IGV4dGVuZHMgTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSB7Ci0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHJlZmVyZW5jZSB0byBhIG1vZHVsZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgTnVsbE1vZHVsZUFydGlmYWN0KElNb2R1bGUgbW9kdWxlKSB7Ci0JCXN1cGVyKG1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGVtcHR5IHJlZmVyZW5jZSB0byBhIG1vZHVsZS4KLQkgKi8KLQlwdWJsaWMgTnVsbE1vZHVsZUFydGlmYWN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVBcnRpZmFjdERlbGVnYXRlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIk51bGxNb2R1bGVBcnRpZmFjdCBbbW9kdWxlPSIgKyBnZXRNb2R1bGUoKSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Qcm9qZWN0TW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1Byb2plY3RNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA2NzY0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1Byb2plY3RNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVEZWxlZ2F0ZTsKLS8qKgotICogQSBzaW1wbGUgSU1vZHVsZVByb2plY3QgdGhhdCBtYXBzIGEgZm9sZGVyIHdpdGhpbiBhIHByb2plY3QKLSAqIChvciB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdCBpdHNlbGYpIHRvIHRoZSBtb2R1bGUuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2plY3RNb2R1bGUgZXh0ZW5kcyBNb2R1bGVEZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHByb2plY3QgbW9kdWxlLgotCSAqLwotCXB1YmxpYyBQcm9qZWN0TW9kdWxlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHByb2plY3QgbW9kdWxlIGluIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIG1vZHVsZQotCSAqLwotCXB1YmxpYyBQcm9qZWN0TW9kdWxlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IHRoYXQgdGhlIG1vZHVsZSBpcyBjb250YWluZWQgaW4uCi0JICogCi0JICogQHJldHVybiB0aGUgcHJvamVjdCB0aGF0IHRoZSBtb2R1bGUgaXMgY29udGFpbmVkIGluCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgLSByZXR1cm5zIHRoZSBtb2R1bGUncyBpZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJLy9yZXR1cm4gZ2V0TW9kdWxlKCkuZ2V0SWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vZHVsZURlbGVnYXRlI3ZhbGlkYXRlKCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCAtIHJldHVybnMgdGhlIG1vZHVsZSdzIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgbW9kdWxlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQkvL3JldHVybiBnZXRNb2R1bGUoKS5nZXROYW1lKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1vZHVsZSBjdXJyZW50bHkgZXhpc3RzLCBhbmQgZmFsc2UgaWYgaXQgaGFzCi0JICogYmVlbiBkZWxldGVkIG9yIG1vdmVkIGFuZCBpcyBubyBsb25nZXIgcmVwcmVzZW50ZWQgYnkgdGhpcyBtb2R1bGUuCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCXJldHVybiAoZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgZ2V0UHJvamVjdCgpLmV4aXN0cygpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBQcm9qZWN0TW9kdWxlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCVByb2plY3RNb2R1bGUgZHAgPSAoUHJvamVjdE1vZHVsZSkgb2JqOwotCQkvL2lmIChnZXRGYWN0b3J5SWQoKSAhPSBudWxsICYmICFnZXRGYWN0b3J5SWQoKS5lcXVhbHMoZHAuZ2V0RmFjdG9yeUlkKCkpKQotCQkvLwlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkgJiYgIXByb2plY3QuZXF1YWxzKGRwLmdldFByb2plY3QoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoZ2V0SWQoKSAhPSBudWxsICYmICFnZXRJZCgpLmVxdWFscyhkcC5nZXRJZCgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoaWxkIG1vZHVsZXMgb2YgdGhpcyBtb2R1bGUuCi0JICoKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNoaWxkIG1vZHVsZXMKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG1vZHVsZSBoYXMgYSBzaW1wbGUgc3RydWN0dXJlIGJhc2VkIG9uIGEKLQkgKiBzaW5nbGUgcm9vdCBmb2xkZXIsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIDxwPgotCSAqIEluIGEgc2luZ2xlIHJvb3Qgc3RydWN0dXJlLCBhbGwgZmlsZXMgdGhhdCBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGUgcm9vdCBmb2xkZXIKLQkgKiBhcmUgcGFydCBvZiB0aGUgbW9kdWxlLCBhbmQgYXJlIGFscmVhZHkgaW4gdGhlIGNvcnJlY3QgbW9kdWxlIHN0cnVjdHVyZS4gTm8KLQkgKiBtb2R1bGUgcmVzb3VyY2VzIGV4aXN0IG91dHNpZGUgb2YgdGhpcyBzaW5nbGUgZm9sZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbW9kdWxlIGhhcyBhIHNpbmdsZSByb290IHN0cnVjdHVyZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2luZ2xlUm9vdFN0cnVjdHVyZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEJhc2ljIGltcGxlbWVudGF0aW9uIG9mIG1lbWJlcnMoKSBtZXRob2QuIEFzc3VtZXMgdGhhdCB0aGUgZW50aXJlIHByb2plY3Qgc2hvdWxkCi0JICogYmUgcHVibGlzaGVkIHRvIGEgc2VydmVyLgotCSAqIAotCSAqIEBzZWUgTW9kdWxlRGVsZWdhdGUjbWVtYmVycygpCi0JICovCi0JcHVibGljIElNb2R1bGVSZXNvdXJjZVtdIG1lbWJlcnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRNb2R1bGVSZXNvdXJjZXMoUGF0aC5FTVBUWSwgZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1vZHVsZSByZXNvdXJjZXMgZm9yIGEgZ2l2ZW4gcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKiBAcGFyYW0gY29udGFpbmVyIGEgY29udGFpbmVyCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBtb2R1bGUgcmVzb3VyY2VzCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZVtdIGdldE1vZHVsZVJlc291cmNlcyhJUGF0aCBwYXRoLCBJQ29udGFpbmVyIGNvbnRhaW5lcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBjb250YWluZXIubWVtYmVycygpOwotCQlpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcmVzb3VyY2VzLmxlbmd0aDsKLQkJCUxpc3Q8SU1vZHVsZVJlc291cmNlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlUmVzb3VyY2U+KHNpemUpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV07Ci0JCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7Ci0JCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJCUlDb250YWluZXIgY29udGFpbmVyMiA9IChJQ29udGFpbmVyKSByZXNvdXJjZTsKLQkJCQkJCU1vZHVsZUZvbGRlciBtZiA9IG5ldyBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTW9kdWxlRm9sZGVyKGNvbnRhaW5lcjIsIG5hbWUsIHBhdGgpOwotCQkJCQkJbWYuc2V0TWVtYmVycyhnZXRNb2R1bGVSZXNvdXJjZXMocGF0aC5hcHBlbmQobmFtZSksIGNvbnRhaW5lcjIpKTsKLQkJCQkJCWxpc3QuYWRkKG1mKTsKLQkJCQkJfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCQlsaXN0LmFkZChuZXcgTW9kdWxlRmlsZSgoSUZpbGUpIHJlc291cmNlLCBuYW1lLCBwYXRoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlJTW9kdWxlUmVzb3VyY2VbXSBtb2R1bGVSZXNvdXJjZXMgPSBuZXcgSU1vZHVsZVJlc291cmNlW2xpc3Quc2l6ZSgpXTsKLQkJCWxpc3QudG9BcnJheShtb2R1bGVSZXNvdXJjZXMpOwotCQkJcmV0dXJuIG1vZHVsZVJlc291cmNlczsKLQkJfQotCQlyZXR1cm4gbmV3IElNb2R1bGVSZXNvdXJjZVswXTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1Byb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjVjMTExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5Nb2R1bGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVGYWN0b3J5RGVsZWdhdGU7Ci0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBkZWZpbmluZyBhIG1vZHVsZSBmYWN0b3J5IHRoYXQgcHJvdmlkZXMgbW9kdWxlcwotICogYmFzZWQgb24gcHJvamVjdHMuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgZXh0ZW5kcyBNb2R1bGVGYWN0b3J5RGVsZWdhdGUgewotCXByaXZhdGUgTWFwPElQcm9qZWN0LCBJTW9kdWxlW10+IG1vZHVsZXMgPSBuZXcgSGFzaE1hcDxJUHJvamVjdCwgSU1vZHVsZVtdPigpOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUuCi0JICovCi0JcHVibGljIFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FjaGUgbW9kdWxlcyB0aGF0IGV4aXN0IGluIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdCB0byBjYWNoZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcml2YXRlIGZpbmFsIElNb2R1bGVbXSBjYWNoZU1vZHVsZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsIHx8ICFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJTW9kdWxlW10gbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltID0gbW9kdWxlcy5nZXQocHJvamVjdCk7Ci0JCQlpZiAobSAhPSBudWxsKQotCQkJCXJldHVybiBtOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJCi0JCXRyeSB7Ci0JCQltID0gY3JlYXRlTW9kdWxlcyhwcm9qZWN0KTsKLQkJCWlmIChtICE9IG51bGwpIHsKLQkJCQltb2R1bGVzLnB1dChwcm9qZWN0LCBtKTsKLQkJCQlyZXR1cm4gbTsKLQkJCX0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgY3JlYXRpbmcgbW9kdWxlIiwgdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBJTW9kdWxlWzBdOwotCX0KLQotCS8qKgotCSAqIENhY2hlIGFsbCBleGlzdGluZyBtb2R1bGVzLgotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBjYWNoZU1vZHVsZXMoKSB7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdFtdIHByb2plY3RzID0gZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3RzKCk7Ci0JCQlpbnQgc2l6ZSA9IHByb2plY3RzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKHByb2plY3RzW2ldLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCWJvb2xlYW4gY2FjaGUgPSB0cnVlOwotCQkJCQl0cnkgewotCQkJCQkJT2JqZWN0IG8gPSBtb2R1bGVzLmdldChwcm9qZWN0c1tpXSk7Ci0JCQkJCQlpZiAobyAhPSBudWxsKQotCQkJCQkJCWNhY2hlID0gZmFsc2U7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKGNhY2hlKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUlNb2R1bGVbXSBtb2R1bGVzMiA9IGNyZWF0ZU1vZHVsZXMocHJvamVjdHNbaV0pOwotCQkJCQkJCWlmIChtb2R1bGVzMiAhPSBudWxsKQotCQkJCQkJCQltb2R1bGVzLnB1dChwcm9qZWN0c1tpXSwgbW9kdWxlczIpOwotCQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjcmVhdGluZyBtb2R1bGUgZm9yICIgKyBwcm9qZWN0c1tpXS5nZXROYW1lKCksCi0JCQkJCQkJCQkJdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjYWNoaW5nIG1vZHVsZXMiLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSByb290LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHdvcmtzcGFjZSByb290Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSVdvcmtzcGFjZVJvb3QgZ2V0V29ya3NwYWNlUm9vdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSNnZXRNb2R1bGVzKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgSU1vZHVsZVtdIGdldE1vZHVsZXMoKSB7Ci0JCWNhY2hlTW9kdWxlcygpOwotCQkKLQkJTGlzdDxJTW9kdWxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQlJdGVyYXRvciBpdGVyID0gbW9kdWxlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlNb2R1bGVbXSBtID0gKElNb2R1bGVbXSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAobSAhPSBudWxsKQotCQkJCWxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QobSkpOwotCQl9Ci0JCQotCQlJTW9kdWxlW10gbW9kdWxlczIgPSBuZXcgSU1vZHVsZVtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShtb2R1bGVzMik7Ci0JCXJldHVybiBtb2R1bGVzMjsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgY2hhbmdlcyB0byBhIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0Ci0JICogQHBhcmFtIGRlbHRhIGEgcmVzb3VyY2UgZGVsdGEKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIHZvaWQgaGFuZGxlR2xvYmFsUHJvamVjdENoYW5nZShJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlNb2R1bGVGYWN0b3J5W10gZmFjdG9yaWVzID0gU2VydmVyUGx1Z2luLmdldE1vZHVsZUZhY3RvcmllcygpOwotCQlpbnQgc2l6ZSA9IGZhY3Rvcmllcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoZmFjdG9yaWVzW2ldLmRlbGVnYXRlICE9IG51bGwgJiYgZmFjdG9yaWVzW2ldLmRlbGVnYXRlIGluc3RhbmNlb2YgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSkgewotCQkJCVByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgcG1mZCA9IChQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlKSBmYWN0b3JpZXNbaV0uZGVsZWdhdGU7Ci0JCQkJaWYgKHBtZmQuZGVsdGFBZmZlY3RzTW9kdWxlcyhkZWx0YSkpIHsKLQkJCQkJcG1mZC5jbGVhckNhY2hlKHByb2plY3QpOwotCQkJCQlwbWZkLmNsZWFyQ2FjaGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkZWx0YSBtYXkgaGF2ZSBjaGFuZ2VkIG1vZHVsZXMsCi0JICogYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHBhcmFtIGRlbHRhIGEgcmVzb3VyY2UgZGVsdGEKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkZWx0YSBtYXkgaGF2ZSBjaGFuZ2VkIG1vZHVsZXMsCi0JICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZGVsdGFBZmZlY3RzTW9kdWxlcyhJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlmaW5hbCBib29sZWFuW10gYiA9IG5ldyBib29sZWFuWzFdOwotCQkKLQkJZmluYWwgSVBhdGhbXSBsaXN0ZW5lclBhdGhzID0gZ2V0TGlzdGVuZXJQYXRocygpOwotCQlpZiAobGlzdGVuZXJQYXRocyA9PSBudWxsIHx8IGxpc3RlbmVyUGF0aHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZpbmFsIGludCBzaXplID0gbGlzdGVuZXJQYXRocy5sZW5ndGg7Ci0JCQotCQl0cnkgewotCQkJZGVsdGEuYWNjZXB0KG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCWlmIChiWzBdKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkvL1RyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgZGVsdGEyLmdldFJlc291cmNlKCkgKyAiICAiICsgZGVsdGEyLmdldEtpbmQoKSArICIgIiArIGRlbHRhMi5nZXRGbGFncygpKTsKLQkJCQkJYm9vbGVhbiBvayA9IGZhbHNlOwotCQkJCQlJUGF0aCBwYXRoID0gZGVsdGEyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCWlmIChsaXN0ZW5lclBhdGhzW2ldLmVxdWFscyhwYXRoKSkgewotCQkJCQkJCWJbMF0gPSB0cnVlOwotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0gZWxzZSBpZiAocGF0aC5pc1ByZWZpeE9mKGxpc3RlbmVyUGF0aHNbaV0pKSB7Ci0JCQkJCQkJb2sgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBvazsKLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCS8vVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiRGVsdGEgY29udGFpbnMgY2hhbmdlOiAiICsgdC5iKTsKLQkJcmV0dXJuIGJbMF07Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgY2FjaGVkIG1ldGFkYXRhLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2NsZWFyQ2FjaGUoSVByb2plY3QpfSBpbnN0ZWFkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJDYWNoZSgpIHsKLQkJLy8gaWdub3JlCi0JfQotCi0JLyoqCi0JICogQ2xlYXIgY2FjaGVkIG1ldGFkYXRhLgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckNhY2hlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJbW9kdWxlcyA9IG5ldyBIYXNoTWFwPElQcm9qZWN0LCBJTW9kdWxlW10+KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbW9kdWxlIGZvciBhIGdpdmVuIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0IHRvIGNyZWF0ZSBtb2R1bGVzIGZvcgotCSAqIEByZXR1cm4gYSBtb2R1bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIHdhcyBubyBtb2R1bGUgaW4gdGhlIHByb2plY3QKLQkgKiBAc2VlICNjcmVhdGVNb2R1bGVzKElQcm9qZWN0KQotCSAqIEBkZXByZWNhdGVkIFVzZSBjcmVhdGVNb2R1bGVzKElQcm9qZWN0KSBpbnN0ZWFkLCB3aGljaCBzdXBwb3J0cyBtdWx0aXBsZSBtb2R1bGVzCi0JICogICAgcGVyIHByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgSU1vZHVsZSBjcmVhdGVNb2R1bGUoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtb2R1bGVzIHRoYXQgYXJlIGNvbnRhaW5lZCB3aXRoaW4gYSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdCB0byBjcmVhdGUgbW9kdWxlcyBmb3IKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgbW9kdWxlcwotCSAqLwotCXByb3RlY3RlZCBJTW9kdWxlW10gY3JlYXRlTW9kdWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlNb2R1bGUgbW9kdWxlID0gY3JlYXRlTW9kdWxlKHByb2plY3QpOwotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElNb2R1bGVbMF07Ci0JCQotCQlyZXR1cm4gbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIHRoYXQgdGhlIG1vZHVsZSBzaG91bGQgbGlzdGVuIHRvCi0JICogZm9yIHN0YXRlIGNoYW5nZXMuIFRoZSBwYXRocyBzaG91bGQgYmUgcHJvamVjdCByZWxhdGl2ZSBwYXRocy4KLQkgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZSBwYXRocy4KLQkgKgotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBwYXRocwotCSAqLwotCXByb3RlY3RlZCBJUGF0aFtdIGdldExpc3RlbmVyUGF0aHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVGYWN0b3J5RGVsZWdhdGUjZ2V0TW9kdWxlcyhJUHJvamVjdCkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGNhY2hlTW9kdWxlcyhwcm9qZWN0KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlRmFjdG9yeURlbGVnYXRlI2ZpbmRNb2R1bGUoU3RyaW5nKQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZSBmaW5kTW9kdWxlKFN0cmluZyBpZCkgewotCQl0cnkgewotCQkJSVBhdGggcGF0aFRvUHJvamVjdCA9IG5ldyBQYXRoKG51bGwsIGlkKTsKLQkJCWlmIChwYXRoVG9Qcm9qZWN0LnNlZ21lbnRDb3VudCgpID09IDEpIHsKLQkJCQkvLyBvbmx5IGxvb2sgZm9yIHByb2plY3RzIHdoaWNoIG1lYW5zIHRoZXJlIHNob3VsZCBvbmx5IGJlIDEgc2VnbWVudCBpbiB0aGUgcGF0aAotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChpZCk7Ci0JCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCQlJTW9kdWxlW10gbSA9IGNhY2hlTW9kdWxlcyhwcm9qZWN0KTsKLQkJCQkJaWYgKG0gIT0gbnVsbCkgewotCQkJCQkJaW50IHNpemUgPSBtLmxlbmd0aDsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQkJU3RyaW5nIGlkMiA9IG1baV0uZ2V0SWQoKTsKLQkJCQkJCQlpbnQgaW5kZXggPSBpZDIuaW5kZXhPZigiOiIpOwotCQkJCQkJCWlmIChpbmRleCA+PSAwKQotCQkJCQkJCQlpZDIgPSBpZDIuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0KLQkJCQkJCQlpZiAoaWQuZXF1YWxzKGlkMikpCi0JCQkJCQkJCXJldHVybiBtW2ldOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLkZJTkVSKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVSLCAiQ291bGQgbm90IGZpbmQgIiArIGlkICsgIi4gUmV2ZXJ0aW5nIHRvIGRlZmF1bHQgYmVoYXZpb3VyIiwgZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBvdGhlcndpc2UgZGVmYXVsdCB0byBzZWFyY2hpbmcgYWxsIG1vZHVsZXMKLQkJcmV0dXJuIHN1cGVyLmZpbmRNb2R1bGUoaWQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1B1Ymxpc2hBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1B1Ymxpc2hBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NjQ2N2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9QdWJsaXNoQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUHVibGlzaExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBIZWxwZXIgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyB0aGUgSVB1Ymxpc2hMaXN0ZW5lciBpbnRlcmZhY2UKLSAqIHdpdGggZW1wdHkgbWV0aG9kcy4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVB1Ymxpc2hMaXN0ZW5lcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaEFkYXB0ZXIgaW1wbGVtZW50cyBJUHVibGlzaExpc3RlbmVyIHsKLQkvKioKLQkgKiBAc2VlIElQdWJsaXNoTGlzdGVuZXIjcHVibGlzaFN0YXJ0ZWQoSVNlcnZlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdWJsaXNoU3RhcnRlZChJU2VydmVyIHNlcnZlcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQHNlZSBJUHVibGlzaExpc3RlbmVyI3B1Ymxpc2hGaW5pc2hlZChJU2VydmVyLCBJU3RhdHVzKQotCSAqLwotCXB1YmxpYyB2b2lkIHB1Ymxpc2hGaW5pc2hlZChJU2VydmVyIHNlcnZlciwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1B1Ymxpc2hIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUHVibGlzaEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2M0NjAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUHVibGlzaEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5Qcm9ncmVzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlRGVsdGE7Ci0vKioKLSAqIFV0aWxpdHkgY2xhc3Mgd2l0aCBhbiBhc3NvcnRtZW50IG9mIHVzZWZ1bCBwdWJsaXNoaW5nIGZpbGUgbWV0aG9kcy4KLSAqCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoSGVscGVyIHsKLQkvLyBzaXplIG9mIHRoZSBidWZmZXIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSID0gNjU1MzY7Ci0KLQkvLyB0aGUgYnVmZmVyCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW0JVRkZFUl07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJU3RhdHVzW10gRU1QVFlfU1RBVFVTID0gbmV3IElTdGF0dXNbMF07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlIGRlZmF1bHRUZW1wRGlyID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLnRvRmlsZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBGSUxFX1BSRUZJWCA9ICJ0bXAiOwotCi0JcHJpdmF0ZSBGaWxlIHRlbXBEaXI7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgUHVibGlzaEhlbHBlci4KLQkgKiAKLQkgKiBAcGFyYW0gdGVtcERpcmVjdG9yeSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gdXNlIGR1cmluZyBwdWJsaXNoaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgIHRvIHVzZSB0aGUgZGVmYXVsdC4gSWYgaXQgZG9lcyBub3QgZXhpc3QsIHRoZSBmb2xkZXIgd2lsbCBiZSBjcmVhdGVkCi0JICovCi0JcHVibGljIFB1Ymxpc2hIZWxwZXIoRmlsZSB0ZW1wRGlyZWN0b3J5KSB7Ci0JCXRoaXMudGVtcERpciA9IHRlbXBEaXJlY3Rvcnk7Ci0JCWlmICh0ZW1wRGlyID09IG51bGwpCi0JCQl0ZW1wRGlyID0gZGVmYXVsdFRlbXBEaXI7Ci0JCWVsc2UgaWYgKCF0ZW1wRGlyLmV4aXN0cygpKQotCQkJdGVtcERpci5ta2RpcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGEgZmlsZSBmcm9tIGEgdG8gYi4gQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0gYWZ0ZXIgdXNlLgotCSAqIAotCSAqIEBwYXJhbSBpbiBhbiBpbnB1dCBzdHJlYW0KLQkgKiBAcGFyYW0gdG8gYSBwYXRoIHRvIGNvcHkgdG8uIHRoZSBkaXJlY3RvcnkgbXVzdCBhbHJlYWR5IGV4aXN0Ci0JICogQHBhcmFtIHRzIHRpbWVzdGFtcAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvcHlGaWxlKElucHV0U3RyZWFtIGluLCBJUGF0aCB0bywgbG9uZyB0cywgSU1vZHVsZUZpbGUgbWYpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0JCQotCQlGaWxlIHRlbXBGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUZpbGUgZmlsZSA9IHRvLnRvRmlsZSgpOwotCQkJdGVtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKFRFTVBGSUxFX1BSRUZJWCwgIi4iICsgdG8uZ2V0RmlsZUV4dGVuc2lvbigpLCB0ZW1wRGlyKTsKLQkJCQotCQkJb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEZpbGUpOwotCQkJCi0JCQlpbnQgYXZhaWwgPSBpbi5yZWFkKGJ1Zik7Ci0JCQl3aGlsZSAoYXZhaWwgPiAwKSB7Ci0JCQkJb3V0LndyaXRlKGJ1ZiwgMCwgYXZhaWwpOwotCQkJCWF2YWlsID0gaW4ucmVhZChidWYpOwotCQkJfQotCQkJCi0JCQlvdXQuY2xvc2UoKTsKLQkJCW91dCA9IG51bGw7Ci0JCQkKLQkJCW1vdmVUZW1wRmlsZSh0ZW1wRmlsZSwgZmlsZSk7Ci0JCQkKLQkJCWlmICh0cyAhPSBJUmVzb3VyY2UuTlVMTF9TVEFNUCAmJiB0cyAhPSAwKQotCQkJCWZpbGUuc2V0TGFzdE1vZGlmaWVkKHRzKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJSVBhdGggcGF0aCA9IG1mLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpLmFwcGVuZChtZi5nZXROYW1lKCkpOwotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjb3B5aW5nIGZpbGU6ICIgKyBwYXRoLnRvT1NTdHJpbmcoKSArICIgdG8gIiArIHRvLnRvT1NTdHJpbmcoKSwKLQkJCQkJCWUpOwotCQkJfQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvcHlpbmdGaWxlLCBwYXRoLnRvT1NTdHJpbmcoKSwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpLCBudWxsKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodGVtcEZpbGUgIT0gbnVsbCAmJiB0ZW1wRmlsZS5leGlzdHMoKSkKLQkJCQl0ZW1wRmlsZS5kZWxldGVPbkV4aXQoKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJaWYgKG91dCAhPSBudWxsKQotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdG8gcmVjdXJzaXZlbHkgZGVsZXRlIGEgZGlyZWN0b3J5LgotCSAqCi0JICogQHBhcmFtIGRpciBhIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzW10gZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKCFkaXIuZXhpc3RzKCkgfHwgIWRpci5pc0RpcmVjdG9yeSgpKQotCQkJcmV0dXJuIG5ldyBJU3RhdHVzW10geyBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yTm90QURpcmVjdG9yeSwgZGlyLmdldEFic29sdXRlUGF0aCgpKSwgbnVsbCkgfTsKLQkJCi0JCUxpc3Q8SVN0YXR1cz4gc3RhdHVzID0gbmV3IEFycmF5TGlzdDxJU3RhdHVzPigyKTsKLQkJCi0JCXRyeSB7Ci0JCQlGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7Ci0JCQlpbnQgc2l6ZSA9IGZpbGVzLmxlbmd0aDsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0aW5nVGFzaywgbmV3IFN0cmluZ1tdIHsgZGlyLmdldEFic29sdXRlUGF0aCgpIH0pLCBzaXplICogMTApOwotCQkJCi0JCQkvLyBjeWNsZSB0aHJvdWdoIGZpbGVzCi0JCQlib29sZWFuIGRlbGV0ZUN1cnJlbnQgPSB0cnVlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlGaWxlIGN1cnJlbnQgPSBmaWxlc1tpXTsKLQkJCQlpZiAoY3VycmVudC5pc0ZpbGUoKSkgewotCQkJCQlpZiAoIWN1cnJlbnQuZGVsZXRlKCkpIHsKLQkJCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckRlbGV0aW5nLCBmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSksIG51bGwpKTsKLQkJCQkJCWRlbGV0ZUN1cnJlbnQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQltb25pdG9yLndvcmtlZCgxMCk7Ci0JCQkJfSBlbHNlIGlmIChjdXJyZW50LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0aW5nVGFzaywgbmV3IFN0cmluZ1tdIHtjdXJyZW50LmdldEFic29sdXRlUGF0aCgpfSkpOwotCQkJCQlJU3RhdHVzW10gc3RhdCA9IGRlbGV0ZURpcmVjdG9yeShjdXJyZW50LCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMCkpOwotCQkJCQlpZiAoc3RhdCAhPSBudWxsICYmIHN0YXQubGVuZ3RoID4gMCkgewotCQkJCQkJZGVsZXRlQ3VycmVudCA9IGZhbHNlOwotCQkJCQkJYWRkQXJyYXlUb0xpc3Qoc3RhdHVzLCBzdGF0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChkZWxldGVDdXJyZW50ICYmICFkaXIuZGVsZXRlKCkpCi0JCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yRGVsZXRpbmcsIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSksIG51bGwpKTsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBkZWxldGluZyBkaXJlY3RvcnkgIiArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSwgZSk7Ci0JCQl9Ci0JCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIG51bGwpKTsKLQkJfQotCQkKLQkJSVN0YXR1c1tdIHN0YXQgPSBuZXcgSVN0YXR1c1tzdGF0dXMuc2l6ZSgpXTsKLQkJc3RhdHVzLnRvQXJyYXkoc3RhdCk7Ci0JCXJldHVybiBzdGF0OwotCX0KLQotCS8qKgotCSAqIFNtYXJ0IGNvcHkgdGhlIGdpdmVuIG1vZHVsZSByZXNvdXJjZXMgdG8gdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcyBhbiBhcnJheSBvZiBtb2R1bGUgcmVzb3VyY2VzCi0JICogQHBhcmFtIHBhdGggYW4gZXh0ZXJuYWwgcGF0aCB0byBjb3B5IHRvCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMgCi0JICovCi0JcHVibGljIElTdGF0dXNbXSBwdWJsaXNoU21hcnQoSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIHB1Ymxpc2hTbWFydChyZXNvdXJjZXMsIHBhdGgsIG51bGwsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFNtYXJ0IGNvcHkgdGhlIGdpdmVuIG1vZHVsZSByZXNvdXJjZXMgdG8gdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcyBhbiBhcnJheSBvZiBtb2R1bGUgcmVzb3VyY2VzCi0JICogQHBhcmFtIHBhdGggYW4gZXh0ZXJuYWwgcGF0aCB0byBjb3B5IHRvCi0JICogQHBhcmFtIGlnbm9yZSBhbiBhcnJheSBvZiBwYXRocyByZWxhdGl2ZSB0byBwYXRoIHRvIGlnbm9yZSwgaS5lLiBub3QgZGVsZXRlIG9yIGNvcHkgb3ZlcgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzIAotCSAqLwotCXB1YmxpYyBJU3RhdHVzW10gcHVibGlzaFNtYXJ0KElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggcGF0aCwgSVBhdGhbXSBpZ25vcmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocmVzb3VyY2VzID09IG51bGwpCi0JCQlyZXR1cm4gRU1QVFlfU1RBVFVTOwotCQkKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkKLQkJTGlzdDxJU3RhdHVzPiBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0PElTdGF0dXM+KDIpOwotCQlGaWxlIHRvRGlyID0gcGF0aC50b0ZpbGUoKTsKLQkJaW50IGZyb21TaXplID0gcmVzb3VyY2VzLmxlbmd0aDsKLQkJU3RyaW5nW10gZnJvbUZpbGVOYW1lcyA9IG5ldyBTdHJpbmdbZnJvbVNpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZyb21TaXplOyBpKyspCi0JCQlmcm9tRmlsZU5hbWVzW2ldID0gcmVzb3VyY2VzW2ldLmdldE5hbWUoKTsKLQkJTGlzdDxTdHJpbmc+IGlnbm9yZUZpbGVOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpZiAoaWdub3JlICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaWdub3JlLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGlnbm9yZVtpXS5zZWdtZW50Q291bnQoKSA9PSAxKSB7Ci0JCQkJCWlnbm9yZUZpbGVOYW1lcy5hZGQoaWdub3JlW2ldLnRvT1NTdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLwljYWNoZSBmaWxlcyBhbmQgZmlsZSBuYW1lcyBmb3IgcGVyZm9ybWFuY2UKLQkJRmlsZVtdIHRvRmlsZXMgPSBudWxsOwotCQlTdHJpbmdbXSB0b0ZpbGVOYW1lcyA9IG51bGw7Ci0JCQotCQlib29sZWFuIGZvdW5kRXhpc3RpbmdEaXIgPSBmYWxzZTsKLQkJaWYgKHRvRGlyLmV4aXN0cygpKSB7Ci0JCQlpZiAodG9EaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJCWZvdW5kRXhpc3RpbmdEaXIgPSB0cnVlOwotCQkJCXRvRmlsZXMgPSB0b0Rpci5saXN0RmlsZXMoKTsKLQkJCQlpbnQgdG9TaXplID0gdG9GaWxlcy5sZW5ndGg7Ci0JCQkJdG9GaWxlTmFtZXMgPSBuZXcgU3RyaW5nW3RvU2l6ZV07Ci0JCQkJCi0JCQkJLy8gY2hlY2sgaWYgdGhpcyBleGFjdCBmaWxlIGV4aXN0cyBpbiB0aGUgbmV3IGRpcmVjdG9yeQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9TaXplOyBpKyspIHsKLQkJCQkJdG9GaWxlTmFtZXNbaV0gPSB0b0ZpbGVzW2ldLmdldE5hbWUoKTsKLQkJCQkJYm9vbGVhbiBpc0RpciA9IHRvRmlsZXNbaV0uaXNEaXJlY3RvcnkoKTsKLQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZyb21TaXplOyBqKyspIHsKLQkJCQkJCWlmICh0b0ZpbGVOYW1lc1tpXS5lcXVhbHMoZnJvbUZpbGVOYW1lc1tqXSkgJiYgaXNEaXIgPT0gcmVzb3VyY2VzW2pdIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikgewotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gZGVsZXRlIGZpbGUgaWYgaXQgY2FuJ3QgYmUgZm91bmQgb3IgaXNuJ3QgdGhlIGNvcnJlY3QgdHlwZQotCQkJCQlpZiAoIWZvdW5kKSB7Ci0JCQkJCQlib29sZWFuIGRlbGV0ZSA9IHRydWU7Ci0JCQkJCQkvLyBpZiBzaG91bGQgYmUgcHJlc2VydmVkLCBkb24ndCBkZWxldGUgYW5kIGRvbid0IHRyeSB0byBjb3B5Ci0JCQkJCQlmb3IgKFN0cmluZyBwcmVzZXJ2ZUZpbGVOYW1lIDogaWdub3JlRmlsZU5hbWVzKSB7Ci0JCQkJCQkJaWYgKHRvRmlsZU5hbWVzW2ldLmVxdWFscyhwcmVzZXJ2ZUZpbGVOYW1lKSkgewotCQkJCQkJCQlkZWxldGUgPSBmYWxzZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGRlbGV0ZSkgewotCQkJCQkJCWlmIChpc0RpcikgewotCQkJCQkJCQlJU3RhdHVzW10gc3RhdCA9IGRlbGV0ZURpcmVjdG9yeSh0b0ZpbGVzW2ldLCBudWxsKTsKLQkJCQkJCQkJYWRkQXJyYXlUb0xpc3Qoc3RhdHVzLCBzdGF0KTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAoIXRvRmlsZXNbaV0uZGVsZXRlKCkpCi0JCQkJCQkJCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JEZWxldGluZywgdG9GaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSksIG51bGwpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQl0b0ZpbGVzW2ldID0gbnVsbDsKLQkJCQkJCXRvRmlsZU5hbWVzW2ldID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7IC8vaWYgKHRvRGlyLmlzRmlsZSgpKQotCQkJCWlmICghdG9EaXIuZGVsZXRlKCkpIHsKLQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yRGVsZXRpbmcsIHRvRGlyLmdldEFic29sdXRlUGF0aCgpKSwgbnVsbCkpOwotCQkJCQlJU3RhdHVzW10gc3RhdCA9IG5ldyBJU3RhdHVzW3N0YXR1cy5zaXplKCldOwotCQkJCQlzdGF0dXMudG9BcnJheShzdGF0KTsKLQkJCQkJcmV0dXJuIHN0YXQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghZm91bmRFeGlzdGluZ0RpciAmJiAhdG9EaXIubWtkaXJzKCkpIHsKLQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvck1rZGlyLCB0b0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSksIG51bGwpKTsKLQkJCUlTdGF0dXNbXSBzdGF0ID0gbmV3IElTdGF0dXNbc3RhdHVzLnNpemUoKV07Ci0JCQlzdGF0dXMudG9BcnJheShzdGF0KTsKLQkJCXJldHVybiBzdGF0OwotCQl9Ci0JCQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm4gbmV3IElTdGF0dXNbXSB7IFN0YXR1cy5DQU5DRUxfU1RBVFVTIH07Ci0JCQotCQltb25pdG9yLndvcmtlZCg1MCk7Ci0JCQotCQkvLyBjeWNsZSB0aHJvdWdoIGZpbGVzIGFuZCBvbmx5IGNvcHkgd2hlbiBpdCBkb2Vzbid0IGV4aXN0Ci0JCS8vIG9yIGlzIG5ld2VyCi0JCWlmICh0b0ZpbGVzID09IG51bGwpIHsKLQkJCXRvRmlsZXMgPSB0b0Rpci5saXN0RmlsZXMoKTsKLQkJCWlmICh0b0ZpbGVzID09IG51bGwpCi0JCQkJdG9GaWxlcyA9IG5ldyBGaWxlWzBdOwotCQl9Ci0JCWludCB0b1NpemUgPSB0b0ZpbGVzLmxlbmd0aDsKLQkJCi0JCWludCBkdyA9IDA7Ci0JCWlmICh0b1NpemUgPiAwKQotCQkJZHcgPSA1MDAgLyB0b1NpemU7Ci0JCQotCQkvLyBjYWNoZSBmaWxlIG5hbWVzIGFuZCBsYXN0IG1vZGlmaWVkIGRhdGVzIGZvciBwZXJmb3JtYW5jZQotCQlpZiAodG9GaWxlTmFtZXMgPT0gbnVsbCkKLQkJCXRvRmlsZU5hbWVzID0gbmV3IFN0cmluZ1t0b1NpemVdOwotCQlsb25nW10gdG9GaWxlTW9kID0gbmV3IGxvbmdbdG9TaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b1NpemU7IGkrKykgewotCQkJaWYgKHRvRmlsZXNbaV0gIT0gbnVsbCkgewotCQkJCWlmICh0b0ZpbGVOYW1lc1tpXSAhPSBudWxsKQotCQkJCQl0b0ZpbGVOYW1lc1tpXSA9IHRvRmlsZXNbaV0uZ2V0TmFtZSgpOwotCQkJCXRvRmlsZU1vZFtpXSA9IHRvRmlsZXNbaV0ubGFzdE1vZGlmaWVkKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnJvbVNpemU7IGkrKykgewotCQkJSU1vZHVsZVJlc291cmNlIGN1cnJlbnQgPSByZXNvdXJjZXNbaV07Ci0JCQlTdHJpbmcgbmFtZSA9IGZyb21GaWxlTmFtZXNbaV07Ci0JCQlib29sZWFuIGN1cnJlbnRJc0RpciA9IGN1cnJlbnQgaW5zdGFuY2VvZiBJTW9kdWxlRm9sZGVyOwotCQkJCi0JCQlpZiAoIWN1cnJlbnRJc0RpcikgewotCQkJCS8vIGNoZWNrIGlmIHRoaXMgaXMgYSBuZXcgb3IgbmV3ZXIgZmlsZQotCQkJCWJvb2xlYW4gY29weSA9IHRydWU7Ci0JCQkJSU1vZHVsZUZpbGUgbWYgPSAoSU1vZHVsZUZpbGUpIGN1cnJlbnQ7Ci0JCQkJCi0JCQkJbG9uZyBtb2QgPSAtMTsKLQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBtZi5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCW1vZCA9IGZpbGUuZ2V0TG9jYWxUaW1lU3RhbXAoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlGaWxlIGZpbGUyID0gKEZpbGUpIG1mLmdldEFkYXB0ZXIoRmlsZS5jbGFzcyk7Ci0JCQkJCW1vZCA9IGZpbGUyLmxhc3RNb2RpZmllZCgpOwotCQkJCX0KLQkJCQkKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHRvU2l6ZTsgaisrKSB7Ci0JCQkJCWlmIChuYW1lLmVxdWFscyh0b0ZpbGVOYW1lc1tqXSkgJiYgbW9kID09IHRvRmlsZU1vZFtqXSkgewotCQkJCQkJY29weSA9IGZhbHNlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGNvcHkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNvcHlGaWxlKG1mLCBwYXRoLmFwcGVuZChuYW1lKSk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJCXN0YXR1cy5hZGQoY2UuZ2V0U3RhdHVzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCW1vbml0b3Iud29ya2VkKGR3KTsKLQkJCX0gZWxzZSB7IC8vaWYgKGN1cnJlbnRJc0RpcikgewotCQkJCUlNb2R1bGVGb2xkZXIgZm9sZGVyID0gKElNb2R1bGVGb2xkZXIpIGN1cnJlbnQ7Ci0JCQkJSU1vZHVsZVJlc291cmNlW10gY2hpbGRyZW4gPSBmb2xkZXIubWVtYmVycygpOwotCi0JCQkJLy8gYnVpbGQgYXJyYXkgb2YgaWdub3JlZCBQYXRocyB0aGF0IGFwcGx5IHRvIHRoaXMgZm9sZGVyCi0JCQkJSVBhdGhbXSBpZ25vcmVDaGlsZHJlbiA9IG51bGw7Ci0JCQkJaWYgKGlnbm9yZSAhPSBudWxsKSB7Ci0JCQkJCUxpc3Q8SVBhdGg+IGlnbm9yZUNoaWxkUGF0aHMgPSBuZXcgQXJyYXlMaXN0PElQYXRoPigpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGlnbm9yZS5sZW5ndGg7IGorKykgewotCQkJCQkJSVBhdGggcHJlc2VydmVQYXRoID0gaWdub3JlW2pdOwotCQkJCQkJaWYgKHByZXNlcnZlUGF0aC5zZWdtZW50KDApLmVxdWFscyhuYW1lKSkgewotCQkJCQkJCWlnbm9yZUNoaWxkUGF0aHMuYWRkKHByZXNlcnZlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoaWdub3JlQ2hpbGRQYXRocy5zaXplKCkgPiAwKQotCQkJCQkJaWdub3JlQ2hpbGRyZW4gPSBpZ25vcmVDaGlsZFBhdGhzLnRvQXJyYXkobmV3IFBhdGhbaWdub3JlQ2hpbGRQYXRocy5zaXplKCldKTsKLQkJCQl9Ci0JCQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmNvcHlpbmdUYXNrLCBuZXcgU3RyaW5nW10ge25hbWUsIG5hbWV9KSk7Ci0JCQkJSVN0YXR1c1tdIHN0YXQgPSBwdWJsaXNoU21hcnQoY2hpbGRyZW4sIHBhdGguYXBwZW5kKG5hbWUpLCBpZ25vcmVDaGlsZHJlbiwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgZHcpKTsKLQkJCQlhZGRBcnJheVRvTGlzdChzdGF0dXMsIHN0YXQpOwotCQkJfQotCQl9Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybiBuZXcgSVN0YXR1c1tdIHsgU3RhdHVzLkNBTkNFTF9TVEFUVVMgfTsKLQkJCi0JCW1vbml0b3Iud29ya2VkKDUwMCAtIGR3ICogdG9TaXplKTsKLQkJbW9uaXRvci5kb25lKCk7Ci0JCQotCQlJU3RhdHVzW10gc3RhdCA9IG5ldyBJU3RhdHVzW3N0YXR1cy5zaXplKCldOwotCQlzdGF0dXMudG9BcnJheShzdGF0KTsKLQkJcmV0dXJuIHN0YXQ7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGEgZGVsdGEgcHVibGlzaC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEgYSBtb2R1bGUgcmVzb3VyY2UgZGVsdGEKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBwdWJsaXNoIHRvCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1c1tdIHB1Ymxpc2hEZWx0YShJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGRlbHRhLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQlyZXR1cm4gRU1QVFlfU1RBVFVTOwotCQkKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkKLQkJTGlzdDxJU3RhdHVzPiBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0PElTdGF0dXM+KDIpOwotCQlpbnQgc2l6ZTIgPSBkZWx0YS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTI7IGkrKykgewotCQkJSVN0YXR1c1tdIHN0YXQgPSBwdWJsaXNoRGVsdGEoZGVsdGFbaV0sIHBhdGgsIG1vbml0b3IpOwotCQkJYWRkQXJyYXlUb0xpc3Qoc3RhdHVzLCBzdGF0KTsKLQkJfQotCQkKLQkJSVN0YXR1c1tdIHN0YXQgPSBuZXcgSVN0YXR1c1tzdGF0dXMuc2l6ZSgpXTsKLQkJc3RhdHVzLnRvQXJyYXkoc3RhdCk7Ci0JCXJldHVybiBzdGF0OwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBhIGRlbHRhIHB1Ymxpc2guCi0JICogCi0JICogQHBhcmFtIGRlbHRhIGEgbW9kdWxlIHJlc291cmNlIGRlbHRhCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gcHVibGlzaCB0bwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzCi0JICovCi0JcHVibGljIElTdGF0dXNbXSBwdWJsaXNoRGVsdGEoSU1vZHVsZVJlc291cmNlRGVsdGEgZGVsdGEsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlMaXN0PElTdGF0dXM+IHN0YXR1cyA9IG5ldyBBcnJheUxpc3Q8SVN0YXR1cz4oMik7Ci0JCQotCQlJTW9kdWxlUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRNb2R1bGVSZXNvdXJjZSgpOwotCQlpbnQga2luZDIgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCQotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJTW9kdWxlRmlsZSkgewotCQkJSU1vZHVsZUZpbGUgZmlsZSA9IChJTW9kdWxlRmlsZSkgcmVzb3VyY2U7Ci0JCQl0cnkgewotCQkJCWlmIChraW5kMiA9PSBJTW9kdWxlUmVzb3VyY2VEZWx0YS5SRU1PVkVEKQotCQkJCQlkZWxldGVGaWxlKHBhdGgsIGZpbGUpOwotCQkJCWVsc2UgewotCQkJCQlJUGF0aCBwYXRoMiA9IHBhdGguYXBwZW5kKGZpbGUuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkpLmFwcGVuZChmaWxlLmdldE5hbWUoKSk7Ci0JCQkJCUZpbGUgZiA9IHBhdGgyLnRvRmlsZSgpLmdldFBhcmVudEZpbGUoKTsKLQkJCQkJaWYgKCFmLmV4aXN0cygpKQotCQkJCQkJZi5ta2RpcnMoKTsKLQkJCQkJCi0JCQkJCWNvcHlGaWxlKGZpbGUsIHBhdGgyKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJc3RhdHVzLmFkZChjZS5nZXRTdGF0dXMoKSk7Ci0JCQl9Ci0JCQlJU3RhdHVzW10gc3RhdCA9IG5ldyBJU3RhdHVzW3N0YXR1cy5zaXplKCldOwotCQkJc3RhdHVzLnRvQXJyYXkoc3RhdCk7Ci0JCQlyZXR1cm4gc3RhdDsKLQkJfQotCQkKLQkJaWYgKGtpbmQyID09IElNb2R1bGVSZXNvdXJjZURlbHRhLkFEREVEKSB7Ci0JCQlJUGF0aCBwYXRoMiA9IHBhdGguYXBwZW5kKHJlc291cmNlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpKS5hcHBlbmQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCUZpbGUgZmlsZSA9IHBhdGgyLnRvRmlsZSgpOwotCQkJaWYgKCFmaWxlLmV4aXN0cygpICYmICFmaWxlLm1rZGlycygpKSB7Ci0JCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yTWtkaXIsIHBhdGgyKSwgbnVsbCkpOwotCQkJCUlTdGF0dXNbXSBzdGF0ID0gbmV3IElTdGF0dXNbc3RhdHVzLnNpemUoKV07Ci0JCQkJc3RhdHVzLnRvQXJyYXkoc3RhdCk7Ci0JCQkJcmV0dXJuIHN0YXQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlNb2R1bGVSZXNvdXJjZURlbHRhW10gY2hpbGREZWx0YXMgPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCWludCBzaXplID0gY2hpbGREZWx0YXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVN0YXR1c1tdIHN0YXQgPSBwdWJsaXNoRGVsdGEoY2hpbGREZWx0YXNbaV0sIHBhdGgsIG1vbml0b3IpOwotCQkJYWRkQXJyYXlUb0xpc3Qoc3RhdHVzLCBzdGF0KTsKLQkJfQotCQkKLQkJaWYgKGtpbmQyID09IElNb2R1bGVSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCUlQYXRoIHBhdGgyID0gcGF0aC5hcHBlbmQocmVzb3VyY2UuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkpLmFwcGVuZChyZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJRmlsZSBmaWxlID0gcGF0aDIudG9GaWxlKCk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSAmJiAhZmlsZS5kZWxldGUoKSkgewotCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckRlbGV0aW5nLCBwYXRoMiksIG51bGwpKTsKLQkJCX0KLQkJfQotCQkKLQkJSVN0YXR1c1tdIHN0YXQgPSBuZXcgSVN0YXR1c1tzdGF0dXMuc2l6ZSgpXTsKLQkJc3RhdHVzLnRvQXJyYXkoc3RhdCk7Ci0JCXJldHVybiBzdGF0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZGVsZXRlRmlsZShJUGF0aCBwYXRoLCBJTW9kdWxlRmlsZSBmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChUcmFjZS5QVUJMSVNISU5HKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfUFVCTElTSElORywgIkRlbGV0aW5nOiAiICsgZmlsZS5nZXROYW1lKCkgKyAiIGZyb20gIiArIHBhdGgudG9TdHJpbmcoKSk7Ci0JCX0KLQkJSVBhdGggcGF0aDIgPSBwYXRoLmFwcGVuZChmaWxlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpKS5hcHBlbmQoZmlsZS5nZXROYW1lKCkpOwotCQlpZiAocGF0aDIudG9GaWxlKCkuZXhpc3RzKCkgJiYgIXBhdGgyLnRvRmlsZSgpLmRlbGV0ZSgpKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckRlbGV0aW5nLCBwYXRoMiksIG51bGwpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29weUZpbGUoSU1vZHVsZUZpbGUgbWYsIElQYXRoIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKFRyYWNlLlBVQkxJU0hJTkcpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19QVUJMSVNISU5HLCAiQ29weWluZzogIiArIG1mLmdldE5hbWUoKSArICIgdG8gIiArIHBhdGgudG9TdHJpbmcoKSk7Ci0JCX0KLQkJCi0JCWlmKCFpc0NvcHlGaWxlKG1mLCBwYXRoKSl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlGaWxlIGZpbGUgPSAoSUZpbGUpIG1mLmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJY29weUZpbGUoZmlsZS5nZXRDb250ZW50cygpLCBwYXRoLCBmaWxlLmdldExvY2FsVGltZVN0YW1wKCksIG1mKTsKLQkJZWxzZSB7Ci0JCQlGaWxlIGZpbGUyID0gKEZpbGUpIG1mLmdldEFkYXB0ZXIoRmlsZS5jbGFzcyk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlMik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclJlYWRpbmcsIGZpbGUyLmdldEFic29sdXRlUGF0aCgpKSwgZSkpOwotCQkJfQotCQkJY29weUZpbGUoaW4sIHBhdGgsIGZpbGUyLmxhc3RNb2RpZmllZCgpLCBtZik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPGNvZGUvPiBpZiB0aGUgbW9kdWxlIGZpbGUgc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24sIDxjb2RlPmZhbHNlPC9jb2RyZT4gb3RoZXJ3aXNlLgotCSAqIEBwYXJhbSBtb2R1bGVGaWxlIHRoZSBtb2R1bGUgZmlsZQotCSAqIEBwYXJhbSB0b1BhdGggZGVzdGluYXRpb24uCi0JICogQHJldHVybiA8Y29kZT50cnVlPGNvZGUvPiwgaWYgdGhlIG1vZHVsZSBmaWxlIHNob3VsZCBiZSBjb3BpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvcHlGaWxlKElNb2R1bGVGaWxlIG1vZHVsZUZpbGUsIElQYXRoIHRvUGF0aCl7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFB1Ymxpc2ggdGhlIGdpdmVuIG1vZHVsZSByZXNvdXJjZXMgdG8gdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcyBhbiBhcnJheSBvZiBtb2R1bGUgcmVzb3VyY2VzCi0JICogQHBhcmFtIHBhdGggYSBwYXRoIHRvIHB1Ymxpc2ggdG8KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cwotCSAqLwotCXB1YmxpYyBJU3RhdHVzW10gcHVibGlzaEZ1bGwoSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHJlc291cmNlcyA9PSBudWxsKQotCQkJcmV0dXJuIEVNUFRZX1NUQVRVUzsKLQkJCi0JCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCi0JCUxpc3Q8SVN0YXR1cz4gc3RhdHVzID0gbmV3IEFycmF5TGlzdDxJU3RhdHVzPigyKTsKLQkJaW50IHNpemUgPSByZXNvdXJjZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVN0YXR1c1tdIHN0YXQgPSBjb3B5KHJlc291cmNlc1tpXSwgcGF0aCwgbW9uaXRvcik7Ci0JCQlhZGRBcnJheVRvTGlzdChzdGF0dXMsIHN0YXQpOwotCQl9Ci0JCQotCQlJU3RhdHVzW10gc3RhdCA9IG5ldyBJU3RhdHVzW3N0YXR1cy5zaXplKCldOwotCQlzdGF0dXMudG9BcnJheShzdGF0KTsKLQkJcmV0dXJuIHN0YXQ7Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzW10gY29weShJTW9kdWxlUmVzb3VyY2UgcmVzb3VyY2UsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTdHJpbmcgbmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKLQkJaWYgKFRyYWNlLlBVQkxJU0hJTkcpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19QVUJMSVNISU5HLCAiQ29weWluZzogIiArIG5hbWUgKyAiIHRvICIgKyBwYXRoLnRvU3RyaW5nKCkpOwotCQl9Ci0JCUxpc3Q8SVN0YXR1cz4gc3RhdHVzID0gbmV3IEFycmF5TGlzdDxJU3RhdHVzPigyKTsKLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikgewotCQkJSU1vZHVsZUZvbGRlciBmb2xkZXIgPSAoSU1vZHVsZUZvbGRlcikgcmVzb3VyY2U7Ci0JCQlJU3RhdHVzW10gc3RhdCA9IHB1Ymxpc2hGdWxsKGZvbGRlci5tZW1iZXJzKCksIHBhdGgsIG1vbml0b3IpOwotCQkJYWRkQXJyYXlUb0xpc3Qoc3RhdHVzLCBzdGF0KTsKLQkJfSBlbHNlIHsKLQkJCUlNb2R1bGVGaWxlIG1mID0gKElNb2R1bGVGaWxlKSByZXNvdXJjZTsKLQkJCXBhdGggPSBwYXRoLmFwcGVuZChtZi5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSkuYXBwZW5kKG5hbWUpOwotCQkJRmlsZSBmID0gcGF0aC50b0ZpbGUoKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlpZiAoIWYuZXhpc3RzKCkpCi0JCQkJZi5ta2RpcnMoKTsKLQkJCXRyeSB7Ci0JCQkJY29weUZpbGUobWYsIHBhdGgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCXN0YXR1cy5hZGQoY2UuZ2V0U3RhdHVzKCkpOwotCQkJfQotCQl9Ci0JCUlTdGF0dXNbXSBzdGF0ID0gbmV3IElTdGF0dXNbc3RhdHVzLnNpemUoKV07Ci0JCXN0YXR1cy50b0FycmF5KHN0YXQpOwotCQlyZXR1cm4gc3RhdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHppcCBmaWxlIGNvbnRhaW5pbmcgdGhlIGdpdmVuIG1vZHVsZSByZXNvdXJjZXMuIERlbGV0ZXMgdGhlIGV4aXN0aW5nIGZpbGUKLQkgKiAoYW5kIGRvZXNuJ3QgY3JlYXRlIGEgbmV3IG9uZSkgaWYgcmVzb3VyY2VzIGlzIG51bGwgb3IgZW1wdHkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcyBhbiBhcnJheSBvZiBtb2R1bGUgcmVzb3VyY2VzCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggd2hlcmUgdGhlIHppcCBmaWxlIHNob3VsZCBiZSBjcmVhdGVkIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzCi0JICovCi0JcHVibGljIElTdGF0dXNbXSBwdWJsaXNoWmlwKElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChyZXNvdXJjZXMgPT0gbnVsbCB8fCByZXNvdXJjZXMubGVuZ3RoID09IDApIHsKLQkJCS8vIHNob3VsZCBhbHNvIGNoZWNrIGlmIHJlc291cmNlcyBjb25zaXN0cyBvZiBhbGwgZW1wdHkgZGlyZWN0b3JpZXMKLQkJCUZpbGUgZmlsZSA9IHBhdGgudG9GaWxlKCk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQlmaWxlLmRlbGV0ZSgpOwotCQkJcmV0dXJuIEVNUFRZX1NUQVRVUzsKLQkJfQotCQkKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkKLQkJRmlsZSB0ZW1wRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSBwYXRoLnRvRmlsZSgpOwotCQkJdGVtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKFRFTVBGSUxFX1BSRUZJWCwgIi4iICsgcGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCksIHRlbXBEaXIpOwotCQkJCi0JCQlCdWZmZXJlZE91dHB1dFN0cmVhbSBib3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKSk7Ci0JCQlaaXBPdXRwdXRTdHJlYW0gem91dCA9IG5ldyBaaXBPdXRwdXRTdHJlYW0oYm91dCk7Ci0JCQlhZGRaaXBFbnRyaWVzKHpvdXQsIHJlc291cmNlcyk7Ci0JCQl6b3V0LmNsb3NlKCk7Ci0JCQkKLQkJCW1vdmVUZW1wRmlsZSh0ZW1wRmlsZSwgZmlsZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ldyBJU3RhdHVzW10geyBlLmdldFN0YXR1cygpIH07Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIHppcHBpbmciLCBlKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgU3RhdHVzW10geyBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ3JlYXRpbmdaaXBGaWxlLCBwYXRoLmxhc3RTZWdtZW50KCksIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKSwgZSkgfTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0ZW1wRmlsZSAhPSBudWxsICYmIHRlbXBGaWxlLmV4aXN0cygpKQotCQkJCXRlbXBGaWxlLmRlbGV0ZU9uRXhpdCgpOwotCQl9Ci0JCXJldHVybiBFTVBUWV9TVEFUVVM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRaaXBFbnRyaWVzKFppcE91dHB1dFN0cmVhbSB6b3V0LCBJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAocmVzb3VyY2VzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpbnQgc2l6ZSA9IHJlc291cmNlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAocmVzb3VyY2VzW2ldIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikgewotCQkJCUlNb2R1bGVGb2xkZXIgbWYgPSAoSU1vZHVsZUZvbGRlcikgcmVzb3VyY2VzW2ldOwotCQkJCUlNb2R1bGVSZXNvdXJjZVtdIHJlcyA9IG1mLm1lbWJlcnMoKTsKLQkJCQkKLQkJCQlJUGF0aCBwYXRoID0gbWYuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkuYXBwZW5kKG1mLmdldE5hbWUoKSk7Ci0JCQkJU3RyaW5nIGVudHJ5UGF0aCA9IHBhdGgudG9Qb3J0YWJsZVN0cmluZygpOwotCQkJCWlmICghZW50cnlQYXRoLmVuZHNXaXRoKCIvIikpCi0JCQkJCWVudHJ5UGF0aCArPSAnLyc7Ci0JCQkJCi0JCQkJWmlwRW50cnkgemUgPSBuZXcgWmlwRW50cnkoZW50cnlQYXRoKTsKLQkJCQkKLQkJCQlsb25nIHRzID0gMDsKLQkJCQlJQ29udGFpbmVyIGZvbGRlciA9IChJQ29udGFpbmVyKSBtZi5nZXRBZGFwdGVyKElDb250YWluZXIuY2xhc3MpOwotCQkJCWlmIChmb2xkZXIgIT0gbnVsbCkKLQkJCQkJdHMgPSBmb2xkZXIuZ2V0TG9jYWxUaW1lU3RhbXAoKTsKLQkJCQkKLQkJCQlpZiAodHMgIT0gSVJlc291cmNlLk5VTExfU1RBTVAgJiYgdHMgIT0gMCkKLQkJCQkJemUuc2V0VGltZSh0cyk7Ci0JCQkJCi0JCQkJem91dC5wdXROZXh0RW50cnkoemUpOwotCQkJCXpvdXQuY2xvc2VFbnRyeSgpOwotCQkJCQotCQkJCWFkZFppcEVudHJpZXMoem91dCwgcmVzKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJSU1vZHVsZUZpbGUgbWYgPSAoSU1vZHVsZUZpbGUpIHJlc291cmNlc1tpXTsKLQkJCUlQYXRoIHBhdGggPSBtZi5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS5hcHBlbmQobWYuZ2V0TmFtZSgpKTsKLQkJCQotCQkJWmlwRW50cnkgemUgPSBuZXcgWmlwRW50cnkocGF0aC50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQkJCi0JCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQlsb25nIHRzID0gMDsKLQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIG1mLmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCXRzID0gZmlsZS5nZXRMb2NhbFRpbWVTdGFtcCgpOwotCQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJfSBlbHNlIHsKLQkJCQlGaWxlIGZpbGUyID0gKEZpbGUpIG1mLmdldEFkYXB0ZXIoRmlsZS5jbGFzcyk7Ci0JCQkJdHMgPSBmaWxlMi5sYXN0TW9kaWZpZWQoKTsKLQkJCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZTIpOwotCQkJfQotCQkJCi0JCQlpZiAodHMgIT0gSVJlc291cmNlLk5VTExfU1RBTVAgJiYgdHMgIT0gMCkKLQkJCQl6ZS5zZXRUaW1lKHRzKTsKLQkJCQotCQkJem91dC5wdXROZXh0RW50cnkoemUpOwotCQkJCi0JCQl0cnkgewotCQkJCWludCBuID0gMDsKLQkJCQl3aGlsZSAobiA+IC0xKSB7Ci0JCQkJCW4gPSBpbi5yZWFkKGJ1Zik7Ci0JCQkJCWlmIChuID4gMCkKLQkJCQkJCXpvdXQud3JpdGUoYnVmLCAwLCBuKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWluLmNsb3NlKCk7Ci0JCQl9Ci0JCQkKLQkJCXpvdXQuY2xvc2VFbnRyeSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWNjZXB0cyBhbiBJTW9kdWxlUmVzb3VyY2UgYXJyYXkgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gY29udGFpbiBhIHNpbmdsZQotCSAqIElNb2R1bGVGaWxlIHJlc291cmNlIGFuZCBjb3BpZXMgaXQgdG8gdGhlIHNwZWNpZmllZCBwYXRoLCB3aGljaCBzaG91bGQKLQkgKiBpbmNsdWRlIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHdyaXRlLiAgSWYgdGhlIGFycmF5IGNvbnRhaW5zIG1vcmUgdGhhbgotCSAqIGEgc2luZ2xlIHJlc291cmNlIG9yIHRoZSByZXNvdXJjZSBpcyBub3QgYW4gSU1vZHVsZUZpbGUgcmVzb3VyY2UsIHRoZQotCSAqIGZpbGUgaXMgbm90IGNyZWF0ZWQuICBDdXJyZW50bHkgbm8gZXJyb3IgaXMgcmV0dXJuZWQsIGJ1dCBlcnJvciBoYW5kbGluZwotCSAqIGlzIHJlY29tbWVuZGVkIHNpbmNlIHRoYXQgaXMgZXhwZWN0ZWQgdG8gY2hhbmdlIGluIHRoZSBmdXR1cmUuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcyBhbiBhcnJheSBjb250YWluaW5nIGEgc2luZ2xlIElNb2R1bGVGaWxlIHJlc291cmNlCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgsIGluY2x1ZGluZyBmaWxlIG5hbWUsIHdoZXJlIHRoZSBmaWxlIHNob3VsZCBiZSBjcmVhdGVkCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1c1tdIHB1Ymxpc2hUb1BhdGgoSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHJlc291cmNlcyA9PSBudWxsIHx8IHJlc291cmNlcy5sZW5ndGggPT0gMCkgewotCQkJLy8gc2hvdWxkIGFsc28gY2hlY2sgaWYgcmVzb3VyY2VzIGNvbnNpc3RzIG9mIGFsbCBlbXB0eSBkaXJlY3RvcmllcwotCQkJRmlsZSBmaWxlID0gcGF0aC50b0ZpbGUoKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCWZpbGUuZGVsZXRlKCk7Ci0JCQlyZXR1cm4gRU1QVFlfU1RBVFVTOwotCQl9Ci0JCQotCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0KLQkJaWYgKHJlc291cmNlcy5sZW5ndGggPT0gMSAmJiByZXNvdXJjZXNbMF0gaW5zdGFuY2VvZiBJTW9kdWxlRmlsZSkgewotCQkJdHJ5IHsKLQkJCQljb3B5RmlsZSgoSU1vZHVsZUZpbGUpIHJlc291cmNlc1swXSwgcGF0aCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG5ldyBJU3RhdHVzW10geyBlLmdldFN0YXR1cygpIH07Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gRU1QVFlfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIG1vdmUgYSB0ZW1wIGZpbGUgaW50byBwb3NpdGlvbiBieSBkZWxldGluZyB0aGUgb3JpZ2luYWwgYW5kCi0JICogc3dhcHBpbmcgaW4gYSBuZXcgY29weS4KLQkgKiAgCi0JICogQHBhcmFtIHRlbXBGaWxlCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgbW92ZVRlbXBGaWxlKEZpbGUgdGVtcEZpbGUsIEZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJaWYgKCFzYWZlRGVsZXRlKGZpbGUsIDIpKSB7Ci0JCQkJLy8gYXR0ZW1wdCB0byByZXdyaXRlIGFuIGV4aXN0aW5nIGZpbGUgd2l0aCB0aGUgdGVtcEZpbGUgY29udGVudHMgaWYKLQkJCQkvLyB0aGUgZXhpc3RpbmcgZmlsZSBjYW4ndCBiZSBkZWxldGVkIHRvIHBlcm1pdCB0aGUgbW92ZQotCQkJCXRyeSB7Ci0JCQkJCUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0ZW1wRmlsZSk7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gY29weUZpbGUoaW4sIGZpbGUuZ2V0UGF0aCgpKTsKLQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQlNdWx0aVN0YXR1cyBzdGF0dXMyID0gbmV3IE11bHRpU3RhdHVzKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yRGVsZXRpbmcsIGZpbGUudG9TdHJpbmcoKSksIG51bGwpOwotCQkJCQkJc3RhdHVzMi5hZGQoc3RhdHVzKTsKLQkJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1czIpOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBzaG91bGRuJ3Qgb2NjdXIKLQkJCQl9IGZpbmFsbHkgewotCQkJCQl0ZW1wRmlsZS5kZWxldGUoKTsKLQkJCQl9Ci0JCQkJLyppZiAoIXNhZmVEZWxldGUoZmlsZSwgOCkpIHsKLQkJCQkJdGVtcEZpbGUuZGVsZXRlKCk7Ci0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JEZWxldGluZywgZmlsZS50b1N0cmluZygpKSwgbnVsbCkpOwotCQkJCX0qLwotCQkJfQotCQl9Ci0JCWlmICghc2FmZVJlbmFtZSh0ZW1wRmlsZSwgZmlsZSwgMTApKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclJlbmFtZSwgdGVtcEZpbGUudG9TdHJpbmcoKSksIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGEgZmlsZSBmcm9tIGEgdG8gYi4gQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0gYWZ0ZXIgdXNlLgotCSAqCi0JICogQHBhcmFtIGluIGFuIElucHV0U3RyZWFtCi0JICogQHBhcmFtIHRvIHRoZSBmaWxlIHRvIGNvcHkgdG8KLQkgKiBAcmV0dXJuIGEgc3RhdHVzCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIGNvcHlGaWxlKElucHV0U3RyZWFtIGluLCBTdHJpbmcgdG8pIHsKLQkJT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0JCQotCQl0cnkgewotCQkJb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG8pOwotCQkJCi0JCQlpbnQgYXZhaWwgPSBpbi5yZWFkKGJ1Zik7Ci0JCQl3aGlsZSAoYXZhaWwgPiAwKSB7Ci0JCQkJb3V0LndyaXRlKGJ1ZiwgMCwgYXZhaWwpOwotCQkJCWF2YWlsID0gaW4ucmVhZChidWYpOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGNvcHlpbmcgZmlsZSIsIGUpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3B5aW5nRmlsZSwgbmV3IFN0cmluZ1tdIHt0bywgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQl0cnkgewotCQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNhZmUgZGVsZXRlLiBUcmllcyB0byBkZWxldGUgbXVsdGlwbGUgdGltZXMgYmVmb3JlIGdpdmluZyB1cC4KLQkgKiAKLQkgKiBAcGFyYW0gZgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgc3VjY2VlZHMsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNhZmVEZWxldGUoRmlsZSBmLCBpbnQgcmV0cnlzKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXdoaWxlIChjb3VudCA8IHJldHJ5cykgewotCQkJaWYgKCFmLmV4aXN0cygpKQotCQkJCXJldHVybiB0cnVlOwotCQkJCi0JCQlmLmRlbGV0ZSgpOwotCQkJCi0JCQlpZiAoIWYuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkKLQkJCWNvdW50Kys7Ci0JCQkvLyBkZWxheSBpZiB3ZSBhcmUgZ29pbmcgdG8gdHJ5IGFnYWluCi0JCQlpZiAoY291bnQgPCByZXRyeXMpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNhZmUgcmVuYW1lLiBXaWxsIHRyeSBtdWx0aXBsZSB0aW1lcyBiZWZvcmUgZ2l2aW5nIHVwLgotCSAqIAotCSAqIEBwYXJhbSBmcm9tCi0JICogQHBhcmFtIHRvCi0JICogQHBhcmFtIHJldHJ5cyBudW1iZXIgb2YgdGltZXMgdG8gcmV0cnkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IHN1Y2NlZWRzLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzYWZlUmVuYW1lKEZpbGUgZnJvbSwgRmlsZSB0bywgaW50IHJldHJ5cykgewotCQkvLyBtYWtlIHN1cmUgcGFyZW50IGRpciBleGlzdHMKLQkJRmlsZSBkaXIgPSB0by5nZXRQYXJlbnRGaWxlKCk7Ci0JCWlmIChkaXIgIT0gbnVsbCAmJiAhZGlyLmV4aXN0cygpKQotCQkJZGlyLm1rZGlycygpOwotCQkKLQkJaW50IGNvdW50ID0gMDsKLQkJd2hpbGUgKGNvdW50IDwgcmV0cnlzKSB7Ci0JCQlpZiAoZnJvbS5yZW5hbWVUbyh0bykpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkKLQkJCWNvdW50Kys7Ci0JCQkvLyBkZWxheSBpZiB3ZSBhcmUgZ29pbmcgdG8gdHJ5IGFnYWluCi0JCQlpZiAoY291bnQgPCByZXRyeXMpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkQXJyYXlUb0xpc3QoTGlzdDxJU3RhdHVzPiBsaXN0LCBJU3RhdHVzW10gYSkgewotCQlpZiAobGlzdCA9PSBudWxsIHx8IGEgPT0gbnVsbCB8fCBhLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQkKLQkJaW50IHNpemUgPSBhLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQlsaXN0LmFkZChhW2ldKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9QdWJsaXNoVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9QdWJsaXNoVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjE4NzNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUHVibGlzaFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlRGVsdGE7Ci0vKioKLSAqIFV0aWxpdHkgY2xhc3Mgd2l0aCBhbiBhc3NvcnRtZW50IG9mIHVzZWZ1bCBmaWxlIG1ldGhvZHMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxsIGl0cyBmdW5jdGlvbmFsaXR5IHRocm91Z2ggc3RhdGljIG1lbWJlcnMuCi0gKiBJdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvciBpbnN0YW50aWF0ZWQuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQdWJsaXNoVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgUHVibGlzaEhlbHBlciBwdWJsaXNoSGVscGVyID0gbmV3IFB1Ymxpc2hIZWxwZXIobnVsbCk7Ci0KLQkvKioKLQkgKiBQdWJsaXNoVXRpbCBjYW5ub3QgYmUgY3JlYXRlZC4gVXNlIHN0YXRpYyBtZXRob2RzLgotCSAqLwotCXByaXZhdGUgUHVibGlzaFV0aWwoKSB7Ci0JCS8vIGNhbid0IGNyZWF0ZQotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIHJlY3Vyc2l2ZWx5IGRlbGV0ZSBhIGRpcmVjdG9yeS4KLQkgKgotCSAqIEBwYXJhbSBkaXIgYSBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1c1tdIGRlbGV0ZURpcmVjdG9yeShGaWxlIGRpciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBQdWJsaXNoSGVscGVyLmRlbGV0ZURpcmVjdG9yeShkaXIsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFNtYXJ0IGNvcHkgdGhlIGdpdmVuIG1vZHVsZSByZXNvdXJjZXMgdG8gdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcyBhbiBhcnJheSBvZiBtb2R1bGUgcmVzb3VyY2VzCi0JICogQHBhcmFtIHBhdGggYW4gZXh0ZXJuYWwgcGF0aCB0byBjb3B5IHRvCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMgCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzW10gcHVibGlzaFNtYXJ0KElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBwdWJsaXNoSGVscGVyLnB1Ymxpc2hTbWFydChyZXNvdXJjZXMsIHBhdGgsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFNtYXJ0IGNvcHkgdGhlIGdpdmVuIG1vZHVsZSByZXNvdXJjZXMgdG8gdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcyBhbiBhcnJheSBvZiBtb2R1bGUgcmVzb3VyY2VzCi0JICogQHBhcmFtIHBhdGggYW4gZXh0ZXJuYWwgcGF0aCB0byBjb3B5IHRvCi0JICogQHBhcmFtIGlnbm9yZSBhbiBhcnJheSBvZiBwYXRocyByZWxhdGl2ZSB0byBwYXRoIHRvIGlnbm9yZSwgaS5lLiBub3QgZGVsZXRlIG9yIGNvcHkgb3ZlcgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzIAotCSAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXNbXSBwdWJsaXNoU21hcnQoSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCBwYXRoLCBJUGF0aFtdIGlnbm9yZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBwdWJsaXNoSGVscGVyLnB1Ymxpc2hTbWFydChyZXNvdXJjZXMsIHBhdGgsIGlnbm9yZSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGEgZGVsdGEgcHVibGlzaC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEgYSBtb2R1bGUgcmVzb3VyY2UgZGVsdGEKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBwdWJsaXNoIHRvCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXNbXSBwdWJsaXNoRGVsdGEoSU1vZHVsZVJlc291cmNlRGVsdGFbXSBkZWx0YSwgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBwdWJsaXNoSGVscGVyLnB1Ymxpc2hEZWx0YShkZWx0YSwgcGF0aCwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGEgZGVsdGEgcHVibGlzaC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEgYSBtb2R1bGUgcmVzb3VyY2UgZGVsdGEKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBwdWJsaXNoIHRvCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXNbXSBwdWJsaXNoRGVsdGEoSU1vZHVsZVJlc291cmNlRGVsdGEgZGVsdGEsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gcHVibGlzaEhlbHBlci5wdWJsaXNoRGVsdGEoZGVsdGEsIHBhdGgsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFB1Ymxpc2ggdGhlIGdpdmVuIG1vZHVsZSByZXNvdXJjZXMgdG8gdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcyBhbiBhcnJheSBvZiBtb2R1bGUgcmVzb3VyY2VzCi0JICogQHBhcmFtIHBhdGggYSBwYXRoIHRvIHB1Ymxpc2ggdG8KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1c1tdIHB1Ymxpc2hGdWxsKElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBwdWJsaXNoSGVscGVyLnB1Ymxpc2hGdWxsKHJlc291cmNlcywgcGF0aCwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB6aXAgZmlsZSBjb250YWluaW5nIHRoZSBnaXZlbiBtb2R1bGUgcmVzb3VyY2VzLiBEZWxldGVzIHRoZSBleGlzdGluZyBmaWxlCi0JICogKGFuZCBkb2Vzbid0IGNyZWF0ZSBhIG5ldyBvbmUpIGlmIHJlc291cmNlcyBpcyBudWxsIG9yIGVtcHR5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMgYW4gYXJyYXkgb2YgbW9kdWxlIHJlc291cmNlcwotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHdoZXJlIHRoZSB6aXAgZmlsZSBzaG91bGQgYmUgY3JlYXRlZCAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1c1tdIHB1Ymxpc2haaXAoSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIHB1Ymxpc2hIZWxwZXIucHVibGlzaFppcChyZXNvdXJjZXMsIHBhdGgsIG1vbml0b3IpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1J1bnRpbWVMaWZlY3ljbGVBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1J1bnRpbWVMaWZlY3ljbGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNmNmOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9SdW50aW1lTGlmZWN5Y2xlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcjsKLS8qKgotICogSGVscGVyIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgaW50ZXJmYWNlCi0gKiB3aXRoIGVtcHR5IG1ldGhvZHMuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVMaWZlY3ljbGVBZGFwdGVyIGltcGxlbWVudHMgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciB7Ci0JLyoqCi0JICogQHNlZSBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyI3J1bnRpbWVBZGRlZChJUnVudGltZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW50aW1lQWRkZWQoSVJ1bnRpbWUgcnVudGltZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQHNlZSBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyI3J1bnRpbWVDaGFuZ2VkKElSdW50aW1lKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bnRpbWVDaGFuZ2VkKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciNydW50aW1lUmVtb3ZlZChJUnVudGltZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW50aW1lUmVtb3ZlZChJUnVudGltZSBydW50aW1lKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9TZXJ2ZXJMaWZlY3ljbGVBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1NlcnZlckxpZmVjeWNsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU1Mjc5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1NlcnZlckxpZmVjeWNsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyOwotLyoqCi0gKiBIZWxwZXIgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyB0aGUgSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIGludGVyZmFjZQotICogd2l0aCBlbXB0eSBtZXRob2RzLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckxpZmVjeWNsZUFkYXB0ZXIgaW1wbGVtZW50cyBJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIgewotCS8qKgotCSAqIEBzZWUgSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyI3NlcnZlckFkZGVkKElTZXJ2ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2VydmVyQWRkZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyI3NlcnZlckNoYW5nZWQoSVNlcnZlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciNzZXJ2ZXJSZW1vdmVkKElTZXJ2ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2VydmVyUmVtb3ZlZChJU2VydmVyIHNlcnZlcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvU29ja2V0VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Tb2NrZXRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMmVhNGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Tb2NrZXRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlOwotaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5UcmFjZTsKLS8qKgotICogQSB1dGlsaXR5IGNsYXNzIGZvciBzb2NrZXQtcmVsYXRlZCBmdW5jdGlvbi4gSXQncyBtYWluIHB1cnBvc2VzIGFyZSB0byBmaW5kCi0gKiB1bnVzZWQgcG9ydHMsIGNoZWNrIHdoZXRoZXIgYSBwb3J0IGlzIGluIHVzZSwgYW5kIGNoZWNrIHdoZXRoZXIgYSBnaXZlbgotICogYWRkcmVzcyBpcyBhIGxvY2FsKGhvc3QpIGFkZHJlc3MuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNvY2tldFV0aWwgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBsb2NrID0gbmV3IE9iamVjdCgpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBTZXQ8U3RyaW5nPiBsb2NhbEhvc3RDYWNoZSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQlwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBub3RMb2NhbEhvc3RDYWNoZSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBDYWNoZVRocmVhZD4gdGhyZWFkTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDYWNoZVRocmVhZD4oKTsKLQotCXByaXZhdGUgc3RhdGljIFNldDxJbmV0QWRkcmVzcz4gYWRkcmVzc0NhY2hlOwotCi0Jc3RhdGljIGNsYXNzIENhY2hlVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkJcHJpdmF0ZSBTZXQ8SW5ldEFkZHJlc3M+IGN1cnJlbnRBZGRyZXNzZXM7Ci0JCXByaXZhdGUgU2V0PFN0cmluZz4gYWRkcmVzc0xpc3Q7Ci0JCXByaXZhdGUgU3RyaW5nIGhvc3Q7Ci0JCXByaXZhdGUgU2V0PFN0cmluZz4gbm9uQWRkcmVzc0xpc3Q7Ci0JCXByaXZhdGUgTWFwIHRocmVhZE1hcDI7Ci0KLQkJcHVibGljIENhY2hlVGhyZWFkKFN0cmluZyBob3N0LCBTZXQ8SW5ldEFkZHJlc3M+IGN1cnJlbnRBZGRyZXNzZXMsIFNldDxTdHJpbmc+IGFkZHJlc3NMaXN0LCBTZXQ8U3RyaW5nPiBub25BZGRyZXNzTGlzdCwgTWFwIHRocmVhZE1hcDIpIHsKLQkJCXN1cGVyKCJDYWNoaW5nIGxvY2FsaG9zdCBpbmZvcm1hdGlvbiIpOwotCQkJdGhpcy5ob3N0ID0gaG9zdDsKLQkJCXRoaXMuY3VycmVudEFkZHJlc3NlcyA9IGN1cnJlbnRBZGRyZXNzZXM7Ci0JCQl0aGlzLmFkZHJlc3NMaXN0ID0gYWRkcmVzc0xpc3Q7Ci0JCQl0aGlzLm5vbkFkZHJlc3NMaXN0ID0gbm9uQWRkcmVzc0xpc3Q7Ci0JCQl0aGlzLnRocmVhZE1hcDIgPSB0aHJlYWRNYXAyOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKGN1cnJlbnRBZGRyZXNzZXMgIT0gbnVsbCkgewotCQkJCUl0ZXJhdG9yIGl0ZXIyID0gY3VycmVudEFkZHJlc3Nlcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyMi5oYXNOZXh0KCkpIHsKLQkJCQkJSW5ldEFkZHJlc3MgYWRkciA9IChJbmV0QWRkcmVzcykgaXRlcjIubmV4dCgpOwotCQkJCQlTdHJpbmcgaG9zdG5hbWUgPSBhZGRyLmdldEhvc3ROYW1lKCkudG9Mb3dlckNhc2UoKTsKLQkJCQkJU3RyaW5nIGhvc3RuYW1lMiA9IGFkZHIuZ2V0Q2Fub25pY2FsSG9zdE5hbWUoKS50b0xvd2VyQ2FzZSgpOwotCQkJCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCQkJCWlmIChob3N0bmFtZSAhPSBudWxsICYmICFhZGRyZXNzTGlzdC5jb250YWlucyhob3N0bmFtZSkpCi0JCQkJCQkJYWRkcmVzc0xpc3QuYWRkKGhvc3RuYW1lKTsKLQkJCQkJCWlmIChob3N0bmFtZTIgIT0gbnVsbCAmJiAhYWRkcmVzc0xpc3QuY29udGFpbnMoaG9zdG5hbWUyKSkKLQkJCQkJCQlhZGRyZXNzTGlzdC5hZGQoaG9zdG5hbWUyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJdHJ5IHsKLQkJCQlJbmV0QWRkcmVzc1tdIGFkZHJzID0gSW5ldEFkZHJlc3MuZ2V0QWxsQnlOYW1lKGhvc3QpOwotCQkJCWludCBsZW5ndGggPSBhZGRycy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgewotCQkJCQlJbmV0QWRkcmVzcyBhZGRyID0gYWRkcnNbMF07Ci0JCQkJCVN0cmluZyBob3N0bmFtZSA9IGFkZHIuZ2V0SG9zdE5hbWUoKS50b0xvd2VyQ2FzZSgpOwotCQkJCQlTdHJpbmcgaG9zdG5hbWUyID0gYWRkci5nZXRDYW5vbmljYWxIb3N0TmFtZSgpLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCQkJaWYgKGFkZHIuaXNMb29wYmFja0FkZHJlc3MoKSkgewotCQkJCQkJCWlmIChob3N0bmFtZSAhPSBudWxsICYmICFhZGRyZXNzTGlzdC5jb250YWlucyhob3N0bmFtZSkpCi0JCQkJCQkJCWFkZHJlc3NMaXN0LmFkZChob3N0bmFtZSk7Ci0JCQkJCQkJaWYgKGhvc3RuYW1lMiAhPSBudWxsICYmICFhZGRyZXNzTGlzdC5jb250YWlucyhob3N0bmFtZTIpKQotCQkJCQkJCQlhZGRyZXNzTGlzdC5hZGQoaG9zdG5hbWUyKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKGhvc3RuYW1lICE9IG51bGwgJiYgIW5vbkFkZHJlc3NMaXN0LmNvbnRhaW5zKGhvc3RuYW1lKSkKLQkJCQkJCQkJbm9uQWRkcmVzc0xpc3QuYWRkKGhvc3RuYW1lKTsKLQkJCQkJCQlpZiAoaG9zdG5hbWUyICE9IG51bGwgJiYgIW5vbkFkZHJlc3NMaXN0LmNvbnRhaW5zKGhvc3RuYW1lMikpCi0JCQkJCQkJCW5vbkFkZHJlc3NMaXN0LmFkZChob3N0bmFtZTIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgewotCQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCQlpZiAoaG9zdCAhPSBudWxsICYmICFub25BZGRyZXNzTGlzdC5jb250YWlucyhob3N0KSkKLQkJCQkJCW5vbkFkZHJlc3NMaXN0LmFkZChob3N0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCQl0aHJlYWRNYXAyLnJlbW92ZShob3N0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFN0YXRpYyB1dGlsaXR5IGNsYXNzIC0gY2Fubm90IGNyZWF0ZSBhbiBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFNvY2tldFV0aWwoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBhbiB1bnVzZWQgbG9jYWwgcG9ydCBiZXR3ZWVuIHRoZSBnaXZlbiBmcm9tIGFuZCB0byB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIGxvdyBsb3dlc3QgcG9zc2libGUgcG9ydCBudW1iZXIKLQkgKiBAcGFyYW0gaGlnaCBoaWdoZXN0IHBvc3NpYmxlIHBvcnQgbnVtYmVyCi0JICogQHJldHVybiBhbiB1bnVzZWQgcG9ydCBudW1iZXIsIG9yIDxjb2RlPi0xPC9jb2RlPiBpZiBubyB1c2VkIHBvcnRzIGNvdWxkIGJlIGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZmluZFVudXNlZFBvcnQoaW50IGxvdywgaW50IGhpZ2gpIHsKLQkJcmV0dXJuIGZpbmRVbnVzZWRQb3J0KG51bGwsIGxvdywgaGlnaCk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgYW4gdW51c2VkIGxvY2FsIHBvcnQgYmV0d2VlbiB0aGUgZ2l2ZW4gZnJvbSBhbmQgdG8gdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBhZGRyZXNzIGEgbG9jYWwgSW5ldEFkZHJlc3MKLQkgKiBAcGFyYW0gbG93IGxvd2VzdCBwb3NzaWJsZSBwb3J0IG51bWJlcgotCSAqIEBwYXJhbSBoaWdoIGhpZ2hlc3QgcG9zc2libGUgcG9ydCBudW1iZXIKLQkgKiBAcmV0dXJuIGFuIHVudXNlZCBwb3J0IG51bWJlciwgb3IgPGNvZGU+LTE8L2NvZGU+IGlmIG5vIHVzZWQgcG9ydHMgY291bGQgYmUgZm91bmQKLQkgKiBAc2luY2UgMS4xCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZmluZFVudXNlZFBvcnQoSW5ldEFkZHJlc3MgYWRkcmVzcywgaW50IGxvdywgaW50IGhpZ2gpIHsKLQkJaWYgKGhpZ2ggPCBsb3cpCi0JCQlyZXR1cm4gLTE7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCWludCBwb3J0ID0gZ2V0UmFuZG9tUG9ydChsb3csIGhpZ2gpOwotCQkJaWYgKCFpc1BvcnRJblVzZShhZGRyZXNzLCBwb3J0KSkKLQkJCQlyZXR1cm4gcG9ydDsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgcmFuZG9tIGxvY2FsIHBvcnQgbnVtYmVyIGluIHRoZSBnaXZlbiByYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gbG93IGxvd2VzdCBwb3NzaWJsZSBwb3J0IG51bWJlcgotCSAqIEBwYXJhbSBoaWdoIGhpZ2hlc3QgcG9zc2libGUgcG9ydCBudW1iZXIKLQkgKiBAcmV0dXJuIGEgcmFuZG9tIHBvcnQgbnVtYmVyIGluIHRoZSBnaXZlbiByYW5nZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRSYW5kb21Qb3J0KGludCBsb3csIGludCBoaWdoKSB7Ci0JCXJldHVybiByYW5kLm5leHRJbnQoaGlnaCAtIGxvdykgKyBsb3c7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gbG9jYWwgcG9ydCBudW1iZXIgaXMgYmVpbmcgdXNlZC4gCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcG9ydCBpcyBpbiB1c2UsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UuIFJldHJpZXMgZXZlcnkgNTAwbXMgZm9yICJjb3VudCIgdHJpZXMuCi0JICoKLQkgKiBAcGFyYW0gcG9ydCB0aGUgcG9ydCBudW1iZXIgdG8gY2hlY2sKLQkgKiBAcGFyYW0gY291bnQgdGhlIG51bWJlciBvZiB0aW1lcyB0byByZXRyeQotCSAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcG9ydCBpcyBpbiB1c2UsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQb3J0SW5Vc2UoaW50IHBvcnQsIGludCBjb3VudCkgewotCQlyZXR1cm4gaXNQb3J0SW5Vc2UobnVsbCwgcG9ydCwgY291bnQpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIGxvY2FsIHBvcnQgbnVtYmVyIGlzIGJlaW5nIHVzZWQuIAotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBvcnQgaXMgaW4gdXNlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlLiBSZXRyaWVzIGV2ZXJ5IDUwMG1zIGZvciAiY291bnQiIHRyaWVzLgotCSAqCi0JICogQHBhcmFtIGFkZHJlc3MgYSBsb2NhbCBJbmV0QWRkcmVzcwotCSAqIEBwYXJhbSBwb3J0IHRoZSBwb3J0IG51bWJlciB0byBjaGVjawotCSAqIEBwYXJhbSBjb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJldHJ5Ci0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwb3J0IGlzIGluIHVzZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQb3J0SW5Vc2UoSW5ldEFkZHJlc3MgYWRkcmVzcywgaW50IHBvcnQsIGludCBjb3VudCkgewotCQlib29sZWFuIGluVXNlID0gaXNQb3J0SW5Vc2UoYWRkcmVzcywgcG9ydCk7Ci0JCXdoaWxlIChpblVzZSAmJiBjb3VudCA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJaW5Vc2UgPSBpc1BvcnRJblVzZShhZGRyZXNzLCBwb3J0KTsKLQkJCWNvdW50IC0tOwotCQl9Ci0JCi0JCXJldHVybiBpblVzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBsb2NhbCBwb3J0IG51bWJlciBpcyBiZWluZyB1c2VkLgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBvcnQgaXMgaW4gdXNlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlLgotCSAqCi0JICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgbnVtYmVyIHRvIGNoZWNrCi0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwb3J0IGlzIGluIHVzZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BvcnRJblVzZShpbnQgcG9ydCkgewotCQlyZXR1cm4gaXNQb3J0SW5Vc2UobnVsbCwgcG9ydCk7Ci0JfQotCQkKLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBsb2NhbCBwb3J0IG51bWJlciBpcyBiZWluZyB1c2VkLgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBvcnQgaXMgaW4gdXNlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGRyZXNzIGEgbG9jYWwgSW5ldEFkZHJlc3MKLQkgKiBAcGFyYW0gcG9ydCB0aGUgcG9ydCBudW1iZXIgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBvcnQgaXMgaW4gdXNlLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BvcnRJblVzZShJbmV0QWRkcmVzcyBhZGRyZXNzLCBpbnQgcG9ydCkgewotCQlTZXJ2ZXJTb2NrZXQgcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzID0gbmV3IFNlcnZlclNvY2tldChwb3J0LCAwLCBhZGRyZXNzKTsKLQkJfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHMgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXMuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBob3N0IChuYW1lLCBmdWxseSBxdWFsaWZpZWQgbmFtZSwgb3IgSVAgYWRkcmVzcykgaXMKLQkgKiByZWZlcnJpbmcgdG8gdGhlIGxvY2FsIG1hY2hpbmUuCi0JICogPHA+Ci0JICogVGhlIGZpcnN0IHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkIChvciB0aGUgZmlyc3QgY2FsbCBhZnRlciBlYWNoIHRpbWUKLQkgKiB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uIGhhcyBjaGFuZ2VkLCBlLmcuIGJ5IHRoZSB1c2VyIHN3aXRjaGluZyBmcm9tIGEKLQkgKiB3aXJlZCBjb25uZWN0aW9uIHRvIHdpcmVsZXNzKSBhIGJhY2tncm91bmQgcHJvY2VzcyBpcyB1c2VkIHRvIGNhY2hlIHRoZQotCSAqIG5ldHdvcmsgaW5mb3JtYXRpb24uIE9uIG1vc3QgbWFjaGluZXMgdGhlIG5ldHdvcmsgaW5mb3JtYXRpb24gd2lsbCBiZSBmb3VuZAotCSAqIHF1aWNrbHkgYW5kIHRoZSByZXN1bHRzIG9mIHRoaXMgY2FsbCB3aWxsIGJlIHJldHVybmVkIGltbWVkaWF0ZWx5LgotCSAqIDwvcD48cD4KLQkgKiBPbiBtYWNoaW5lcyB3aGVyZSB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uIG9mIHRoZSBtYWNoaW5lIGlzIGJhZCBvciB0aGUKLQkgKiBuZXR3b3JrIGhhcyBwcm9ibGVtcywgdGhlIGZpcnN0IGNhbGwgdG8gdGhpcyBtZXRob2Qgd2lsbCBhbHdheXMgcmV0dXJuIGFmdGVyCi0JICogMzUwbXMsIGV2ZW4gaWYgdGhlIGNhY2hpbmcgaXMgbm90IGNvbXBsZXRlLiBBdCB0aGF0IHBvaW50IGl0IG1heSByZXR1cm4KLQkgKiAiZmFsc2UgbmVnYXRpdmUiIHJlc3VsdHMuIChpLmUuIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogZXZlbiB0aG91Z2ggaXQgbWF5IGxhdGVyIGRldGVybWluZSB0aGF0IHRoZSBob3N0IGFkZHJlc3MgaXMgYSBsb2NhbCBob3N0KQotCSAqIDwvcD48cD4KLQkgKiBBbGwgc3Vic2VxdWVudCBjYWxscyAodW50aWwgdGhlIG5ldHdvcmsgY29uZmlndXJhdGlvbiBjaGFuZ2VzKSB3aWxsCi0JICogcmV0dXJuIHZlcnkgcXVpY2tseS4gSWYgdGhlIGJhY2tncm91bmQgcHJvY2VzcyBpcyBzdGlsbCBydW5uaW5nIGl0IHdpbGwKLQkgKiBjb250aW51ZSB0byBmaWxsIHRoZSBjYWNoZSBhbmQgZWFjaCBzdWJzZXF1ZW50IGNhbGwgdG8gdGhpcyBtZXRob2QgbWF5IGJlCi0JICogbW9yZSBjb3JyZWN0L2NvbXBsZXRlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gaG9zdCBhIGhvc3RuYW1lIG9yIElQIGFkZHJlc3MKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBob3N0IGlzIGxvY2FsaG9zdCwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xvY2FsaG9zdChTdHJpbmcgaG9zdCkgewotCQlpZiAoaG9zdCA9PSBudWxsIHx8IGhvc3QuZXF1YWxzKCIiKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWhvc3QgPSBob3N0LnRvTG93ZXJDYXNlKCk7Ci0JCWlmICgibG9jYWxob3N0Ii5lcXVhbHMoaG9zdCkgfHwgIjEyNy4wLjAuMSIuZXF1YWxzKGhvc3QpIHx8ICI6OjEiLmVxdWFscyhob3N0KSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJLy8gY2hlY2sgZXhpc3RpbmcgY2FjaGVzIHRvIHNlZSBpZiB0aGUgaG9zdCBpcyB0aGVyZQotCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCWlmIChsb2NhbEhvc3RDYWNoZS5jb250YWlucyhob3N0KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChub3RMb2NhbEhvc3RDYWNoZS5jb250YWlucyhob3N0KSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJSW5ldEFkZHJlc3MgbG9jYWxIb3N0YWRkciA9IG51bGw7Ci0JCQotCQkvLyBjaGVjayBzaW1wbGUgY2FzZXMKLQkJdHJ5IHsKLQkJCWxvY2FsSG9zdGFkZHIgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKLQkJCWlmIChob3N0LmVxdWFscyhsb2NhbEhvc3RhZGRyLmdldEhvc3ROYW1lKCkudG9Mb3dlckNhc2UoKSkKLQkJCQkJfHwgaG9zdC5lcXVhbHMobG9jYWxIb3N0YWRkci5nZXRIb3N0QWRkcmVzcygpLnRvTG93ZXJDYXNlKCkpKXsKLQkJCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCQkJbG9jYWxIb3N0Q2FjaGUuYWRkKGhvc3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJMb2NhbGhvc3QgY2FjaGluZyBmYWlsdXJlIiwgZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIEJ1ZyAzMzc3NjMgLSB0aGUgSW5ldEFkZHJlc3MncyBnZXRDYW5vbmljYWxIb3N0TmFtZSB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBzaW1wbGUgY2FzZQotCQkvLyB0byBiZSBjYWxsZWQgaW4gaXRzIG93biBzZXBhcmF0ZSB0aHJlYWQuIFRoaXMgd2FzIGR1ZSB0byB0aGUgY2FsbCBiZWluZyBwbGF0Zm9ybQotCQkvLyBkZXBlbmRlbnQgYW5kIGluIHNvbWUgY2FzZXMsIHRha2luZyB1cCB0byAxMCBzZWNvbmRzIHRvIHJldHVybi4gCi0JCS8vIAotCQkvLyBUaGUgY2FjaGVkIHRocmVhZCBtYXkgcGVyZm9ybSBvcGVyYXRpb25zIHRoYXQgYXJlIGV4cGVuc2l2ZS4gVGhlcmVmb3JlLCB0byBoYW5kbGUKLQkJLy8gdGhlIGNhc2Ugd2hlcmUgdGhlIGNhbm9uaWNhbCBob3N0IG5hbWUgcmV0dXJucyBxdWlja2x5LCBhIHRocmVhZCB0aGF0IHRlcm1pbmF0ZXMgCi0JCS8vIGFmdGVyIDEwMG1zIGlzIHVzZWQuCi0JCXRyeSB7Ci0JCQlmaW5hbCBTdHJpbmcgaG9zdEZpbmFsID0gaG9zdDsKLQkJCWZpbmFsIEluZXRBZGRyZXNzIGxvY2FsSG9zdGFkZHJGaW5hbCA9IGxvY2FsSG9zdGFkZHI7Ci0JCQlUaHJlYWQgY29tcGFyZUNhbm9uaWNhbEhvc3ROYW1lVGhyZWFkID0gbmV3IFRocmVhZCgpewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJCQlib29sZWFuIGlzTG9jYWwgPSAKLQkJCQkJCWhvc3RGaW5hbC5lcXVhbHMobG9jYWxIb3N0YWRkckZpbmFsLmdldENhbm9uaWNhbEhvc3ROYW1lKCkudG9Mb3dlckNhc2UoKSk7CQkJCQkKLQkJCQkJaWYgKGlzTG9jYWwpewotCQkJCQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQkJCQkJbG9jYWxIb3N0Q2FjaGUuYWRkKGhvc3RGaW5hbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJY29tcGFyZUNhbm9uaWNhbEhvc3ROYW1lVGhyZWFkLnN0YXJ0KCk7Ci0JCQljb21wYXJlQ2Fub25pY2FsSG9zdE5hbWVUaHJlYWQuam9pbigxMDApOwotCQkJLy8gQ2hlY2sgY2FjaGUgYWdhaW4KLQkJCWlmIChsb2NhbEhvc3RDYWNoZS5jb250YWlucyhob3N0KSl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJDb21wYXJpbmcgaG9zdCB3aXRoIGxvY2FsIGhvc3QgY29uaWNhbCBob3N0IG5hbWUgZmFpbGVkIiwgZSk7Ci0JCQl9CQkJCi0JCX0KLQkJCi0JCS8vIGNoZWNrIGZvciBjdXJyZW50IHRocmVhZCBhbmQgd2FpdCBpZiBuZWNlc3NhcnkKLQkJYm9vbGVhbiBjdXJyZW50VGhyZWFkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlUaHJlYWQgdCA9IG51bGw7Ci0JCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCQl0ID0gdGhyZWFkTWFwLmdldChob3N0KTsKLQkJCX0KLQkJCWlmICh0ICE9IG51bGwgJiYgdC5pc0FsaXZlKCkpIHsKLQkJCQljdXJyZW50VGhyZWFkID0gdHJ1ZTsKLQkJCQl0LmpvaW4oMzApOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkxvY2FsaG9zdCBjYWNoaW5nIGZhaWx1cmUiLCBlKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gY2hlY2sgaWYgY2FjaGUgaXMgc3RpbGwgb2sKLQkJYm9vbGVhbiByZWZyZXNoZWRDYWNoZSA9IGZhbHNlOwotCQl0cnkgewotCQkJLy8gZ2V0IG5ldHdvcmsgaW50ZXJmYWNlcwotCQkJZmluYWwgU2V0PEluZXRBZGRyZXNzPiBjdXJyZW50QWRkcmVzc2VzID0gbmV3IEhhc2hTZXQ8SW5ldEFkZHJlc3M+KCk7Ci0JCQkKLQkJCWlmKGxvY2FsSG9zdGFkZHIgIT0gbnVsbCkKLQkJCQljdXJyZW50QWRkcmVzc2VzLmFkZChsb2NhbEhvc3RhZGRyKTsKLQkJCQotCQkJRW51bWVyYXRpb24gbmlzID0gTmV0d29ya0ludGVyZmFjZS5nZXROZXR3b3JrSW50ZXJmYWNlcygpOwotCQkJd2hpbGUgKG5pcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCU5ldHdvcmtJbnRlcmZhY2UgaW50ZXIgPSAoTmV0d29ya0ludGVyZmFjZSkgbmlzLm5leHRFbGVtZW50KCk7Ci0JCQkJRW51bWVyYXRpb248SW5ldEFkZHJlc3M+IGlhcyA9IGludGVyLmdldEluZXRBZGRyZXNzZXMoKTsKLQkJCQl3aGlsZSAoaWFzLmhhc01vcmVFbGVtZW50cygpKQotCQkJCQljdXJyZW50QWRkcmVzc2VzLmFkZChpYXMubmV4dEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCQkKLQkJCS8vIGNoZWNrIGlmIGNhY2hlIGlzIGVtcHR5IG9yIG9sZCBhbmQgcmVmaWxsIGl0IGlmIG5lY2Vzc2FyeQotCQkJaWYgKGFkZHJlc3NDYWNoZSA9PSBudWxsIHx8ICFhZGRyZXNzQ2FjaGUuY29udGFpbnNBbGwoY3VycmVudEFkZHJlc3NlcykgfHwgIWN1cnJlbnRBZGRyZXNzZXMuY29udGFpbnNBbGwoYWRkcmVzc0NhY2hlKSkgewotCQkJCUNhY2hlVGhyZWFkIGNhY2hlVGhyZWFkID0gbnVsbDsKLQkJCQlyZWZyZXNoZWRDYWNoZSA9IHRydWU7Ci0JCQkJCi0JCQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQkJCWFkZHJlc3NDYWNoZSA9IGN1cnJlbnRBZGRyZXNzZXM7Ci0JCQkJCW5vdExvY2FsSG9zdENhY2hlID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQkJCQlsb2NhbEhvc3RDYWNoZSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oY3VycmVudEFkZHJlc3Nlcy5zaXplKCkgKiAzKTsKLQkJCQkJCi0JCQkJCUl0ZXJhdG9yIGl0ZXIgPSBjdXJyZW50QWRkcmVzc2VzLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJSW5ldEFkZHJlc3MgYWRkciA9IChJbmV0QWRkcmVzcykgaXRlci5uZXh0KCk7Ci0JCQkJCQlTdHJpbmcgYSA9IGFkZHIuZ2V0SG9zdEFkZHJlc3MoKS50b0xvd2VyQ2FzZSgpOwotCQkJCQkJaWYgKGEgIT0gbnVsbCAmJiAhbG9jYWxIb3N0Q2FjaGUuY29udGFpbnMoYSkpCi0JCQkJCQkJbG9jYWxIb3N0Q2FjaGUuYWRkKGEpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQljYWNoZVRocmVhZCA9IG5ldyBDYWNoZVRocmVhZChob3N0LCBjdXJyZW50QWRkcmVzc2VzLCBsb2NhbEhvc3RDYWNoZSwgbm90TG9jYWxIb3N0Q2FjaGUsIHRocmVhZE1hcCk7Ci0JCQkJCXRocmVhZE1hcC5wdXQoaG9zdCwgY2FjaGVUaHJlYWQpOwotCQkJCQljYWNoZVRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCQkJCWNhY2hlVGhyZWFkLnNldFByaW9yaXR5KFRocmVhZC5OT1JNX1BSSU9SSVRZIC0gMSk7Ci0JCQkJCWNhY2hlVGhyZWFkLnN0YXJ0KCk7Ci0JCQkJfQotCQkJCWNhY2hlVGhyZWFkLmpvaW4oMjAwKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJMb2NhbGhvc3QgY2FjaGluZyBmYWlsdXJlIiwgZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJaWYgKGxvY2FsSG9zdENhY2hlLmNvbnRhaW5zKGhvc3QpKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG5vdExvY2FsSG9zdENhY2hlLmNvbnRhaW5zKGhvc3QpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJLy8gaWYgdGhlIGNhY2hlIGhhc24ndCBiZWVuIGNsZWFyZWQsIG1heWJlIHdlIHN0aWxsIG5lZWQgdG8gbG9va3VwIHRoZSBob3N0ICAKLQkJaWYgKCFyZWZyZXNoZWRDYWNoZSAmJiAhY3VycmVudFRocmVhZCkgewotCQkJdHJ5IHsKLQkJCQlDYWNoZVRocmVhZCBjYWNoZVRocmVhZCA9IG51bGw7Ci0JCQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQkJCWNhY2hlVGhyZWFkID0gbmV3IENhY2hlVGhyZWFkKGhvc3QsIG51bGwsIGxvY2FsSG9zdENhY2hlLCBub3RMb2NhbEhvc3RDYWNoZSwgdGhyZWFkTWFwKTsKLQkJCQkJdGhyZWFkTWFwLnB1dChob3N0LCBjYWNoZVRocmVhZCk7Ci0JCQkJCWNhY2hlVGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJCQkJY2FjaGVUaHJlYWQuc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFkgLSAxKTsKLQkJCQkJY2FjaGVUaHJlYWQuc3RhcnQoKTsKLQkJCQl9Ci0JCQkJY2FjaGVUaHJlYWQuam9pbig3NSk7Ci0JCQkJCi0JCQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQkJCWlmIChsb2NhbEhvc3RDYWNoZS5jb250YWlucyhob3N0KSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJDb3VsZCBub3QgZmluZCBsb2NhbGhvc3QiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQlpZighbm90TG9jYWxIb3N0Q2FjaGUuY29udGFpbnMoaG9zdCkpewotCQkJCW5vdExvY2FsSG9zdENhY2hlLmFkZChob3N0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvV2ViUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvV2ViUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRhMDdmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1dlYlJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0RGVsZWdhdGU7Ci0vKioKLSAqIEEgV2ViIG1vZHVsZSByZXNvdXJjZS4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV2ViUmVzb3VyY2UgZXh0ZW5kcyBNb2R1bGVBcnRpZmFjdERlbGVnYXRlIHsKLQlwcml2YXRlIElQYXRoIHBhdGg7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcmVmZXJlbmNlIHRvIGEgV2ViIHJlc291cmNlIChIVE1MLCBHSUYsIGV0Yy4gb24gYSBzZXJ2ZXIpLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcGFyYW0gcGF0aCBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgV2ViUmVzb3VyY2UoSU1vZHVsZSBtb2R1bGUsIElQYXRoIHBhdGgpIHsKLQkJc3VwZXIobW9kdWxlKTsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQl9Ci0KLQlwdWJsaWMgV2ViUmVzb3VyY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBhcnRpZmFjdCB3aXRoaW4gdGhlIG1vZHVsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZWxhdGl2ZSBwYXRoCi0JICovCi0JcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVBcnRpZmFjdERlbGVnYXRlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBnZXRNb2R1bGUoKS5nZXROYW1lKCk7Ci0JCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjZGVzZXJpYWxpemUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlc2VyaWFsaXplKFN0cmluZyBzKSB7Ci0JCWludCBpbmQgPSBzLmluZGV4T2YoIi8vIik7Ci0JCXN1cGVyLmRlc2VyaWFsaXplKHMuc3Vic3RyaW5nKDAsIGluZCkpOwotCQlwYXRoID0gbmV3IFBhdGgocy5zdWJzdHJpbmcoaW5kKzIpKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSNzZXJpYWxpemUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgc2VyaWFsaXplKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnNlcmlhbGl6ZSgpKTsKLQkJc2IuYXBwZW5kKCIvLyIpOwotCQlzYi5hcHBlbmQocGF0aC50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJXZWJSZXNvdXJjZSBbbW9kdWxlPSIgKyBnZXRNb2R1bGUoKSArICIsIHBhdGg9IiArIHBhdGggKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDNlZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uLy9hcGlzdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPlV0aWxpdHkgY2xhc3NlcyBmb3IgdGhlIHNlcnZlciB0b29scyBmcmFtZXdvcmsuPC9wPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+UGluZ1RocmVhZCBpcyBhIHV0aWxpdHkgY2xhc3MgZm9yIHBpbmdpbmcgYSBzZXJ2ZXIgdG8gZGV0ZXJtaW5lIGlmCi1pdCBpcyBydW5uaW5nIGFuZCB1cGRhdGluZyB0aGUgc2VydmVyJ3Mgc3RhdGUuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+U29ja2V0VXRpbCBjb250YWlucyB1dGlsaXR5IG1ldGhvZHMgZm9yIGRldGVybWluaW5nIGlmIHBvcnRzIGFyZQotZnJlZSBhbmQgd2hldGhlciBhIGdpdmVuIGhvc3RuYW1lIGlzIGEgbG9jYWwgaG9zdG5hbWUuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+VGhlIGZvdXIgWFhYQWRhcHRlciBjbGFzc2VzIGFyZSBpbXBsZW1lbnRhdGlvbnMgb2Ygc2VydmVyIHRvb2xzCi1saXN0ZW5lciBpbnRlcmZhY2VzIHdpdGggdGhlIG1ldGhvZCBib2RpZXMgc3R1YmJlZCBpbjsgdGhleSBjYW4gYmUKLXN1YmNsYXNzZWQgYnkgY2xpZW50cyB3aG8gb25seSB3YW50IHRvIGltcGxlbWVudCBhIHNpbmdsZSBsaXN0ZW5lcgotaW50ZXJmYWNlIG1ldGhvZC48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5TZXJ2ZXJQb3J0LCBUYXNrLCBhbmQgVGFza01vZGVsIGFyZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbnMgb2YKLW90aGVyIGludGVyZmFjZSBjbGFzc2VzLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmIyNDQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci08aGVhZD4KLQk8IS0tICBFc2NhcGUgdG8gdGhlIHJvb3Qgb2YgeW91ciBzb3VyY2UgZm9sZGVyICAtLT4KLQk8bWV0YQotCQluYW1lPSJyb290IgotCQljb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0JPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotPGFic3RyYWN0PlV0aWxpdHkgY2xhc3NlcyBmb3IgdGhlIHNlcnZlciB0b29scyBmcmFtZXdvcmsuPC9hYnN0cmFjdD4KLQotPHA+UGluZ1RocmVhZCBpcyBhIHV0aWxpdHkgY2xhc3MgZm9yIHBpbmdpbmcgYSBzZXJ2ZXIgdG8gZGV0ZXJtaW5lIGlmCi1pdCBpcyBydW5uaW5nIGFuZCB1cGRhdGluZyB0aGUgc2VydmVyJ3Mgc3RhdGUuPC9wPgotCi08cD5Tb2NrZXRVdGlsIGNvbnRhaW5zIHV0aWxpdHkgbWV0aG9kcyBmb3IgZGV0ZXJtaW5pbmcgaWYgcG9ydHMgYXJlCi1mcmVlIGFuZCB3aGV0aGVyIGEgZ2l2ZW4gaG9zdG5hbWUgaXMgYSBsb2NhbCBob3N0bmFtZS48L3A+Ci0KLTxwPlRoZSBmb3VyIFhYWEFkYXB0ZXIgY2xhc3NlcyBhcmUgaW1wbGVtZW50YXRpb25zIG9mIHNlcnZlciB0b29scwotbGlzdGVuZXIgaW50ZXJmYWNlcyB3aXRoIHRoZSBtZXRob2QgYm9kaWVzIHN0dWJiZWQgaW47IHRoZXkgY2FuIGJlCi1zdWJjbGFzc2VkIGJ5IGNsaWVudHMgd2hvIG9ubHkgd2FudCB0byBpbXBsZW1lbnQgYSBzaW5nbGUgbGlzdGVuZXIKLWludGVyZmFjZSBtZXRob2QuPC9wPgotCi08cD5TZXJ2ZXJQb3J0LCBUYXNrLCBhbmQgVGFza01vZGVsIGFyZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbnMgb2YKLW90aGVyIGludGVyZmFjZSBjbGFzc2VzLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OWJkMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNlcnZlcnVpLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlhNGMxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi1zZXJ2ZXJ1aS5qYXIKLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWlfMy4wLjAuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYWFiOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkgcGx1Z2luCi0KLSMgVHVybiBvbiBnZW5lcmFsIGRlYnVnZ2luZwotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9kZWJ1Zz10cnVlCi0KLSMgVHJhY2luZyBvcHRpb25zCi1vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2NvbmZpZz1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pbmZvPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3dhcm5pbmc9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2V2ZXJlPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ZpbmVzdD1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9maW5lcj1mYWxzZQotCi0jIExvYWRpbmcgb2YgZXh0ZW5zaW9uIHBvaW50cwotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9leHRlbnNpb25fcG9pbnQ9ZmFsc2UKLQotIyBQZXJmb3JtYW5jZSBvZiBsb2FkaW5nIGFuZCBjYWxsaW5nIGRlbGVnYXRlcwotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9wZXJmb3JtYW5jZT1mYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVlYmE3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGJlNDMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNGcmkgTm92IDEwIDE3OjExOjM1IEhTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTIwODUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0jVGh1IFNlcCAxMyAxNToyNTowNiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWluc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlY3JlYXRlTW9kaWZpZWRDbGFzc0ZpbGVJbk91dHB1dEZvbGRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoLCoudGVzdHN1aXRlLCouZGVwbG95LCoubG9jYXRpb24sKi5leGVjdXRpb24sKi5kYXRhcG9vbCwqLmFydGlmYWN0LCouaHRtbCwqLnN2Zwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjc3ODE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jV2VkIEFwciAxNCAxNjozNjoyMCBFRFQgMjAxMAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9NAotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPWphdmE7amF2YXg7b3JnO2NvbTsKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD00CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGE2MGU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1NhdCBBcHIgMjIgMTg6MzY6MTQgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MgotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE5MGQ5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4zLjEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvciwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hdWRpbzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY29tbWFuZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jbmY7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndlYmJyb3dzZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5kaXNjb3Zlcnk7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuYnJvd3NlcjtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuY29uc29sZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDMsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMywyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eTtleGNsdWRlOj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53ZWJicm93c2VyIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODFkYTgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8KLXNvdXJjZS4uID0gc2VydmVydWkvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9kZWJ1Zy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9kZWJ1Zy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MTRkN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfZGVidWcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfZGlzY29ubmVjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9kaXNjb25uZWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwZDM4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9kaXNjb25uZWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3Byb2ZpbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfcHJvZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzMzNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfcHJvZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9wdWJsaXNoLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3B1Ymxpc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzgyN2FmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3B1Ymxpc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfcmVzdGFydC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9yZXN0YXJ0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMwYWM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9yZXN0YXJ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3J1bi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9ydW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Y0MTAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3J1bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9zdG9wLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3N0b3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmYxNjg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3N0b3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvZGVidWdfb25fc2VydmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L2RlYnVnX29uX3NlcnZlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NjUwYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvZGVidWdfb25fc2VydmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3Byb2ZpbGVfb25fc2VydmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3Byb2ZpbGVfb25fc2VydmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhOTUyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi9wcm9maWxlX29uX3NlcnZlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi9ydW5fb25fc2VydmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3J1bl9vbl9zZXJ2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWQ3ZDk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3J1bl9vbl9zZXJ2ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvd2l6X2ltcG9ydF9jb25maWd1cmF0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3dpel9pbXBvcnRfY29uZmlndXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZjZiMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvd2l6X2ltcG9ydF9jb25maWd1cmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3dpel9tb2RpZnlfbW9kdWxlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfbW9kaWZ5X21vZHVsZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTA3MDEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3dpel9tb2RpZnlfbW9kdWxlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfbmV3X3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfbmV3X3NlcnZlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YmFjYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvd2l6X25ld19zZXJ2ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvd2l6X25ld19zZXJ2ZXJfcHJvamVjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfbmV3X3NlcnZlcl9wcm9qZWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmZDExYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfbmV3X3NlcnZlcl9wcm9qZWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdmlldzE2L3NlcnZlcl9wZXJzcGVjdGl2ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3ZpZXcxNi9zZXJ2ZXJfcGVyc3BlY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGI2NDhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdmlldzE2L3NlcnZlcl9wZXJzcGVjdGl2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3ZpZXcxNi9zZXJ2ZXJzX3ZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N2aWV3MTYvc2VydmVyc192aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhYmZiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3ZpZXcxNi9zZXJ2ZXJzX3ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfZGVidWcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfZGVidWcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmY5YzNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX2RlYnVnLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX2Rpc2Nvbm5lY3QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfZGlzY29ubmVjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NTYwOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfZGlzY29ubmVjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9wcm9maWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX3Byb2ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzA5YjBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX3Byb2ZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfcHVibGlzaC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9wdWJsaXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYzMjJmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9wdWJsaXNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX3Jlc3RhcnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfcmVzdGFydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZDkwOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfcmVzdGFydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9ydW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfcnVuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM2MmU2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9ydW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfc3RvcC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9zdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNjNWZhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9zdG9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L2NsZWFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L2NsZWFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3NWVkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9jbGVhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9kZWJ1Z19vbl9zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvZGVidWdfb25fc2VydmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I0Y2YyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9kZWJ1Z19vbl9zZXJ2ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvcHJvZmlsZV9vbl9zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvcHJvZmlsZV9vbl9zZXJ2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTRjODlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3Byb2ZpbGVfb25fc2VydmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3J1bl9vbl9zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvcnVuX29uX3NlcnZlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MjJhODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvcnVuX29uX3NlcnZlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi93aXpfaW1wb3J0X2NvbmZpZ3VyYXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvd2l6X2ltcG9ydF9jb25maWd1cmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmNTdiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi93aXpfaW1wb3J0X2NvbmZpZ3VyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvd2l6X21vZGlmeV9tb2R1bGVzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3dpel9tb2RpZnlfbW9kdWxlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNGZlZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvd2l6X21vZGlmeV9tb2R1bGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3dpel9uZXdfc2VydmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3dpel9uZXdfc2VydmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2ZmNiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi93aXpfbmV3X3NlcnZlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi93aXpfbmV3X3NlcnZlcl9wcm9qZWN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3dpel9uZXdfc2VydmVyX3Byb2plY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUyMzE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3dpel9uZXdfc2VydmVyX3Byb2plY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfZGVidWcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfZGVidWcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzE0ZDdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX2RlYnVnLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX2Rpc2Nvbm5lY3QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfZGlzY29ubmVjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMGQzODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfZGlzY29ubmVjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9wcm9maWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3Byb2ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWMzMzQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3Byb2ZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfcHVibGlzaC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9wdWJsaXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlOWE2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9wdWJsaXNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3Jlc3RhcnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfcmVzdGFydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMGFjNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfcmVzdGFydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9ydW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfcnVuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmNDEwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9ydW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfc3RvcC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9zdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJmMTY4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9zdG9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L2NsZWFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L2NsZWFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzMGE0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi9jbGVhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi9kZWJ1Z19vbl9zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvZGVidWdfb25fc2VydmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ2NTBiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi9kZWJ1Z19vbl9zZXJ2ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvcHJvZmlsZV9vbl9zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvcHJvZmlsZV9vbl9zZXJ2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2E5NTIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3Byb2ZpbGVfb25fc2VydmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3J1bl9vbl9zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvcnVuX29uX3NlcnZlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZDdkOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvcnVuX29uX3NlcnZlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi93aXpfaW1wb3J0X2NvbmZpZ3VyYXRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvd2l6X2ltcG9ydF9jb25maWd1cmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmNmIzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi93aXpfaW1wb3J0X2NvbmZpZ3VyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvd2l6X21vZGlmeV9tb2R1bGVzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3dpel9tb2RpZnlfbW9kdWxlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MDcwMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvd2l6X21vZGlmeV9tb2R1bGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3dpel9uZXdfc2VydmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3dpel9uZXdfc2VydmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViYWNiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi93aXpfbmV3X3NlcnZlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi93aXpfbmV3X3NlcnZlcl9wcm9qZWN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3dpel9uZXdfc2VydmVyX3Byb2plY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2ZkMTFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3dpel9uZXdfc2VydmVyX3Byb2plY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V2aWV3MTYvc2VydmVyX3BlcnNwZWN0aXZlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldmlldzE2L3NlcnZlcl9wZXJzcGVjdGl2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YjY0OGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V2aWV3MTYvc2VydmVyX3BlcnNwZWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldmlldzE2L3NlcnZlcnNfdmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXZpZXcxNi9zZXJ2ZXJzX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmFiZmJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldmlldzE2L3NlcnZlcnNfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvYXVkaW9fY2F0ZWdvcnkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2F1ZGlvX2NhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRhNTM4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvYXVkaW9fY2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2F1ZGlvX3NvdW5kLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9hdWRpb19zb3VuZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZDg1NTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2F1ZGlvX3NvdW5kLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9jb25maWd1cmF0aW9uX21pc3NpbmcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2NvbmZpZ3VyYXRpb25fbWlzc2luZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZWY0YzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2NvbmZpZ3VyYXRpb25fbWlzc2luZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvY29uZmlndXJhdGlvbl9ub25lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9jb25maWd1cmF0aW9uX25vbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmQyNzU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9jb25maWd1cmF0aW9uX25vbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2ludGVybmFsX2Jyb3dzZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2ludGVybmFsX2Jyb3dzZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWY2MDlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9pbnRlcm5hbF9icm93c2VyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9tb25pdG9yT2ZmLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9tb25pdG9yT2ZmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlNWYzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9mZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9tb25pdG9yT24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmYzOTc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9tb25pdG9yT24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3Byb2plY3RfbWlzc2luZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcHJvamVjdF9taXNzaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiNGMxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcHJvamVjdF9taXNzaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9wdWJsaXNoX2Rpc2FibGVkLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9wdWJsaXNoX2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE5Yjg0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcHVibGlzaF9kaXNhYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcHVibGlzaF9lbmFibGVkLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9wdWJsaXNoX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjkwMGVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9wdWJsaXNoX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3JlcGFpcl9jb25maWcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3JlcGFpcl9jb25maWcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTY5MGVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9yZXBhaXJfY29uZmlnLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWFlMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0ZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3MDA1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGVkX2RlYnVnLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRlZF9kZWJ1Zy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZTE3NzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGVkX2RlYnVnLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRlZF9wcm9maWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRlZF9wcm9maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlMjU4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0ZWRfcHJvZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0aW5nMS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0aW5nMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MjYzYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGluZzEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGluZzIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGluZzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDNiYmZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRpbmcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRpbmczLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRpbmczLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE1MWU1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0aW5nMy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdG9wcGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZjM2I2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdG9wcGluZzEuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdG9wcGluZzEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDZjNTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RvcHBpbmcxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RvcHBpbmcyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RvcHBpbmcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZjM2I2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwaW5nMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwaW5nMy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwaW5nMy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNmM1N2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdG9wcGluZzMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3N0YXRlX3N0YXJ0ZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3N0YXRlX3N0YXJ0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTZlMDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zdGF0ZV9zdGFydGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zdGF0ZV9zdG9wcGVkLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zdGF0ZV9zdG9wcGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFiYmUzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc3RhdGVfc3RvcHBlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvd2ViX21vZHVsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvd2ViX21vZHVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjBmNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3dlYl9tb2R1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL292cjE2L2RlZmF1bHRfc2VydmVyX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvZGVmYXVsdF9zZXJ2ZXJfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmY2JjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvZGVmYXVsdF9zZXJ2ZXJfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9zZXJ2ZXJfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9zZXJ2ZXJfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4ZDUyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvc2VydmVyX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvc2VydmVyX3N0YXJ0ZWRfZGVidWdfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9zZXJ2ZXJfc3RhcnRlZF9kZWJ1Z19vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzU4NDZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9zZXJ2ZXJfc3RhcnRlZF9kZWJ1Z19vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL292cjE2L3NlcnZlcl9zdGFydGVkX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvc2VydmVyX3N0YXJ0ZWRfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUxYjZkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvc2VydmVyX3N0YXJ0ZWRfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9zZXJ2ZXJfc3RhcnRlZF9wcm9maWxlX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvc2VydmVyX3N0YXJ0ZWRfcHJvZmlsZV9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGY4MTVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9zZXJ2ZXJfc3RhcnRlZF9wcm9maWxlX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvc2VydmVyX3N0YXJ0aW5nMV9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL292cjE2L3NlcnZlcl9zdGFydGluZzFfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU2YjcxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvc2VydmVyX3N0YXJ0aW5nMV9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL292cjE2L3NlcnZlcl9zdGFydGluZzJfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9zZXJ2ZXJfc3RhcnRpbmcyX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNjRiZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL292cjE2L3NlcnZlcl9zdGFydGluZzJfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9zZXJ2ZXJfc3RhcnRpbmczX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvc2VydmVyX3N0YXJ0aW5nM19vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTIxY2NlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9zZXJ2ZXJfc3RhcnRpbmczX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvc2VydmVyX3N0b3BwZWRfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9zZXJ2ZXJfc3RvcHBlZF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzYwNDJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9zZXJ2ZXJfc3RvcHBlZF9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL292cjE2L3NlcnZlcl9zdG9wcGluZzFfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9zZXJ2ZXJfc3RvcHBpbmcxX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Y2MxYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL292cjE2L3NlcnZlcl9zdG9wcGluZzFfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9zZXJ2ZXJfc3RvcHBpbmcyX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvc2VydmVyX3N0b3BwaW5nMl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDBhNDM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9zZXJ2ZXJfc3RvcHBpbmcyX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvc2VydmVyX3N0b3BwaW5nM19vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL292cjE2L3NlcnZlcl9zdG9wcGluZzNfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU1NjNmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvc2VydmVyX3N0b3BwaW5nM19vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL3dpemJhbi9pbXBvcnRfY29uZmlndXJhdGlvbl93aXoucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL3dpemJhbi9pbXBvcnRfY29uZmlndXJhdGlvbl93aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDBhZDIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vaW1wb3J0X2NvbmZpZ3VyYXRpb25fd2l6LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vbmV3X3NlcnZlcl93aXoucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL3dpemJhbi9uZXdfc2VydmVyX3dpei5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NzU2N2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL3dpemJhbi9uZXdfc2VydmVyX3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL3NlbGVjdF9jbGllbnRfd2l6LnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vc2VsZWN0X2NsaWVudF93aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDk3ODg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vc2VsZWN0X2NsaWVudF93aXoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL3dpemJhbi9zZWxlY3Rfc2VydmVyX3dpei5wbmcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL3NlbGVjdF9zZXJ2ZXJfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmMWI3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL3NlbGVjdF9zZXJ2ZXJfd2l6LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlY2I3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1TZXJ2ZXIgVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi1leHRlbnNpb25Qb2ludEVkaXRvclBhZ2VzPUVkaXRvciBQYWdlcwotZXh0ZW5zaW9uUG9pbnRFZGl0b3JQYWdlU2VjdGlvbnM9RWRpdG9yIFBhZ2UgU2VjdGlvbnMKLWV4dGVuc2lvblBvaW50RWRpdG9yQWN0aW9ucz1FZGl0b3IgQWN0aW9ucwotZXh0ZW5zaW9uUG9pbnRTZXJ2ZXJJbWFnZXM9U2VydmVyIEltYWdlcwotZXh0ZW5zaW9uUG9pbnRXaXphcmRGcmFnbWVudHM9V2l6YXJkIEZyYWdtZW50cwotZXh0ZW5zaW9uUG9pbnRJbml0aWFsU2VsZWN0aW9uUHJvdmlkZXI9SW5pdGlhbCBTZWxlY3Rpb24gUHJvdmlkZXIKLWV4dGVuc2lvblBvaW50U2VydmVyTGFiZWxQcm92aWRlcj1TZXJ2ZXIgTGFiZWwgUHJvdmlkZXIKLWV4dGVuc2lvblBvaW50QXVkaW89QXVkaW8KLWV4dGVuc2lvblBvaW50U2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9uPVNlcnZlciBDcmVhdGlvbiBXaXphcmQgUGFnZSBFeHRlbnNpb24KLWV4dGVuc2lvblBvaW50U2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlRXh0ZW5zaW9uPVNlcnZlciBFZGl0b3IgT3ZlcnZpZXcgUGFnZSBNb2RpZmllcgotCi0jIC0tLS0tLS0tLS0tLS0tLSBXaXphcmRzIGFuZCBWaWV3cyAtLS0tLS0tLS0tLS0tLS0KLQotY2F0ZWdvcnk9U2VydmVyCi1jb250ZXh0PUluIFNlcnZlcnMgVmlldwotbmV3U2VydmVyPVNlcnZlcgotbmV3U2VydmVyRGVzY3JpcHRpb249RGVmaW5lIGEgbmV3IHNlcnZlcgotCi12aWV3U2VydmVycz1TZXJ2ZXJzCi12aWV3U2VydmVyc19vbGQ9U2VydmVycyAoZGVwcmVjYXRlZCkKLWRlZmF1bHRQcm92aWRlcj1TZXJ2ZXIgYW5kIE1vZHVsZSBQcm92aWRlcgotCi0jIC0tLS0tLS0tLS0tLS0tLSBBY3Rpb24gU2V0cyAodG9vbGJhciBpY29uIGdyb3VwcykgLS0tLS0tLS0tLS0tLS0tCi0KLSMgU2VydmVycyBhY3Rpb24gc2V0Ci1hY3Rpb25TZXRUaXRsZT1TZXJ2ZXIKLWFjdGlvblNldE5ld1NlcnZlcj1DcmVhdGUgU2VydmVyCi0KLSMgUnVuIG9uIFNlcnZlciBhY3Rpb25zCi1hY3Rpb25SdW5PblNlcnZlcj1SdW4gb24gU2VydmVyCi1hY3Rpb25SdW5PblNlcnZlckRlc2NyaXB0aW9uPVJ1biB0aGUgY3VycmVudCBzZWxlY3Rpb24gb24gYSBzZXJ2ZXIKLWFjdGlvbkRlYnVnT25TZXJ2ZXI9RGVidWcgb24gU2VydmVyCi1hY3Rpb25EZWJ1Z09uU2VydmVyRGVzY3JpcHRpb249RGVidWcgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9uIGEgc2VydmVyCi1hY3Rpb25QdWJsaXNoPVB1Ymxpc2gKLWFjdGlvblB1Ymxpc2hEZXNjcmlwdGlvbj1QdWJsaXNoIHRvIHNlcnZlcgotYWN0aW9uUnVuPVJ1bgotYWN0aW9uUnVuRGVzY3JpcHRpb249UnVuIHNlcnZlcgotYWN0aW9uRGVidWc9RGVidWcKLWFjdGlvbkRlYnVnRGVzY3JpcHRpb249RGVidWcgc2VydmVyCi1hY3Rpb25Qcm9maWxlT25TZXJ2ZXI9UHJvZmlsZSBvbiBTZXJ2ZXIKLWFjdGlvblN0b3A9U3RvcAotYWN0aW9uU3RvcERlc2NyaXB0aW9uPVN0b3AgdGhlIHNlcnZlcgotCi0jIC0tLS0tLS0tLS0tLS0tLSBQcmVmZXJlbmNlcyBhbmQgUHJvcGVydHkgcGFnZXMgLS0tLS0tLS0tLS0tLS0tCi0KLXByZWZlcmVuY2VTZXJ2ZXJzVGl0bGU9U2VydmVyCi1wcmVmZXJlbmNlTGF1bmNoaW5nVGl0bGU9TGF1bmNoaW5nCi1wcmVmZXJlbmNlUnVudGltZXNUaXRsZT1SdW50aW1lIEVudmlyb25tZW50cwotcHJlZmVyZW5jZVNlcnZlcktleXdvcmRzPXNlcnZlcnMgcnVudGltZSBlbnZpcm9ubWVudCBidWlsZCBpbnN0YWxsZWQgcHVibGlzaGluZyBkZXBsb3kgYXNzZW1ibHkgbGF1bmNoaW5nIHJ1bm5pbmcgZGVidWdnaW5nIHByb2ZpbGluZwotCi1wcm9wZXJ0aWVzU2VydmVyPVNlcnZlcgotcHJvcGVydGllc1NlcnZlckluZm89R2VuZXJhbAotcHJvcGVydGllc01vbml0b3I9TW9uaXRvcmluZwotCi1ydW5PblNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb249UnVuIG9uIFNlcnZlcgotbGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlTmFtZT1SdW4gb24gU2VydmVyCi1sYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVEZXNjcmlwdGlvbj1SdW5zIGFwcGxpY2F0aW9ucyBvbiB0aGUgc2VydmVyCi0KLSMgLS0tLS0tLS0tLS0tLS0tIEVkaXRvciAtLS0tLS0tLS0tLS0tLS0KLQotc2VydmVyRWRpdG9yPVNlcnZlciBFZGl0b3IKLXNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZT1PdmVydmlldwotCi0jIC0tLS0tLS0tLS0tLS0tLSBBdWRpbyAtLS0tLS0tLS0tLS0tLS0KLQotYXVkaW9QcmVmZXJlbmNlVGl0bGU9QXVkaW8KLXByZWZlcmVuY2VBdWRpb0tleXdvcmRzPXNvdW5kIHZvbHVtZQotCi1sYXVuY2hhYmxlV2ViQnJvd3Nlcj1XZWIgYnJvd3NlcgotbGF1bmNoYWJsZVdlYkJyb3dzZXJEZXNjcmlwdGlvbj1PcGVuIHRoZSBSZXNvdXJjZSBpbiBhIFdlYiBCcm93c2VyCi0KLWF1ZGlvQ2F0ZWdvcnlTZXJ2ZXI9U2VydmVyCi1hdWRpb1NlcnZlclN0YXJ0ZWQ9U2VydmVyIFN0YXJ0ZWQKLWF1ZGlvU2VydmVyU3RvcHBlZD1TZXJ2ZXIgU3RvcHBlZAotCi1hdWRpb0NhdGVnb3J5UHVibGlzaD1QdWJsaXNoaW5nCi1hdWRpb1B1Ymxpc2hGaW5pc2hlZD1QdWJsaXNoIEZpbmlzaGVkCi0KLSMgLS0tLS0tLS0tLS0tLS0tIE90aGVyIC0tLS0tLS0tLS0tLS0tLQotCi1tb25pdG9yTGFiZWw9VENQL0lQIG1vbml0b3IKLW1vbml0b3JEZXNjcmlwdGlvbj1Vc2VzIHRoZSBpbnRlcm5hbCBUQ1AvSVAgbW9uaXRvciB0byBtb25pdG9yIHNlcnZlciByZXF1ZXN0cy4KLQotbW9kdWxlUHJvamVjdERlY29yYXRvckxhYmVsPU1vZHVsZSBQcm9qZWN0Ci1tb2R1bGVQcm9qZWN0RGVjb3JhdG9yRGVzY3JpcHRpb249RGVjb3JhdGVzIHNlcnZlciBtb2R1bGVzIHdpdGggaW5mb3JtYXRpb24gb24gdGhlIHByb2plY3QgdGhhdCB0aGV5IGNvbWUgZnJvbQotc2VydmVyU3RhdGVEZWNvcmF0b3JMYWJlbD1TZXJ2ZXIgU3RhdGUgRGVjb3JhdG9yCi0KLSMgLS0tLS0tLS0tLS0tLS0tIEFjdGlvbiBTZXRzICh0b29sYmFyIGljb24gZ3JvdXBzKSAtLS0tLS0tLS0tLS0tLS0KLQotIyBXZWIgQnJvd3NlciBhY3Rpb24gc2V0Ci1hY3Rpb25TZXRXZWJCcm93c2VyVGl0bGU9V2ViIEJyb3dzZXIKLWFjdGlvblNldE9wZW5XZWJCcm93c2VyPU9wZW4gV2ViIEJyb3dzZXIKLWFjdGlvblNldFN3aXRjaEJyb3dzZXI9V2ViIEJyb3dzZXIKLQotIyAtLS0tLS0tLS0tLS0tLS0gUHJlZmVyZW5jZXMgLS0tLS0tLS0tLS0tLS0tCi0KLSMgTmFtZSBvZiB0aGUgcHJlZmVyZW5jZSBwYWdlcwotcHJlZmVyZW5jZUludGVybmV0VGl0bGU9SW50ZXJuZXQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZjQ2OTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZWRpdG9yUGFnZXMiIG5hbWU9IiVleHRlbnNpb25Qb2ludEVkaXRvclBhZ2VzIiBzY2hlbWE9InNjaGVtYS9lZGl0b3JQYWdlcy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVkaXRvclBhZ2VTZWN0aW9ucyIgbmFtZT0iJWV4dGVuc2lvblBvaW50RWRpdG9yUGFnZVNlY3Rpb25zIiBzY2hlbWE9InNjaGVtYS9lZGl0b3JQYWdlU2VjdGlvbnMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlZGl0b3JBY3Rpb25zIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRFZGl0b3JBY3Rpb25zIiBzY2hlbWE9InNjaGVtYS9lZGl0b3JBY3Rpb25zLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2VydmVySW1hZ2VzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRTZXJ2ZXJJbWFnZXMiIHNjaGVtYT0ic2NoZW1hL3NlcnZlckltYWdlcy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9IndpemFyZEZyYWdtZW50cyIgbmFtZT0iJWV4dGVuc2lvblBvaW50V2l6YXJkRnJhZ21lbnRzIiBzY2hlbWE9InNjaGVtYS93aXphcmRGcmFnbWVudHMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJpbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIiIG5hbWU9IiVleHRlbnNpb25Qb2ludEluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciIgc2NoZW1hPSJzY2hlbWEvaW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYXVkaW8iIG5hbWU9IiVleHRlbnNpb25Qb2ludEF1ZGlvIiBzY2hlbWE9InNjaGVtYS9hdWRpby5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9InNlcnZlclRvb2xUaXAiIG5hbWU9IiVleHRlbnNpb25Qb2ludFNlcnZlclRvb2xUaXAiIHNjaGVtYT0ic2NoZW1hL3NlcnZlclRvb2xUaXAuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb24iIG5hbWU9IiVleHRlbnNpb25Qb2ludFNlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbiIgc2NoZW1hPSJzY2hlbWEvc2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9uLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlTW9kaWZpZXIiIG5hbWU9IiVleHRlbnNpb25Qb2ludFNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZUV4dGVuc2lvbiIgc2NoZW1hPSJzY2hlbWEvc2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlTW9kaWZpZXIuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzZXJ2ZXJMYWJlbFByb3ZpZGVyIiBuYW1lPSIlc2VydmVyTGFiZWxQcm92aWRlciIgc2NoZW1hPSJzY2hlbWEvc2VydmVyTGFiZWxQcm92aWRlci5leHNkIi8+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICA8Y2F0ZWdvcnkKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICBuYW1lPSIlY2F0ZWdvcnkiLz4KLQotICA8d2l6YXJkCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5uZXcuc2VydmVyIgotICAgICAgbmFtZT0iJW5ld1NlcnZlciIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5OZXdTZXJ2ZXJXaXphcmQiCi0gICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICAgIGljb249Imljb25zL2N0b29sMTYvd2l6X25ld19zZXJ2ZXIuZ2lmIj4KLSAgICA8ZGVzY3JpcHRpb24+JW5ld1NlcnZlckRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLSAgPC93aXphcmQ+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPiAKLSAgPGNhdGVnb3J5Ci0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCi0gICAgbmFtZT0iJWNhdGVnb3J5Ii8+Ci0KLQotICA8dmlldwotICAgICAgICBhbGxvd011bHRpcGxlPSJmYWxzZSIKLSAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNuZi5TZXJ2ZXJzVmlldzIiCi0gICAgICAgIGljb249Imljb25zL2N2aWV3MTYvc2VydmVyc192aWV3LmdpZiIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyc1ZpZXciCi0gICAgICAgIG5hbWU9IiV2aWV3U2VydmVycyI+Ci0gIDwvdmlldz4KLTwvZXh0ZW5zaW9uPgotPGV4dGVuc2lvbgotICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4KLSAgIDxuYXZpZ2F0b3JDb250ZW50Ci0gICAgICAgICBhY3RpdmVCeURlZmF1bHQ9InRydWUiCi0gICAgICAgICBjb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY25mLlNlcnZlckNvbnRlbnRQcm92aWRlciIKLSAgICAgICAgIGljb249Imljb25zL2N2aWV3MTYvc2VydmVyc192aWV3LmdpZiIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlcnNWaWV3LmNvbnRlbnQucm9vdCIKLSAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY25mLlNlcnZlckxhYmVsUHJvdmlkZXIiCi0gICAgICAgICBuYW1lPSIlZGVmYXVsdFByb3ZpZGVyIgotICAgICAgICAgcHJpb3JpdHk9ImhpZ2hlc3QiPgotICAgICAgPHRyaWdnZXJQb2ludHM+Ci0gICAgICAgICA8b3I+Ci0gICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyIj4KLSAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyIj4KLSAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgIDwvb3I+Ci0gICAgICA8L3RyaWdnZXJQb2ludHM+Ci0gICAgICA8cG9zc2libGVDaGlsZHJlbj4KLSAgICAgICAgIDxvcj4KLSAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0iamF2YS5sYW5nLk9iamVjdCI+Ci0gICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyIj4KLSAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyIj4KLSAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgIDwvb3I+Ci0gICAgICA8L3Bvc3NpYmxlQ2hpbGRyZW4+Ci0JICA8YWN0aW9uUHJvdmlkZXIKLQkgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jbmYuU2VydmVyQWN0aW9uUHJvdmlkZXIiCi0JICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyc1ZpZXcuU2VydmVyQWN0aW9uUHJvdmlkZXIiCi0JICAgICAgICAgICAgcHJpb3JpdHk9ImhpZ2hlc3QiPgotCQkJPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyIj4KLSAgICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyIj4KLSAgICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiPgotICAgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24iPgotICAgICAgICAgICAgICAgICAgPGNvdW50Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iMCI+Ci0gICAgICAgICAgICAgICAgICA8L2NvdW50PgotICAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgICA8L29yPgotICAgICAgICAgICAgPC9lbmFibGVtZW50PgotCSAgPC9hY3Rpb25Qcm92aWRlcj4gICAgICAKLSAgICAgIDxkcm9wQXNzaXN0YW50Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY25mLlNlcnZlcnNWaWV3RHJvcEFkYXB0ZXJBc3Npc3RhbnQiCi0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyc1ZpZXcuRHJvcEFzc2lzdGFudCI+Ci0gICAgICAgICAgPHBvc3NpYmxlRHJvcFRhcmdldHM+Ci0gICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImphdmEubGFuZy5PYmplY3QiPgotICAgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICA8L29yPgotICAgICAgICAgIDwvcG9zc2libGVEcm9wVGFyZ2V0cz4KLSAgICAgICA8L2Ryb3BBc3Npc3RhbnQ+Ci0gICA8L25hdmlnYXRvckNvbnRlbnQ+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbgotICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXIiPgotICAgPHZpZXdlckNvbnRlbnRCaW5kaW5nCi0gICAgICAgICB2aWV3ZXJJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJzVmlldyI+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICA8Y29udGVudEV4dGVuc2lvbgotICAgICAgICAgICAgICAgaXNSb290PSJ0cnVlIgotICAgICAgICAgICAgICAgcGF0dGVybj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJzVmlldy5jb250ZW50LnJvb3QiPgotICAgICAgICAgPC9jb250ZW50RXh0ZW5zaW9uPgotICAgICAgPC9pbmNsdWRlcz4KLSAgIDwvdmlld2VyQ29udGVudEJpbmRpbmc+Ci0JPHZpZXdlcgotICAgICAgIGhlbHBDb250ZXh0PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnN2Y3AwMDAwIgotICAgICAgIHZpZXdlcklkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlcnNWaWV3Ij4KLQkJPG9wdGlvbnM+Ci0JCQk8cHJvcGVydHkgbmFtZT0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLmhpZGVMaW5rV2l0aEVkaXRvckFjdGlvbiIKLQkJCQl2YWx1ZT0idHJ1ZSI+Ci0JCQk8L3Byb3BlcnR5PgotCQk8L29wdGlvbnM+Ci0JPC92aWV3ZXI+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLSAgPHBlcnNwZWN0aXZlRXh0ZW5zaW9uCi0gICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnUGVyc3BlY3RpdmUiPgotICAgIDx2aWV3Ci0gICAgICByZWxhdGl2ZT0ib3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdWaWV3IgotICAgICAgcmVsYXRpb25zaGlwPSJzdGFjayIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlcnNWaWV3Ij4KLSAgICA8L3ZpZXc+Ci0gIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgPHBhZ2UKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcmVmZXJlbmNlUGFnZSIKLSAgICBuYW1lPSIlcHJlZmVyZW5jZVNlcnZlcnNUaXRsZSIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmVmZXJlbmNlS2V5d29yZHMiLz4KLSAgPC9wYWdlPgotICA8cGFnZQotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmxhdW5jaGluZy5wcmVmZXJlbmNlUGFnZSIKLSAgICBuYW1lPSIlcHJlZmVyZW5jZUxhdW5jaGluZ1RpdGxlIgotICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByZWZlcmVuY2VQYWdlIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkxhdW5jaGluZ1ByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZWZlcmVuY2VLZXl3b3JkcyIvPgotICA8L3BhZ2U+Ci0gIDxwYWdlCi0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucnVudGltZS5wcmVmZXJlbmNlUGFnZSIKLSAgICBuYW1lPSIlcHJlZmVyZW5jZVJ1bnRpbWVzVGl0bGUiCi0gICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJlZmVyZW5jZVBhZ2UiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuUnVudGltZVByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZWZlcmVuY2VLZXl3b3JkcyIvPgotICA8L3BhZ2U+Ci0gIDxwYWdlCi0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5hdWRpby5wcmVmZXJlbmNlUGFnZSIKLSAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcmVmZXJlbmNlUGFnZSIKLSAgICBuYW1lPSIlYXVkaW9QcmVmZXJlbmNlVGl0bGUiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW8uQXVkaW9QcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5hdWRpby5wcmVmZXJlbmNlS2V5d29yZHMiLz4KLSAgPC9wYWdlPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmtleXdvcmRzIj4KLSAgPGtleXdvcmQKLSAgICBsYWJlbD0iJXByZWZlcmVuY2VTZXJ2ZXJLZXl3b3JkcyIKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmVmZXJlbmNlS2V5d29yZHMiLz4KLSAgPGtleXdvcmQKLSAgICBsYWJlbD0iJXByZWZlcmVuY2VBdWRpb0tleXdvcmRzIgotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmF1ZGlvLnByZWZlcmVuY2VLZXl3b3JkcyIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICA8ZWRpdG9yIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvciIKLSAgICBuYW1lPSIlc2VydmVyRWRpdG9yIgotICAgIGljb249Imljb25zL29iajE2L3NlcnZlci5naWYiCi0gICAgZXh0ZW5zaW9ucz0ic2VydmVyIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvci5TZXJ2ZXJFZGl0b3IiCi0gICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3IuU2VydmVyRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IiLz4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lbGVtZW50RmFjdG9yaWVzIj4KLSAgPGZhY3RvcnkgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLmlucHV0LmZhY3RvcnkiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLlNlcnZlckVkaXRvcklucHV0RmFjdG9yeSIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgotICA8cGFnZQotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByb2plY3QucHJvcGVydGllcyIKLSAgICBuYW1lPSIlcHJvcGVydGllc1NlcnZlciIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5Qcm9qZWN0UHJvcGVydHlQYWdlIj4KLSAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgIDxhbmQ+Ci0gICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLSAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmlzUnVubmFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgPC9hbmQ+Ci0gICAgIDwvZW5hYmxlZFdoZW4+Ci0gIDwvcGFnZT4KLSAgPHBhZ2UKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcm9wZXJ0aWVzIgotICAgIG5hbWU9IiVwcm9wZXJ0aWVzU2VydmVySW5mbyIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJQcm9wZXJ0eVBhZ2UiPgotICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgPGFuZD4KLSAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlciIvPgotICAgICAgIDwvYW5kPgotICAgICA8L2VuYWJsZWRXaGVuPgotICA8L3BhZ2U+Ci0gIDxwYWdlCi0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJvcGVydGllcy5tb25pdG9yIgotICAgIG5hbWU9IiVwcm9wZXJ0aWVzTW9uaXRvciIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9uaXRvclByb3BlcnR5UGFnZSI+Ci0gICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICA8YW5kPgotICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyIi8+Ci0gICAgICAgPC9hbmQ+Ci0gICAgIDwvZW5hYmxlZFdoZW4+Ci0gIDwvcGFnZT4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4KLSAgPGFjdGlvblNldAotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLm5ldy5hY3Rpb25TZXQiCi0gICAgbGFiZWw9IiVhY3Rpb25TZXRUaXRsZSIKLSAgICB2aXNpYmxlPSJmYWxzZSI+Ci0gICAgPGFjdGlvbgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuYWN0aW9uLm5ldy5zZXJ2ZXIiCi0gICAgICB0b29sYmFyUGF0aD0ic2VydmVycyIKLSAgICAgIGxhYmVsPSIlYWN0aW9uU2V0TmV3U2VydmVyIgotICAgICAgdG9vbHRpcD0iJWFjdGlvblNldE5ld1NlcnZlciIKLSAgICAgIGljb249Imljb25zL2N0b29sMTYvd2l6X25ld19zZXJ2ZXIuZ2lmIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9ucy5OZXdTZXJ2ZXJBY3Rpb24iLz4KLSAgPC9hY3Rpb25TZXQ+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoU2hvcnRjdXRzIj4KLSAgIDxzaG9ydGN1dAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIubGF1bmNoU2hvcnRjdXQiCi0gICAgICAgICBsYWJlbD0iJWFjdGlvblJ1bk9uU2VydmVyIgotICAgICAgICAgZGVzY3JpcHRpb249IiVhY3Rpb25SdW5PblNlcnZlckRlc2NyaXB0aW9uIgotICAgICAgICAgbW9kZXM9InJ1biwgZGVidWcsIHByb2ZpbGUiCi0gICAgICAgICBwYXRoPSJhYSIKLSAgICAgICAgIGljb249Imljb25zL2V0b29sMTYvcnVuX29uX3NlcnZlci5naWYiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJMYXVuY2hTaG9ydGN1dCI+Ci0gICAgICA8Y29udGV4dHVhbExhdW5jaD4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxjb3VudCB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgIDxpdGVyYXRlPgotICAgICAgICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmlzUnVubmFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgPC9pdGVyYXRlPgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgIDxjb250ZXh0TGFiZWwKLSAgICAgICAgICAgbW9kZT0icnVuIgotICAgICAgICAgICBsYWJlbD0iJWFjdGlvblJ1bk9uU2VydmVyIi8+Ci0gICAgICAgIDxjb250ZXh0TGFiZWwKLSAgICAgICAgICAgbW9kZT0iZGVidWciCi0gICAgICAgICAgIGxhYmVsPSIlYWN0aW9uRGVidWdPblNlcnZlciIvPgotICAgICAgICA8Y29udGV4dExhYmVsCi0gICAgICAgICAgIG1vZGU9InByb2ZpbGUiCi0gICAgICAgICAgIGxhYmVsPSIlYWN0aW9uUHJvZmlsZU9uU2VydmVyIi8+Ci0gICAgICA8L2NvbnRleHR1YWxMYXVuY2g+Ci0gICAgICA8Y29uZmlndXJhdGlvblR5cGUKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgotICAgICAgPC9jb25maWd1cmF0aW9uVHlwZT4KLSAgIDwvc2hvcnRjdXQ+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgotICAgPHByb3BlcnR5VGVzdGVyCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcm9wZXJ0eVRlc3RlciIKLSAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICAgIHByb3BlcnRpZXM9ImlzUnVubmFibGUiCi0gICAgICB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0IgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyUHJvcGVydHlUZXN0ZXIiPgotICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLSAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJvcGVydHlUZXN0ZXIiCi0gICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCi0gICAgICBwcm9wZXJ0aWVzPSJzZXJ2ZXJUeXBlIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJQcm9wZXJ0eVRlc3RlciI+Ci0gICA8L3Byb3BlcnR5VGVzdGVyPgotICAgPHByb3BlcnR5VGVzdGVyCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcm9wZXJ0eVRlc3RlciIKLSAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICAgIHByb3BlcnRpZXM9InNlcnZlclR5cGUiCi0gICAgICB0eXBlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVycy5Nb2R1bGVTZXJ2ZXIiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJQcm9wZXJ0eVRlc3RlciI+Ci0gICA8L3Byb3BlcnR5VGVzdGVyPgotICAgPHByb3BlcnR5VGVzdGVyCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcm9wZXJ0eVRlc3RlciIKLSAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICAgIHByb3BlcnRpZXM9Im1vZHVsZVR5cGUiCi0gICAgICB0eXBlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZSIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclByb3BlcnR5VGVzdGVyIj4KLSAgIDwvcHJvcGVydHlUZXN0ZXI+Ci0gICA8cHJvcGVydHlUZXN0ZXIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByb3BlcnR5VGVzdGVyIgotICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIgotICAgICAgcHJvcGVydGllcz0ibW9kdWxlVHlwZSIKLSAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLk1vZHVsZVNlcnZlciIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclByb3BlcnR5VGVzdGVyIj4KLSAgIDwvcHJvcGVydHlUZXN0ZXI+Ci0gICA8cHJvcGVydHlUZXN0ZXIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByb3BlcnR5VGVzdGVyIgotICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIgotICAgICAgcHJvcGVydGllcz0ibW9kdWxlVmVyc2lvbiIKLSAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyUHJvcGVydHlUZXN0ZXIiPgotICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLSAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJvcGVydHlUZXN0ZXIiCi0gICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCi0gICAgICBwcm9wZXJ0aWVzPSJtb2R1bGVWZXJzaW9uIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyUHJvcGVydHlUZXN0ZXIiPgotICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLTwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yUGFnZXMiPgotICAgIDxwYWdlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5lZGl0b3Iub3ZlcnZpZXciCi0gICAgICBvcmRlcj0iLTEwMDAwIgotICAgICAgbmFtZT0iJXNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZSIKLSAgICAgIHR5cGVJZHM9IioiCi0gICAgICBpbnNlcnRpb25JZHM9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZWRpdG9yLm92ZXJ2aWV3LmxlZnQsIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZWRpdG9yLm92ZXJ2aWV3LnJpZ2h0IgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLk92ZXJ2aWV3RWRpdG9yUGFydCIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgIDxmYWN0b3J5Ci0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyIj4KLSAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXIiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gICAgPGZhY3RvcnkKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlckFkYXB0ZXJGYWN0b3J5IgotICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyIj4KLSAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXIiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gICAgPGZhY3RvcnkKLSAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyQWRhcHRlckZhY3RvcnkiPgotICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gIDwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuY2xpZW50cyI+Ci0gIDxjbGllbnQKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53ZWIiCi0gICAgbmFtZT0iJWxhdW5jaGFibGVXZWJCcm93c2VyIgotICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoYWJsZVdlYkJyb3dzZXJEZXNjcmlwdGlvbiIKLSAgICBsYXVuY2hhYmxlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5IdHRwTGF1bmNoYWJsZSIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5XZWJMYXVuY2hhYmxlQ2xpZW50Ii8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsU3RhcnR1cCI+Ci0gIDxzdGFydHVwCi0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc3RhcnR1cCIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TdGFydHVwIi8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5hdWRpbyI+Ci0gIDxjYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zb3VuZC5zZXJ2ZXIiCi0gICAgbmFtZT0iJWF1ZGlvQ2F0ZWdvcnlTZXJ2ZXIiLz4KLSAgPHNvdW5kIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnNvdW5kLnNlcnZlclN0YXJ0IgotICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnNvdW5kLnNlcnZlciIKLSAgICBuYW1lPSIlYXVkaW9TZXJ2ZXJTdGFydGVkIi8+Ci0gIDxzb3VuZCBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zb3VuZC5zZXJ2ZXJTdG9wIgotICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnNvdW5kLnNlcnZlciIKLSAgICBuYW1lPSIlYXVkaW9TZXJ2ZXJTdG9wcGVkIi8+Ci0gIDxjYXRlZ29yeSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zb3VuZC5wdWJsaXNoIgotICAgIG5hbWU9IiVhdWRpb0NhdGVnb3J5UHVibGlzaCIvPgotICA8c291bmQgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuc291bmQucHVibGlzaEZpbmlzaGVkIgotICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnNvdW5kLnB1Ymxpc2giCi0gICAgbmFtZT0iJWF1ZGlvUHVibGlzaEZpbmlzaGVkIi8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsU2VydmVyTW9uaXRvcnMiPgotICA8bW9uaXRvcgotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLm1vbml0b3IiCi0gICAgbmFtZT0iJW1vbml0b3JMYWJlbCIKLSAgICBkZXNjcmlwdGlvbj0iJW1vbml0b3JEZXNjcmlwdGlvbiIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5EZWZhdWx0TW9uaXRvckRlbGVnYXRlIi8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0gIDxhY3Rpb25TZXQKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53ZWJicm93c2VyLmFjdGlvblNldCIKLSAgICBsYWJlbD0iJWFjdGlvblNldFdlYkJyb3dzZXJUaXRsZSIKLSAgICB2aXNpYmxlPSJmYWxzZSI+Ci0gICAgPGFjdGlvbgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2ViYnJvd3Nlci5hY3Rpb24ub3BlbiIKLSAgICAgIHRvb2xiYXJQYXRoPSJicm93c2VyIgotICAgICAgbGFiZWw9IiVhY3Rpb25TZXRPcGVuV2ViQnJvd3NlciIKLSAgICAgIHRvb2x0aXA9IiVhY3Rpb25TZXRPcGVuV2ViQnJvd3NlciIKLSAgICAgIGljb249Imljb25zL29iajE2L2ludGVybmFsX2Jyb3dzZXIuZ2lmIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2ViYnJvd3Nlci5PcGVuQnJvd3NlcldvcmtiZW5jaEFjdGlvbiIvPgotICAgIDxhY3Rpb24KLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndlYmJyb3dzZXIuYWN0aW9uLnN3aXRjaCIKLSAgICAgIG1lbnViYXJQYXRoPSJ3aW5kb3cvYnJvd3NlciIKLSAgICAgIGxhYmVsPSIlYWN0aW9uU2V0U3dpdGNoQnJvd3NlciIKLSAgICAgIHRvb2x0aXA9IiVhY3Rpb25TZXRTd2l0Y2hCcm93c2VyIgotICAgICAgc3R5bGU9InB1bGxkb3duIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2ViYnJvd3Nlci5Td2l0Y2hCcm93c2VyV29ya2JlbmNoQWN0aW9uIi8+Ci0gIDwvYWN0aW9uU2V0PgotPC9leHRlbnNpb24+Ci0KLTwhLS0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaEdyb3VwcyI+Ci0gIDxsYXVuY2hHcm91cAotICAgICBsYWJlbD0iJUV4dGVybmFsVG9vbHNMYXVuY2hHcm91cC5sYWJlbCIKLSAgICAgYmFubmVySW1hZ2U9Imljb25zL2Z1bGwvd2l6YmFuL2V4dF90b29sc193aXouZ2lmIgotICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scyIKLSAgICAgaW1hZ2U9Imljb25zL2Z1bGwvb2JqMTYvZXh0ZXJuYWxfdG9vbHMuZ2lmIgotICAgICBtb2RlPSJydW4iCi0gICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmxhdW5jaEdyb3VwIgotICAgICB0aXRsZT0iJUV4dGVybmFsVG9vbHNMYXVuY2hHcm91cC50aXRsZSI+Ci0gIDwvbGF1bmNoR3JvdXA+Ci0gIDxsYXVuY2hHcm91cAotICAgICBsYWJlbD0iJUV4dGVybmFsVG9vbHNMYXVuY2hHcm91cC5sYWJlbCIKLSAgICAgYmFubmVySW1hZ2U9Imljb25zL2Z1bGwvd2l6YmFuL2V4dF90b29sc193aXouZ2lmIgotICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5idWlsZGVyIgotICAgICBpbWFnZT0iaWNvbnMvZnVsbC9vYmoxNi9leHRlcm5hbF90b29scy5naWYiCi0gICAgIHB1YmxpYz0iZmFsc2UiCi0gICAgIG1vZGU9InJ1biIKLSAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMubGF1bmNoR3JvdXAuYnVpbGRlciI+Ci0gICA8L2xhdW5jaEdyb3VwPgotPC9leHRlbnNpb24+Ci0tLT4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotICA8Y2F0ZWdvcnkKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICBuYW1lPSIlY2F0ZWdvcnkiCi0gICAgZGVzY3JpcHRpb249IiVjYXRlZ29yeSIvPgotICA8Y29tbWFuZAotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmxhdW5jaFNob3J0Y3V0LnJ1biIKLSAgICBuYW1lPSIlYWN0aW9uUnVuT25TZXJ2ZXIiCi0gICAgZGVzY3JpcHRpb249IiVhY3Rpb25SdW5PblNlcnZlckRlc2NyaXB0aW9uIgotICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmNhdGVnb3J5LnJ1biIvPgotICA8Y29tbWFuZAotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmxhdW5jaFNob3J0Y3V0LmRlYnVnIgotICAgIG5hbWU9IiVhY3Rpb25EZWJ1Z09uU2VydmVyIgotICAgIGRlc2NyaXB0aW9uPSIlYWN0aW9uRGVidWdPblNlcnZlckRlc2NyaXB0aW9uIgotICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmNhdGVnb3J5LnJ1biIvPgotICA8Y29tbWFuZAotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnJ1biIKLSAgICBuYW1lPSIlYWN0aW9uUnVuIgotICAgIGRlc2NyaXB0aW9uPSIlYWN0aW9uUnVuRGVzY3JpcHRpb24iCi0gICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuU2VydmVyQWN0aW9uSGFuZGxlciIvPgotICA8Y29tbWFuZAotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmRlYnVnIgotICAgIG5hbWU9IiVhY3Rpb25EZWJ1ZyIKLSAgICBkZXNjcmlwdGlvbj0iJWFjdGlvbkRlYnVnRGVzY3JpcHRpb24iCi0gICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuU2VydmVyQWN0aW9uSGFuZGxlciIvPgotICA8Y29tbWFuZAotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnN0b3AiCi0gICAgbmFtZT0iJWFjdGlvblN0b3AiCi0gICAgZGVzY3JpcHRpb249IiVhY3Rpb25TdG9wRGVzY3JpcHRpb24iCi0gICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuU2VydmVyQWN0aW9uSGFuZGxlciIvPgotICA8Y29tbWFuZAotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnB1Ymxpc2giCi0gICAgbmFtZT0iJWFjdGlvblB1Ymxpc2giCi0gICAgZGVzY3JpcHRpb249IiVhY3Rpb25QdWJsaXNoRGVzY3JpcHRpb24iCi0gICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuU2VydmVyQWN0aW9uSGFuZGxlciIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzIj4KLSAgPGNvbnRleHQKLSAgICBpZD0ib3JnLmVjbGlwc2UudWkuc2VydmVyVmlld1Njb3BlIgotICAgIG5hbWU9IiVjb250ZXh0IgotICAgIGRlc2NyaXB0aW9uPSIlY29udGV4dCIKLSAgICBwYXJlbnRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMud2luZG93Ij4KLSAgPC9jb250ZXh0PgotPC9leHRlbnNpb24+Ci0KLTwhLS0gY29tbWFuZHMgYW5kIHRoZWlyIGJpbmRpbmdzCi1OT1RFOgotTTEgPSBDVFJML0NPTU1BTkQKLU0yID0gU0hJRlQKLU0zID0gQUxUCi1NNCA9IFBsYXRmb3JtLXNwZWNpZmljIGZvdXJ0aCBrZXkKLS0tPgotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYmluZGluZ3MiPgotICA8a2V5Ci0gICAgc2VxdWVuY2U9Ik0zK00yK1ggUiIKLSAgICBjb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmdsb2JhbFNjb3BlIgotICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5sYXVuY2hTaG9ydGN1dC5ydW4iCi0gICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iLz4KLSAgPGtleQotICAgIHNlcXVlbmNlPSJNMytNMitEIFIiCi0gICAgY29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5nbG9iYWxTY29wZSIKLSAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIubGF1bmNoU2hvcnRjdXQuZGVidWciCi0gICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iLz4KLSAgPGtleQotICAgIHNlcXVlbmNlPSJNMStNMytSIgotICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuc2VydmVyVmlld1Njb3BlIgotICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5ydW4iCi0gICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iLz4KLSAgPGtleQotICAgIHNlcXVlbmNlPSJNMStNMytEIgotICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuc2VydmVyVmlld1Njb3BlIgotICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5kZWJ1ZyIKLSAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIvPgotICA8a2V5Ci0gICAgc2VxdWVuY2U9Ik0xK00zK1MiCi0gICAgY29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5zZXJ2ZXJWaWV3U2NvcGUiCi0gICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnN0b3AiCi0gICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iLz4KLSAgPGtleQotICAgIHNlcXVlbmNlPSJNMStNMytQIgotICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuc2VydmVyVmlld1Njb3BlIgotICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wdWJsaXNoIgotICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIi8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJJbWFnZXMiPgotICA8aW1hZ2UKLSAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2ViIgotICAgICB0eXBlSWRzPSJ3c3Qud2ViIgotICAgICBpY29uPSJpY29ucy9vYmoxNi93ZWJfbW9kdWxlLmdpZiIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5tYXJrZXJSZXNvbHV0aW9uIj4KLSAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKLSAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciIKLSAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudmFsaWRhdGlvbi5tYXJrZXIiLz4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5kZWNvcmF0b3JzIj4KLSAgPGRlY29yYXRvcgotICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1vZHVsZUxhYmVsRGVjb3JhdG9yIgotICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5kZWNvcmF0b3IiCi0gICAgIGxhYmVsPSIlbW9kdWxlUHJvamVjdERlY29yYXRvckxhYmVsIgotICAgICBsaWdodHdlaWdodD0iZmFsc2UiCi0gICAgIHN0YXRlPSJmYWxzZSI+Ci0gICAgPGRlc2NyaXB0aW9uPiVtb2R1bGVQcm9qZWN0RGVjb3JhdG9yRGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotICAgIDxlbmFibGVtZW50PgotICAgICAgPG9yPgotICAgICAgICA8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUiLz4KLSAgICAgICAgPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLk1vZHVsZVNlcnZlciIvPgotICAgICAgPC9vcj4KLSAgICA8L2VuYWJsZW1lbnQ+Ci0gIDwvZGVjb3JhdG9yPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGVzIj4KLSAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlCi0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgZGVsZWdhdGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9ucy5SdW5PblNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSIKLSAgICBkZWxlZ2F0ZU5hbWU9IiVsYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVOYW1lIgotICAgIGRlbGVnYXRlRGVzY3JpcHRpb249IiVsYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGVEZXNjcmlwdGlvbiIKLSAgICBwdWJsaWM9ImZhbHNlIgotICAgIG1vZGVzPSJydW4sZGVidWcscHJvZmlsZSIKLSAgICBuYW1lPSIlcnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uIi8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZXMiPgotICA8bGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZQotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UiCi0gICAgY29uZmlnVHlwZUlEPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgIGljb249Imljb25zL2V0b29sMTYvcnVuX29uX3NlcnZlci5naWYiPgotICA8L2xhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2U+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJUb29sVGlwIj4KLSAgPHNlcnZlclRvb2xUaXAKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5HZW5lcmFsVG9vbFRpcCIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5HZW5lcmFsVG9vbFRpcCIKLSAgICBzZXJ2ZXJUeXBlcz0iKiIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5sYXVuY2hhYmxlQWRhcHRlcnMiPgotICA8bGF1bmNoYWJsZUFkYXB0ZXIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW4kRGVmYXVsdExhdW5jaGFibGVBZGFwdGVyIgotICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5sYXVuY2hhYmxlLmFkYXB0ZXIuZGVmYXVsdCIKLSAgICAgICAgcHJpb3JpdHk9Ii05OTk5OTkiLz4KLTwvZXh0ZW5zaW9uPgotPGV4dGVuc2lvbgotICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmRlY29yYXRvcnMiPgotICAgPGRlY29yYXRvcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY25mLlNlcnZlckRlY29yYXRvciIKLSAgICAgICAgIGljb249Imljb25zL29iajE2L3NlcnZlci5naWYiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5uYXZpZ2F0b3JEZWNvcmF0b3IiCi0gICAgICAgICBsYWJlbD0iJXNlcnZlclN0YXRlRGVjb3JhdG9yTGFiZWwiCi0gICAgICAgICBsaWdodHdlaWdodD0idHJ1ZSIKLSAgICAgICAgIGxvY2F0aW9uPSJCT1RUT01fUklHSFQiCi0gICAgICAgICBzdGF0ZT0idHJ1ZSI+Ci0gICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgIDxvcj4KLSAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIiPgotICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyIj4KLSAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICA8L29yPgotICAgICAgPC9lbmFibGVtZW50PgotICAgPC9kZWNvcmF0b3I+Ci08L2V4dGVuc2lvbj4KLTxleHRlbnNpb24KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuc2F2ZUVkaXRvclByb21wdGVyIj4KLSAgIDxzYXZlRWRpdG9yUHJvbXB0ZXIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNhdmVFZGl0b3JQcm9tcHRlciIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnNhdmVFZGl0b3JQcm9tcHRlcjEiPgotICAgPC9zYXZlRWRpdG9yUHJvbXB0ZXI+Ci08L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9hdWRpby5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9hdWRpby5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTllZGY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvYXVkaW8uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIiBpZD0iYXVkaW8iIG5hbWU9IkF1ZGlvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIHNvcnQgcnVudGltZSB0eXBlcywgcnVudGltZXMsIHNlcnZlciB0eXBlcywgYW5kIHNlcnZlcnMuIFRoZSBmaXJzdCBleHRlbnNpb24gZm91bmQgaXMgYWx3YXlzIHVzZWQgYW5kIGl0IGlzIGV4cGVjdGVkIHRoYXQgb25seSBvbmUgY29tcGFyYXRvciBleGlzdHMgaW4gYW4gaW5zdGFsbGF0aW9uLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjYXRlZ29yeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzb3VuZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNhdGVnb3J5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGNhdGVnb3J5Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBjYXRlZ29yeQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzb3VuZCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHNvdW5kCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2F0ZWdvcnkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBjYXRlZ29yeSBpZAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgc291bmQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHNvcnRlciBleHRlbnNpb24gcG9pbnQ6Ci0KLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIAotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zb3J0ZXImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7aW1hZ2UKLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlJnF1b3Q7Ci0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5ydW50aW1lLk15Q29tcGFyYXRvciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvZWRpdG9yQWN0aW9ucy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9lZGl0b3JBY3Rpb25zLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Y2ZjYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9lZGl0b3JBY3Rpb25zLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIiBpZD0iZWRpdG9yQWN0aW9ucyIgbmFtZT0iRWRpdG9yIEFjdGlvbnMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXMgYSB3YXkgdG8gYWRkIGFjdGlvbnMgdG8gdGhlIHRvb2xiYXIgb2YgYW4gZXhpc3Rpbmcgc2VydmVyIGVkaXRvci4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzY2hlbWE6Ly9vcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zL3NjaGVtYS9leHByZXNzaW9uTGFuZ3VhZ2UuZXhzZCIvPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVkaXRvckFjdGlvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZWRpdG9yQWN0aW9uIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZW5hYmxlbWVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgYWN0aW9uDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGVJZHMiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBzZXJ2ZXIgdHlwZSBpZHMuIE1heSBpbmNsdWRlIHdpbGRjYXJkcyAoKikgYXQgdGhlIGVuZCBvZiBhbiBpZA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGlzIGFjdGlvbg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9yZGVyIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIGludGVnZXIgdGhhdCBzcGVjaWZpZXMgYW4gYWJzb2x1dGUgb3JkZXJpbmcgb2YgdGhlIGFjdGlvbiByZWxhdGl2ZSB0byBvdGhlciBhY3Rpb25zDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gZWRpdG9yIGFjdGlvbiBleHRlbnNpb24gcG9pbnQ6DQotDQotJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3JBY3Rpb25zJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtwYWdlDQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUmcXVvdDsNCi0gICAgICAgICAgICBvcmRlcj0mcXVvdDsyMCZxdW90Ow0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7JWVkaXRvckFjdGlvbiZxdW90Ow0KLSAgICAgICAgICAgIHR5cGVJZHM9JnF1b3Q7Y29tLmV4YW1wbGUuKiZxdW90Ow0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVFZGl0b3JBY3Rpb24mcXVvdDsvJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvZWRpdG9yUGFnZVNlY3Rpb25zLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2VkaXRvclBhZ2VTZWN0aW9ucy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmZhOGI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvZWRpdG9yUGFnZVNlY3Rpb25zLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIiBpZD0iZWRpdG9yUGFnZVNlY3Rpb25zIiBuYW1lPSJFZGl0b3IgUGFnZSBTZWN0aW9ucyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyBhIHdheSB0byBhZGQgYWRkaXRpb25hbCBzZWN0aW9ucyBpbnRvIGFuIGV4aXN0aW5nIHNlcnZlciBlZGl0b3IgcGFnZSB0aGF0IGNvbnRhaW5zIGluc2VydGlvbiBwb2ludHMuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ic2NoZW1hOi8vb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy9zY2hlbWEvZXhwcmVzc2lvbkxhbmd1YWdlLmV4c2QiLz4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZWN0aW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJzZWN0aW9uIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVuYWJsZW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHNlY3Rpb24NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuU2VydmVyRWRpdG9yU2VjdGlvbiZsdDsvc2FtcCZndDsNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLlNlcnZlckVkaXRvclNlY3Rpb24iLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZUlkcyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHNlcnZlciB0eXBlIGlkcy4gTWF5IGluY2x1ZGUgd2lsZGNhcmRzICgqKSBhdCB0aGUgZW5kIG9mIGFuIGlkDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9yZGVyIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIGludGVnZXIgdGhhdCBzcGVjaWZpZXMgYW4gYWJzb2x1dGUgb3JkZXJpbmcgb2YgdGhlIHNlY3Rpb24gcmVsYXRpdmUgdG8gb3RoZXIgc2VjdGlvbnMNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0aW9uSWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgdGhlIGVkaXRvciBwYWdlIGluc2VydGlvbiBpZCB0aGF0IHRoaXMgc2VjdGlvbiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50bw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGVkaXRvciBwYWdlIHNlY3Rpb24gZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbiANCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvclBhZ2VTZWN0aW9ucyZxdW90OyZndDsNCi0gICAgICAmbHQ7c2VjdGlvbg0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlJnF1b3Q7DQotICAgICAgICAgICAgb3JkZXI9JnF1b3Q7MCZxdW90Ow0KLSAgICAgICAgICAgIGluc2VydGlvbklkPSZxdW90O2NvbS5leGFtcGxlLmxlZnQmcXVvdDsNCi0gICAgICAgICAgICB0eXBlSWRzPSZxdW90O2NvbS5leGFtcGxlLiomcXVvdDsNCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlRWRpdG9yU2VjdGlvbkZhY3RvcnkmcXVvdDsvJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLlNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeURlbGVnYXRlJmx0Oy9jb2RlJmd0Oy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2VkaXRvclBhZ2VzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2VkaXRvclBhZ2VzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYTllYzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9lZGl0b3JQYWdlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIgaWQ9ImVkaXRvclBhZ2VzIiBuYW1lPSJFZGl0b3IgUGFnZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXMgYSB3YXkgdG8gYWRkIGFuIGFkZGl0aW9uYWwgcGFnZSB0byBhIHNlcnZlciBvciBzZXJ2ZXIgY29uZmlndXJhdGlvbiBlZGl0b3IuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ic2NoZW1hOi8vb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy9zY2hlbWEvZXhwcmVzc2lvbkxhbmd1YWdlLmV4c2QiLz4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwYWdlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJwYWdlIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZW5hYmxlbWVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcGFnZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCZsdDsvc2FtcCZndDsNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0Ii8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgcGFnZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGVJZHMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBzZXJ2ZXIgdHlwZSBpZHMuIE1heSBpbmNsdWRlIHdpbGRjYXJkcyAoKikgYXQgdGhlIGVuZCBvZiBhbiBpZA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcmRlciIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBpbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIGFuIGFic29sdXRlIG9yZGVyaW5nIG9mIHRoZSBwYWdlIHJlbGF0aXZlIHRvIG90aGVyIHBhZ2VzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imluc2VydGlvbklkcyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGluc2VydGlvbiBpZHMgdGhhdCBhbGxvdyBzZWN0aW9ucyB0byBiZSBwbHVnZ2VkIGluDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gZWRpdG9yIHBhZ2UgZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yUGFnZXMmcXVvdDsmZ3Q7DQotICAgICAgJmx0O3BhZ2UNCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZSZxdW90Ow0KLSAgICAgICAgICAgIG9yZGVyPSZxdW90OzIwJnF1b3Q7DQotICAgICAgICAgICAgbmFtZT0mcXVvdDslZWRpdG9yUGFnZSZxdW90Ow0KLSAgICAgICAgICAgIHR5cGVJZHM9JnF1b3Q7Y29tLmV4YW1wbGUuKiZxdW90Ow0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVFZGl0b3JGYWN0b3J5JnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLlNlcnZlckVkaXRvclBhcnRGYWN0b3J5RGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvaW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2luaXRpYWxTZWxlY3Rpb25Qcm92aWRlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTliY2EzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvaW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIgaWQ9ImluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciIgbmFtZT0iSW5pdGlhbCBTZWxlY3Rpb24gUHJvdmlkZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXMgYSB3YXkgdG8gaW5pdGlhbGx5IHNlbGVjdCBydW50aW1lIHR5cGVzLCBydW50aW1lcywgc2VydmVyIHR5cGVzLCBhbmQgc2VydmVycyBpbiB0aGUgc2VydmVyIHdpemFyZHMuIFRoZSBmaXJzdCBleHRlbnNpb24gZm91bmQgaXMgYWx3YXlzIHVzZWQgYW5kIGl0IGlzIGV4cGVjdGVkIHRoYXQgb25seSBvbmUgaW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyIGV4aXN0cyBpbiBhbiBpbnN0YWxsYXRpb24uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlbGVjdGlvblByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic2VsZWN0aW9uUHJvdmlkZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLkluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciZsdDsvc2FtcCZndDsuIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgdGhlIGV4dGVuc2lvbiBwb2ludDoKLQotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciZxdW90OyZndDsKLSAgICAgICZsdDtzZWxlY3Rpb25Qcm92aWRlcgotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUmcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWUuTXlTZWxlY3Rpb25Qcm92aWRlciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvc2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9uLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL3NlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmNjMWVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvc2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIiBpZD0ic2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9uIiBuYW1lPSJTZXJ2ZXIgQ3JlYXRpb24gV2l6YXJkIFBhZ2UgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIGZvciBhZG9wdGVycyB0byBtb2RpZnkgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHNlcnZlciBjcmVhdGlvbiB3aXphcmQgcGFnZS4gIEl0IHByb3ZpZGVzIG1lY2hhbmlzbXMgdG8gYWRkIGN1c3RvbSBVSSB0byBkaWZmZXJlbnQgc2VjdGlvbnMgb2YgdGhlIHNlcnZlciBjcmVhdGlvbiB3aXphcmQgcGFnZS4gIEl0IGFsc28gYWxsb3cgYWRvcHRlciB0byBjb250cm9sIHRoZSBkaXNwbGF5IG9mIHNvbWUgZXhpc3RpbmcgVUkgb24gdGhlIHNlcnZlciBjcmVhdGlvbiB3aXphcmQgcGFnZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbiIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InNlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5TZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb24mbHQ7L3NhbXAmZ3Q7LiBUaGUgY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuU2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9uOiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLlNlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbiZsdDsvY29kZSZndDsuCi0KLVRoaXMgZXh0ZW5zaW9uIHBvaW50IGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHRoZSBjb250cm9sIG9uIHRoZSBmb2xsb3dpbmcgZmllbGRzIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLkFic3RyYWN0VUlDb250cm9sLklVSUNvbnRyb2xMaXN0ZW5lci5oYW5kbGVVSUNvbnRyb2xNYXBDaGFuZ2VkKE1hcCZsdDtTdHJpbmcsIFVJQ29udHJvbEVudHJ5Jmd0Oyk6Ci1TZXJ2ZXImYXBvcztzIGhvc3QgbmFtZQotCi1UaGlzIGV4dGVuc2lvbiBwb2ludCBjdXJyZW50bHkgb25seSBpc3N1ZSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgb24gdGhlIGZvbGxvd2luZyBwcm9wZXJ0eSBjaGFuZ2U6Ci1TZXJ2ZXIgdHlwZSBzZWxlY3Rpb24gY2hhbmdlCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAzLjIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIHRoZSBleHRlbnNpb24gcG9pbnQ6Ci0KLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnNlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbiZxdW90OyZndDsKLSAgICAgICZsdDtzZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb24KLSAgICAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkudGVzdC5zZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb24mcXVvdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkudGVzdC5pbnRlcm5hbC5zZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb24uU2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9uVGVzdCZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9zZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2VNb2RpZmllci5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9zZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2VNb2RpZmllci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmY5OTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvc2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlTW9kaWZpZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiIGlkPSJzZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2VNb2RpZmllciIgbmFtZT0iU2VydmVyIEVkaXRvciBPdmVydmlldyBQYWdlIE1vZGlmaWVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IGZvciBhZG9wdGVycyB0byBtb2RpZnkgY29udHJvbHMgb24gdGhlIHNlcnZlciBlZGl0b3IgT3ZlcnZpZXcgcGFnZS4gIEl0IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGFsbG93IG1vZGlmeSB0aGUgZGlzcGxheSBvZiBzb21lIGV4aXN0aW5nIFVJIG9uIHRoZSBPdmVydmlldyBwYWdlLgotCi1UaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlTW9kaWZpZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2VNb2RpZmllciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5TZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2VNb2RpZmllciZsdDsvc2FtcCZndDsuIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5TZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2VNb2RpZmllcjoiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMy4yCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50OgotCi0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJFZGl0b3JQYWdlRXh0ZW5zaW9uJnF1b3Q7Jmd0OwotICAgICAgJmx0O3NlcnZlckVkaXRvck92ZXJ2aWV3UGFnZU1vZGlmaWVyCi0gICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnRlc3Quc2VydmVyRWRpdG9yT3ZlcnZpZXdNb2RpZmllciZxdW90OwotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS50ZXN0LmludGVybmFsLnNlcnZlckVkaXRvclBhZ2VFeHRlbnNpb24uU2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlTW9kaWZpZXJUZXN0JnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLlNlcnZlckVkaXRvclBhZ2VFeHRlbnNpb24mbHQ7L2NvZGUmZ3Q7LgotCi1UaGlzIGV4dGVuc2lvbiBwb2ludCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyB0aGUgY29udHJvbCBvbiB0aGUgZm9sbG93aW5nIGZpZWxkcyBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2Ygb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5BYnN0cmFjdFVJQ29udHJvbC5JVUlDb250cm9sTGlzdGVuZXIuaGFuZGxlVUlDb250cm9sTWFwQ2hhbmdlZChNYXAmbHQ7U3RyaW5nLCBVSUNvbnRyb2xFbnRyeSZndDspOgotU2VydmVyJmFwb3M7cyBob3N0IG5hbWUKLQotVGhpcyBleHRlbnNpb24gcG9pbnQgY3VycmVudGx5IG9ubHkgaXNzdWUgcHJvcGVydHkgY2hhbmdlIGV2ZW50IG9uIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkgY2hhbmdlOgotU2VydmVyIHR5cGUgc2VsZWN0aW9uIGNoYW5nZQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvc2VydmVySW1hZ2VzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL3NlcnZlckltYWdlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGFlMGRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvc2VydmVySW1hZ2VzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIiBpZD0ic2VydmVySW1hZ2VzIiBuYW1lPSJTZXJ2ZXIgSW1hZ2VzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIHByb3ZpZGUgYW4gaW1hZ2UgZm9yIGEgcnVudGltZSwgc2VydmVyLCBzZXJ2ZXIgY29uZmlndXJhdGlvbiBvciBtb2R1bGUgdHlwZS4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImltYWdlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJpbWFnZSI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iaWQiLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGltYWdlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBidW5kbGUtcmVsYXRpdmUgcGF0aCB0byB0aGUgaWNvbiBpbWFnZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZUlkcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHJ1bnRpbWUsIHNlcnZlciwgb3IgbW9kdWxlIHR5cGUgaWRzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBzZXJ2ZXIgaW1hZ2UgZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbiANCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnNlcnZlckltYWdlcyZxdW90OyZndDsNCi0gICAgICAmbHQ7aW1hZ2UNCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZSZxdW90Ow0KLSAgICAgICAgICAgIGljb249JnF1b3Q7aWNvbnMvb2JqMTYvcnVudGltZS5naWYmcXVvdDsNCi0gICAgICAgICAgICB0eXBlSWRzPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWUmcXVvdDsvJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvc2VydmVyTGFiZWxQcm92aWRlci5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9zZXJ2ZXJMYWJlbFByb3ZpZGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZmU4MWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9zZXJ2ZXJMYWJlbFByb3ZpZGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIiBpZD0ic2VydmVyTGFiZWxQcm92aWRlciIgbmFtZT0iU2VydmVyIExhYmVsIFByb3ZpZGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIGN1c3RvbWl6ZSB0aGUgdGV4dCBsYWJlbCBmb3IgYSBwYXJ0aWN1bGFyIHNlcnZlciB0eXBlCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZXJ2ZXJMYWJlbFByb3ZpZGVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InNlcnZlckxhYmVsUHJvdmlkZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdFNlcnZlckxhYmVsUHJvdmlkZXImbHQ7L3NhbXAmZ3Q7LiBUaGUgY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdFNlcnZlckxhYmVsUHJvdmlkZXI6Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmVyVHlwZXMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIFNlcnZlciBUeXBlcyB0aGF0IHRoaXMgU2VydmVyIExhYmVsIFByb3ZpZGVyIHdpbGwgcmVzcG9uZCB0by4gQSBjb21tYSBzZXBhcmF0ZSBsaXN0IGNhbiBiZSBwcm92aWRlciBmb3IgbW9yZSB0aGFuIG9uZSBTZXJ2ZXIgVHlwZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAzLjIuMgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL3NlcnZlclRvb2xUaXAuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvc2VydmVyVG9vbFRpcC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTM0OTE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvc2VydmVyVG9vbFRpcC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIgaWQ9InNlcnZlclRvb2xUaXAiIG5hbWU9IlNlcnZlciBUb29sVGlwIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIGFkZCBhZGRpdGlvbmFsIHRleHQgd2hlbiB0aGUgbW91c2VvdmVyIGFjdGlvbiBpcyBkZXRlY3RlZAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZXJ2ZXJUb29sVGlwIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InNlcnZlclRvb2xUaXAiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImlkIi8+Ci0gICAgICAgICA8L2FwcGluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIFRvb2xUaXAgcHJvdmlkZXIKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLklTZXJ2ZXJUb29sVGlwJmx0Oy9zYW1wJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlcnZlclRvb2xUaXAiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXJ2ZXJUeXBlcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgc2VydmVyIHR5cGUgaWRzIHRoYXQgdXNlIHRoaXMgU2VydmVyVG9vbFRpcAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAzLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIHRoZSBleHRlbnNpb24gcG9pbnQ6Ci0KLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnNlcnZlclRvb2xUaXAmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7c2VydmVyVG9vbFRpcAotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUmcXVvdDsKLSAgICAgICAgICAgIHNlcnZlclR5cGVzPSZxdW90OyomcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVUb29sVGlwUHJvdmlkZXImcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpaW5mbyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvd2l6YXJkRnJhZ21lbnRzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL3dpemFyZEZyYWdtZW50cy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGE4OWIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvd2l6YXJkRnJhZ21lbnRzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIiBpZD0id2l6YXJkRnJhZ21lbnRzIiBuYW1lPSJXaXphcmQgRnJhZ21lbnRzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIGFkZCBwYWdlcyBvciBsb2dpYyBpbnRvIHdpemFyZHMgZm9yIGEgc3BlY2lmaWMgcnVudGltZSwgc2VydmVyLCBvciBzZXJ2ZXIgY29uZmlndXJhdGlvbiB0eXBlLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZnJhZ21lbnQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImZyYWdtZW50Ij4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZnJhZ21lbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQmbHQ7L3NhbXAmZ3Q7DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudCIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlSWRzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcnVudGltZSBvciBzZXJ2ZXIgdHlwZSBpZHMgdGhhdCB0aGlzIGZyYWdtZW50IGFwcGxpZXMgdG8NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHdpemFyZCBmcmFnbWVudCBleHRlbnNpb24gcG9pbnQ6DQotDQotJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uIA0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkRnJhZ21lbnRzJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtmcmFnbWVudA0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlJnF1b3Q7DQotICAgICAgICAgICAgdHlwZUlkcz0mcXVvdDtjb20uZXhhbXBsZS5ydW50aW1lJnF1b3Q7DQotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuRXhhbXBsZVdpemFyZEZyYWdtZW50JnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50Jmx0Oy9jb2RlJmd0Oy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9BYnN0cmFjdFVJQ29udHJvbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvQWJzdHJhY3RVSUNvbnRyb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlODRlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9BYnN0cmFjdFVJQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQWJzdHJhY3QgVUkgY29udHJvbCB0aGF0IGFsbG93cyBhZG9wdGVyIHRvIGNvbnRyb2wgdGhlIFVJCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFVJQ29udHJvbCB7Ci0JLy8gQ29udHJvbCBtYXAgZGVzY3JpYmluZyB0aGUgVUkgdGhhdCBuZWVkcyB0byBiZSBjb250cm9sbGVkLiAKLQlwdWJsaWMgTWFwPFN0cmluZywgVUlDb250cm9sRW50cnk+IGNvbnRyb2xNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFVJQ29udHJvbEVudHJ5PigpOwotCS8vIFVJIENvbnRyb2wgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGNoYW5nZXMgaW4gZXZlbnQgb24gR1VJIHByb3ZpZGVkIGJ5IHRoaXMgVUkgY29udHJvbAotCXB1YmxpYyBJVUlDb250cm9sTGlzdGVuZXIgY29udHJvbExpc3RlbmVyOwotCQotCS8vIFRoZSBsaXN0IG9mIHByb3BlcnRpZXMgc3VwcG9ydGVkIGJ5IHRoZSBleGlzdGluZyBVSSBjb250cm9sLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSE9TVE5BTUUgPSAiUFJPUF9IT1NUTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9TRVJWRVJfVFlQRSA9ICJQUk9QX1NFUlZFUlRZUEUiOwotCi0JLyoqCi0JICogVUkgQ29udHJvbCBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gY2hhbmdlcyBpbiBldmVudCBvbiBHVUkgcHJvdmlkZWQgYnkgdGhpcyBVSSBjb250cm9sCi0JICogSVVJQ29udHJvbExpc3RlbmVyCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJVUlDb250cm9sTGlzdGVuZXIgewotCQkvKioKLQkJICogSGFuZGxlIHRoZSBVSSBjb250cm9sIG1hcCBjaGFuZ2UgYnkgdGhlIGxpc3RlbmVyIGJhc2VkIG9uIHRoZSBnaXZlbiBjb250cm9sIG1hcC4KLQkJICogQHBhcmFtIGNvbnRyb2xNYXAgdGhlIGNvbnRyb2wgbWFwIHRoYXQgZGVzY3JpYmVzIHRoZSBVSSBjb250cm9sLgotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlVUlDb250cm9sTWFwQ2hhbmdlZChNYXA8U3RyaW5nLCBVSUNvbnRyb2xFbnRyeT4gY29udHJvbE1hcCk7Ci0JCS8qKgotCQkgKiBHZXQgdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gY29udHJvbCBVSSBvbiB0aGUgbGlzdGVuZXIncyBwYWdlLgotCQkgKiBAcGFyYW0gY29udHJvbElkIGNvbnRyb2wgSUQgb2YgdGhlIFVJIG9uIHRoZSBsaXN0ZW5lcidzIHBhZ2UuCi0JCSAqIEByZXR1cm4gdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29udHJvbCBJRCBmaWVsZC4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29udHJvbFN0cmluZ1ZhbHVlKFN0cmluZyBjb250cm9sSWQpOwotCX0KLQkKLQkvKioKLQkgKiBVSSBjb250cm9sIGVudHJ5IGNsYXNzIHRoYXQgZGVzY3JpYmVzIHRoZSBiZWhhdmlvdXIgb2YgdGhlIFVJIGNvbnRyb2wgb2Ygc3BlY2lmaWMgZmllbGRzIG9yIHdpZGdldC4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgVUlDb250cm9sRW50cnkgewotCQlwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVkOwotCQlwcml2YXRlIFN0cmluZyBuZXdUZXh0VmFsdWU7Ci0JCQotCQlwdWJsaWMgVUlDb250cm9sRW50cnkoYm9vbGVhbiBjdXJJc0VuYWJsZWQsIFN0cmluZyBjdXJOZXdUZXh0VmFsdWUpIHsKLQkJCWlzRW5hYmxlZCA9IGN1cklzRW5hYmxlZDsKLQkJCW5ld1RleHRWYWx1ZSA9IGN1ck5ld1RleHRWYWx1ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBHaXZlcyB0aGUgbmV3IHRleHQgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLgotCQkgKiBAcmV0dXJuIHRoZSBuZXcgdGV4dCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQuIElmIHRoZSB2YWx1ZSByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIGl0IG1lYW5zCi0JCSAqIHRoZSBmaWVsZCBkbyBub3QgbmVlZCB0byBiZSBtb2RpZmllZC4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmV3VGV4dFZhbHVlKCkgewotCQkJcmV0dXJuIG5ld1RleHRWYWx1ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gaWYgdGhlIFVJIGNvbnRyb2wgbmVlZHMgdG8gYmUgZW5hYmxlZC4KLQkJICogQHJldHVybiB0cnVlIGlmIHZhbHVlIG5lZWRzIHRvIGJlIGVuYWJsZWQ7IG90aGVyd2lzZSwgcmV0dXJuIGZhbHNlLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJcmV0dXJuIGlzRW5hYmxlZDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpcmUgdGhlIGNvbnRyb2wgY2hhbmdlIGV2ZW50IGZvciB0aGUgY2hhbmdlZCBjb250cm9sIG1hcCB0byB0YWtlIGVmZmVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVUlDb250cm9sQ2hhbmdlZEV2ZW50KCkgewotCQlpZiAoY29udHJvbExpc3RlbmVyICE9IG51bGwpIHsKLQkJCWNvbnRyb2xMaXN0ZW5lci5oYW5kbGVVSUNvbnRyb2xNYXBDaGFuZ2VkKGNvbnRyb2xNYXApOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFsbG93IFVJIENvbnRyb2wgdG8gcmVhY3QgYmFzZWQgb24gYSBwcm9wZXJ0eSBjaGFuZ2UgYW5kIGNoYW5nZSB0aGUgVUkgY29udHJvbC4KLQkgKiBAcGFyYW0gZXZlbnQgcHJvcGVydHkgY2hhbmdlIGV2ZW50IHRoYXQgZGVzY3JpYmVzIHRoZSBjaGFuZ2UuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpOwotCQotCS8qKgotCSAqIFNldCB0aGUgVUkgY29udHJvbCBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIGNoYW5nZXMgaW5pdGlhbGVkIGJ5IHRoaXMgVUkgY29udHJvbC4gCi0JICogQHBhcmFtIGN1ckNvbnRyb2xMaXN0ZW5lciB0aGUgVUkgY29udHJvbCBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJQ29udHJvbExpc3RlbmVyKElVSUNvbnRyb2xMaXN0ZW5lciBjdXJDb250cm9sTGlzdGVuZXIpIHsKLQkJY29udHJvbExpc3RlbmVyID0gY3VyQ29udHJvbExpc3RlbmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL0ZhY2V0UnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL0ZhY2V0UnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkZmYxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9GYWNldFJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlcjsKLS8qKgotICogQSBmYWNldCBydW50aW1lIGxhYmVsIHByb3ZpZGVyIHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gaW1wbGVtZW50YXRpb24gb2YKLSAqIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5JUnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIgaW4gdGhlCi0gKiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyBleHRlbnNpb24gcG9pbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBGYWNldFJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IElSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlci5jbGFzcyB9OwotCi0JcHVibGljIGZpbmFsIGNsYXNzIFJ1bnRpbWVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBJUnVudGltZUNvbXBvbmVudCByYzsKLQotCQlwdWJsaWMgUnVudGltZUxhYmVsUHJvdmlkZXIoSVJ1bnRpbWVDb21wb25lbnQgcmMpIHsKLQkJCXRoaXMucmMgPSByYzsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCQlyZXR1cm4gcmMuZ2V0UHJvcGVydHkoInR5cGUiKTsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlLCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlJUnVudGltZUNvbXBvbmVudCByYyA9IChJUnVudGltZUNvbXBvbmVudCkgYWRhcHRhYmxlOwotCQlyZXR1cm4gbmV3IFJ1bnRpbWVMYWJlbFByb3ZpZGVyKHJjKTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIEFEQVBURVJfVFlQRVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL0lTZXJ2ZXJNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL0lTZXJ2ZXJNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNhMjliNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9JU2VydmVyTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogQSBoZWxwZXIgaW50ZXJmYWNlIGZvciBtb2R1bGVzIHRoYXQgYXJlIGRlcGxveWVkIHRvIGEgc2VydmVyLCBjb21tb25seQotICogdXNlZCB0byBoZWxwIGFjdGlvbnMgaW50ZXJhY3Qgd2l0aCBtb2R1bGVzIGluIHRoZSBTZXJ2ZXJzIHZpZXcuCi0gKgotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJNb2R1bGUgewotCS8qKgotCSAqIFJldHVybiB0aGUgc2VydmVyIHRoYXQgdGhlIG1vZHVsZSBiZWxvbmdzIHRvLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlcnZlcgotCSAqLwotCXB1YmxpYyBJU2VydmVyIGdldFNlcnZlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZQotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzdjNGI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL1NlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7Ci0vKioKLSAqIFNlcnZlciBsYXVuY2ggY29uZmlndXJhdGlvbiB0YWIuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25UYWIgZXh0ZW5kcyBBYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIgewotCS8vIGZsYWcgdG8gYmUgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0byBlbmFibGUgY29tYm8gaW4gbGF1bmNoIGNvbmZpZyBkaWFsb2cKLQkvLyBhZnRlciB0aGUgdXNlciByZXF1ZXN0cyBhIGxhdW5jaCwgdGhleSBjYW5ub3QgY2hhbmdlIGl0Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfT05MWSA9ICJyZWFkLW9ubHkiOwotCi0JcHJpdmF0ZSBTdHJpbmdbXSBzZXJ2ZXJUeXBlSWRzOwotCi0JcHJpdmF0ZSBDb21ibyBzZXJ2ZXJDb21ibzsKLQotCXByaXZhdGUgTGFiZWwgcnVudGltZUxhYmVsOwotCXByaXZhdGUgTGFiZWwgaG9zdG5hbWU7Ci0KLQlwcml2YXRlIElTZXJ2ZXIgc2VydmVyOwotCi0JLy8gbGlzdCBvZiBzZXJ2ZXJzIHRoYXQgYXJlIGluIGNvbWJvCi0JcHJpdmF0ZSBMaXN0PElTZXJ2ZXI+IHNlcnZlcnM7Ci0KLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2M7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgc2VydmVyIGxhdW5jaCBjb25maWd1cmF0aW9uIHRhYi4KLQkgKi8KLQlwdWJsaWMgU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYigpIHsKLQkJdGhpcyhuZXcgU3RyaW5nW10geyIqIn0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBzZXJ2ZXIgbGF1bmNoIGNvbmZpZ3VyYXRpb24gdGFiIHdpdGggdGhlIGdpdmVuIHNlcnZlciB0eXBlIGlkcy4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyVHlwZUlkcyBhbiBhcnJheSBvZiBzZXJ2ZXIgdHlwZSBpZHMKLQkgKi8KLQlwdWJsaWMgU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYihTdHJpbmdbXSBzZXJ2ZXJUeXBlSWRzKSB7Ci0JCXRoaXMuc2VydmVyVHlwZUlkcyA9IHNlcnZlclR5cGVJZHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gNTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQkvL2RhdGEud2lkdGhIaW50ID0gMjAwOwotCQkvL2NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnNlcnZlckxhdW5jaERlc2NyaXB0aW9uKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWRhdGEud2lkdGhIaW50ID0gMzAwOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuc2VydmVyTGF1bmNoU2VydmVyKTsKLQkJc2VydmVyQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlzZXJ2ZXJDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc2VydmVyQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVTZXJ2ZXJTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2VydmVyQ29tYm8sIENvbnRleHRJZHMuTEFVTkNIX0NPTkZJR1VSQVRJT05fU0VSVkVSX0NPTUJPKTsKLQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5zZXJ2ZXJMYXVuY2hSdW50aW1lKTsKLQkJcnVudGltZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlydW50aW1lTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5zZXJ2ZXJMYXVuY2hIb3N0KTsKLQkJaG9zdG5hbWUgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWhvc3RuYW1lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJLy8gaW5pdGlhbGl6ZQotCQlJU2VydmVyW10gc2VydmVyczIgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJc2VydmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlcnZlcj4oKTsKLQkJaWYgKHNlcnZlcnMyICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVyczIubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJU2VydmVyIHNlcnZlcjIgPSBzZXJ2ZXJzMltpXTsKLQkJCQlpZiAoc2VydmVyMi5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJiBpc1N1cHBvcnRlZFNlcnZlcihzZXJ2ZXIyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKSkgewotCQkJCQlzZXJ2ZXJDb21iby5hZGQoc2VydmVyMi5nZXROYW1lKCkpOwotCQkJCQlzZXJ2ZXJzLmFkZChzZXJ2ZXIyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHNlbGVjdCBmaXJzdCBpdGVtIGluIGxpc3QKLQkJaWYgKHNlcnZlckNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkKLQkJCXNlcnZlckNvbWJvLnNlbGVjdCgwKTsKLQkJCi0JCWhhbmRsZVNlcnZlclNlbGVjdGlvbigpOwotCQkKLQkJc2VydmVyQ29tYm8uZm9yY2VGb2N1cygpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzU3VwcG9ydGVkU2VydmVyKFN0cmluZyBzZXJ2ZXJUeXBlSWQpIHsKLQkJaWYgKHNlcnZlclR5cGVJZHMgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlpbnQgc2l6ZSA9IHNlcnZlclR5cGVJZHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKG1hdGNoZXMoc2VydmVyVHlwZUlkLCBzZXJ2ZXJUeXBlSWRzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQlpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCB8fCAiKiIuZXF1YWxzKGEpIHx8ICIqIi5lcXVhbHMoYikgfHwgYS5zdGFydHNXaXRoKGIpIHx8IGIuc3RhcnRzV2l0aChhKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gYSBzZXJ2ZXIgaXMgc2VsZWN0ZWQuCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VydmVyU2VsZWN0aW9uKCkgewotCQlpZiAoc2VydmVycy5pc0VtcHR5KCkpCi0JCQlzZXJ2ZXIgPSBudWxsOwotCQllbHNlCi0JCQlzZXJ2ZXIgPSBzZXJ2ZXJzLmdldChzZXJ2ZXJDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJSVJ1bnRpbWUgcnVudGltZSA9IG51bGw7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJcnVudGltZSA9IHNlcnZlci5nZXRSdW50aW1lKCk7Ci0JCQlob3N0bmFtZS5zZXRUZXh0KHNlcnZlci5nZXRIb3N0KCkpOwotCQl9IGVsc2UKLQkJCWhvc3RuYW1lLnNldFRleHQoIiIpOwotCQkKLQkJLy8gY2hlY2sgaWYgInJ1bnRpbWUiIHByb3BlcnR5IGlzIHRydWUgb3IgZmFsc2UKLQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCAmJiBzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKS5oYXNSdW50aW1lKCkpCi0JCQlydW50aW1lTGFiZWwuc2V0VGV4dChydW50aW1lLmdldE5hbWUoKSk7Ci0JCWVsc2UKLQkJCXJ1bnRpbWVMYWJlbC5zZXRUZXh0KCIiKTsKLQkJCi0JCXRyeSB7Ci0JCQlpZiAod2MgIT0gbnVsbCkKLQkJCQkoKFNlcnZlcilzZXJ2ZXIpLnNldHVwTGF1bmNoQ29uZmlndXJhdGlvbih3YywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmVycm9yTm9TZXJ2ZXJTZWxlY3RlZCk7Ci0JCWVsc2UgaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5lcnJvclNlcnZlckFscmVhZHlSdW5uaW5nKTsKLQkJZWxzZQotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkKLQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pIHsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQlpZiAoc2VydmVyQ29tYm8gIT0gbnVsbCkgewkKLQkJCXNlcnZlckNvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlpZiAoc2VydmVyQ29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwKQotCQkJCXNlcnZlckNvbWJvLnNlbGVjdCgwKTsKLQkJfQotCQkKLQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewotCQkJc2VydmVyID0gc2VydmVycy5nZXQoc2VydmVyQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJKChTZXJ2ZXIpIHNlcnZlcikuc2V0dXBMYXVuY2hDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24sIG51bGwpOwotCQl9Ci0JCXdjID0gY29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2luaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJc2VydmVyQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJLy8gcmVtb3ZlIGVycm9yIG1lc3NhZ2UgdGhhdCBvdGhlciBpbnN0YW5jZXMgbWF5IGhhdmUgc2V0Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCi0JCXRyeSB7Ci0JCQkvLyBidWcgMTM3ODIyIC0gc2V0IHRoZSBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjIHZhcmlhYmxlIGJlZm9yZSBjYWxsaW5nIHRoZSBtZXRob2QgaGFuZGxlU2VydmVyU2VsZWN0aW9uKCkKLQkJCS8vaWYgKGNvbmZpZ3VyYXRpb24gaW5zdGFuY2VvZiBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KQotCQkJLy8Jd2MgPSAoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSljb25maWd1cmF0aW9uOwotCQkJCi0JCQlTdHJpbmcgc2VydmVySWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShTZXJ2ZXIuQVRUUl9TRVJWRVJfSUQsICIiKTsKLQkJCWlmIChzZXJ2ZXJJZCAhPSBudWxsICYmICFzZXJ2ZXJJZC5lcXVhbHMoIiIpKSB7Ci0JCQkJc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlcklkKTsKLQkJCQkKLQkJCQlpZiAoc2VydmVyID09IG51bGwpIHsgLy8gc2VydmVyIG5vIGxvbmdlciBleGlzdHMJCQkJCi0JCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5lcnJvckludmFsaWRTZXJ2ZXIpOwotCQkJCQkvL3NlcnZlckNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7ICAvLyBhcHBlYXJzIHRvIGJlIGJyb2tlbi4uLmRvZXNuJ3Qgd29yayB3aXRoIHJlYWQgb25seT8JCQkJCQkJCQkJCQkKLQkJCQkJc2VydmVyQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJc2VydmVyQ29tYm8uc2V0VGV4dChzZXJ2ZXIuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuZXJyb3JTZXJ2ZXJBbHJlYWR5UnVubmluZyk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChzZXJ2ZXJDb21iby5nZXRJdGVtQ291bnQoKSA+IDApCi0JCQkJCXNlcnZlckNvbWJvLnNlbGVjdCgwKTsKLQkJCX0KLQkJCWhhbmRsZVNlcnZlclNlbGVjdGlvbigpOwotCQkJCi0JCQkvLyBmbGFnIHNob3VsZCBvbmx5IGJlIHNldCBpZiBsYXVuY2ggaGFzIGJlZW4gYXR0ZW1wdGVkIG9uIHRoZSBjb25maWcKLQkJCWlmIChjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShSRUFEX09OTFksIGZhbHNlKSkKLQkJCQlzZXJ2ZXJDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkpCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShTZXJ2ZXIuQVRUUl9TRVJWRVJfSUQsIHNlcnZlci5nZXRJZCgpKTsKLQkJZWxzZQotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoU2VydmVyLkFUVFJfU0VSVkVSX0lELCAoU3RyaW5nKW51bGwpOwotCQl3YyA9IGNvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNpc1ZhbGlkKElMYXVuY2hDb25maWd1cmF0aW9uKSAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKElMYXVuY2hDb25maWd1cmF0aW9uIGxhdW5jaENvbmZpZykgewotCQl0cnkgewotCQkJU3RyaW5nIGlkID0gbGF1bmNoQ29uZmlnLmdldEF0dHJpYnV0ZShTZXJ2ZXIuQVRUUl9TRVJWRVJfSUQsICIiKTsKLQkJCWlmIChpZCAhPSBudWxsICYmICFpZC5lcXVhbHMoIiIpKSB7Ci0JCQkJSVNlcnZlciBzZXJ2ZXIyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKGlkKTsKLQkJCQlpZiAoc2VydmVyMiA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKHNlcnZlcjIuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5zZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL1NlcnZlclVJQ29yZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvU2VydmVyVUlDb3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMDkzMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvU2VydmVyVUlDb3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlckxhYmVsUHJvdmlkZXI7Ci0vKioKLSAqIFNlcnZlciBVSSBjb3JlLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFsbCBpdHMgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIHN0YXRpYyBtZW1iZXJzLgotICogSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3IgaW5zdGFudGlhdGVkLgotICogPC9wPgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2VydmVyVUlDb3JlIHsKLQkvKioKLQkgKiBDYW5ub3QgaW5zdGFudGlhdGUgU2VydmVyVUlDb3JlIC0gdXNlIHN0YXRpYyBtZXRob2RzLgotCSAqLwotCXByaXZhdGUgU2VydmVyVUlDb3JlKCkgewotCQkvLyBjYW4ndCBjcmVhdGUKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGFiZWwgcHJvdmlkZXIgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYWxsIHNlcnZlcgotCSAqIG9iamVjdHMgaW4gdGhlIFVJLgotCSAqIAotCSAqIEByZXR1cm4gYSBsYWJlbCBwcm92aWRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBTZXJ2ZXJMYWJlbFByb3ZpZGVyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL1NlcnZlclVJVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvU2VydmVyVUlVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NGEwZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvU2VydmVyVUlVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0vKioKLSAqIFNlcnZlciBVSSB1dGlsaXR5IG1ldGhvZHMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxsIGl0cyBmdW5jdGlvbmFsaXR5IHRocm91Z2ggc3RhdGljIG1lbWJlcnMuCi0gKiBJdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvciBpbnN0YW50aWF0ZWQuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZXJ2ZXJVSVV0aWwgewotCS8qKgotCSAqIENhbm5vdCBpbnN0YW50aWF0ZSBTZXJ2ZXJVSVV0aWwgLSB1c2Ugc3RhdGljIG1ldGhvZHMuCi0JICovCi0JcHJpdmF0ZSBTZXJ2ZXJVSVV0aWwoKSB7Ci0JCS8vIGNhbid0IGNyZWF0ZQotCX0KLQotCS8qKgotCSAqIE9wZW4gdGhlIG5ldyBydW50aW1lIHdpemFyZC4gVGhlIGdpdmVuIHR5cGVJZCBhbmQgdmVyc2lvbklkIGFyZSB1c2VkIHRvIGZpbHRlcgotCSAqIHRoZSBzZXQgb2YgcnVudGltZXMgZGlzcGxheWVkLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbCBhIHNoZWxsIHRvIHVzZSB3aGVuIGNyZWF0aW5nIHRoZSB3aXphcmQKLQkgKiBAcGFyYW0gdHlwZUlkIGEgbW9kdWxlIHR5cGUgaWQsIG9yIG51bGwgZm9yIGFueSBtb2R1bGUgdHlwZQotCSAqIEBwYXJhbSB2ZXJzaW9uSWQgYSBtb2R1bGUgdmVyc2lvbiwgb3IgbnVsbCBmb3IgYW55IHZlcnNpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgcnVudGltZSB3YXMgY3JlYXRlZCwgb3IKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3dOZXdSdW50aW1lV2l6YXJkKFNoZWxsIHNoZWxsLCBTdHJpbmcgdHlwZUlkLCBTdHJpbmcgdmVyc2lvbklkKSB7Ci0JCXJldHVybiBTZXJ2ZXJVSVBsdWdpbi5zaG93TmV3UnVudGltZVdpemFyZChzaGVsbCwgdHlwZUlkLCB2ZXJzaW9uSWQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIE9wZW4gdGhlIG5ldyBydW50aW1lIHdpemFyZC4gVGhlIGdpdmVuIHR5cGVJZCwgdmVyc2lvbklkLCBhbmQgcnVudGltZVR5cGVJZCBhcmUKLQkgKiB1c2VkIHRvIGZpbHRlciB0aGUgc2V0IG9mIHJ1bnRpbWVzIGRpc3BsYXllZC4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbCB0byB1c2Ugd2hlbiBjcmVhdGluZyB0aGUgd2l6YXJkCi0JICogQHBhcmFtIHR5cGVJZCBhIG1vZHVsZSB0eXBlIGlkLCBvciBudWxsIGZvciBhbnkgbW9kdWxlIHR5cGUKLQkgKiBAcGFyYW0gdmVyc2lvbklkIGEgbW9kdWxlIHZlcnNpb24sIG9yIG51bGwgZm9yIGFueSB2ZXJzaW9uCi0JICogQHBhcmFtIHJ1bnRpbWVUeXBlSWQgYSBzZXJ2ZXIgcnVudGltZSB0eXBlLCBvciBudWxsIGZvciBhbnkgdHlwZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBydW50aW1lIHdhcyBjcmVhdGVkLCBvcgotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3dOZXdSdW50aW1lV2l6YXJkKFNoZWxsIHNoZWxsLCBTdHJpbmcgdHlwZUlkLCBTdHJpbmcgdmVyc2lvbklkLCBTdHJpbmcgcnVudGltZVR5cGVJZCkgewotCQlyZXR1cm4gU2VydmVyVUlQbHVnaW4uc2hvd05ld1J1bnRpbWVXaXphcmQoc2hlbGwsIHR5cGVJZCwgdmVyc2lvbklkLCBydW50aW1lVHlwZUlkKTsJCQotCX0KLQotCS8qKgotCSAqIE9wZW4gdGhlIG5ldyBzZXJ2ZXIgd2l6YXJkLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbCBhIHNoZWxsIHRvIHVzZSB3aGVuIGNyZWF0aW5nIHRoZSB3aXphcmQKLQkgKiBAcGFyYW0gdHlwZUlkIGEgbW9kdWxlIHR5cGUgaWQsIG9yIG51bGwgZm9yIGFueSBtb2R1bGUgdHlwZQotCSAqIEBwYXJhbSB2ZXJzaW9uSWQgYSBtb2R1bGUgdmVyc2lvbiwgb3IgbnVsbCBmb3IgYW55IHZlcnNpb24KLQkgKiBAcGFyYW0gc2VydmVyVHlwZUlkIGEgc2VydmVyIHJ1bnRpbWUgdHlwZSwgb3IgbnVsbCBmb3IgYW55IHR5cGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgc2VydmVyIHdhcyBjcmVhdGVkLCBvcgotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3dOZXdTZXJ2ZXJXaXphcmQoU2hlbGwgc2hlbGwsIFN0cmluZyB0eXBlSWQsIFN0cmluZyB2ZXJzaW9uSWQsIFN0cmluZyBzZXJ2ZXJUeXBlSWQpIHsKLQkJcmV0dXJuIFNlcnZlclVJUGx1Z2luLnNob3dOZXdTZXJ2ZXJXaXphcmQoc2hlbGwsIHR5cGVJZCwgdmVyc2lvbklkLCBzZXJ2ZXJUeXBlSWQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9hY3Rpb25zL1J1bk9uU2VydmVyQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9hY3Rpb25zL1J1bk9uU2VydmVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDAwOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvYWN0aW9ucy9SdW5PblNlcnZlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9ucy5SdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlOwotLyoqCi0gKiAiUnVuIG9uIFNlcnZlciIgbWVudSBhY3Rpb24uIEFsbG93cyB0aGUgdXNlciB0byBzZWxlY3QgYW4KLSAqIG9iamVjdCwgYW5kIGhhdmUgYXV0b21hdGljIHNlcnZlciBjcmVhdGlvbiwgbGF1bmNoaW5nLCBhbmQKLSAqIHRoZSBhcHByb3ByaWF0ZSBjbGllbnQgdG8gYXBwZWFyLiBBIG5ldyBpbnN0YW5jZSBvZiB0aGlzCi0gKiBhY3Rpb24gbXVzdCBiZSBjcmVhdGVkIGZvciBlYWNoIG9iamVjdCB0aGF0IHRoZSB1c2VyIHNlbGVjdHMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFJ1bk9uU2VydmVyQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcm90ZWN0ZWQgUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCXByb3RlY3RlZCBIYXNoTWFwPFN0cmluZyxPYmplY3Q+IGFjdGlvblByb3BlcnRpZXM7Ci0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFJ1biBvbiBTZXJ2ZXIgYWN0aW9uIGZvciBydW4gbW9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gYXR0ZW1wdCB0byBydW4KLQkgKi8KLQlwdWJsaWMgUnVuT25TZXJ2ZXJBY3Rpb24oT2JqZWN0IG9iamVjdCkgewotCQl0aGlzKG9iamVjdCwgSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgUnVuIG9uIFNlcnZlciBhY3Rpb24gZm9yIHJ1biBtb2RlLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBhdHRlbXB0IHRvIHJ1bgotCSAqLwotCXB1YmxpYyBSdW5PblNlcnZlckFjdGlvbihPYmplY3Qgb2JqZWN0LCBIYXNoTWFwPFN0cmluZyxPYmplY3Q+IGFjdGlvblByb3BlcnRpZXMpIHsJCQotCQl0aGlzKG9iamVjdCwgSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpOwotCQl0aGlzLmFjdGlvblByb3BlcnRpZXMgPSBhY3Rpb25Qcm9wZXJ0aWVzOwotCQlkZWxlZ2F0ZS5zZXRBY3Rpb25Qcm9wZXJ0aWVzKGFjdGlvblByb3BlcnRpZXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBSdW4gb24gU2VydmVyIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gYXR0ZW1wdCB0byBydW4KLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBhIHtAbGluayBJTGF1bmNoTWFuYWdlcn0gbGF1bmNoIG1vZGUKLQkgKi8KLQlwdWJsaWMgUnVuT25TZXJ2ZXJBY3Rpb24oT2JqZWN0IG9iamVjdCwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCWlmIChhY3Rpb25Qcm9wZXJ0aWVzID09IG51bGwpewotCQkJYWN0aW9uUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCQl9Ci0JCQotCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobGF1bmNoTW9kZSkpIHsKLQkJCXNldFRleHQoTWVzc2FnZXMuYWN0aW9uRGVidWdPblNlcnZlcik7Ci0JCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19EVE9PTF9ERUJVR19PTl9TRVJWRVIpKTsKLQkJCXNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NUT09MX0RFQlVHX09OX1NFUlZFUikpOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VUT09MX0RFQlVHX09OX1NFUlZFUikpOwotCQl9IGVsc2UgaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobGF1bmNoTW9kZSkpIHsKLQkJCXNldFRleHQoTWVzc2FnZXMuYWN0aW9uUHJvZmlsZU9uU2VydmVyKTsKLQkJCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RUT09MX1BST0ZJTEVfT05fU0VSVkVSKSk7Ci0JCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DVE9PTF9QUk9GSUxFX09OX1NFUlZFUikpOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VUT09MX1BST0ZJTEVfT05fU0VSVkVSKSk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblJ1bk9uU2VydmVyKTsKLQkJCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RUT09MX1JVTl9PTl9TRVJWRVIpKTsKLQkJCXNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NUT09MX1JVTl9PTl9TRVJWRVIpKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FVE9PTF9SVU5fT05fU0VSVkVSKSk7Ci0JCX0KLQkJCi0JCWRlbGVnYXRlID0gbmV3IFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUoYWN0aW9uUHJvcGVydGllcyk7Ci0JCWRlbGVnYXRlLnNldExhdW5jaE1vZGUobGF1bmNoTW9kZSk7Ci0JCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmplY3QpOwotCQkJZGVsZWdhdGUuc2VsZWN0aW9uQ2hhbmdlZCh0aGlzLCBzZWwpOwotCQl9IGVsc2UKLQkJCWRlbGVnYXRlLnNlbGVjdGlvbkNoYW5nZWQodGhpcywgbnVsbCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZGVsZWdhdGUucnVuKHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvSVNlcnZlckVkaXRvclBhcnRJbnB1dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0YzlkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvSVNlcnZlckVkaXRvclBhcnRJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci0vKioKLSAqIEFuIGlucHV0IGludG8gYSBzZXJ2ZXIgcGFydCBvciBzZWN0aW9uIGVkaXRvci4KLSAqCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlckVkaXRvclBhcnRJbnB1dCBleHRlbmRzIElFZGl0b3JJbnB1dCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIHRvIGJlIGVkaXRlZC4KLQkgKgotCSAqIEByZXR1cm4gYSB3b3JraW5nIGNvcHkgb2YgdGhlIHNlcnZlcgotCSAqLwotCXB1YmxpYyBJU2VydmVyV29ya2luZ0NvcHkgZ2V0U2VydmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciBpcyByZWFkLW9ubHkuCi0JICogCi0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgaXMgcmVhZC1vbmx5LAotCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXJSZWFkT25seSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2VkaXRvci9TZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2VNb2RpZmllci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL1NlcnZlckVkaXRvck92ZXJ2aWV3UGFnZU1vZGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOTQ4OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL1NlcnZlckVkaXRvck92ZXJ2aWV3UGFnZU1vZGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5BYnN0cmFjdFVJQ29udHJvbDsKLQotLyoqCi0gKiBBIG1vZGlmaWVyIGNsYXNzIHRoYXQgYWxsb3dzIGFkb3B0ZXIgdG8gbW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgYSBVSSBjb250cm9sIG9uIHRoZQotICogc2VydmVyIGVkaXRvciBwYWdlKHMpLgotICogCi0gKiBTZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2VNb2RpZmllcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlTW9kaWZpZXIgZXh0ZW5kcyBBYnN0cmFjdFVJQ29udHJvbCB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXJXYyA9IG51bGw7Ci0KLQkKLQkvKioKLQkgKiBUaGUgbGlzdCBvZiBlZGl0b3Igc2VjdGlvbnMgb24gdGhlIHNlcnZlciBlZGl0b3JzIHRoYXQgYWxsb3cgaW5zZXJ0aW5nIGN1c3RvbSBHVUkuCi0JICogVUlfUE9TSVRJT04KLQkgKi8KLQlwdWJsaWMgZW51bSBVSV9MT0NBVElPTiB7IE9WRVJWSUVXLCBPVEhFUiB9Ci0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgY3VzdG9tZXIgVUkgb24gdGhlIHNwZWNpZmllZCBzZXJ2ZXIgZWRpdG9yIHBhcnQsIGVpdGhlciBnZW5lcmFsIG9yIG90aGVyLgotCSAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgcG9zaXRpb24gb24gdGhlIHNlcnZlciBjcmVhdGlvbiB3aXphcmQgcGFnZSB0aGF0IGFsbG93cyBpbnNlcnRpbmcgY3VzdG9tIEdVSS4KLQkgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY3JlYXRlQ29udHJvbChVSV9MT0NBVElPTiBsb2NhdGlvbiwgQ29tcG9zaXRlIHBhcmVudCk7Ci0JCi0JCi0JLyoqCi0JKiBTZXQgdGhlIHNlcnZlciB3b3JraW5nIGNvcHkgdG8gdGhlIGNvbnRyb2wgdG8gYWxsb3cgZXh0ZW5zaW9uIHRvIHN0b3JlIHRoZSBleHRlbnNpb24gdmFsdWVzLgotCSogQHBhcmFtIGN1clNlcnZlcldjCi0JKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJXb3JraW5nQ29weShJU2VydmVyV29ya2luZ0NvcHkgY3VyU2VydmVyV2MpIHsKLQkJc2VydmVyV2MgPSBjdXJTZXJ2ZXJXYzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL1NlcnZlckVkaXRvclBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2VkaXRvci9TZXJ2ZXJFZGl0b3JQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MDdkNDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL1NlcnZlckVkaXRvclBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLio7Ci0vKioKLSAqIEFuIGFic3RyYWN0IHNlcnZlciBlZGl0b3Igd2hpY2ggaW1wbGVtZW50cyB0aGUgbW9zdCBjb21tb24gbWV0aG9kcwotICogZnJvbSBJRWRpdG9yUGFydC4KLSAqIAotICogVGhpcyBjbGFzcyBhbHNvIHByb3ZpZGVzIGVhY2ggZWRpdG9yIHBhZ2Ugd2l0aCBhbiBlcnJvciBtZXNzYWdlIHdoaWNoCi0gKiB3aWxsIGJlIGRpc3BsYXllZCBvbiB0aGUgc3RhdHVzIGJhciBvZiB0aGUgZWRpdG9yLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJFZGl0b3JQYXJ0IGV4dGVuZHMgRWRpdG9yUGFydCB7Ci0JLyoqCi0JICogUHJvcGVydHkgY2hhbmdlIGlkIGZvciB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QX0VSUk9SID0gNTsKLQotCXByaXZhdGUgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PFNlcnZlckVkaXRvclNlY3Rpb24+PiBzZWN0aW9uVG9JbnNlcnRpb25JZCA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0PFNlcnZlckVkaXRvclNlY3Rpb24+IHNlY3Rpb25zID0gbnVsbDsKLQlwcml2YXRlIFNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIgY29tbWFuZE1hbmFnZXI7Ci0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCXByaXZhdGUgSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtOwotCi0JLyoqCi0JICogVGhlIHNlcnZlciBjdXJyZW50bHkgYmVpbmcgZWRpdGVkLgotCSAqLwotCXByb3RlY3RlZCBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyOwotCi0JLyoqCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlcnZlciBpcyByZWFkLW9ubHksIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZE9ubHk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgc2VydmVyIGVkaXRvciBwYXJ0LgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJFZGl0b3JQYXJ0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjZG9TYXZlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvciA9PSBudWxsKSAKLQkJCXJldHVybjsKLQkJCi0JCUxpc3Q8U2VydmVyRWRpdG9yU2VjdGlvbj4gY3VyU2VjdGlvbnMgPSBnZXRTZWN0aW9ucygpOwotCQlpbnQgdGlja3MgPSAxMDA7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLnNhdmluZ1Rhc2ssIGN1clNlY3Rpb25zLnNpemUoKSAqIHRpY2tzKTsKLQkJZm9yIChTZXJ2ZXJFZGl0b3JTZWN0aW9uIHNlY3Rpb246IGN1clNlY3Rpb25zKSB7Ci0JCQlzZWN0aW9uLmRvU2F2ZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQkJZm9yIChTZXJ2ZXJFZGl0b3JTZWN0aW9uIHNlY3Rpb246IGdldFNlY3Rpb25zKCkpIHsKLQkJCXNlY3Rpb24uZG9TYXZlQXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG1hbmFnZWQgZm9ybSB0aGF0IHRoaXMgcGFydCBpcyB1c2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gbWFuYWdlZEZvcm0gYSBtYW5hZ2VkIGZvcm0KLQkgKiBAc2luY2UgMS4xCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlZEZvcm0oSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCXRoaXMubWFuYWdlZEZvcm0gPSBtYW5hZ2VkRm9ybTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYW5hZ2VkIGZvcm0gdGhhdCB0aGlzIHBhcnQgaXMgdXNpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0JICogbWFuYWdlZCBmb3JtIGhhcyBiZWVuIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIG1hbmFnZWRGb3JtIHRoZSBtYW5hZ2VkIGZvcm0gdGhhdCB0aGlzIHBhcnQgaXMgdXNpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgaWYgbm8gbWFuYWdlZCBmb3JtIGhhcyBiZWVuIHNldAotCSAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwcm90ZWN0ZWQgSU1hbmFnZWRGb3JtIGdldE1hbmFnZWRGb3JtKCkgewotCQlyZXR1cm4gbWFuYWdlZEZvcm07Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKiBAc2VlICNnZXRNYW5hZ2VkRm9ybSgpIFVzZSBmb3JtcyBVSSBiYXNlZCBmb3IgZXJyb3JzIHZpYSB7QGxpbmsgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1lc3NhZ2VNYW5hZ2VyfQotCSAqICAgIG9uIHRoZSBtZXNzYWdlIGZvcm0gaW5zdGVhZCBvZiB0aGlzIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3IpIHsKLQkJaWYgKGVycm9yID09IG51bGwgJiYgZXJyb3JNZXNzYWdlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5lcXVhbHMoZXJyb3JNZXNzYWdlKSkKLQkJCXJldHVybjsKLQkJCi0JCWVycm9yTWVzc2FnZSA9IGVycm9yOwotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9FUlJPUik7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZXJyb3IgbWVzc2FnZSBzaG93biBpbiB0aGUgZWRpdG9yLgotCSAqIAotCSAqIEBzZWUgI2dldE1hbmFnZWRGb3JtKCkgVXNlIGZvcm1zIFVJIGJhc2VkIGZvciBlcnJvcnMgdmlhIHtAbGluayBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWVzc2FnZU1hbmFnZXJ9Ci0JICogICAgb24gdGhlIG1lc3NhZ2UgZm9ybSBpbnN0ZWFkIG9mIHRoaXMgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkgewotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9FUlJPUik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGlzIHBhZ2UuCi0JICogCi0JICogQHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZQotCSAqIEBzZWUgI2dldE1hbmFnZWRGb3JtKCkgVXNlIGZvcm1zIFVJIGJhc2VkIGZvciBlcnJvcnMgdmlhIHtAbGluayBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWVzc2FnZU1hbmFnZXJ9Ci0JICogICAgb24gdGhlIG1lc3NhZ2UgZm9ybSBpbnN0ZWFkIG9mIHRoaXMgbWV0aG9kCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCWlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRTZWN0aW9ucygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJU2VydmVyRWRpdG9yU2VjdGlvbiBzZWN0aW9uID0gKFNlcnZlckVkaXRvclNlY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlTdHJpbmcgZXJyb3IgPSBzZWN0aW9uLmdldEVycm9yTWVzc2FnZSgpOwotCQkJCWlmIChlcnJvciAhPSBudWxsKQotCQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGVycm9yIG9yIHN0YXR1cyBtZXNzYWdlcyB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIHdoZW4gdGhlCi0JICogc2VydmVyIHJlc291cmNlIGlzIHNhdmVkLiBJZiB0aGVyZSBhcmUgYW55IGVycm9yIG1lc3NhZ2VzLCB0aGUKLQkgKiB1c2VyIHdpbGwgYmUgdW5hYmxlIHRvIHNhdmUgdGhlIGVkaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc2V0IG9mIHN0YXR1cwotCSAqIEBzZWUgI2dldE1hbmFnZWRGb3JtKCkgVXNlIGZvcm1zIFVJIGJhc2VkIGZvciBlcnJvcnMgdmlhIHtAbGluayBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWVzc2FnZU1hbmFnZXJ9Ci0JICogICAgb24gdGhlIG1lc3NhZ2UgZm9ybSBpbnN0ZWFkIG9mIHRoaXMgbWV0aG9kCi0JICovCi0JcHVibGljIElTdGF0dXNbXSBnZXRTYXZlU3RhdHVzKCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlY3Rpb25zKCkuaXRlcmF0b3IoKTsKLQkJTGlzdDxJU3RhdHVzPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJU3RhdHVzPigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2ZXJFZGl0b3JTZWN0aW9uIHNlY3Rpb24gPSAoU2VydmVyRWRpdG9yU2VjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJSVN0YXR1c1tdIHN0YXR1cyA9IHNlY3Rpb24uZ2V0U2F2ZVN0YXR1cygpOwotCQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSBzdGF0dXMubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCWlmIChzdGF0dXNbaV0uZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLk9LKQotCQkJCQkJbGlzdC5hZGQoc3RhdHVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCUlTdGF0dXNbXSBzdGF0dXMgPSBuZXcgSVN0YXR1c1tzaXplXTsKLQkJbGlzdC50b0FycmF5KHN0YXR1cyk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFNlcnZlckVkaXRvclNlY3Rpb24+IGdldFNlY3Rpb25zKCkgewotCQlpZiAoc2VjdGlvbnMgPT0gbnVsbCkgewotCQkJc2VjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFNlcnZlckVkaXRvclNlY3Rpb24+KCk7Ci0JCQlzZWN0aW9uVG9JbnNlcnRpb25JZCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxTZXJ2ZXJFZGl0b3JTZWN0aW9uPj4oKTsKLQkJCQotCQkJaWYgKGNvbW1hbmRNYW5hZ2VyICE9IG51bGwpewotCQkJCVNlcnZlckVkaXRvciBzZXJ2ZXJFZGl0b3IgPSBjb21tYW5kTWFuYWdlci5nZXRTZXJ2ZXJFZGl0b3IoKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IFNlcnZlckVkaXRvckNvcmUuZ2V0U2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXMoKS5pdGVyYXRvcigpOwotCQkJCVN0cmluZyBpbnNlcnRpb25JZCA9IG51bGw7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQl0cnkgewotCQkJCQkJSVNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeSBmYWN0b3J5ID0gKElTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWluc2VydGlvbklkID0gZmFjdG9yeS5nZXRJbnNlcnRpb25JZCgpOwotCQkJCQkJCi0JCQkJCQlJU2VydmVyRWRpdG9yUGFydEZhY3RvcnkgcGFnZUZhY3RvcnkgPSBzZXJ2ZXJFZGl0b3IuZ2V0UGFnZUZhY3RvcnkodGhpcyk7Ci0JCQkJCQlpZiAocGFnZUZhY3Rvcnkuc3VwcG9ydHNJbnNlcnRpb25JZChpbnNlcnRpb25JZCkpIHsKLQkJCQkJCQlTdHJpbmcgc2VydmVyVHlwZUlkID0gbnVsbDsKLQkJCQkJCQlpZiAoc2VydmVyICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsKQotCQkJCQkJCQlzZXJ2ZXJUeXBlSWQgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0JCQkJCQkJaWYgKHNlcnZlclR5cGVJZCAhPSBudWxsICYmIGZhY3Rvcnkuc3VwcG9ydHNUeXBlKHNlcnZlclR5cGVJZCkKLQkJCQkJCQkJCSYmIGZhY3Rvcnkuc2hvdWxkQ3JlYXRlU2VjdGlvbihzZXJ2ZXIpKSB7Ci0JCQkJCQkJCVNlcnZlckVkaXRvclNlY3Rpb24gc2VjdGlvbiA9IGZhY3RvcnkuY3JlYXRlU2VjdGlvbigpOwotCQkJCQkJCQlpZiAoc2VjdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCQlzZWN0aW9uLnNldFNlcnZlckVkaXRvclBhcnQodGhpcyk7Ci0JCQkJCQkJCQlzZWN0aW9ucy5hZGQoc2VjdGlvbik7Ci0JCQkJCQkJCQlMaXN0PFNlcnZlckVkaXRvclNlY3Rpb24+IGxpc3QgPSBudWxsOwotCQkJCQkJCQkJbGlzdCA9IHNlY3Rpb25Ub0luc2VydGlvbklkLmdldChpbnNlcnRpb25JZCk7Ci0KLQkJCQkJCQkJCWlmIChsaXN0ID09IG51bGwpCi0JCQkJCQkJCQkJbGlzdCA9IG5ldyBBcnJheUxpc3Q8U2VydmVyRWRpdG9yU2VjdGlvbj4oKTsKLQkJCQkJCQkJCWxpc3QuYWRkKHNlY3Rpb24pOwotCQkJCQkJCQkJc2VjdGlvblRvSW5zZXJ0aW9uSWQucHV0KGluc2VydGlvbklkLCBsaXN0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkZhaWxlZCB0byBnZXQgc2VjdGlvbnMgIiArIGluc2VydGlvbklkICsgIjogIiwgZSk7Ci0JCQkJCQl9CQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNlY3Rpb25zOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRTZWN0aW9ucyhTdHJpbmcgaW5zZXJ0aW9uSWQpIHsKLQkJaWYgKGluc2VydGlvbklkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWdldFNlY3Rpb25zKCk7Ci0JCUxpc3Q8U2VydmVyRWRpdG9yU2VjdGlvbj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U2VydmVyRWRpdG9yU2VjdGlvbj4oKTsKLQkJdHJ5IHsKLQkJCUxpc3Q8U2VydmVyRWRpdG9yU2VjdGlvbj4gc2VjdGlvbnMyID0gc2VjdGlvblRvSW5zZXJ0aW9uSWQuZ2V0KGluc2VydGlvbklkKTsKLQkJCWlmIChzZWN0aW9uczIgIT0gbnVsbCkgewotCQkJCUl0ZXJhdG9yPFNlcnZlckVkaXRvclNlY3Rpb24+IGl0ZXJhdG9yID0gc2VjdGlvbnMyLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlsaXN0LmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXNldFNpdGUoc2l0ZSk7Ci0JCXNldElucHV0KGlucHV0KTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSVNlcnZlckVkaXRvclBhcnRJbnB1dCkgewotCQkJSVNlcnZlckVkaXRvclBhcnRJbnB1dCBzZXBpID0gKElTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQpIGlucHV0OwotCQkJc2VydmVyID0gc2VwaS5nZXRTZXJ2ZXIoKTsKLQkJCWNvbW1hbmRNYW5hZ2VyID0gKChTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQpIHNlcGkpLmdldFNlcnZlckNvbW1hbmRNYW5hZ2VyKCk7Ci0JCQlyZWFkT25seSA9IHNlcGkuaXNTZXJ2ZXJSZWFkT25seSgpOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlY3Rpb25zKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyRWRpdG9yU2VjdGlvbiBzZWN0aW9uID0gKFNlcnZlckVkaXRvclNlY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXNlY3Rpb24uaW5pdChzaXRlLCBpbnB1dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gb3BlcmF0aW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBvcGVyYXRpb24gaGlzdG9yeQotCSAqIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0aW9uIGFuIG9wZXJhdGlvbiByZWFkeSB0byBiZSBleGVjdXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQljb21tYW5kTWFuYWdlci5leGVjdXRlKG9wZXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXJ2ZXIgdGhhdCBpcyBiZWluZyBlZGl0ZWQuCi0JICogCi0JICogQHJldHVybiBhIHNlcnZlciB3b3JraW5nIGNvcHkKLQkgKi8KLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGdldFNlcnZlcigpIHsKLQkJcmV0dXJuIHNlcnZlcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnRzIGVkaXRvciBzZWN0aW9ucyBpbnRvIHRoZSBnaXZlbiBjb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgY29tcG9zaXRlIHRvIGFkZCB0aGUgc2VjdGlvbihzKSB0bwotCSAqIEBwYXJhbSBpZCB0aGUgc2VjdGlvbiBpbnNlcnRpb24gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnRTZWN0aW9ucyhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlY3Rpb25zKGlkKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2ZXJFZGl0b3JTZWN0aW9uIHNlY3Rpb24gPSAoU2VydmVyRWRpdG9yU2VjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQlzZWN0aW9uLmNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkZhaWxlZCB0byBpbnNlcnQgZWRpdG9yIHNlY3Rpb246ICIgKyBpZCArICJcbiIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZSBvZiB0aGUgZWRpdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VjdGlvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2ZXJFZGl0b3JTZWN0aW9uIHNlY3Rpb24gPSAoU2VydmVyRWRpdG9yU2VjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJc2VjdGlvbi5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCWlmICh0b29sa2l0ICE9IG51bGwpIHsKLQkJCXRvb2xraXQuZGlzcG9zZSgpOwotCQkJdG9vbGtpdCA9IG51bGw7Ci0JCX0KLQkJCi0JCWNvbW1hbmRNYW5hZ2VyID0gbnVsbDsKLQkJc2VjdGlvblRvSW5zZXJ0aW9uSWQgPSBudWxsOwotCQlzZWN0aW9ucyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgZm9ybSB0b29sa2l0IHRvIGNyZWF0ZSB3aWRnZXRzLiBJdCB3aWxsIGJlIGRpc3Bvc2VkIGF1dG9tYXRpY2FsbHkKLQkgKiB3aGVuIHRoZSBlZGl0b3IgaXMgY2xvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBkaXNwbGF5IHRoZSBkaXNwbGF5Ci0JICogQHJldHVybiBGb3JtVG9vbGtpdAotCSAqLwotCXByb3RlY3RlZCBGb3JtVG9vbGtpdCBnZXRGb3JtVG9vbGtpdChEaXNwbGF5IGRpc3BsYXkpIHsKLQkJaWYgKG1hbmFnZWRGb3JtICE9IG51bGwpCi0JCQlyZXR1cm4gbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotCQkKLQkJaWYgKHRvb2xraXQgPT0gbnVsbCkKLQkJCXRvb2xraXQgPSBuZXcgRm9ybVRvb2xraXQoZGlzcGxheSk7Ci0JCXJldHVybiB0b29sa2l0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvU2VydmVyRWRpdG9yU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL1NlcnZlckVkaXRvclNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3NzUzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvU2VydmVyRWRpdG9yU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3IuU2VydmVyRWRpdG9yUGFydElucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLlNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXI7Ci0vKioKLSAqIEFuIGFic3RyYWN0IHNlcnZlciBlZGl0b3Igc2VjdGlvbi4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyRWRpdG9yU2VjdGlvbiB7Ci0JcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQotCXByaXZhdGUgU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlciBjb21tYW5kTWFuYWdlcjsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudENvbXA7Ci0JcHJpdmF0ZSBTZXJ2ZXJFZGl0b3JQYXJ0IGVkaXRvcjsKLQotCS8qKgotCSAqIFRoZSBzZXJ2ZXIgY3VycmVudGx5IGJlaW5nIGVkaXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcjsKLQotCS8qKgotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgaXMgcmVhZC1vbmx5LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlYWRPbmx5OwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgc2VjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc2l0ZSB0aGUgZWRpdG9yIHNpdGUKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGVkaXRvciBpbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQpIHsKLQkJCUlTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQgc2VwaSA9IChJU2VydmVyRWRpdG9yUGFydElucHV0KSBpbnB1dDsKLQkJCXNlcnZlciA9IHNlcGkuZ2V0U2VydmVyKCk7Ci0JCQljb21tYW5kTWFuYWdlciA9ICgoU2VydmVyRWRpdG9yUGFydElucHV0KSBzZXBpKS5nZXRTZXJ2ZXJDb21tYW5kTWFuYWdlcigpOwotCQkJcmVhZE9ubHkgPSBzZXBpLmlzU2VydmVyUmVhZE9ubHkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBvcGVyYXRpb24gYW5kIGFkZHMgaXQgdG8gdGhlIG9wZXJhdGlvbiBoaXN0b3J5Ci0JICogd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRpb24gYW4gb3BlcmF0aW9uIHJlYWR5IHRvIGJlIGV4ZWN1dGVkCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWNvbW1hbmRNYW5hZ2VyLmV4ZWN1dGUob3BlcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIHNlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLnBhcmVudENvbXAgPSBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaGVsbCBvZiB0aGUgc2VjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaGVsbAotCSAqLwotCXB1YmxpYyBTaGVsbCBnZXRTaGVsbCgpIHsKLQkJcmV0dXJuIHBhcmVudENvbXAuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgc2VjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlCi0JICogQHNlZSAjZ2V0TWFuYWdlZEZvcm0oKSBVc2UgZm9ybXMgVUkgYmFzZWQgZm9yIGVycm9ycyB2aWEge0BsaW5rIG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNZXNzYWdlTWFuYWdlcn0KLQkgKiAgICBvbiB0aGUgbWVzc2FnZSBmb3JtIGluc3RlYWQgb2YgdGhpcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGVycm9yIG9yIHN0YXR1cyBtZXNzYWdlcyB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIHdoZW4gdGhlCi0JICogc2VydmVyIHJlc291cmNlIGlzIHNhdmVkLiBJZiB0aGVyZSBhcmUgYW55IGVycm9yIG1lc3NhZ2VzLCB0aGUKLQkgKiB1c2VyIHdpbGwgYmUgdW5hYmxlIHRvIHNhdmUgdGhlIGVkaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhpcwotCSAqICAgc2VydmVyIGNhbiBiZSBzYXZlZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoeQotCSAqICAgaXQgY2FuJ3QgYmUKLQkgKiBAc2VlICNnZXRNYW5hZ2VkRm9ybSgpIFVzZSBmb3JtcyBVSSBiYXNlZCBmb3IgZXJyb3JzIHZpYSB7QGxpbmsgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1lc3NhZ2VNYW5hZ2VyfQotCSAqICAgIG9uIHRoZSBtZXNzYWdlIGZvcm0gaW5zdGVhZCBvZiB0aGlzIG1ldGhvZAotCSAqLwotCXB1YmxpYyBJU3RhdHVzW10gZ2V0U2F2ZVN0YXR1cygpIHsKLQkJcmV0dXJuIG5ldyBJU3RhdHVzW10geyBTdGF0dXMuT0tfU1RBVFVTIH07Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBlZGl0b3IgcGFydCB0aGF0IHRoaXMgc2VjdGlvbiBiZWxvbmdzIHRvLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0b3IgdGhlIGVkaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlckVkaXRvclBhcnQoU2VydmVyRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgc2VjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3IgYW4gZXJyb3IgbWVzc2FnZQotCSAqIEBzZWUgI2dldE1hbmFnZWRGb3JtKCkgVXNlIGZvcm1zIFVJIGJhc2VkIGZvciBlcnJvcnMgdmlhIHtAbGluayBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWVzc2FnZU1hbmFnZXJ9Ci0JICogICAgb24gdGhlIG1lc3NhZ2UgZm9ybSBpbnN0ZWFkIG9mIHRoaXMgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvcikgewotCQlpZiAoZXJyb3IgPT0gbnVsbCAmJiBlcnJvck1lc3NhZ2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChlcnJvciAhPSBudWxsICYmIGVycm9yLmVxdWFscyhlcnJvck1lc3NhZ2UpKQotCQkJcmV0dXJuOwotCQkKLQkJZXJyb3JNZXNzYWdlID0gZXJyb3I7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkKLQkJCWVkaXRvci51cGRhdGVFcnJvck1lc3NhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSBmb3JtIHRvb2xraXQgdG8gY3JlYXRlIHdpZGdldHMuIEl0IHdpbGwgYmUgZGlzcG9zZWQgYXV0b21hdGljYWxseQotCSAqIHdoZW4gdGhlIGVkaXRvciBpcyBjbG9zZWQuCi0JICogCi0JICogQHBhcmFtIGRpc3BsYXkgdGhlIGRpc3BsYXkKLQkgKiBAcmV0dXJuIGEgRm9ybVRvb2xraXQKLQkgKi8KLQlwcm90ZWN0ZWQgRm9ybVRvb2xraXQgZ2V0Rm9ybVRvb2xraXQoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCXJldHVybiBlZGl0b3IuZ2V0Rm9ybVRvb2xraXQoZGlzcGxheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFuYWdlZCBmb3JtIHRoYXQgdGhlIGVkaXRvciBpcyB1c2luZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8KLQkgKiBtYW5hZ2VkIGZvcm0gaGFzIGJlZW4gc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1hbmFnZWQgZm9ybSB0aGF0IHRoZSBlZGl0b3IgaXMgdXNpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0JICogICAgbWFuYWdlZCBmb3JtIGhhcyBiZWVuIHNldAotCSAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwcm90ZWN0ZWQgSU1hbmFnZWRGb3JtIGdldE1hbmFnZWRGb3JtKCkgewotCQlyZXR1cm4gZWRpdG9yLmdldE1hbmFnZWRGb3JtKCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3cgYSBzZWN0aW9uIGFuIG9wcG9ydHVuaXR5IHRvIHJlc3BvbmQgdG8gYSBkb1NhdmUgcmVxdWVzdCBvbiB0aGUgZWRpdG9yLgotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgc2F2ZSBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQltb25pdG9yLndvcmtlZCgxMDApOwotCX0KLQotCS8qKgotCSAqIEFsbG93IGEgc2VjdGlvbiBhbiBvcHBvcnR1bml0eSB0byByZXNwb25kIHRvIGEgZG9TYXZlQXMgcmVxdWVzdCBvbiB0aGUgZWRpdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoZSBzZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGlnbm9yZQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2NGMxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8vYXBpc3R5bGVzLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD5Qcm92aWRlcyBlZGl0b3Igc3VwcG9ydCBmb3IgdGhlIHNlcnZlciB0b29scyBVSS48L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5Vc2luZyBleHRlbnNpb24gcG9pbnRzLCBjbGllbnRzIGNhbiBwcm92aWRlIHBhZ2VzLCBzZWN0aW9ucywgYW5kCi1hY3Rpb25zIHRvIGJlIGFkZGVkIHRvIHRoZSBlZGl0b3IgZm9yIGEgc3BlY2lmaWMgc2VydmVyIHR5cGUuIFRoaXMKLXBhY2thZ2UgY29udGFpbnMgdGhlIGRlbGVnYXRlIGNsYXNzZXMgZm9yIHRoZXNlIGV4dGVuc2lvbiBwb2ludHMsIGFzCi13ZWxsIGFzIHRoZSBBUEkgdGhhdCB0aGV5IGNhbiB1c2UgdG8gcHV0IGNvbW1hbmRzIG9uIHRoZSBzaGFyZWQKLWVkaXRvciBjb21tYW5kIGhpc3Rvcnkgc3RhY2sgYW5kIGludGVyYWN0IHdpdGggdGhlIGVkaXRpbmcgZnJhbWV3b3JrLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2VkaXRvci9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2VkaXRvci9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0YzRhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci08aGVhZD4KLQk8IS0tICBFc2NhcGUgdG8gdGhlIHJvb3Qgb2YgeW91ciBzb3VyY2UgZm9sZGVyICAtLT4KLQk8bWV0YQotCQluYW1lPSJyb290IgotCQljb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0JPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotPGFic3RyYWN0PlByb3ZpZGVzIGVkaXRvciBzdXBwb3J0IGZvciB0aGUgc2VydmVyIHRvb2xzIFVJLjwvYWJzdHJhY3Q+Ci0KLTxwPlVzaW5nIGV4dGVuc2lvbiBwb2ludHMsIGNsaWVudHMgY2FuIHByb3ZpZGUgcGFnZXMsIHNlY3Rpb25zLCBhbmQKLWFjdGlvbnMgdG8gYmUgYWRkZWQgdG8gdGhlIGVkaXRvciBmb3IgYSBzcGVjaWZpYyBzZXJ2ZXIgdHlwZS4gVGhpcwotcGFja2FnZSBjb250YWlucyB0aGUgZGVsZWdhdGUgY2xhc3NlcyBmb3IgdGhlc2UgZXh0ZW5zaW9uIHBvaW50cywgYXMKLXdlbGwgYXMgdGhlIEFQSSB0aGF0IHRoZXkgY2FuIHVzZSB0byBwdXQgY29tbWFuZHMgb24gdGhlIHNoYXJlZAotZWRpdG9yIGNvbW1hbmQgaGlzdG9yeSBzdGFjayBhbmQgaW50ZXJhY3Qgd2l0aCB0aGUgZWRpdGluZyBmcmFtZXdvcmsuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvQ29udGV4dElkcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDlmNzI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0NvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotLyoqCi0gKiBDb250ZXh0IGhlbHAgaWQgY29uc3RhbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRleHRJZHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9TRVJWRVJfV0laQVJEID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd3NpMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX1NFUlZFUl9FWElTVElORyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dzaTAwMDIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9TRVJWRVJfRVhJU1RJTkdfVEFCTEUgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN3c2kwMDA0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfU0VSVkVSX0NSRUFURSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dzaTAwMTAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9TRVJWRVJfQ1JFQVRFX1RBQkxFID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd3NpMDAxMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX1NFUlZFUl9QUkVGRVJFTkNFID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd3NpMDAxNCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfQ0xJRU5UX1dJWkFSRCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dzYzAwMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9DTElFTlQgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN3c2MwMDAyIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19TRVJWRVJfV0laQVJEID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd25zMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1NFUlZFUl9UWVBFID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd25zMDAwNiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1BST1BFUlRZX1BBR0UgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN2Y3AwMDA0IjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUlVOVElNRV9XSVpBUkQgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN3bnIwMDAwIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSF9DT05GSUdVUkFUSU9OX1NFUlZFUl9DT01CTyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dzbDAwMDAiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX1RBU0tfV0laQVJEID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zc3R3MDAwMCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RJRllfTU9EVUxFU19DT01QT1NJVEUgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN3bW0wMDAwIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1JTkFURV9TRVJWRVJfRElBTE9HID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZHRpMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX1NFUlZFUl9ESUFMT0cgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN2Y3AwMDAyIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9QVUJMSVNIX0JFRk9SRV9TVEFSVCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMTIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9TSE9XX09OX0FDVElWSVRZID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zcGdlMDAyMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9HRU5FUkFMX1NBVkVfRURJVE9SUyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMjQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9MQVVOQ0hfTU9ERSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMzAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9MQVVOQ0hfTU9ERV9ERUJVRyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMzEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9FTkFCTEVfQlJFQUtQT0lOVFMgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNwZ2UwMDMyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0dFTkVSQUxfUkVTVEFSVCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMzQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19TRVJWRVJTID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zdmNwMDAwMCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0RFVEFJTFNfRElBTE9HID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZHBkMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9ERVRBSUxTX0RJQUxPR19TVEFUVVMgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNkcGQwMDAyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0RFVEFJTFNfRElBTE9HX0RFVEFJTFNfQlVUVE9OID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZHBkMDAwNCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9ERVRBSUxTX0RJQUxPR19ERVRBSUxTID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZHBkMDAwNiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9NUFRfSVJSRVZFUlNJQkxFX0RJQUxPRyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc2RwaTAwMDAiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX09WRVJWSUVXX1BBR0UgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlb3AwMDAwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfU0VSVkVSID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZW9wMDAwMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0NPTkZJR1VSQVRJT04gPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlb3AwMDA0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSE9TVE5BTUUgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlb3AwMDA2IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfUlVOVElNRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc2VvcDAwMDgiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9BVVRPUFVCTElTSF9FTkFCTEUgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlb3AwMDEyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfQVVUT1BVQkxJU0hfQlVJTEQgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlb3AwMDE0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfQVVUT1BVQkxJU0hfRElTQUJMRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc2VvcDAwMTYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9BVVRPUFVCTElTSF9JTlRFUlZBTD0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZW9wMDAxOCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX1BVQkxJU0hUQVNLU19DT05GSUdVUkFUSU9OID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZW9wMDAyMCI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX1RJTUVPVVRfU1RBUlQgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNwZ2UwMDI2IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfVElNRU9VVF9TVE9QID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zcGdlMDAyNyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVURJT19QUkVGRVJFTkNFUyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuYXVwcjAwMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVRElPX1BSRUZFUkVOQ0VTX0VOQUJMRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuYXVwcjAwMDIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVRElPX1BSRUZFUkVOQ0VTX1ZPTFVNRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuYXVwcjAwMDQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVRElPX1BSRUZFUkVOQ0VTX1NPVU5EU19UQUJMRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuYXVwcjAwMDYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVRElPX1BSRUZFUkVOQ0VTX1BMQVkgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLmF1cHIwMDA4IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVURJT19QUkVGRVJFTkNFU19CUk9XU0UgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLmF1cHIwMDEwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVURJT19QUkVGRVJFTkNFU19SRVNFVCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuYXVwcjAwMTIiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlZmF1bHRNb25pdG9yRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlZmF1bHRNb25pdG9yRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmYmQwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9EZWZhdWx0TW9uaXRvckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3JXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLk1vbml0b3JDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJNb25pdG9yRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuU29ja2V0VXRpbDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9uaXRvckRlbGVnYXRlIGV4dGVuZHMgU2VydmVyTW9uaXRvckRlbGVnYXRlIHsKLQlwcm90ZWN0ZWQgTWFwPFNlcnZlclBvcnQsIElNb25pdG9yPiBtb25pdG9ycyA9IG5ldyBIYXNoTWFwPFNlcnZlclBvcnQsIElNb25pdG9yPigpOwotCXByb3RlY3RlZCBJTW9uaXRvckxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVyKCkgewotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWxpc3RlbmVyID0gbmV3IElNb25pdG9yTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb25pdG9yQWRkZWQoSU1vbml0b3IgbW9uaXRvcikgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb25pdG9yQ2hhbmdlZChJTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vbml0b3JSZW1vdmVkKElNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJCi0JCQkJT2JqZWN0IG1vbktleSA9IG51bGw7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb25pdG9ycy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IGtleSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJT2JqZWN0IHZhbHVlID0gbW9uaXRvcnMuZ2V0KGtleSk7Ci0JCQkJCWlmIChtb25pdG9yLmVxdWFscyh2YWx1ZSkpCi0JCQkJCQltb25LZXkgPSBrZXk7Ci0JCQkJfQotCQkJCWlmIChtb25LZXkgIT0gbnVsbCkKLQkJCQkJbW9uaXRvcnMucmVtb3ZlKG1vbktleSk7Ci0JCQkJaWYgKG1vbml0b3JzLmlzRW1wdHkoKSkgewotCQkJCQlNb25pdG9yQ29yZS5yZW1vdmVNb25pdG9yTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJCQlsaXN0ZW5lciA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlNb25pdG9yQ29yZS5hZGRNb25pdG9yTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJNb25pdG9yRGVsZWdhdGUjc3RhcnRNb25pdG9yaW5nKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0KQotCSAqLwotCXB1YmxpYyBpbnQgc3RhcnRNb25pdG9yaW5nKElTZXJ2ZXIgc2VydmVyLCBTZXJ2ZXJQb3J0IHBvcnQsIGludCBtb25pdG9yUG9ydCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJSU1vbml0b3IgbW9uaXRvciA9IG1vbml0b3JzLmdldChwb3J0KTsKLQkJCWludCBtcG9ydCA9IC0xOwotCQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJCW1wb3J0ID0gbW9uaXRvclBvcnQ7Ci0JCQkJaWYgKG1wb3J0ID09IC0xKQotCQkJCQltcG9ydCA9IFNvY2tldFV0aWwuZmluZFVudXNlZFBvcnQoNTAwMCwgMTUwMDApOwotCQkJCQotCQkJCS8vIHNob3VsZCBzZWFyY2ggZm9yIGEgbW9uaXRvciBmaXJzdCAuLgotCQkJCUlNb25pdG9yV29ya2luZ0NvcHkgd2MgPSBNb25pdG9yQ29yZS5jcmVhdGVNb25pdG9yKCk7Ci0JCQkJd2Muc2V0TG9jYWxQb3J0KG1wb3J0KTsKLQkJCQl3Yy5zZXRSZW1vdGVIb3N0KHNlcnZlci5nZXRIb3N0KCkpOwotCQkJCXdjLnNldFJlbW90ZVBvcnQocG9ydC5nZXRQb3J0KCkpOwotCQkJCWlmICgiSFRUUCIuZXF1YWxzKHBvcnQuZ2V0UHJvdG9jb2woKSkpCi0JCQkJCXdjLnNldFByb3RvY29sKCJIVFRQIik7Ci0JCQkJbW9uaXRvciA9IHdjLnNhdmUoKTsKLQkJCQlhZGRMaXN0ZW5lcigpOwotCQkJfSBlbHNlCi0JCQkJbXBvcnQgPSBtb25pdG9yLmdldExvY2FsUG9ydCgpOwotCQkJbW9uaXRvci5zdGFydCgpOwotCQkJbW9uaXRvcnMucHV0KHBvcnQsIG1vbml0b3IpOwotCQkJcmV0dXJuIG1wb3J0OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZCBub3Qgc3RhcnQgbW9uaXRvcmluZyIsIGUpOwotCQkJfQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yU3RhcnRpbmdNb25pdG9yLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSksIG51bGwpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJNb25pdG9yRGVsZWdhdGUjc3RvcE1vbml0b3Jpbmcob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcE1vbml0b3JpbmcoSVNlcnZlciBzZXJ2ZXIsIFNlcnZlclBvcnQgcG9ydCkgewotCQl0cnkgewotCQkJSU1vbml0b3IgbW9uaXRvciA9IG1vbml0b3JzLmdldChwb3J0KTsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJbW9uaXRvci5zdG9wKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkNvdWxkIG5vdCBzdG9wIG1vbml0b3JpbmciLCBlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlZmF1bHRTZXJ2ZXJJbWFnZURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlZmF1bHRTZXJ2ZXJJbWFnZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA4NjhhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9EZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLS8qKgotICogQSBPdmVybGF5SW1hZ2VEZXNjcmlwdG9yIGNvbnNpc3RzIG9mIGEgbWFpbiBpY29uIGFuZCBvbmUgb3IgbW9yZSBvdmVybGF5cy4KLSAqIFRoZSBvdmVybGF5cyBhcmUgY29tcHV0ZWQgYWNjb3JkaW5nIHRvIGZsYWdzIHNldCBvbiBjcmVhdGlvbiBvZiB0aGUgZGVzY3JpcHRvci4KLSAqIEBkZXByZWNhdGVkIHNpbmNlIDMuMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yIHsKLQlwcml2YXRlIEltYWdlIGZCYXNlSW1hZ2U7Ci0JcHJpdmF0ZSBQb2ludCBmU2l6ZTsKLQlwcml2YXRlIEltYWdlIG92ZXJsYXk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IE92ZXJsYXlJbWFnZURlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIGJhc2VJbWFnZSBhbiBpbWFnZSBkZXNjcmlwdG9yIHVzZWQgYXMgdGhlIGJhc2UgaW1hZ2UKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvcihJbWFnZSBiYXNlSW1hZ2UpIHsKLQkJdGhpcyhiYXNlSW1hZ2UsIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfREVGQVVMVF9TRVJWRVJfT1ZFUkxBWSkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBiYXNlSW1hZ2UKLQkgKiBAcGFyYW0gb3ZlcmxheQotCSAqLwotCXB1YmxpYyBEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlIGJhc2VJbWFnZSwgSW1hZ2Ugb3ZlcmxheSkgewotCQlzZXRCYXNlSW1hZ2UoYmFzZUltYWdlKTsKLQkJdGhpcy5vdmVybGF5ID0gb3ZlcmxheTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciNnZXRTaXplKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpIHsKLQkJaWYgKGZTaXplID09IG51bGwpIHsKLQkJCUltYWdlRGF0YSBkYXRhID0gZ2V0QmFzZUltYWdlKCkuZ2V0SW1hZ2VEYXRhKCk7Ci0JCQlzZXRTaXplKG5ldyBQb2ludChkYXRhLndpZHRoLCBkYXRhLmhlaWdodCkpOwotCQl9Ci0JCXJldHVybiBmU2l6ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvciBvdGhlciA9IChEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yKSBvYmplY3Q7Ci0JCXJldHVybiAoZ2V0QmFzZUltYWdlKCkuZXF1YWxzKG90aGVyLmdldEJhc2VJbWFnZSgpKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0QmFzZUltYWdlKCkuaGFzaENvZGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IjZHJhd0NvbXBvc2l0ZUltYWdlKGludCwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJSW1hZ2VEYXRhIGJnID0gZ2V0QmFzZUltYWdlKCkuZ2V0SW1hZ2VEYXRhKCk7Ci0JCWlmIChiZyA9PSBudWxsKQotCQkJYmcgPSBERUZBVUxUX0lNQUdFX0RBVEE7Ci0KLQkJZHJhd0ltYWdlKGJnLCAwLCAwKTsKLQkJZHJhd092ZXJsYXlzKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFueSBvdmVybGF5cyB0byB0aGUgaW1hZ2UgYXMgc3BlY2lmaWVkIGluIHRoZSBmbGFncy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3T3ZlcmxheXMoKSB7Ci0JCUltYWdlRGF0YSBkYXRhID0gb3ZlcmxheS5nZXRJbWFnZURhdGEoKTsKLQkJaW50IHggPSBnZXRTaXplKCkueCAtIGRhdGEud2lkdGg7Ci0JCWRyYXdJbWFnZShkYXRhLCB4LCAwKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEltYWdlIGdldEJhc2VJbWFnZSgpIHsKLQkJcmV0dXJuIGZCYXNlSW1hZ2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QmFzZUltYWdlKEltYWdlIGJhc2VJbWFnZSkgewotCQlmQmFzZUltYWdlID0gYmFzZUltYWdlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNpemUoUG9pbnQgc2l6ZSkgewotCQlmU2l6ZSA9IHNpemU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlZmF1bHRTZXJ2ZXJMYWJlbERlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVmYXVsdFNlcnZlckxhYmVsRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NGViZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVmYXVsdFNlcnZlckxhYmVsRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotLyoqCi0gKiAKLSAqIEBkZXByZWNhdGVkIHNpbmNlIDMuMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0U2VydmVyTGFiZWxEZWNvcmF0b3IgaW1wbGVtZW50cyBJTGFiZWxEZWNvcmF0b3IgewotCXByb3RlY3RlZCBNYXA8T2JqZWN0LCBJbWFnZT4gbWFwID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBJbWFnZT4oKTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yI2RlY29yYXRlSW1hZ2Uob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBkZWNvcmF0ZUltYWdlKEltYWdlIGltYWdlLCBPYmplY3QgZWxlbWVudCkgewotCQl0cnkgewotCQkJSW1hZ2UgaW1nID0gbWFwLmdldChlbGVtZW50KTsKLQkJCWlmIChpbWcgIT0gbnVsbCkKLQkJCQlyZXR1cm4gaW1nOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJCi0JCURlZmF1bHRTZXJ2ZXJJbWFnZURlc2NyaXB0b3IgZHNpZCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmVyKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9ICgoU2VydmVyKSBlbGVtZW50KS5nZXRTZXJ2ZXJTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKTsKLQkJCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCQkJZHNpZCA9IG5ldyBEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yKGltYWdlLCBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19FUlJPUl9UU0spKTsKLQkJCQllbHNlIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpCi0JCQkJCWRzaWQgPSBuZXcgRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvcihpbWFnZSwgc2hhcmVkSW1hZ2VzLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfV0FSTl9UU0spKTsKLQkJCQllbHNlIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLklORk8pCi0JCQkJCWRzaWQgPSBuZXcgRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvcihpbWFnZSwgc2hhcmVkSW1hZ2VzLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfSU5GT19UU0spKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGRzaWQgPT0gbnVsbCkKLQkJCWRzaWQgPSBuZXcgRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvcihpbWFnZSk7Ci0JCUltYWdlIGltYWdlMiA9IGRzaWQuY3JlYXRlSW1hZ2UoKTsKLQkJbWFwLnB1dChlbGVtZW50LCBpbWFnZTIpOwotCQlyZXR1cm4gaW1hZ2UyOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yI2RlY29yYXRlVGV4dChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVjb3JhdGVUZXh0KFN0cmluZyB0ZXh0LCBPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdHJ5IHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiQ291bGQgbm90IGRpc3Bvc2UgaW1hZ2VzIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlbGV0ZVJ1bnRpbWVEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlbGV0ZVJ1bnRpbWVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0MDFlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9EZWxldGVSdW50aW1lRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1wdWJsaWMgY2xhc3MgRGVsZXRlUnVudGltZURpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgewotCXByb3RlY3RlZCBib29sZWFuIHByb21wdERlbGV0ZVNlcnZlcnM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvbXB0UmVtb3ZlVGFyZ2V0czsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWxldGVTZXJ2ZXJzOwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZVRhcmdldHM7Ci0KLQlwdWJsaWMgRGVsZXRlUnVudGltZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgYm9vbGVhbiBwcm9tcHREZWxldGVTZXJ2ZXJzLCBib29sZWFuIHByb21wdFJlbW92ZVRhcmdldHMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIE1lc3NhZ2VzLmRlZmF1bHREaWFsb2dUaXRsZSwgbnVsbCwgTWVzc2FnZXMuZGlhbG9nUnVudGltZUluVXNlLCBRVUVTVElPTiwKLQkJCW5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDApOwotCQl0aGlzLnByb21wdERlbGV0ZVNlcnZlcnMgPSBwcm9tcHREZWxldGVTZXJ2ZXJzOwotCQl0aGlzLnByb21wdFJlbW92ZVRhcmdldHMgPSBwcm9tcHRSZW1vdmVUYXJnZXRzOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUN1c3RvbUFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoIXByb21wdERlbGV0ZVNlcnZlcnMgJiYgIXByb21wdFJlbW92ZVRhcmdldHMpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoNCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoMyk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQljb21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJCi0JCWlmIChwcm9tcHREZWxldGVTZXJ2ZXJzKSB7Ci0JCQlkZWxldGVTZXJ2ZXJzID0gdHJ1ZTsKLQkJCWZpbmFsIEJ1dHRvbiBkZWxldGVTZXJ2ZXJzQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQkJZGVsZXRlU2VydmVyc0J1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmRpYWxvZ1J1bnRpbWVEZWxldGVTZXJ2ZXJzKTsKLQkJCWRlbGV0ZVNlcnZlcnNCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZGVsZXRlU2VydmVyc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWRlbGV0ZVNlcnZlcnMgPSBkZWxldGVTZXJ2ZXJzQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCQotCQlpZiAocHJvbXB0UmVtb3ZlVGFyZ2V0cykgewotCQkJcmVtb3ZlVGFyZ2V0cyA9IHRydWU7Ci0JCQlmaW5hbCBCdXR0b24gcmVtb3ZlVGFyZ2V0c0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJCXJlbW92ZVRhcmdldHNCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dSdW50aW1lUmVtb3ZlVGFyZ2V0cyk7Ci0JCQlyZW1vdmVUYXJnZXRzQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCXJlbW92ZVRhcmdldHNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlyZW1vdmVUYXJnZXRzID0gcmVtb3ZlVGFyZ2V0c0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJcmV0dXJuIGNvbXA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGVTZXJ2ZXJzKCkgewotCQlyZXR1cm4gZGVsZXRlU2VydmVyczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZVRhcmdldHMoKSB7Ci0JCXJldHVybiByZW1vdmVUYXJnZXRzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9EZWxldGVTZXJ2ZXJEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlbGV0ZVNlcnZlckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDhlZGZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlbGV0ZVNlcnZlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUnVsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5NdWx0aVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyOwotLyoqCi0gKiBEaWFsb2cgdGhhdCBwcm9tcHRzIGEgdXNlciB0byBkZWxldGUgc2VydmVyKHMpIGFuZC9vciBzZXJ2ZXIgY29uZmlndXJhdGlvbihzKS4KLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZVNlcnZlckRpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgewotCXByb3RlY3RlZCBJU2VydmVyW10gc2VydmVyczsKLQlwcm90ZWN0ZWQgSUZvbGRlcltdIGNvbmZpZ3M7Ci0KLQlwcm90ZWN0ZWQgTGlzdDxJU2VydmVyPiBydW5uaW5nU2VydmVyc0xpc3Q7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcnVubmluZ1NlcnZlckNhblN0b3A7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNoZWNrRGVsZXRlQ29uZmlnczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGNoZWNrRGVsZXRlUnVubmluZzsKLQlwcm90ZWN0ZWQgQnV0dG9uIGNoZWNrRGVsZXRlUnVubmluZ1N0b3A7Ci0KLQkvKioKLQkgKiBEZWxldGVTZXJ2ZXJEaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwgYSBzaGVsbAotCSAqIEBwYXJhbSBzZXJ2ZXJzIGFuIGFycmF5IG9mIHNlcnZlcnMKLQkgKiBAcGFyYW0gY29uZmlncyBhbiBhcnJheSBvZiBzZXJ2ZXIgY29uZmlndXJhdGlvbnMKLQkgKi8KLQlwdWJsaWMgRGVsZXRlU2VydmVyRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJU2VydmVyW10gc2VydmVycywgSUZvbGRlcltdIGNvbmZpZ3MpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIE1lc3NhZ2VzLmRlbGV0ZVNlcnZlckRpYWxvZ1RpdGxlLCBudWxsLCBudWxsLCBRVUVTVElPTiwKLQkJCQluZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCB9LCAwKTsKLQkJCi0JCWlmIChzZXJ2ZXJzID09IG51bGwgfHwgY29uZmlncyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJdGhpcy5zZXJ2ZXJzID0gc2VydmVyczsKLQkJdGhpcy5jb25maWdzID0gY29uZmlnczsKLQkJCi0JCXJ1bm5pbmdTZXJ2ZXJzTGlzdCA9IG5ldyBBcnJheUxpc3Q8SVNlcnZlcj4oKTsKLQkJZm9yIChpbnQgaSA9IDAgOyBpIDwgc2VydmVycy5sZW5ndGggOyArK2kpIHsKLQkJCWlmIChzZXJ2ZXJzW2ldLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJCXJ1bm5pbmdTZXJ2ZXJzTGlzdC5hZGQoc2VydmVyc1tpXSk7Ci0JCQkKLQkJCWlmIChzZXJ2ZXJzW2ldLmNhblN0b3AoKS5pc09LKCkpCi0JCQkJcnVubmluZ1NlcnZlckNhblN0b3AgPSB0cnVlOwotCQl9Ci0JCQotCQlpZiAoc2VydmVycy5sZW5ndGggPT0gMSkKLQkJCW1lc3NhZ2UgPSBOTFMuYmluZChNZXNzYWdlcy5kZWxldGVTZXJ2ZXJEaWFsb2dNZXNzYWdlLCBzZXJ2ZXJzWzBdLmdldE5hbWUoKSk7Ci0JCWVsc2UKLQkJCW1lc3NhZ2UgPSBOTFMuYmluZChNZXNzYWdlcy5kZWxldGVTZXJ2ZXJEaWFsb2dNZXNzYWdlTWFueSwgc2VydmVycy5sZW5ndGggKyAiIik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5ERUxFVEVfU0VSVkVSX0RJQUxPRyk7Ci0JCQotCQlpZiAoY29uZmlncy5sZW5ndGggPiAwKSB7Ci0JCQljaGVja0RlbGV0ZUNvbmZpZ3MgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJCWNoZWNrRGVsZXRlQ29uZmlncy5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0ZVNlcnZlckRpYWxvZ0xvb3NlQ29uZmlndXJhdGlvbnMsIGNvbmZpZ3NbMF0uZ2V0TmFtZSgpKSk7Ci0JCQljaGVja0RlbGV0ZUNvbmZpZ3Muc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCQotCQkvLyBwcm9tcHQgZm9yIHN0b3BwaW5nIHJ1bm5pbmcgc2VydmVycwotCQlpbnQgc2l6ZSA9IHJ1bm5pbmdTZXJ2ZXJzTGlzdC5zaXplKCk7Ci0JCWlmIChzaXplID4gMCkgewotCQkJaWYgKHNlcnZlcnMubGVuZ3RoID4gMSkgewotCQkJCWNoZWNrRGVsZXRlUnVubmluZyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQkJCWNoZWNrRGVsZXRlUnVubmluZy5zZXRUZXh0KE1lc3NhZ2VzLmRlbGV0ZVNlcnZlckRpYWxvZ1J1bm5pbmdTZXJ2ZXIpOwotCQkJCWNoZWNrRGVsZXRlUnVubmluZy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChydW5uaW5nU2VydmVyQ2FuU3RvcCkgewotCQkJCWNoZWNrRGVsZXRlUnVubmluZ1N0b3AgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJCQljaGVja0RlbGV0ZVJ1bm5pbmdTdG9wLnNldFRleHQoTWVzc2FnZXMuZGVsZXRlU2VydmVyRGlhbG9nUnVubmluZ1NlcnZlclN0b3ApOwotCQkJCWNoZWNrRGVsZXRlUnVubmluZ1N0b3Auc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCQlpZiAoY2hlY2tEZWxldGVSdW5uaW5nICE9IG51bGwpIHsKLQkJCQkJLy8gT25seSBpbmRlbnQgdGhlIGNoZWNrYm94IGlmIHRoZSBkZWxldGUgcnVubmluZyBzZXJ2ZXJzIGNoZWNrYm94IGlzIGF2YWlsYWJsZS4KLQkJCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTU7Ci0JCQkJCWNoZWNrRGVsZXRlUnVubmluZy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQljaGVja0RlbGV0ZVJ1bm5pbmdTdG9wLnNldEVuYWJsZWQoY2hlY2tEZWxldGVSdW5uaW5nLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJCWNoZWNrRGVsZXRlUnVubmluZ1N0b3Auc2V0TGF5b3V0RGF0YShkYXRhKTsJCQkJCi0JCQl9Ci0JCX0KLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IE9LKSB7Ci0JCQlmaW5hbCBib29sZWFuIGNoZWNrZWQgPSAoY2hlY2tEZWxldGVDb25maWdzICE9IG51bGwgJiYgY2hlY2tEZWxldGVDb25maWdzLmdldFNlbGVjdGlvbigpKTsKLQkJCWZpbmFsIGJvb2xlYW4gZGVsZXRlUnVubmluZyA9IChjaGVja0RlbGV0ZVJ1bm5pbmcgPT0gbnVsbCB8fCBjaGVja0RlbGV0ZVJ1bm5pbmcuZ2V0U2VsZWN0aW9uKCkpOwotCQkJZmluYWwgYm9vbGVhbiBkZWxldGVSdW5uaW5nU3RvcCA9IChjaGVja0RlbGV0ZVJ1bm5pbmdTdG9wICE9IG51bGwgJiYgY2hlY2tEZWxldGVSdW5uaW5nU3RvcC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkKLQkJCVRocmVhZCB0ID0gbmV3IFRocmVhZCgiRGVsZXRlIHNlcnZlcnMiKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAocnVubmluZ1NlcnZlcnNMaXN0LnNpemUoKSA+IDApIHsKLQkJCQkJCS8vIHN0b3Agc2VydmVycyBhbmQvb3IgdXBkYXRlcyBzZXJ2ZXJzJyBsaXN0Ci0JCQkJCQlwcmVwYXJlRm9yRGVsZXRpb24oZGVsZXRlUnVubmluZywgZGVsZXRlUnVubmluZ1N0b3ApOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlKb2Igam9iID0gbmV3IEpvYihNZXNzYWdlcy5kZWxldGVTZXJ2ZXJUYXNrKSB7Ci0JCQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQkJaWYgKHNlcnZlcnMubGVuZ3RoID09IDApIHsKLQkJCQkJCQkJLy8gYWxsIHNlcnZlcnMgaGF2ZSBiZWVuIGRlbGV0ZWQgZnJvbSBsaXN0Ci0JCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJCX0KLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJCQkJCQotCQkJCQkJCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQkJCQkJCXNlcnZlcnNbaV0uZGVsZXRlKCk7Ci0JCQkJCQkJCQotCQkJCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJCQkJCQotCQkJCQkJCQlpZiAoY2hlY2tlZCkgewotCQkJCQkJCQkJc2l6ZSA9IGNvbmZpZ3MubGVuZ3RoOwotCQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJCQkJCQkJY29uZmlnc1tpXS5kZWxldGUodHJ1ZSwgdHJ1ZSwgbW9uaXRvcik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3Igd2hpbGUgZGVsZXRpbmcgcmVzb3VyY2VzIiwgZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCAwLCBlLmdldE1lc3NhZ2UoKSwgZSk7IAotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQkJCi0JCQkJCS8vIHNldCBydWxlIGZvciB3b3Jrc3BhY2UgYW5kIHNlcnZlcnMKLQkJCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKLQkJCQkJSVNjaGVkdWxpbmdSdWxlW10gcnVsZXMgPSBuZXcgSVNjaGVkdWxpbmdSdWxlW3NpemUrMV07Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCQkJcnVsZXNbaV0gPSBzZXJ2ZXJzW2ldOwotCQkJCQlJUmVzb3VyY2VSdWxlRmFjdG9yeSBydWxlRmFjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpOwotCQkJCQlydWxlc1tzaXplXSA9IHJ1bGVGYWN0b3J5LmNyZWF0ZVJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCQkJCWpvYi5zZXRSdWxlKE11bHRpUnVsZS5jb21iaW5lKHJ1bGVzKSk7Ci0JCQkJCWpvYi5zZXRQcmlvcml0eShKb2IuQlVJTEQpOwotCQkJCQkKLQkJCQkJam9iLnNjaGVkdWxlKCk7Ci0JCQkJfQotCQkJfTsKLQkJCXQuc2V0RGFlbW9uKHRydWUpOwotCQkJdC5zdGFydCgpOwotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgc2VydmVycycgJiBjb25maWdzJyBsaXN0cy4gSWYgPGNvZGU+ZGVsZXRlUnVubmluZzwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiAJYW5kIGEgc2VydmVyIGNhbid0IGJlIHN0b3BwZWQsIGl0IGlzbid0IHJlbW92ZWQuCi0JICogQHBhcmFtIGRlbGV0ZVJ1bm5pbmcgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gcnVubmluZyBzZXJ2ZXJzIHdpbGwgYmUgc3RvcHBlZAotCSAqIAliZWZvcmUgYmVpbmcgZGVsZXRlZCwgaWYgPGNvZGU+ZmFsc2U8L2NvZGU+IHJ1bm5pbmcgc2VydmVycyB3aWxsIGJlIHJlbW92ZWQKLQkgKiAgICBmcm9tIGRlbGV0aW9uIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZUZvckRlbGV0aW9uKGJvb2xlYW4gZGVsZXRlUnVubmluZywgYm9vbGVhbiBzdG9wUnVubmluZykgewotCQkvLyBjb252ZXJ0cyBzZXJ2ZXJzICYgY29uZmlncyB0byBsaXN0IHRvIGZhY2lsaXRhdGUgcmVtb3ZhbAotCQlMaXN0PElTZXJ2ZXI+IHNlcnZlcnNMaXN0ID0gbmV3IExpbmtlZExpc3Q8SVNlcnZlcj4oQXJyYXlzLmFzTGlzdChzZXJ2ZXJzKSk7Ci0JCUxpc3Q8SUZvbGRlcj4gY29uZmlnc0xpc3QgPSBuZXcgTGlua2VkTGlzdDxJRm9sZGVyPihBcnJheXMuYXNMaXN0KGNvbmZpZ3MpKTsKLQkJaWYgKCFkZWxldGVSdW5uaW5nKSB7Ci0JCQkvLyBkb24ndCBkZWxldGUgc2VydmVycyBvciBjb25maWd1cmF0aW9ucwotCQkJaW50IHNpemUgPSBydW5uaW5nU2VydmVyc0xpc3Quc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJU2VydmVyIHNlcnZlciA9IHJ1bm5pbmdTZXJ2ZXJzTGlzdC5nZXQoaSk7Ci0JCQkJc2VydmVyc0xpc3QucmVtb3ZlKHNlcnZlcik7Ci0JCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkgIT0gbnVsbCkKLQkJCQkJY29uZmlnc0xpc3QucmVtb3ZlKHNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHN0b3BSdW5uaW5nKSB7Ci0JCQkJLy8gc3RvcCBydW5uaW5nIHNlcnZlcnMgYW5kIHdhaXQgZm9yIHRoZW0gKHN0b3AgaXMgYXN5bmNocm9ub3VzKQotCQkJCUlTZXJ2ZXIgczsKLQkJCQlNdWx0aVNlcnZlclN0b3BMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNdWx0aVNlcnZlclN0b3BMaXN0ZW5lcigpOwotCQkJCWludCBleHBlY3RlZCA9IDA7Ci0JCQkJSXRlcmF0b3IgaXRlciA9IHJ1bm5pbmdTZXJ2ZXJzTGlzdC5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlzID0gKElTZXJ2ZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAocy5jYW5TdG9wKCkuaXNPSygpKSB7Ci0JCQkJCQkrK2V4cGVjdGVkOwotCQkJCQkJcy5zdG9wKGZhbHNlLCBsaXN0ZW5lcik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBzZXJ2ZXIgY2FuJ3QgYmUgc3RvcHBlZCwgZG9uJ3QgZGVsZXRlIGl0Ci0JCQkJCQlzZXJ2ZXJzTGlzdC5yZW1vdmUocyk7Ci0JCQkJCQljb25maWdzTGlzdC5yZW1vdmUocy5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCXdoaWxlIChleHBlY3RlZCAhPSBsaXN0ZW5lci5nZXROdW1iZXJTdG9wcGVkKCkpIHsKLQkJCQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJJbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIGZvciBzZXJ2ZXJzIHN0b3AiKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlzZXJ2ZXJzID0gbmV3IElTZXJ2ZXJbc2VydmVyc0xpc3Quc2l6ZSgpXTsKLQkJc2VydmVyc0xpc3QudG9BcnJheShzZXJ2ZXJzKTsKLQkJY29uZmlncyA9IG5ldyBJRm9sZGVyW2NvbmZpZ3NMaXN0LnNpemUoKV07Ci0JCWNvbmZpZ3NMaXN0LnRvQXJyYXkoY29uZmlncyk7Ci0JfQotCi0JLyoqCi0JICogQ2xhc3MgdXNlZCB0byB3YWl0IGFsbCBzZXJ2ZXJzIHN0b3AuIFVzZSBvbmUgaW5zdGFuY2UKLQkgKiBmb3IgYSBncm91cCBvZiBzZXJ2ZXJzIGFuZCBsb29wIHRvIHNlZSBpZiB0aGUgbnVtYmVyIHN0b3BwZWQKLQkgKiBlcXVhbHMgdGhlIG51bWJlciBvZiBzZXJ2ZXJzIHdhaXRpbmcgdG8gc3RvcC4KLQkgKi8KLQljbGFzcyBNdWx0aVNlcnZlclN0b3BMaXN0ZW5lciBpbXBsZW1lbnRzIElPcGVyYXRpb25MaXN0ZW5lciB7Ci0JCXByb3RlY3RlZCBpbnQgbnVtOyAKLQotCQlwdWJsaWMgdm9pZCBkb25lKElTdGF0dXMgcmVzdWx0KSB7Ci0JCQludW0rKzsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TnVtYmVyU3RvcHBlZCgpIHsKLQkJCXJldHVybiBudW07Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRWNsaXBzZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0VjbGlwc2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMzI4YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRWNsaXBzZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOwotLyoqCi0gKiBFY2xpcHNlIHV0aWxpdHkgbWV0aG9kcy4KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VVdGlsIHsKLQkvKioKLQkgKiBFY2xpcHNlVXRpbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgRWNsaXBzZVV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2VydmVyIHByb2plY3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gSWYgcGF0aCBpcwotCSAqIG51bGwsIGl0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZGVmYXVsdCBsb2NhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGF0aCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlLklQYXRoCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTZXJ2ZXJQcm9qZWN0KFN0cmluZyBuYW1lLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy9tb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCS8vbW9uaXRvci5iZWdpblRhc2soU2VydmVyUGx1Z2luLmdldFJlc291cmNlKCIlY3JlYXRlU2VydmVyUHJvamVjdFRhc2siKSwgMzAwMCk7Ci0JCQotCQl0cnkgewotCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KG5hbWUpOwotCQkJCi0JCQkvLyBnZXQgYSBwcm9qZWN0IGRlc2NyaXB0b3IKLQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSB3b3Jrc3BhY2UubmV3UHJvamVjdERlc2NyaXB0aW9uKG5hbWUpOwotCQkJZGVzY3JpcHRpb24uc2V0TG9jYXRpb24ocGF0aCk7Ci0JCQkKLQkJCXByb2plY3QuY3JlYXRlKGRlc2NyaXB0aW9uLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDAwKSk7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlwcm9qZWN0Lm9wZW4oUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwMCkpOwotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybiBudWxsOwotCQkJCi0JCQkvLyBhZGQgdGhlIHNlcnZlciBwcm9qZWN0IG5hdHVyZQotCQkJU2VydmVyUGx1Z2luLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLnNldFNlcnZlclByb2plY3QodHJ1ZSwgbW9uaXRvcik7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBzZXJ2ZXIgcHJvamVjdCBuYW1lZCAiICsgbmFtZSwgY2UpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90Q3JlYXRlU2VydmVyUHJvamVjdFN0YXR1cywgY2UuZ2V0TWVzc2FnZSgpKSwgY2UpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIHNlcnZlciBwcm9qZWN0ICgyKSBuYW1lZCAiICsgbmFtZSwgZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yQ291bGROb3RDcmVhdGVTZXJ2ZXJQcm9qZWN0LCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzZXJ2ZXIgcHJvamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lLiBJZiBwYXRoIGlzCi0JICogbnVsbCwgaXQgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBkZWZhdWx0IGxvY2F0aW9uLgotCSAqCi0JICogQHBhcmFtIHNoZWxsIGEgc2hlbGwKLQkgKiBAcGFyYW0gbmFtZSBhIG5hbWUKLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlTmV3U2VydmVyUHJvamVjdChmaW5hbCBTaGVsbCBzaGVsbCwgU3RyaW5nIG5hbWUsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmaW5hbCBJU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZVNlcnZlclByb2plY3QobmFtZSwgcGF0aCwgbW9uaXRvcik7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCVNoZWxsIHNoZWxsMiA9IHNoZWxsOwotCQkJCQlpZiAoc2hlbGwgPT0gbnVsbCkKLQkJCQkJCXNoZWxsMiA9IGdldFNoZWxsKCk7Ci0JCQkJCW9wZW5FcnJvcihzaGVsbDIsIE1lc3NhZ2VzLmVycm9yQ291bGROb3RDcmVhdGVTZXJ2ZXJQcm9qZWN0LCBzdGF0dXMpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZm9yIGEgcHJvamVjdC4KLQkgKgotCSAqIEBwYXJhbSBwcm9qZWN0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRQcm9qZWN0SW1hZ2VEZXNjcmlwdG9yKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQotCQlJV29ya2JlbmNoQWRhcHRlciBhZGFwdGVyID0gKElXb3JrYmVuY2hBZGFwdGVyKSBwcm9qZWN0LmdldEFkYXB0ZXIoSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MpOwotCQotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yKHByb2plY3QpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2hlbGwgZm9yIHRoZSB3b3JrYmVuY2guCi0JICoKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsCi0JICovCi0JcHVibGljIHN0YXRpYyBTaGVsbCBnZXRTaGVsbCgpIHsKLQkJcmV0dXJuIGdldFN0YW5kYXJkRGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpc3BsYXkgdG8gYmUgdXNlZC4gVGhlIG1ldGhvZCBmaXJzdCBjaGVja3MsIGlmCi0JICogdGhlIHRocmVhZCBjYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyBhbiBhc3NvY2lhdGVkIGRpc3BsYXkuIElmIHNvLCB0aGlzCi0JICogZGlzcGxheSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgZGVmYXVsdCBkaXNwbGF5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRpc3BsYXkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpc3BsYXkgZ2V0U3RhbmRhcmREaXNwbGF5KCkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkKLQkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQotCQlyZXR1cm4gZGlzcGxheTsJCQotCX0JCi0JCi0JLyoqCi0JICogT3BlbiBhIGRpYWxvZyB3aW5kb3cuCi0JICoKLQkgKiBAcGFyYW0gbWVzc2FnZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5FcnJvcihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYSBkaWFsb2cgd2luZG93LgotCSAqCi0JICogQHBhcmFtIG1lc3NhZ2UgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBzdGF0dXMgSVN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuRXJyb3IoZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhIGRpYWxvZyB3aW5kb3cuCi0JICoKLQkgKiBAcGFyYW0gc2hlbGwgdGhlIHNoZWxsCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkVycm9yKFNoZWxsIHNoZWxsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgbWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhIGRpYWxvZyB3aW5kb3cuCi0JICoKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAotCSAqIEBwYXJhbSBtZXNzYWdlIGEgbWVzc2FnZQotCSAqIEBwYXJhbSBzdGF0dXMgYSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkVycm9yKFNoZWxsIHNoZWxsLCBTdHJpbmcgbWVzc2FnZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBNZXNzYWdlcy5lcnJvckRpYWxvZ1RpdGxlLCBtZXNzYWdlLCBzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIERvIGEgdmFsaWRhdGVFZGl0KCkgb24gdGhlIGdpdmVuIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcmV0dXJuIHRydWUgaWYgdmFsaWRhdGUgZWRpdCB3b3JrZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVFZGl0KFNoZWxsIHNoZWxsLCBJU2VydmVyIHNlcnZlcikgewotCQlJU3RhdHVzIHN0YXR1cyA9IFNlcnZlclV0aWwudmFsaWRhdGVFZGl0KHNoZWxsLCBzZXJ2ZXIpOwotCQlyZXR1cm4gdmFsaWRhdGVFZGl0KHNoZWxsLCBzdGF0dXMpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUVkaXQoU2hlbGwgc2hlbGwsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkvLyBpbmZvcm0gdXNlcgotCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlcy5lZGl0b3JWYWxpZGF0ZUVkaXRGYWlsdXJlTWVzc2FnZTsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzKTsKLQotCQkJLy8gZG8gbm90IGV4ZWN1dGUgY29tbWFuZAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9HZW5lcmFsVG9vbFRpcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvR2VuZXJhbFRvb2xUaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY4N2I0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9HZW5lcmFsVG9vbFRpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLklTZXJ2ZXJUb29sVGlwOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJhbFRvb2xUaXAgaW1wbGVtZW50cyBJU2VydmVyVG9vbFRpcCB7Ci0JcHVibGljIEdlbmVyYWxUb29sVGlwKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udGVudChDb21wb3NpdGUgcGFyZW50LCBJU2VydmVyIHNlcnZlcikgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsU1dULk5PTkUpOwotCQl0ZXh0LnNldEJhY2tncm91bmQocGFyZW50LmdldEJhY2tncm91bmQoKSk7Ci0JCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlTdHJpbmcgcyA9ICIiOwotCQlpZiAoc2VydmVyLmdldFJ1bnRpbWUoKSAhPSBudWxsKQotCQkJcyArPSBzZXJ2ZXIuZ2V0UnVudGltZSgpLmdldE5hbWUoKSArICIgLSAiOwotCQlzICs9IE5MUy5iaW5kKE1lc3NhZ2VzLm1vZHVsZXMsIHNlcnZlci5nZXRNb2R1bGVzKCkubGVuZ3RoICsgIiIpOwotCQl0ZXh0LnNldFRleHQocyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0ltYWdlUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0ltYWdlUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwNjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9JbWFnZVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25EZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGhhbmRsZSBpbWFnZSByZXNvdXJjZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbWFnZVJlc291cmNlIHsKLQkvLyB0aGUgaW1hZ2UgcmVnaXN0cnkKLQlwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnk7Ci0KLQkvLyBtYXAgb2YgaW1hZ2UgZGVzY3JpcHRvcnMgc2luY2UgdGhlc2UKLQkvLyB3aWxsIGJlIGxvc3QgYnkgdGhlIGltYWdlIHJlZ2lzdHJ5Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yPiBpbWFnZURlc2NyaXB0b3JzOwotCi0JLy8gYmFzZSB1cmxzIGZvciBpbWFnZXMKLQlwcml2YXRlIHN0YXRpYyBVUkwgSUNPTl9CQVNFX1VSTDsKLQotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcGF0aFN1ZmZpeCA9ICJpY29ucy8iOwotCQkJSUNPTl9CQVNFX1VSTCA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkocGF0aFN1ZmZpeCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZihUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IHNldCBpY29uIGJhc2UgVVJMIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0NMQ0wgPSAiY2xjbDE2LyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9DVE9PTCA9ICJjdG9vbDE2LyI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTENMID0gImVsY2wxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRVRPT0wgPSAiZXRvb2wxNi8iOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRExDTCA9ICJkbGNsMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0RUT09MID0gImR0b29sMTYvIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfT0JKID0gIm9iajE2LyI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9PVlIgPSAib3ZyMTYvIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfV0laQkFOID0gIndpemJhbi8iOwotCi0JLy8gLS0tIGNvbnN0YW50cyBmb3IgaW1hZ2VzIC0tLQotCi0JLy8gU2VydmVyIFN0YXRlIEltYWdlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DTENMX1NUQVJUID0gIklNR19DTENMX1NUQVJUIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xDTF9TVEFSVF9ERUJVRyA9ICJJTUdfQ0xDTF9TVEFSVF9ERUJVRyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMQ0xfU1RBUlRfUFJPRklMRSA9ICJJTUdfQ0xDTF9TVEFSVF9QUk9GSUxFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xDTF9TVE9QID0gIklNR19DTENMX1NUT1AiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DTENMX1BVQkxJU0ggPSAiSU1HX0NMQ0xfUFVCTElTSCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMQ0xfRElTQ09OTkVDVCA9ICJJTUdfQ0xDTF9ESVNDT05ORUNUIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX1NUQVJUID0gIklNR19FTENMX1NUQVJUIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9TVEFSVF9ERUJVRyA9ICJJTUdfRUxDTF9TVEFSVF9ERUJVRyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfU1RBUlRfUFJPRklMRSA9ICJJTUdfRUxDTF9TVEFSVF9QUk9GSUxFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9TVE9QID0gIklNR19FTENMX1NUT1AiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX1BVQkxJU0ggPSAiSU1HX0VMQ0xfUFVCTElTSCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfRElTQ09OTkVDVCA9ICJJTUdfRUxDTF9ESVNDT05ORUNUIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX1NUQVJUID0gIklNR19ETENMX1NUQVJUIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9TVEFSVF9ERUJVRyA9ICJJTUdfRExDTF9TVEFSVF9ERUJVRyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfU1RBUlRfUFJPRklMRSA9ICJJTUdfRExDTF9TVEFSVF9QUk9GSUxFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9TVE9QID0gIklNR19ETENMX1NUT1AiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX1BVQkxJU0ggPSAiSU1HX0RMQ0xfUFVCTElTSCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfRElTQ09OTkVDVCA9ICJJTUdfRExDTF9ESVNDT05ORUNUIjsKLQotCS8vIFdpemFyZCBCYW5uZXIgSW1hZ2VzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWkJBTl9ORVdfUlVOVElNRSA9ICJuZXdTZXJ2ZXJXaXoiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XSVpCQU5fTkVXX1NFUlZFUiA9ICJuZXdTZXJ2ZXJXaXoiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XSVpCQU5fU0VMRUNUX1NFUlZFUl9DTElFTlQgPSAid2l6Q2xpZW50IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laQkFOX1NFTEVDVF9TRVJWRVIgPSAic2VsZWN0U2VydmVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laQkFOX0lNUE9SVF9TRVJWRVJfQ09ORklHVVJBVElPTiA9ICJpbXBvcnRDb25maWdXaXoiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEID0gInN0YXRlU3RhcnRlZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEX0RFQlVHID0gInN0YXRlU3RhcnRlZERlYnVnIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfUFJPRklMRSA9ICJzdGF0ZVN0YXJ0ZWRQcm9maWxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUT1BQRUQgPSAic3RhdGVTdG9wcGVkIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU1RBVEVfU1RBUlRFRCA9ICJzdGF0ZVN0YXJ0ZWQyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU1RBVEVfU1RPUFBFRCA9ICJzdGF0ZVN0b3BwZWQyIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzEgPSAic3RhdGVTdGFydGluZzEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMiA9ICJzdGF0ZVN0YXJ0aW5nMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18zID0gInN0YXRlU3RhcnRpbmczIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzEgPSAic3RhdGVTdG9wcGluZzEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMiA9ICJzdGF0ZVN0b3BwaW5nMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18zID0gInN0YXRlU3RvcHBpbmczIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfT1ZFUkxBWSA9ICJzdGF0ZVN0YXJ0ZWRPdmVybGF5IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfREVCVUdfT1ZFUkxBWSA9ICJzdGF0ZVN0YXJ0ZWREZWJ1Z092ZXJsYXkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfU1RBVEVfU1RBUlRFRF9QUk9GSUxFX09WRVJMQVkgPSAic3RhdGVTdGFydGVkUHJvZmlsZU92ZXJsYXkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfU1RBVEVfU1RPUFBFRF9PVkVSTEFZID0gInN0YXRlU3RvcHBlZE92ZXJsYXkiOwkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzFfT1ZFUkxBWSA9ICJzdGF0ZVN0YXJ0aW5nT3ZlcmxheTEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMl9PVkVSTEFZID0gInN0YXRlU3RhcnRpbmdPdmVybGF5MiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18zX09WRVJMQVkgPSAic3RhdGVTdGFydGluZ092ZXJsYXkzIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzFfT1ZFUkxBWSA9ICJzdGF0ZVN0b3BwaW5nT3ZlcmxheTEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMl9PVkVSTEFZID0gInN0YXRlU3RvcHBpbmdPdmVybGF5MiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18zX09WRVJMQVkgPSAic3RhdGVTdG9wcGluZ092ZXJsYXkzIjsKLQotCQotCS8vIFNlcnZlciBDbGllbnQgSW1hZ2VzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NUT09MX1JVTl9PTl9TRVJWRVIgPSAiSU1HX0NUT09MX0NMSUVOVCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NUT09MX0RFQlVHX09OX1NFUlZFUiA9ICJJTUdfQ1RPT0xfQ0xJRU5UMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NUT09MX1BST0ZJTEVfT05fU0VSVkVSID0gIklNR19DVE9PTF9DTElFTlQzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ1RPT0xfTkVXX1NFUlZFUiA9ICJJTUdfQ1RPT0xfTkVXX1NFUlZFUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NUT09MX05FV19TRVJWRVJfSU5TVEFOQ0UgPSAiSU1HX0NUT09MX05FV19TRVJWRVJfSU5TVEFOQ0UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DVE9PTF9NT0RJRllfTU9EVUxFUyA9ICJJTUdfQ1RPT0xfTU9ESUZZX01PRFVMRVMiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX1JVTl9PTl9TRVJWRVIgPSAiSU1HX0VUT09MX0NMSUVOVCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0RFQlVHX09OX1NFUlZFUiA9ICJJTUdfRVRPT0xfQ0xJRU5UMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX1BST0ZJTEVfT05fU0VSVkVSID0gIklNR19FVE9PTF9DTElFTlQzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfTU9ESUZZX01PRFVMRVMgPSAiSU1HX0VUT09MX01PRElGWV9NT0RVTEVTIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfUkVTRVRfREVGQVVMVCA9ICJJTUdfRVRPT0xfUkVTRVRfREVGQVVMVCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfUlVOX09OX1NFUlZFUiA9ICJJTUdfRFRPT0xfQ0xJRU5UIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfREVCVUdfT05fU0VSVkVSID0gIklNR19EVE9PTF9DTElFTlQyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfUFJPRklMRV9PTl9TRVJWRVIgPSAiSU1HX0RUT09MX0NMSUVOVDMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9NT0RJRllfTU9EVUxFUyA9ICJJTUdfRFRPT0xfTU9ESUZZX01PRFVMRVMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9SRVNFVF9ERUZBVUxUID0gIklNR19EVE9PTF9SRVNFVF9ERUZBVUxUIjsKLQotCS8vIEdlbmVyYWwgT2JqZWN0IEltYWdlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVIgPSAic2VydmVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX0NPTkZJR1VSQVRJT05fTk9ORSA9ICJub0NvbmZpZ3VyYXRpb24iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfQ09ORklHVVJBVElPTl9NSVNTSU5HID0gImNvbmZpZ3VyYXRpb25NaXNzaW5nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFJPSkVDVF9NSVNTSU5HID0gInByb2plY3RNaXNzaW5nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUkVQQUlSX0NPTkZJR1VSQVRJT04gPSAicmVwYWlyQ29uZmlndXJhdGlvbiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFVCTElTSF9FTkFCTEVEID0gInB1Ymxpc2hFbmFibGVkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFVCTElTSF9ESVNBQkxFRCA9ICJwdWJsaXNoRGlzYWJsZWQiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19NT05JVE9SX09OID0gIm1vbml0b3JPbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX01PTklUT1JfT0ZGID0gIm1vbml0b3JPZmYiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUZBVUxUX1NFUlZFUl9PVkVSTEFZID0gImRlZmF1bHRTZXJ2ZXJPdmVybGF5IjsKLQkKLQkvLyBBdWRpbyBpbWFnZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQVVESU9fU09VTkQgPSAic291bmQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19BVURJT19DQVRFR09SWSA9ICJjYXRlZ29yeSI7Ci0KLQkvKioKLQkgKiBDYW5ub3QgY29uc3RydWN0IGFuIEltYWdlUmVzb3VyY2UuIFVzZSBzdGF0aWMgbWV0aG9kcyBvbmx5LgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZXNvdXJjZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQkvKioKLQkgKiBEaXNwb3NlIG9mIGVsZW1lbnQgaW1hZ2VzIHRoYXQgd2VyZSBjcmVhdGVkLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbWFnZSB3aXRoIHRoZSBnaXZlbiBrZXkuCi0JICoKLQkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlpZiAoaW1hZ2VSZWdpc3RyeSA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZUltYWdlUmVnaXN0cnkoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChrZXkpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2VSZWdpc3RyeS5wdXQoa2V5LCBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKTsKLQkJCWltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHdpdGggdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJaWYgKGltYWdlUmVnaXN0cnkgPT0gbnVsbCkKLQkJCWluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KCk7Ci0JCUltYWdlRGVzY3JpcHRvciBpZCA9IGltYWdlRGVzY3JpcHRvcnMuZ2V0KGtleSk7Ci0JCWlmIChpZCAhPSBudWxsKQotCQkJcmV0dXJuIGlkOwotCQkKLQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgaW1hZ2UgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0aWFsaXplSW1hZ2VSZWdpc3RyeSgpIHsKLQkJaW1hZ2VSZWdpc3RyeSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KCk7Ci0JCWltYWdlRGVzY3JpcHRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEltYWdlRGVzY3JpcHRvcj4oKTsKLQotCQkvLyB3aXphcmQgYmFubmVycwotCQlyZWdpc3RlckltYWdlKElNR19XSVpCQU5fTkVXX1NFUlZFUiwgVVJMX1dJWkJBTiArICJuZXdfc2VydmVyX3dpei5wbmciKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfV0laQkFOX0lNUE9SVF9TRVJWRVJfQ09ORklHVVJBVElPTiwgVVJMX1dJWkJBTiArICJpbXBvcnRfY29uZmlndXJhdGlvbl93aXoucG5nIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1dJWkJBTl9TRUxFQ1RfU0VSVkVSX0NMSUVOVCwgVVJMX1dJWkJBTiArICJzZWxlY3RfY2xpZW50X3dpei5wbmciKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfV0laQkFOX1NFTEVDVF9TRVJWRVIsIFVSTF9XSVpCQU4gKyAic2VsZWN0X3NlcnZlcl93aXoucG5nIik7Ci0KLQkJLy8gY2xpZW50IGltYWdlcwotCQlyZWdpc3RlckltYWdlKElNR19FVE9PTF9SVU5fT05fU0VSVkVSLCBVUkxfRVRPT0wgKyAicnVuX29uX3NlcnZlci5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRVRPT0xfREVCVUdfT05fU0VSVkVSLCBVUkxfRVRPT0wgKyAiZGVidWdfb25fc2VydmVyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19FVE9PTF9QUk9GSUxFX09OX1NFUlZFUiwgVVJMX0VUT09MICsgInByb2ZpbGVfb25fc2VydmVyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19FVE9PTF9NT0RJRllfTU9EVUxFUywgVVJMX0VUT09MICsgIndpel9tb2RpZnlfbW9kdWxlcy5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRVRPT0xfUkVTRVRfREVGQVVMVCwgVVJMX0VUT09MICsgImNsZWFyLmdpZiIpOwotCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NUT09MX1JVTl9PTl9TRVJWRVIsIFVSTF9DVE9PTCArICJydW5fb25fc2VydmVyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19DVE9PTF9ERUJVR19PTl9TRVJWRVIsIFVSTF9DVE9PTCArICJkZWJ1Z19vbl9zZXJ2ZXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NUT09MX1BST0ZJTEVfT05fU0VSVkVSLCBVUkxfQ1RPT0wgKyAicHJvZmlsZV9vbl9zZXJ2ZXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NUT09MX05FV19TRVJWRVIsIFVSTF9DVE9PTCArICJ3aXpfbmV3X3NlcnZlci5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ1RPT0xfTkVXX1NFUlZFUl9JTlNUQU5DRSwgVVJMX0NUT09MICsgIndpel9uZXdfaW5zdGFuY2UuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NUT09MX01PRElGWV9NT0RVTEVTLCBVUkxfQ1RPT0wgKyAid2l6X21vZGlmeV9tb2R1bGVzLmdpZiIpOwotCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX0RUT09MX1JVTl9PTl9TRVJWRVIsIFVSTF9EVE9PTCArICJydW5fb25fc2VydmVyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19EVE9PTF9ERUJVR19PTl9TRVJWRVIsIFVSTF9EVE9PTCArICJkZWJ1Z19vbl9zZXJ2ZXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0RUT09MX1BST0ZJTEVfT05fU0VSVkVSLCBVUkxfRFRPT0wgKyAicHJvZmlsZV9vbl9zZXJ2ZXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0RUT09MX01PRElGWV9NT0RVTEVTLCBVUkxfRFRPT0wgKyAid2l6X21vZGlmeV9tb2R1bGVzLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19EVE9PTF9SRVNFVF9ERUZBVUxULCBVUkxfRFRPT0wgKyAiY2xlYXIuZ2lmIik7Ci0JCi0JCS8vIGxvYWQgc2VydmVyIHN0YXRlIGltYWdlcyBubyBvdmVybGF5LCBzdGlsbCB1c2VkIGluIHRoZSBSdW4gT24gU2VydmVyCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVELCBVUkxfT0JKICsgInNlcnZlcl9zdGFydGVkLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVJfU1RBVEVfU1RBUlRFRF9ERUJVRywgVVJMX09CSiArICJzZXJ2ZXJfc3RhcnRlZF9kZWJ1Zy5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfUFJPRklMRSwgVVJMX09CSiArICJzZXJ2ZXJfc3RhcnRlZF9wcm9maWxlLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVJfU1RBVEVfU1RPUFBFRCwgVVJMX09CSiArICJzZXJ2ZXJfc3RvcHBlZC5naWYiKTsKLQkJCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NUQVRFX1NUQVJURUQsIFVSTF9PQkogKyAic3RhdGVfc3RhcnRlZC5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfU1RBVEVfU1RPUFBFRCwgVVJMX09CSiArICJzdGF0ZV9zdG9wcGVkLmdpZiIpOwotCQkKLQkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzEsIFVSTF9PQkogKyAic2VydmVyX3N0YXJ0aW5nMS5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzIsIFVSTF9PQkogKyAic2VydmVyX3N0YXJ0aW5nMi5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzMsIFVSTF9PQkogKyAic2VydmVyX3N0YXJ0aW5nMy5naWYiKTsKLQkJCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18xLCBVUkxfT0JKICsgInNlcnZlcl9zdG9wcGluZzEuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18yLCBVUkxfT0JKICsgInNlcnZlcl9zdG9wcGluZzIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18zLCBVUkxfT0JKICsgInNlcnZlcl9zdG9wcGluZzMuZ2lmIik7Ci0JCi0JCS8vIGxvYWQgc2VydmVyIHN0YXRlIGltYWdlcyBvdmVybGF5Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEX09WRVJMQVksIFVSTF9PVlIgKyAic2VydmVyX3N0YXJ0ZWRfb3ZyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVJfU1RBVEVfU1RBUlRFRF9ERUJVR19PVkVSTEFZLCBVUkxfT1ZSICsgInNlcnZlcl9zdGFydGVkX2RlYnVnX292ci5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfUFJPRklMRV9PVkVSTEFZLCBVUkxfT1ZSICsgInNlcnZlcl9zdGFydGVkX3Byb2ZpbGVfb3ZyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVJfU1RBVEVfU1RPUFBFRF9PVkVSTEFZLCBVUkxfT1ZSICsgInNlcnZlcl9zdG9wcGVkX292ci5naWYiKTsKLQkJCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18xX09WRVJMQVksIFVSTF9PVlIgKyAic2VydmVyX3N0YXJ0aW5nMV9vdnIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18yX09WRVJMQVksIFVSTF9PVlIgKyAic2VydmVyX3N0YXJ0aW5nMl9vdnIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18zX09WRVJMQVksIFVSTF9PVlIgKyAic2VydmVyX3N0YXJ0aW5nM19vdnIuZ2lmIik7Ci0JCQotCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMV9PVkVSTEFZLCBVUkxfT1ZSICsgInNlcnZlcl9zdG9wcGluZzFfb3ZyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMl9PVkVSTEFZLCBVUkxfT1ZSICsgInNlcnZlcl9zdG9wcGluZzJfb3ZyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfM19PVkVSTEFZLCBVUkxfT1ZSICsgInNlcnZlcl9zdG9wcGluZzNfb3ZyLmdpZiIpOwotCi0JCS8vIGxvYWQgYWN0aW9uIGltYWdlcwotCQlyZWdpc3RlckltYWdlKElNR19FTENMX1BVQkxJU0gsIFVSTF9FTENMICsgImxhdW5jaF9wdWJsaXNoLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19FTENMX1NUQVJULCBVUkxfRUxDTCArICJsYXVuY2hfcnVuLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19FTENMX1NUQVJUX0RFQlVHLCBVUkxfRUxDTCArICJsYXVuY2hfZGVidWcuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0VMQ0xfU1RBUlRfUFJPRklMRSwgVVJMX0VMQ0wgKyAibGF1bmNoX3Byb2ZpbGUuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0VMQ0xfU1RPUCwgVVJMX0VMQ0wgKyAibGF1bmNoX3N0b3AuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0VMQ0xfRElTQ09OTkVDVCwgVVJMX0VMQ0wgKyAibGF1bmNoX2Rpc2Nvbm5lY3QuZ2lmIik7Ci0JCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NMQ0xfUFVCTElTSCwgVVJMX0NMQ0wgKyAibGF1bmNoX3B1Ymxpc2guZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NMQ0xfU1RBUlQsIFVSTF9DTENMICsgImxhdW5jaF9ydW4uZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NMQ0xfU1RBUlRfREVCVUcsIFVSTF9DTENMICsgImxhdW5jaF9kZWJ1Zy5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ0xDTF9TVEFSVF9QUk9GSUxFLCBVUkxfQ0xDTCArICJsYXVuY2hfcHJvZmlsZS5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ0xDTF9TVE9QLCBVUkxfQ0xDTCArICJsYXVuY2hfc3RvcC5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ0xDTF9ESVNDT05ORUNULCBVUkxfQ0xDTCArICJsYXVuY2hfZGlzY29ubmVjdC5naWYiKTsKLQkKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRExDTF9QVUJMSVNILCBVUkxfRExDTCArICJsYXVuY2hfcHVibGlzaC5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRExDTF9TVEFSVCwgVVJMX0RMQ0wgKyAibGF1bmNoX3J1bi5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRExDTF9TVEFSVF9ERUJVRywgVVJMX0RMQ0wgKyAibGF1bmNoX2RlYnVnLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19ETENMX1NUQVJUX1BST0ZJTEUsIFVSTF9ETENMICsgImxhdW5jaF9wcm9maWxlLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19ETENMX1NUT1AsIFVSTF9ETENMICsgImxhdW5jaF9zdG9wLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19ETENMX0RJU0NPTk5FQ1QsIFVSTF9ETENMICsgImxhdW5jaF9kaXNjb25uZWN0LmdpZiIpOwotCQotCQkvLyBsb2FkIGdlbmVyYWwgb2JqZWN0IGltYWdlcwotCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVIsIFVSTF9PQkogKyAic2VydmVyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVJfQ09ORklHVVJBVElPTl9OT05FLCBVUkxfT0JKICsgImNvbmZpZ3VyYXRpb25fbm9uZS5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX0NPTkZJR1VSQVRJT05fTUlTU0lORywgVVJMX09CSiArICJjb25maWd1cmF0aW9uX21pc3NpbmcuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1BST0pFQ1RfTUlTU0lORywgVVJMX09CSiArICJwcm9qZWN0X21pc3NpbmcuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1JFUEFJUl9DT05GSUdVUkFUSU9OLCBVUkxfT0JKICsgInJlcGFpcl9jb25maWcuZ2lmIik7Ci0JCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX1BVQkxJU0hfRU5BQkxFRCwgVVJMX09CSiArICJwdWJsaXNoX2VuYWJsZWQuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1BVQkxJU0hfRElTQUJMRUQsIFVSTF9PQkogKyAicHVibGlzaF9kaXNhYmxlZC5naWYiKTsKLQkJCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX01PTklUT1JfT04sIFVSTF9PQkogKyAibW9uaXRvck9uLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19NT05JVE9SX09GRiwgVVJMX09CSiArICJtb25pdG9yT2ZmLmdpZiIpOwotCQkKLQkJcmVnaXN0ZXJJbWFnZShJTUdfREVGQVVMVF9TRVJWRVJfT1ZFUkxBWSwgVVJMX09WUiArICJkZWZhdWx0X3NlcnZlcl9vdnIuZ2lmIik7Ci0JCQotCQkvLyBhdWRpbyBpbWFnZXMKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQVVESU9fU09VTkQsIFVSTF9PQkogKyAiYXVkaW9fc291bmQuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0FVRElPX0NBVEVHT1JZLCBVUkxfT0JKICsgImF1ZGlvX2NhdGVnb3J5LmdpZiIpOwotCQkKLQkJbG9hZFNlcnZlckltYWdlcygpOwotCQkKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5yZWdpc3Rlckljb25Gb3JGYW1pbHkoCi0JCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19TRVJWRVIpLCBTZXJ2ZXJVdGlsLlNFUlZFUl9KT0JfRkFNSUxZKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlciBhbiBpbWFnZSB3aXRoIHRoZSByZWdpc3RyeS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwYXJ0aWFsVVJMIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlZ2lzdGVySW1hZ2UoU3RyaW5nIGtleSwgU3RyaW5nIHBhcnRpYWxVUkwpIHsKLQkJdHJ5IHsKLQkJCUltYWdlRGVzY3JpcHRvciBpZCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG5ldyBVUkwoSUNPTl9CQVNFX1VSTCwgcGFydGlhbFVSTCkpOwotCQkJaW1hZ2VSZWdpc3RyeS5wdXQoa2V5LCBpZCk7Ci0JCQlpbWFnZURlc2NyaXB0b3JzLnB1dChrZXksIGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgcmVnaXN0ZXJpbmcgaW1hZ2UgIiArIGtleSArICIgZnJvbSAiICsgcGFydGlhbFVSTCwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBzZXJ2ZXIgaW1hZ2VzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZFNlcnZlckltYWdlcygpIHsKLQkJaWYgKFRyYWNlLkNPTkZJRykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0NPTkZJRywgIi0+LSBMb2FkaW5nIC5zZXJ2ZXJJbWFnZXMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQl9Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCWxvYWRTZXJ2ZXJJbWFnZXMocmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgU2VydmVyVUlQbHVnaW4uRVhURU5TSU9OX1NFUlZFUl9JTUFHRVMpKTsKLQkJU2VydmVyVUlQbHVnaW4uYWRkUmVnaXN0cnlMaXN0ZW5lcigpOwotCQlpZiAoVHJhY2UuQ09ORklHKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfQ09ORklHLCAiLTwtIERvbmUgbG9hZGluZyAuc2VydmVySW1hZ2VzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIHNlcnZlciBpbWFnZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkU2VydmVySW1hZ2VzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmKSB7Ci0JCWludCBzaXplID0gY2YubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbmFtZSA9IGNmW2ldLmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBpY29uUGF0aCA9IGNmW2ldLmdldEF0dHJpYnV0ZSgiaWNvbiIpOwotCQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4obmFtZSwgaWNvblBhdGgpOwotCQkJCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCAmJiBpY29uUGF0aCAhPSBudWxsICYmIGljb25QYXRoLmxlbmd0aCgpID4gMCkKLQkJCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCQkKLQkJCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nW10gdHlwZUlkcyA9IFNlcnZlclVJUGx1Z2luLnRva2VuaXplKGNmW2ldLmdldEF0dHJpYnV0ZSgidHlwZUlkcyIpLCAiLCIpOwotCQkJCQlpbnQgc2l6ZTIgPSB0eXBlSWRzLmxlbmd0aDsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCQlpbWFnZVJlZ2lzdHJ5LnB1dCh0eXBlSWRzW2pdLCBpbWFnZURlc2NyaXB0b3IpOwkJCi0JCQkJCQlpbWFnZURlc2NyaXB0b3JzLnB1dCh0eXBlSWRzW2pdLCBpbWFnZURlc2NyaXB0b3IpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChUcmFjZS5DT05GSUcpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0NPTkZJRywgIiAgTG9hZGVkIHNlcnZlckltYWdlOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgc2VydmVySW1hZ2U6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBoYW5kbGVTZXJ2ZXJJbWFnZURlbHRhKElFeHRlbnNpb25EZWx0YSBkZWx0YSkgewotCQlpZiAoaW1hZ2VSZWdpc3RyeSA9PSBudWxsKSAvLyBub3QgbG9hZGVkIHlldAotCQkJcmV0dXJuOwotCQkKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSBkZWx0YS5nZXRFeHRlbnNpb24oKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCi0JCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUV4dGVuc2lvbkRlbHRhLkFEREVEKQotCQkJbG9hZFNlcnZlckltYWdlcyhjZik7Ci0JCWVsc2UgewotCQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVN0cmluZyB0eXBlSWQgPSBjZltpXS5nZXRBdHRyaWJ1dGUoInR5cGVJZHMiKTsKLQkJCQlpbWFnZVJlZ2lzdHJ5LnJlbW92ZSh0eXBlSWQpOwotCQkJCWltYWdlRGVzY3JpcHRvcnMucmVtb3ZlKHR5cGVJZCk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvSW5pdGlhbGl6ZUpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvSW5pdGlhbGl6ZUpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTFiZTUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0luaXRpYWxpemVKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotLyoqCi0gKiBKb2IgdG8gaW5pdGlhbGl6ZSB0aGUgc2VydmVyIFVJLgotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbGl6ZUpvYiBleHRlbmRzIEpvYiB7Ci0JLyoqCi0JICogQ3JlYXRlIHRoZSBqb2IuCi0JICovCi0JcHVibGljIEluaXRpYWxpemVKb2IoKSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLmpvYkluaXRpYWxpemluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2IjcnVuKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlzZXJ2ZXJzW2ldLmFkZFNlcnZlckxpc3RlbmVyKFNlcnZlclVJUGx1Z2luLnNlcnZlckxpc3RlbmVyKTsKLQkJCQlzZXJ2ZXJzW2ldLmFkZFB1Ymxpc2hMaXN0ZW5lcihTZXJ2ZXJVSVBsdWdpbi5wdWJsaXNoTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9MYXVuY2hDbGllbnRKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0xhdW5jaENsaWVudEpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzEyNjQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0xhdW5jaENsaWVudEpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIExhdW5jaENsaWVudEpvYiBleHRlbmRzIENoYWluZWRKb2IgewotCXByb3RlY3RlZCBJTW9kdWxlW10gbW9kdWxlOwotCXByb3RlY3RlZCBJQ2xpZW50IGNsaWVudDsKLQlwcm90ZWN0ZWQgSUxhdW5jaGFibGVBZGFwdGVyIGxhdW5jaGFibGVBZGFwdGVyOwotCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZTsKLQlwcm90ZWN0ZWQgSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0OwotCi0JcHVibGljIExhdW5jaENsaWVudEpvYihJU2VydmVyIHNlcnZlciwgSU1vZHVsZVtdIG1vZHVsZSwgU3RyaW5nIGxhdW5jaE1vZGUsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCwgSUxhdW5jaGFibGVBZGFwdGVyIGxhdW5jaGFibGVBZGFwdGVyLCBJQ2xpZW50IGNsaWVudCkgewotCQlzdXBlcihNZXNzYWdlcy5sYXVuY2hpbmdDbGllbnRUYXNrLCBzZXJ2ZXIpOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKLQkJdGhpcy5tb2R1bGVBcnRpZmFjdCA9IG1vZHVsZUFydGlmYWN0OwotCQl0aGlzLmxhdW5jaGFibGVBZGFwdGVyID0gbGF1bmNoYWJsZUFkYXB0ZXI7Ci0JCXRoaXMuY2xpZW50ID0gY2xpZW50OwotCQlzZXRSdWxlKHNlcnZlcik7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoVHJhY2UuRklORVIpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FUiwgIkxhdW5jaENsaWVudCBqb2IiKTsKLQkJfQotCi0JCS8vIHdhaXQgZm9yIHVwIHRvIDUgbWludXRlcwotCQlmaW5hbCBTZXJ2ZXIgc2VydmVyID0gKFNlcnZlcikgZ2V0U2VydmVyKCk7Ci0JCWludCBzdGF0ZSA9IHNlcnZlci5nZXRNb2R1bGVTdGF0ZShtb2R1bGUpOwotCQlpbnQgY291bnQgPSBTZXJ2ZXJQcmVmZXJlbmNlcy5nZXRJbnN0YW5jZSgpLmdldE1vZHVsZVN0YXJ0VGltZW91dCgpOwotCQl3aGlsZSAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORyAmJiBjb3VudCA+IDApIHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDIwMDApOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCWNvdW50IC09IDIwMDA7Ci0JCQlzdGF0ZSA9IHNlcnZlci5nZXRNb2R1bGVTdGF0ZShtb2R1bGUpOwotCQl9Ci0JCQotCQlpZiAoVHJhY2UuRklORVIpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FUiwgIkxhdW5jaENsaWVudCBqb2IgMiAiICsgc3RhdGUpOwotCQl9Ci0JCQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQotCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORykKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkKLQkJaWYgKFRyYWNlLkZJTkVSKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVIsICJMYXVuY2hDbGllbnQgam9iIDMiKTsKLQkJfQotCi0JCS8vIGpvYiByZXR1cm4gc3RhdHVzCi0JCWZpbmFsIElTdGF0dXNbXSByZXN1bHRpbmdTdGF0dXMgPSBuZXcgSVN0YXR1c1tdIHsgU3RhdHVzLk9LX1NUQVRVUyB9OwotCi0JCS8vIGFjcXVpcmUgdGhlIGxhdW5jaGFibGUgb2JqZWN0LgotCQlmaW5hbCBPYmplY3RbXSBsYXVuY2hhYmxlID0gbmV3IE9iamVjdFsxXTsKLQkJdHJ5IHsKLQkJCWxhdW5jaGFibGVbMF0gPSBsYXVuY2hhYmxlQWRhcHRlci5nZXRMYXVuY2hhYmxlKHNlcnZlciwgbW9kdWxlQXJ0aWZhY3QpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlyZXN1bHRpbmdTdGF0dXNbMF0gPSBjZS5nZXRTdGF0dXMoKTsKLQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcihudWxsLCByZXN1bHRpbmdTdGF0dXNbMF0pOwotCQl9Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQl9Ci0JCS8vIGRpc3BsYXkgY2xpZW50IG9uIFVJIHRocmVhZCBpZiBsYXVuY2hhYmxlIGV4aXN0cy4KLQkJaWYgKGxhdW5jaGFibGVbMF0gIT0gbnVsbCkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJBdHRlbXB0aW5nIHRvIGxvYWQgY2xpZW50OiAiICsgY2xpZW50LmdldElkKCkpOwotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRpbmdTdGF0dXNbMF0gPSBjbGllbnQubGF1bmNoKHNlcnZlciwgbGF1bmNoYWJsZVswXSwgbGF1bmNoTW9kZSwgc2VydmVyLmdldExhdW5jaCgpKTsKLQkJCQkJCWlmIChyZXN1bHRpbmdTdGF0dXNbMF0gIT0gbnVsbCAmJiByZXN1bHRpbmdTdGF0dXNbMF0uZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcihudWxsLCByZXN1bHRpbmdTdGF0dXNbMF0pOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJTZXJ2ZXIgY2xpZW50IGZhaWxlZCIsIGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKFRyYWNlLkZJTkVSKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVIsICJMYXVuY2hDbGllbnQgam9iIDQiKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0aW5nU3RhdHVzWzBdOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9MYXVuY2hpbmdQcmVmZXJlbmNlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTGF1bmNoaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlNTdiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9MYXVuY2hpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotLyoqCi0gKiBUaGUgcHJlZmVyZW5jZSBwYWdlIHRoYXQgaG9sZHMgc2VydmVyIGxhdW5jaGluZyBwcm9wZXJ0aWVzLgotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoaW5nUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JcHJvdGVjdGVkIFNlcnZlclByZWZlcmVuY2VzIHByZWZlcmVuY2VzOwotCXByb3RlY3RlZCBTZXJ2ZXJVSVByZWZlcmVuY2VzIHVpUHJlZmVyZW5jZXM7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hCZWZvcmVTdGFydDsKLQotCXByb3RlY3RlZCBieXRlIHNhdmVFZGl0b3JzOwotCXByb3RlY3RlZCBCdXR0b25bXSBzYXZlQnV0dG9uczsKLQlwcm90ZWN0ZWQgaW50IGxhdW5jaE1vZGU7Ci0JcHJvdGVjdGVkIEJ1dHRvbltdIGxhdW5jaE1vZGVCdXR0b25zOwotCXByb3RlY3RlZCBpbnQgbGF1bmNoTW9kZTI7Ci0JcHJvdGVjdGVkIEJ1dHRvbltdIGxhdW5jaE1vZGUyQnV0dG9uczsKLQlwcm90ZWN0ZWQgaW50IGJyZWFrcG9pbnRFbmFibGVtZW50OwotCXByb3RlY3RlZCBCdXR0b25bXSBicmVha3BvaW50QnV0dG9uczsKLQlwcm90ZWN0ZWQgaW50IHJlc3RhcnRFbmFibGVtZW50OwotCXByb3RlY3RlZCBCdXR0b25bXSByZXN0YXJ0QnV0dG9uczsKLQotCS8qKgotCSAqIFNlcnZlclByZWZlcmVuY2VzUGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBMYXVuY2hpbmdQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCXByZWZlcmVuY2VzID0gU2VydmVyUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKTsKLQkJdWlQcmVmZXJlbmNlcyA9IFNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBwcmVmZXJlbmNlIG9wdGlvbnMuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscChwYXJlbnQsIENvbnRleHRJZHMuUFJFRl9HRU5FUkFMKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJcHVibGlzaEJlZm9yZVN0YXJ0ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCXB1Ymxpc2hCZWZvcmVTdGFydC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZBdXRvUHVibGlzaCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXB1Ymxpc2hCZWZvcmVTdGFydC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlwdWJsaXNoQmVmb3JlU3RhcnQuc2V0U2VsZWN0aW9uKHByZWZlcmVuY2VzLmlzQXV0b1B1Ymxpc2hpbmcoKSk7Ci0JCXdocy5zZXRIZWxwKHB1Ymxpc2hCZWZvcmVTdGFydCwgQ29udGV4dElkcy5QUkVGX0dFTkVSQUxfUFVCTElTSF9CRUZPUkVfU1RBUlQpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQljcmVhdGVTYXZlRWRpdG9yR3JvdXAoY29tcG9zaXRlKTsKLQkJCi0JCWNyZWF0ZUxhdW5jaE1vZGVHcm91cChjb21wb3NpdGUpOwotCQkKLQkJY3JlYXRlTGF1bmNoTW9kZTJHcm91cChjb21wb3NpdGUpOwotCQkKLQkJY3JlYXRlQnJlYWtwb2ludHNHcm91cChjb21wb3NpdGUpOwotCQkKLQkJY3JlYXRlUmVzdGFydEdyb3VwKGNvbXBvc2l0ZSk7Ci0JCQotCQlzZXRTYXZlRWRpdG9yU3RhdHVzKHVpUHJlZmVyZW5jZXMuZ2V0U2F2ZUVkaXRvcnMoKSk7Ci0JCXNldExhdW5jaE1vZGVTdGF0dXModWlQcmVmZXJlbmNlcy5nZXRMYXVuY2hNb2RlKCkpOwotCQlzZXRMYXVuY2hNb2RlMlN0YXR1cyh1aVByZWZlcmVuY2VzLmdldExhdW5jaE1vZGUyKCkpOwotCQlzZXRCcmVha3BvaW50c1N0YXR1cyh1aVByZWZlcmVuY2VzLmdldEVuYWJsZUJyZWFrcG9pbnRzKCkpOwotCQlzZXRSZXN0YXJ0U3RhdHVzKHVpUHJlZmVyZW5jZXMuZ2V0UmVzdGFydCgpKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2F2ZUVkaXRvckdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoTWVzc2FnZXMucHJlZlNhdmVFZGl0b3JzKTsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCVN0cmluZ1tdIG1lc3NhZ2VzID0gbmV3IFN0cmluZ1tdIHsKLQkJCU1lc3NhZ2VzLnByZWZTYXZlRWRpdG9yc0Fsd2F5cywgTWVzc2FnZXMucHJlZlNhdmVFZGl0b3JzTmV2ZXIsCi0JCQlNZXNzYWdlcy5wcmVmU2F2ZUVkaXRvcnNQcm9tcHQKLQkJfTsKLQkJCi0JCWZpbmFsIGJ5dGVbXSBvcHRpb25zID0gbmV3IGJ5dGVbXSB7Ci0JCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLlNBVkVfRURJVE9SU19BTFdBWVMsCi0JCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLlNBVkVfRURJVE9SU19ORVZFUiwKLQkJCVNlcnZlclVJUHJlZmVyZW5jZXMuU0FWRV9FRElUT1JTX1BST01QVAotCQl9OwotCQkKLQkJQnV0dG9uW10gYnV0dG9ucyA9IG5ldyBCdXR0b25bM107Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJYnV0dG9uc1tpXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCQlidXR0b25zW2ldLnNldFRleHQobWVzc2FnZXNbaV0pOwotCQkJZmluYWwgaW50IGIgPSBpOwotCQkJYnV0dG9uc1tpXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlzYXZlRWRpdG9ycyA9IG9wdGlvbnNbYl07Ci0JCQkJfQotCQkJfSk7Ci0JCQl3aHMuc2V0SGVscChidXR0b25zW2ldLCBDb250ZXh0SWRzLlBSRUZfR0VORVJBTF9TQVZFX0VESVRPUlMpOwotCQl9Ci0JCXNhdmVCdXR0b25zID0gYnV0dG9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTYXZlRWRpdG9yU3RhdHVzKGJ5dGUgc3RhdHVzKSB7Ci0JCXNhdmVFZGl0b3JzID0gc3RhdHVzOwotCQlzYXZlQnV0dG9uc1swXS5zZXRTZWxlY3Rpb24oc2F2ZUVkaXRvcnMgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5TQVZFX0VESVRPUlNfQUxXQVlTKTsKLQkJc2F2ZUJ1dHRvbnNbMV0uc2V0U2VsZWN0aW9uKHNhdmVFZGl0b3JzID09IFNlcnZlclVJUHJlZmVyZW5jZXMuU0FWRV9FRElUT1JTX05FVkVSKTsKLQkJc2F2ZUJ1dHRvbnNbMl0uc2V0U2VsZWN0aW9uKHNhdmVFZGl0b3JzID09IFNlcnZlclVJUHJlZmVyZW5jZXMuU0FWRV9FRElUT1JTX1BST01QVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTGF1bmNoTW9kZUdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoTWVzc2FnZXMucHJlZkxhdW5jaE1vZGUpOwotCQkKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJU3RyaW5nW10gbWVzc2FnZXMgPSBuZXcgU3RyaW5nW10gewotCQkJTWVzc2FnZXMucHJlZkxhdW5jaE1vZGVSZXN0YXJ0LCBNZXNzYWdlcy5wcmVmTGF1bmNoTW9kZUNvbnRpbnVlLAotCQkJTWVzc2FnZXMucHJlZkxhdW5jaE1vZGVQcm9tcHQKLQkJfTsKLQkJCi0JCWZpbmFsIGJ5dGVbXSBvcHRpb25zID0gbmV3IGJ5dGVbXSB7Ci0JCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFX1JFU1RBUlQsCi0JCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFX0NPTlRJTlVFLAotCQkJU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERV9QUk9NUFQKLQkJfTsKLQkJCi0JCUJ1dHRvbltdIGJ1dHRvbnMgPSBuZXcgQnV0dG9uWzNdOwotCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWJ1dHRvbnNbaV0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQkJYnV0dG9uc1tpXS5zZXRUZXh0KG1lc3NhZ2VzW2ldKTsKLQkJCWZpbmFsIGludCBiID0gaTsKLQkJCWJ1dHRvbnNbaV0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJbGF1bmNoTW9kZSA9IG9wdGlvbnNbYl07Ci0JCQkJfQotCQkJfSk7Ci0JCQl3aHMuc2V0SGVscChidXR0b25zW2ldLCBDb250ZXh0SWRzLlBSRUZfR0VORVJBTF9MQVVOQ0hfTU9ERSk7Ci0JCX0KLQkJbGF1bmNoTW9kZUJ1dHRvbnMgPSBidXR0b25zOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldExhdW5jaE1vZGVTdGF0dXMoaW50IG1vZGUpIHsKLQkJbGF1bmNoTW9kZSA9IG1vZGU7Ci0JCWxhdW5jaE1vZGVCdXR0b25zWzBdLnNldFNlbGVjdGlvbihsYXVuY2hNb2RlID09IFNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREVfUkVTVEFSVCk7Ci0JCWxhdW5jaE1vZGVCdXR0b25zWzFdLnNldFNlbGVjdGlvbihsYXVuY2hNb2RlID09IFNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREVfQ09OVElOVUUpOwotCQlsYXVuY2hNb2RlQnV0dG9uc1syXS5zZXRTZWxlY3Rpb24obGF1bmNoTW9kZSA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFX1BST01QVCk7IAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUxhdW5jaE1vZGUyR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dChNZXNzYWdlcy5wcmVmTGF1bmNoTW9kZTIpOwotCQkKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJU3RyaW5nW10gbWVzc2FnZXMgPSBuZXcgU3RyaW5nW10gewotCQkJTWVzc2FnZXMucHJlZkxhdW5jaE1vZGUyUmVzdGFydCwgTWVzc2FnZXMucHJlZkxhdW5jaE1vZGUyQnJlYWtwb2ludHMsCi0JCQlNZXNzYWdlcy5wcmVmTGF1bmNoTW9kZTJDb250aW51ZSwgTWVzc2FnZXMucHJlZkxhdW5jaE1vZGUyUHJvbXB0Ci0JCX07Ci0JCQotCQlmaW5hbCBieXRlW10gb3B0aW9ucyA9IG5ldyBieXRlW10gewotCQkJU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERTJfUkVTVEFSVCwKLQkJCVNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREUyX0RJU0FCTEVfQlJFQUtQT0lOVFMsCi0JCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFMl9DT05USU5VRSwKLQkJCVNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREUyX1BST01QVAotCQl9OwotCQkKLQkJQnV0dG9uW10gYnV0dG9ucyA9IG5ldyBCdXR0b25bNF07Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJYnV0dG9uc1tpXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCQlidXR0b25zW2ldLnNldFRleHQobWVzc2FnZXNbaV0pOwotCQkJZmluYWwgaW50IGIgPSBpOwotCQkJYnV0dG9uc1tpXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlsYXVuY2hNb2RlMiA9IG9wdGlvbnNbYl07Ci0JCQkJfQotCQkJfSk7Ci0JCQl3aHMuc2V0SGVscChidXR0b25zW2ldLCBDb250ZXh0SWRzLlBSRUZfR0VORVJBTF9MQVVOQ0hfTU9ERV9ERUJVRyk7Ci0JCX0KLQkJbGF1bmNoTW9kZTJCdXR0b25zID0gYnV0dG9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYXVuY2hNb2RlMlN0YXR1cyhpbnQgbW9kZSkgewotCQlsYXVuY2hNb2RlMiA9IG1vZGU7Ci0JCWxhdW5jaE1vZGUyQnV0dG9uc1swXS5zZXRTZWxlY3Rpb24obGF1bmNoTW9kZTIgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERTJfUkVTVEFSVCk7Ci0JCWxhdW5jaE1vZGUyQnV0dG9uc1sxXS5zZXRTZWxlY3Rpb24obGF1bmNoTW9kZTIgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERTJfRElTQUJMRV9CUkVBS1BPSU5UUyk7Ci0JCWxhdW5jaE1vZGUyQnV0dG9uc1syXS5zZXRTZWxlY3Rpb24obGF1bmNoTW9kZTIgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERTJfQ09OVElOVUUpOwotCQlsYXVuY2hNb2RlMkJ1dHRvbnNbM10uc2V0U2VsZWN0aW9uKGxhdW5jaE1vZGUyID09IFNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREUyX1BST01QVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnJlYWtwb2ludHNHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlncm91cC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZCcmVha3BvaW50cyk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlTdHJpbmdbXSBtZXNzYWdlcyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQlNZXNzYWdlcy5wcmVmQnJlYWtwb2ludHNBbHdheXMsIE1lc3NhZ2VzLnByZWZCcmVha3BvaW50c05ldmVyLAotCQkJTWVzc2FnZXMucHJlZkJyZWFrcG9pbnRzUHJvbXB0Ci0JCX07Ci0JCQotCQlmaW5hbCBieXRlW10gb3B0aW9ucyA9IG5ldyBieXRlW10gewotCQkJU2VydmVyVUlQcmVmZXJlbmNlcy5FTkFCTEVfQlJFQUtQT0lOVFNfQUxXQVlTLAotCQkJU2VydmVyVUlQcmVmZXJlbmNlcy5FTkFCTEVfQlJFQUtQT0lOVFNfTkVWRVIsCi0JCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLkVOQUJMRV9CUkVBS1BPSU5UU19QUk9NUFQKLQkJfTsKLQkJCi0JCUJ1dHRvbltdIGJ1dHRvbnMgPSBuZXcgQnV0dG9uWzNdOwotCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWJ1dHRvbnNbaV0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQkJYnV0dG9uc1tpXS5zZXRUZXh0KG1lc3NhZ2VzW2ldKTsKLQkJCWZpbmFsIGludCBiID0gaTsKLQkJCWJ1dHRvbnNbaV0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJYnJlYWtwb2ludEVuYWJsZW1lbnQgPSBvcHRpb25zW2JdOwotCQkJCX0KLQkJCX0pOwotCQkJd2hzLnNldEhlbHAoYnV0dG9uc1tpXSwgQ29udGV4dElkcy5QUkVGX0dFTkVSQUxfRU5BQkxFX0JSRUFLUE9JTlRTKTsKLQkJfQotCQlicmVha3BvaW50QnV0dG9ucyA9IGJ1dHRvbnM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QnJlYWtwb2ludHNTdGF0dXMoaW50IG1vZGUpIHsKLQkJYnJlYWtwb2ludEVuYWJsZW1lbnQgPSBtb2RlOwotCQlicmVha3BvaW50QnV0dG9uc1swXS5zZXRTZWxlY3Rpb24oYnJlYWtwb2ludEVuYWJsZW1lbnQgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5FTkFCTEVfQlJFQUtQT0lOVFNfQUxXQVlTKTsKLQkJYnJlYWtwb2ludEJ1dHRvbnNbMV0uc2V0U2VsZWN0aW9uKGJyZWFrcG9pbnRFbmFibGVtZW50ID09IFNlcnZlclVJUHJlZmVyZW5jZXMuRU5BQkxFX0JSRUFLUE9JTlRTX05FVkVSKTsKLQkJYnJlYWtwb2ludEJ1dHRvbnNbMl0uc2V0U2VsZWN0aW9uKGJyZWFrcG9pbnRFbmFibGVtZW50ID09IFNlcnZlclVJUHJlZmVyZW5jZXMuRU5BQkxFX0JSRUFLUE9JTlRTX1BST01QVCk7IAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlc3RhcnRHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlncm91cC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZSZXN0YXJ0KTsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCVN0cmluZ1tdIG1lc3NhZ2VzID0gbmV3IFN0cmluZ1tdIHsKLQkJCU1lc3NhZ2VzLnByZWZSZXN0YXJ0QWx3YXlzLCBNZXNzYWdlcy5wcmVmUmVzdGFydE5ldmVyLCBNZXNzYWdlcy5wcmVmUmVzdGFydFByb21wdAotCQl9OwotCQkKLQkJZmluYWwgYnl0ZVtdIG9wdGlvbnMgPSBuZXcgYnl0ZVtdIHsKLQkJCVNlcnZlclVJUHJlZmVyZW5jZXMuUkVTVEFSVF9BTFdBWVMsCi0JCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLlJFU1RBUlRfTkVWRVIsCi0JCQlTZXJ2ZXJVSVByZWZlcmVuY2VzLlJFU1RBUlRfUFJPTVBUCi0JCX07Ci0JCQotCQlCdXR0b25bXSBidXR0b25zID0gbmV3IEJ1dHRvblszXTsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQlidXR0b25zW2ldID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLQkJCWJ1dHRvbnNbaV0uc2V0VGV4dChtZXNzYWdlc1tpXSk7Ci0JCQlmaW5hbCBpbnQgYiA9IGk7Ci0JCQlidXR0b25zW2ldLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXJlc3RhcnRFbmFibGVtZW50ID0gb3B0aW9uc1tiXTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXdocy5zZXRIZWxwKGJ1dHRvbnNbaV0sIENvbnRleHRJZHMuUFJFRl9HRU5FUkFMX1JFU1RBUlQpOwotCQl9Ci0JCXJlc3RhcnRCdXR0b25zID0gYnV0dG9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZXN0YXJ0U3RhdHVzKGludCBtb2RlKSB7Ci0JCXJlc3RhcnRFbmFibGVtZW50ID0gbW9kZTsKLQkJcmVzdGFydEJ1dHRvbnNbMF0uc2V0U2VsZWN0aW9uKHJlc3RhcnRFbmFibGVtZW50ID09IFNlcnZlclVJUHJlZmVyZW5jZXMuUkVTVEFSVF9BTFdBWVMpOwotCQlyZXN0YXJ0QnV0dG9uc1sxXS5zZXRTZWxlY3Rpb24ocmVzdGFydEVuYWJsZW1lbnQgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5SRVNUQVJUX05FVkVSKTsKLQkJcmVzdGFydEJ1dHRvbnNbMl0uc2V0U2VsZWN0aW9uKHJlc3RhcnRFbmFibGVtZW50ID09IFNlcnZlclVJUHJlZmVyZW5jZXMuUkVTVEFSVF9QUk9NUFQpOyAKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHByZWZlcmVuY2UgcGFnZSB1c2luZyB0aGUgcGFzc2VkIHdvcmtiZW5jaC4KLQkgKgotCSAqIEBwYXJhbSB3b3JrYmVuY2ggdGhlIGN1cnJlbnQgd29ya2JlbmNoCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgc3BlY2lhbCBwcm9jZXNzaW5nIHdoZW4gdGhpcyBwYWdlJ3MgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlwdWJsaXNoQmVmb3JlU3RhcnQuc2V0U2VsZWN0aW9uKHByZWZlcmVuY2VzLmlzRGVmYXVsdEF1dG9QdWJsaXNoaW5nKCkpOwotCQkKLQkJc2V0U2F2ZUVkaXRvclN0YXR1cyh1aVByZWZlcmVuY2VzLmdldERlZmF1bHRTYXZlRWRpdG9ycygpKTsKLQkJc2V0TGF1bmNoTW9kZVN0YXR1cyh1aVByZWZlcmVuY2VzLmdldERlZmF1bHRMYXVuY2hNb2RlKCkpOwotCQlzZXRMYXVuY2hNb2RlMlN0YXR1cyh1aVByZWZlcmVuY2VzLmdldERlZmF1bHRMYXVuY2hNb2RlMigpKTsKLQkJc2V0QnJlYWtwb2ludHNTdGF0dXModWlQcmVmZXJlbmNlcy5nZXREZWZhdWx0RW5hYmxlQnJlYWtwb2ludHMoKSk7Ci0JCXNldFJlc3RhcnRTdGF0dXModWlQcmVmZXJlbmNlcy5nZXREZWZhdWx0UmVzdGFydCgpKTsKLQkJCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXByZWZlcmVuY2VzLnNldEF1dG9QdWJsaXNoaW5nKHB1Ymxpc2hCZWZvcmVTdGFydC5nZXRTZWxlY3Rpb24oKSk7Ci0JCXVpUHJlZmVyZW5jZXMuc2V0U2F2ZUVkaXRvcnMoc2F2ZUVkaXRvcnMpOwotCQl1aVByZWZlcmVuY2VzLnNldExhdW5jaE1vZGUobGF1bmNoTW9kZSk7Ci0JCXVpUHJlZmVyZW5jZXMuc2V0TGF1bmNoTW9kZTIobGF1bmNoTW9kZTIpOwotCQl1aVByZWZlcmVuY2VzLnNldEVuYWJsZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRFbmFibGVtZW50KTsKLQkJdWlQcmVmZXJlbmNlcy5zZXRSZXN0YXJ0KHJlc3RhcnRFbmFibGVtZW50KTsKLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NWEwNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcjI7Ci0KLXB1YmxpYyBjbGFzcyBNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIGltcGxlbWVudHMgSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IyIHsKLQlwdWJsaWMgYm9vbGVhbiBoYXNSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSU1hcmtlclJlc29sdXRpb25bXSBnZXRSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcikgewotCQlyZXR1cm4gbmV3IElNYXJrZXJSZXNvbHV0aW9uW10geyBuZXcgUnVudGltZU1hcmtlclJlc29sdXRpb24oKSB9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4Mjg1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotICogVHJhbnNsYXRlZCBtZXNzYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvckFkZERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yVmVyc2lvbkxldmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRpbmdUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVNlcnZlclByb2plY3REaWFsb2dNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRTZXJ2ZXJQcm9qZWN0TmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtaW5hdGVTZXJ2ZXJEaWFsb2dNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbk1vbml0b3JQb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZVNlcnZlckRpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZVNlcnZlckRpYWxvZ01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlU2VydmVyRGlhbG9nTWVzc2FnZU1hbnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlU2VydmVyRGlhbG9nTG9vc2VDb25maWd1cmF0aW9uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVTZXJ2ZXJEaWFsb2dSdW5uaW5nU2VydmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZVNlcnZlckRpYWxvZ1J1bm5pbmdTZXJ2ZXJTdG9wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZVNlcnZlclRhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb3VsZE5vdENyZWF0ZVNlcnZlclByb2plY3RTdGF0dXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2aW5nVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JTYXZlRXJyb3JEaWFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yU2F2ZUVycm9yTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZWFkT25seUZpbGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRWRpdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclVuZG9EaXNhYmxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JVbmRvRW5hYmxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZWRvRGlzYWJsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yUmVkb0VuYWJsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yUmVzb3VyY2VEZWxldGVUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZXNvdXJjZURlbGV0ZVNlcnZlck1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yUmVzb3VyY2VEZWxldGVTYXZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc291cmNlRGlydHlEaWFsb2dNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelNlbGVjdENsaWVudFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelNlbGVjdENsaWVudERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc291cmNlRGlydHlEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvdXJjZURpcnR5RGlhbG9nQ29udGludWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3UnVudGltZVdpemFyZFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckxhdW5jaERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckxhdW5jaFNlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJMYXVuY2hIb3N0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckxhdW5jaFJ1bnRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb1NlcnZlclNlbGVjdGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU2VydmVyQWxyZWFkeVJ1bm5pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JJbnZhbGlkU2VydmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVuT25TZXJ2ZXJMYXVuY2hDb25maWdOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelNlbGVjdENsaWVudE1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb3VsZE5vdENyZWF0ZVNlcnZlclByb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JWYWxpZGF0ZUVkaXRGYWlsdXJlTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmUHJvamVjdE5vdE1vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmUHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmUHJvamVjdERlZmF1bHRTZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlByb2plY3ROb3RDb25maWd1cmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZQcm9qZWN0Tm9TZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvcFNlcnZlckluZm9OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb3BTZXJ2ZXJJbmZvVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9wU2VydmVySW5mb1ZlbmRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sVGlwRW5hYmxlRm9jdXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbFRpcERpc2FibGVGb2N1czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvdWxkTm90U2F2ZVByZWZlcmVuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZmVyZW5jZVJ1bnRpbWVzRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dSdW50aW1lU2VhcmNoTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dSdW50aW1lU2VhcmNoVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nUnVudGltZVNlYXJjaFByb2dyZXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluZm9Ob1J1bnRpbWVzRm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6RWRpdFJ1bnRpbWVXaXphcmRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmZXJlbmNlUnVudGltZXNUYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dSdW50aW1lSW5Vc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nUnVudGltZURlbGV0ZVNlcnZlcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nUnVudGltZVJlbW92ZVRhcmdldHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdERpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZlcmVuY2VSdW50aW1lc1RpdGxlTG9uZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmQXV0b1B1Ymxpc2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkxhdW5jaE1vZGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkxhdW5jaE1vZGVSZXN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZMYXVuY2hNb2RlQ29udGludWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkxhdW5jaE1vZGVQcm9tcHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkxhdW5jaE1vZGUyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZMYXVuY2hNb2RlMlJlc3RhcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkxhdW5jaE1vZGUyQ29udGludWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkxhdW5jaE1vZGUyQnJlYWtwb2ludHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkxhdW5jaE1vZGUyUHJvbXB0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZCcmVha3BvaW50czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmQnJlYWtwb2ludHNBbHdheXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkJyZWFrcG9pbnRzTmV2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkJyZWFrcG9pbnRzUHJvbXB0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZSZXN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZSZXN0YXJ0QWx3YXlzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZSZXN0YXJ0TmV2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlJlc3RhcnRQcm9tcHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlNob3dPbkFjdGl2aXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZTYXZlRWRpdG9yczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmU2F2ZUVkaXRvcnNBbHdheXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlNhdmVFZGl0b3JzTmV2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlNhdmVFZGl0b3JzUHJvbXB0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbk5ldzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25OZXdTZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUHJvcGVydGllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25PcGVuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblNob3dJbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Db3B5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblBhc3RlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbkRlYnVnVG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25EZWJ1ZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25EZWJ1Z1Jlc3RhcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uRGVidWdSZXN0YXJ0VG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25TdGFydFRvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uU3RhcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUHJvZmlsZVRvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUHJvZmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Qcm9maWxlUmVzdGFydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Qcm9maWxlUmVzdGFydFRvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUmVzdGFydFRvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUmVzdGFydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25QdWJsaXNoVG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25QdWJsaXNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblB1Ymxpc2hDbGVhblRvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUHVibGlzaENsZWFuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblJlbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25EZWxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ1JlbW92ZU1vZHVsZUNvbmZpcm07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nUmVtb3ZlTW9kdWxlc0NvbmZpcm07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybWluYXRlU2VydmVyRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uRGVidWdPblNlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Qcm9maWxlT25TZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUnVuT25TZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uU3RvcE1vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25TdGFydE1vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25SZXN0YXJ0TW9kdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblN3aXRjaFNlcnZlckxvY2F0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN3aXRjaFNlcnZlckxvY2F0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN3aXRjaFNlcnZlckxvY2F0aW9uTWV0YWRhdGE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nQWRkUmVtb3ZlTW9kdWxlc05vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uU2V0TmV3U2VydmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTm9BcnRpZmFjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vTW9kdWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckxhdW5jaENvbmZpZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb2RlV2FybmluZ1J1bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb2RlV2FybmluZ0RlYnVnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vZGVXYXJuaW5nUHJvZmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb2RlV2FybmluZ1Jlc3RhcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9kZVdhcm5pbmdCcmVha3BvaW50czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb2RlV2FybmluZ0NvbnRpbnVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ0JyZWFrcG9pbnRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ0JyZWFrcG9pbnRzUmVlbmFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nQnJlYWtwb2ludHNDb250aW51ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dSZW1lbWJlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dSZXN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ1Jlc3RhcnRSZXN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ1Jlc3RhcnRDb250aW51ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dQdWJsaXNoQ2xlYW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb1NlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclJvb3RNb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaG9zdG5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpNb2R1bGVBdmFpbGFibGVMaXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek1vZHVsZURlcGxveWVkTGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpNb2R1bGVBZGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlUmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek1vZHVsZUFkZEFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpNb2R1bGVSZW1vdmVBbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlUmVxdWlyZWRNb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlUmVxdWlyZWRNb2R1bGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek1vZHVsZVB1Ymxpc2hJbW1lZGlhdGVseTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpUYXNrVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6VGFza0Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpekVycm9ySW52YWxpZEZvbGRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpFcnJvckNsb3NlZFByb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlU2VydmVyUHJvamVjdERpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld1NlcnZlclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld1NlcnZlckRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld1NlcnZlclJ1bk9uU2VydmVyRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3U2VydmVyU2VsZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld1NlcnZlck1hbnVhbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpDaGVja1JlbW90ZVN1cHBvcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6RW1wdHlIb3N0TmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpTZWxlY3RTZXJ2ZXJQcmVmZXJyZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3U2VydmVyRXhpc3Rpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3U2VydmVyUnVudGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdTZXJ2ZXJSdW50aW1lQ3JlYXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpekVycm9yU2VydmVyQ3JlYXRpb25FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpSdW5PblNlcnZlclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpekRlYnVnT25TZXJ2ZXJUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpQcm9maWxlT25TZXJ2ZXJUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpNb2R1bGVBcnRpZmFjdHNEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpNb2R1bGVBcnRpZmFjdHNBdmFpbGFibGVMaXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek1vZHVsZUFydGlmYWN0c05vU2VsZWN0aW9uRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3UnVudGltZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld1J1bnRpbWVEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdSdW50aW1lQ3JlYXRlU2VydmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBlcmZvcm1pbmdUYXNrczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpNb2R1bGVXaXphcmRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdTZXJ2ZXJXaXphcmRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpTZWxlY3RDbGllbnRXaXphcmRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpUYXNrV2l6YXJkVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vbml0b3JNb25pdG9yUG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yQ29sdW1uU3RhdHVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vbml0b3JDb2x1bW5UeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vbml0b3JDb2x1bW5Qb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vbml0b3JDb2x1bW5Nb25pdG9yUG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yQ29sdW1uQ29udGVudFR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vbml0b3JDb250ZW50VHlwZUFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yQ29udGVudFR5cGVXZWI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlV2ViU2VydmljZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvck5vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RvcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGFydGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0b3BwZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5UeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVUeXBlQ29tcFRyZWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJlUnVudGltZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkUnVudGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdTZXJ2ZXJTZWxlY3RFeGlzdGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50VW5rbm93bk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyVHlwZUNvbXBMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlck5hbWVEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTZXJ2ZXJzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdOb01vZHVsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1NlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3RhdHVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25TdG9wVG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25TdG9wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbk1vZGlmeU1vZHVsZXNUb29sVGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbk1vZGlmeU1vZHVsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uTW9uaXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3SW5pdGlhbGl6aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTeW5jT2theTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3luY1Jlc3RhcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N5bmNQdWJsaXNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTeW5jUmVzdGFydFB1Ymxpc2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N5bmNQdWJsaXNoaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTeW5jT2theTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N5bmNSZXN0YXJ0MjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3luY1B1Ymxpc2gyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTeW5jUmVzdGFydFB1Ymxpc2gyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTeW5jUHVibGlzaGluZzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yU2VydmVyRWRpdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclByb21wdElycmV2ZXJzaWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZW5hbWVGaWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckVkaXRvckNhbnRTYXZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRHVwbGljYXRlTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZWFkT25seTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JXcml0YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZXNvdXJjZU1vZGlmaWVkVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yUmVhZE9ubHlNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclNlcnZlck1vZGlmaWVkTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZXNvdXJjZVdhcm5UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZXNvdXJjZVdhcm5NZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3R2VuZXJhbFNlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdHZW5lcmFsRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVySG9zdG5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdSdW50aW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3UnVudGltZUVkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJDb25maWd1cmF0aW9uUGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckNvbmZpZ3VyYXRpb25Ccm93c2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJDb25maWd1cmF0aW9uQnJvd3NlTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1B1Ymxpc2hTZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3QXV0b1B1Ymxpc2hEaXNhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3QXV0b1B1Ymxpc2hFbmFibGVkUmVzb3VyY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaEVuYWJsZWRCdWlsZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld0F1dG9QdWJsaXNoRW5hYmxlZEludGVydmFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaENvbW1hbmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdUaW1lb3V0U2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1RpbWVvdXREZXNjcmlwdGlvbjsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdUaW1lb3V0Q29tbWFuZDsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdQdWJsaXNoZXJzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3U3RhcnRUaW1lb3V0OwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1N0b3BUaW1lb3V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVySG9zdG5hbWVDb21tYW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyTmFtZUNvbW1hbmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdSdW50aW1lQ29tbWFuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld09wZW5MYXVuY2hDb25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvclNhdmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck1pc3NpbmdDb25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yQ29uZmlndXJhdGlvbk5vdEFjY2Vzc2libGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0YXJ0aW5nNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3RhdHVzU3RhcnRlZDI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0b3BwaW5nNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3RhdHVzU3RvcHBlZDI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0YXJ0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdGFydGluZzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0YXJ0aW5nMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3RhdHVzU3RhcnRpbmczOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdG9wcGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3RhdHVzU3RvcHBpbmcxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdG9wcGluZzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0b3BwaW5nMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3RhdHVzU3RhcnRlZERlYnVnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdGFydGVkUHJvZmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3RhdHVzU3RhcnRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3RhdHVzU3RvcHBlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25TdG9wVG9vbFRpcDI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uU3RvcDI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGF1bmNoaW5nQ2xpZW50VGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdJbnN0YWxsYWJsZVNlcnZlclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld0luc3RhbGxhYmxlU2VydmVyRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld0luc3RhbGxhYmxlU2VydmVyQ29uZmlybTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdJbnN0YWxsYWJsZVNlcnZlckpvYjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdJbnN0YWxsYWJsZVNlcnZlclJlc3RhcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJTaXRlRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5zdGFsbGFibGVTZXJ2ZXJDb21wVHJlZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnN0YWxsYWJsZVNlcnZlckxpbms7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5zdGFsbGFibGVTZXJ2ZXJMb2NhbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnN0YWxsYWJsZVNlcnZlclNlYXJjaGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpMaWNlbnNlVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TGljZW5zZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpekxpY2Vuc2VBY2NlcHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TGljZW5zZURlY2xpbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TGljZW5zZU5vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgam9iSW5pdGlhbGl6aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvYkluaXRpYWxpemluZ1NlcnZlcnNWaWV3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvYlJlc3RhcnRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xpZW50RGVmYXVsdE5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xpZW50RGVmYXVsdERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vZHVsZURlY29yYXRvclByb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWludXRlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb2R1bGVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTdGFydGluZ01vbml0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXVkaW9QcmVmU2VsZWN0RmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdWRpb1ByZWZFbmFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXVkaW9QcmVmVm9sdW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1ZGlvUHJlZlNvdW5kczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdWRpb1ByZWZTb3VuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdWRpb1ByZWZGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1ZGlvUHJlZlBsYXk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXVkaW9QcmVmQnJvd3NlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1ZGlvUHJlZlJlc2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1ZGlvVW5rbm93bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdWRpb05vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXVkaW9EZWZhdWx0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludGVybmFsV2ViQnJvd3Nlck5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2ZXJzVmlldzJfbm9TZXJ2ZXJzOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLmludGVybmFsLk1lc3NhZ2VzIiwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5ZmYwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgLS0tLS0tLS0tLS0tLS0tIFdpemFyZHMgLS0tLS0tLS0tLS0tLS0tCi0jIChJZiB0aGUgZmlyc3QgdHdvIGxpbmVzIGluIGEgZ3JvdXAgZG8gbm90IHN0YXJ0IHdpdGggIndpeiIsIGl0IGlzIGJlY2F1c2UKLSMgdGhvc2UgbGluZXMgYXJlIGRpc3BsYXllZCBpbiB0aGUgd29ya2JlbmNoICJOZXciIHdpemFyZC4gVGhlIHJlc3Qgb2YgdGhlCi0jIHRleHQgaXMgZGlzcGxheWVkIGluIGVhY2ggYWN0dWFsIHdpemFyZCkKLQotIyBOZXcgU2VydmVyIChhbmQgQ29uZmlndXJhdGlvbikgV2l6YXJkCi13aXpOZXdTZXJ2ZXJXaXphcmRUaXRsZT1OZXcgU2VydmVyCi13aXpOZXdTZXJ2ZXJUaXRsZT1EZWZpbmUgYSBOZXcgU2VydmVyCi13aXpOZXdTZXJ2ZXJEZXNjcmlwdGlvbj1DaG9vc2UgdGhlIHR5cGUgb2Ygc2VydmVyIHRvIGNyZWF0ZQotd2l6TmV3U2VydmVyUnVuT25TZXJ2ZXJEZXNjcmlwdGlvbj1TZWxlY3Qgd2hpY2ggc2VydmVyIHRvIHVzZQotd2l6TmV3U2VydmVyUnVudGltZT1TZXJ2ZXIgJnJ1bnRpbWUgZW52aXJvbm1lbnQ6Ci13aXpOZXdTZXJ2ZXJSdW50aW1lQ3JlYXRlPUNyZWF0ZSBhIG5ldyBydW50aW1lIGVudmlyb25tZW50Ci13aXpDaGVja1JlbW90ZVN1cHBvcnQ9VGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzZXJ2ZXIgdHlwZSBkb2VzIG5vdCBzdXBwb3J0IHJlbW90ZSBob3N0cwotd2l6RW1wdHlIb3N0TmFtZT1TZXJ2ZXIncyBob3N0IG5hbWUgbXVzdCBiZSBzZXQuCi0KLXdpek5ld1NlcnZlclNlbGVjdD1Ib3cgZG8geW91IHdhbnQgdG8gc2VsZWN0IHRoZSBzZXJ2ZXI/Ci13aXpOZXdTZXJ2ZXJFeGlzdGluZz1DaG9vc2UgYW4gZSZ4aXN0aW5nIHNlcnZlcgotd2l6TmV3U2VydmVyTWFudWFsPSZNYW51YWxseSBkZWZpbmUgYSBuZXcgc2VydmVyCi13aXpOZXdTZXJ2ZXJTZWxlY3RFeGlzdGluZz1TZWxlY3QgdGhlIHNlcnZlciB0aGF0IHlvdSB3YW50IHRvIHVzZToKLQotIyBTZWxlY3QgU2VydmVyIHdpemFyZAotd2l6UnVuT25TZXJ2ZXJUaXRsZT1SdW4gT24gU2VydmVyCi13aXpEZWJ1Z09uU2VydmVyVGl0bGU9RGVidWcgT24gU2VydmVyCi13aXpQcm9maWxlT25TZXJ2ZXJUaXRsZT1Qcm9maWxlIE9uIFNlcnZlcgotd2l6U2VsZWN0U2VydmVyUHJlZmVycmVkPUFsd2F5cyB1c2UgdGhpcyBzZXJ2ZXIgd2hlbiBydW5uaW5nIHRoaXMgJnByb2plY3QKLQotIyBTZWxlY3QgU2VydmVyIENsaWVudCBXaXphcmQKLXdpelNlbGVjdENsaWVudFdpemFyZFRpdGxlPVNlbGVjdCBhIFNlcnZlciBDbGllbnQKLXdpelNlbGVjdENsaWVudFRpdGxlPVNlbGVjdCBhIHNlcnZlciBjbGllbnQKLXdpelNlbGVjdENsaWVudERlc2NyaXB0aW9uPVNlbGVjdCBhIGNsaWVudCB0byB1c2Ugd2l0aCB0aGlzIHNlcnZlci4KLXdpelNlbGVjdENsaWVudE1lc3NhZ2U9TXVsdGlwbGUgY2xpZW50cyBjYW4gcnVuIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gU2VsZWN0IGEgY2xpZW50IGZyb20gdGhlIGxpc3QgYmVsb3c6Ci0KLSMgU2VsZWN0IE1vZHVsZUFydGlmYWN0IFdpemFyZAotd2l6TW9kdWxlQXJ0aWZhY3RzRGVzY3JpcHRpb249U3BlY2lmeSBob3cgdG8gc3RhcnQgdGhlIHNlbGVjdGVkIHJlc291cmNlLgotd2l6TW9kdWxlQXJ0aWZhY3RzQXZhaWxhYmxlTGlzdD1BdmFpbGFibGUgbGF1bmNoZXJzOgotd2l6TW9kdWxlQXJ0aWZhY3RzTm9TZWxlY3Rpb25FcnJvcj1Zb3UgbXVzdCBzZWxlY3QgYSBsYXVuY2hlci4KLQotIyBUYXNrIFdpemFyZAotd2l6VGFza1dpemFyZFRpdGxlPVNlbGVjdCBUYXNrcwotd2l6VGFza1RpdGxlPVNlbGVjdCBUYXNrcwotd2l6VGFza0Rlc2NyaXB0aW9uPVNlbGVjdCB0aGUgdGFza3MgdG8gcGVyZm9ybSBvbiB0aGUgc2VydmVyLgotCi0jIE5ldyBSdW50aW1lIFdpemFyZAotd2l6TmV3UnVudGltZVdpemFyZFRpdGxlPU5ldyBTZXJ2ZXIgUnVudGltZSBFbnZpcm9ubWVudAotd2l6TmV3UnVudGltZVRpdGxlPU5ldyBTZXJ2ZXIgUnVudGltZSBFbnZpcm9ubWVudAotd2l6TmV3UnVudGltZURlc2NyaXB0aW9uPURlZmluZSBhIG5ldyBzZXJ2ZXIgcnVudGltZSBlbnZpcm9ubWVudAotd2l6TmV3UnVudGltZUNyZWF0ZVNlcnZlcj0mQ3JlYXRlIGEgbmV3IGxvY2FsIHNlcnZlcgotd2l6RWRpdFJ1bnRpbWVXaXphcmRUaXRsZT1FZGl0IFNlcnZlciBSdW50aW1lIEVudmlyb25tZW50Ci0KLSMgTmV3IFNlcnZlciBBZGFwdGVyIFdpemFyZAotd2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJUaXRsZT1JbnN0YWxsIE5ldyBTZXJ2ZXIgQWRhcHRlcgotd2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJEZXNjcmlwdGlvbj1Eb3dubG9hZCBhbmQgaW5zdGFsbCBzdXBwb3J0IGZvciBhIG5ldyBzZXJ2ZXIKLXdpek5ld0luc3RhbGxhYmxlU2VydmVyTWVzc2FnZT1UaGUgZm9sbG93aW5nIHNlcnZlciBhZGFwdGVycyBoYXZlIGJlZW4gZm91bmQgb24gcmVtb3RlIHVwZGF0ZSBtYW5hZ2VyIHNpdGVzLiBTZWxlY3QgYSBzZXJ2ZXIgYWRhcHRlciB0byBkb3dubG9hZCBhbmQgaW5zdGFsbC4KLXdpek5ld0luc3RhbGxhYmxlU2VydmVyQ29uZmlybT1TdXBwb3J0IGZvciB7MH0gd2lsbCBub3cgYmUgZG93bmxvYWRlZCBhbmQgaW5zdGFsbGVkLiBZb3Ugd2lsbCBiZSBwcm9tcHRlZCB0byByZXN0YXJ0IG9uY2UgdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZS4KLXdpek5ld0luc3RhbGxhYmxlU2VydmVySm9iPUluc3RhbGxpbmcgezB9Ci13aXpOZXdJbnN0YWxsYWJsZVNlcnZlclJlc3RhcnQ9SW5zdGFsbGF0aW9uIGNvbXBsZXRlLiBUaGUgbmV3IHNlcnZlciB3aWxsIG5vdCBiZSBhdmFpbGFibGUgdW50aWwgYWZ0ZXIgdGhlIHdvcmtiZW5jaCBpcyByZXN0YXJ0ZWQuIERvIHlvdSB3YW50IHRvIHJlc3RhcnQgbm93Pwotd2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJTaXRlRXJyb3I9Q291bGQgbm90IGNvbm5lY3QgdG8gezB9Ci0KLSMgTGljZW5zZSB3aXphcmQKLXdpekxpY2Vuc2VUaXRsZT1GZWF0dXJlIExpY2Vuc2UKLXdpekxpY2Vuc2VEZXNjcmlwdGlvbj1UaGlzIGxpY2Vuc2UgbXVzdCBiZSBhY2NlcHRlZCBiZWZvcmUgcHJvY2VlZGluZyB3aXRoIHRoZSBpbnN0YWxsYXRpb24uCi13aXpMaWNlbnNlQWNjZXB0PUkgJmFjY2VwdCB0aGUgdGVybXMgb2YgdGhlIGxpY2Vuc2UgYWdyZWVtZW50Ci13aXpMaWNlbnNlRGVjbGluZT1JICZkbyBub3QgYWNjZXB0IHRoZSB0ZXJtcyBvZiB0aGUgbGljZW5zZSBhZ3JlZW1lbnQKLXdpekxpY2Vuc2VOb25lPUZlYXR1cmUgZG9lcyBub3QgY29udGFpbiBhIGxpY2Vuc2UuCi0KLSMgQWRkL1JlbW92ZSBNb2R1bGVzCi13aXpNb2R1bGVXaXphcmRUaXRsZT1BZGQgYW5kIFJlbW92ZS4uLgotd2l6TW9kdWxlVGl0bGU9QWRkIGFuZCBSZW1vdmUKLXdpek1vZHVsZURlc2NyaXB0aW9uPU1vZGlmeSB0aGUgcmVzb3VyY2VzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgb24gdGhlIHNlcnZlcgotd2l6TW9kdWxlTWVzc2FnZT1Nb3ZlIHJlc291cmNlcyB0byB0aGUgcmlnaHQgdG8gY29uZmlndXJlIHRoZW0gb24gdGhlIHNlcnZlcgotd2l6TW9kdWxlQXZhaWxhYmxlTGlzdD0mQXZhaWxhYmxlOgotd2l6TW9kdWxlRGVwbG95ZWRMaXN0PSZDb25maWd1cmVkOgotd2l6TW9kdWxlQWRkPUEmZGQgPgotd2l6TW9kdWxlQWRkQWxsPUFkZCBBJmxsID4+Ci13aXpNb2R1bGVSZW1vdmU9PCAmUmVtb3ZlCi13aXpNb2R1bGVSZW1vdmVBbGw9PDwgUmUmbW92ZSBBbGwKLXdpek1vZHVsZVJlcXVpcmVkTW9kdWxlPXswfSBpcyByZXF1aXJlZCBhbmQgY2Fubm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VydmVyCi13aXpNb2R1bGVSZXF1aXJlZE1vZHVsZXM9T25lIG9mIHRoZSByZXF1aXJlZCBtb2R1bGVzICh7MH0pIG11c3QgYmUgYWRkZWQgdG8gdGhlIHNlcnZlcgotd2l6TW9kdWxlUHVibGlzaEltbWVkaWF0ZWx5PUlmIHNlcnZlciBpcyBzdGFydGVkLCBwdWJsaXNoIGNoYW5nZXMgJmltbWVkaWF0ZWx5Ci0KLSMgV2l6YXJkIGluZm8gYW5kIGVycm9yIG1lc3NhZ2VzCi13aXpFcnJvckludmFsaWRGb2xkZXI9VGhlIGZvbGRlciBtdXN0IGJlIGEgc2VydmVyIHByb2plY3Qgb3IgYSBmb2xkZXIgd2l0aGluIGEgc2VydmVyIHByb2plY3QKLXdpekVycm9yQ2xvc2VkUHJvamVjdD1UaGUgZm9sZGVyIG11c3Qgbm90IGJlIGluIGEgY2xvc2VkIHByb2plY3QKLXdpekVycm9yU2VydmVyQ3JlYXRpb25FcnJvcj1DYW5ub3QgY3JlYXRlIGEgc2VydmVyIHVzaW5nIHRoZSBzZWxlY3RlZCB0eXBlCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0gVmlld3MgLS0tLS0tLS0tLS0tLS0tCi0KLSMgLS0tIFNlcnZlciBDb25maWd1cmF0aW9uIHZpZXcgLS0tCi12aWV3U2VydmVycz1TZXJ2ZXJzCi0KLXZpZXdOb01vZHVsZXM9Tm90aGluZyBkZXBsb3llZAotCi0jIEFjdGlvbnMKLWFjdGlvbkRlbGV0ZT1EZWxldGUKLWFjdGlvblJlbW92ZT1SZW1vdmUKLWFjdGlvbk9wZW49T3BlbgotYWN0aW9uU2hvd0luPVNob3cgSW4KLWFjdGlvbkNvcHk9Q29weQotYWN0aW9uUGFzdGU9UGFzdGUKLWFjdGlvbk1vbml0b3I9TW9uaXRvcmluJmcKLWFjdGlvbk1vbml0b3JQb3J0PU1vbml0b3IgcG9ydCB7MH0gKHsxfSkKLWFjdGlvblByb3BlcnRpZXM9UHJvcGVydGllcwotYWN0aW9uTmV3PU5lJncKLWFjdGlvbk5ld1NlcnZlcj1TZXJ2ZXIKLQotIyAtLS0gU2VydmVycyB2aWV3IC0tLQotdmlld0luaXRpYWxpemluZz1Jbml0aWFsaXppbmcuLi4KLQotIyBDb2x1bW4gdGl0bGVzCi12aWV3U2VydmVyPVNlcnZlcgotdmlld1N0YXR1cz1TdGF0dXMKLXZpZXdTdGF0ZT1TdGF0ZQotCi0jIEFjdGlvbnMKLWFjdGlvblN0YXJ0PSZTdGFydAotYWN0aW9uU3RhcnRUb29sVGlwPVN0YXJ0IHRoZSBzZXJ2ZXIKLWFjdGlvbkRlYnVnPSZEZWJ1ZwotYWN0aW9uRGVidWdUb29sVGlwPVN0YXJ0IHRoZSBzZXJ2ZXIgaW4gZGVidWcgbW9kZQotYWN0aW9uRGVidWdSZXN0YXJ0PVJlc3RhcnQgaW4gRGVidWcKLWFjdGlvbkRlYnVnUmVzdGFydFRvb2xUaXA9UmVzdGFydCB0aGUgc2VydmVyIGluIGRlYnVnIG1vZGUKLWFjdGlvblByb2ZpbGU9UHJvJmZpbGUKLWFjdGlvblByb2ZpbGVUb29sVGlwPVN0YXJ0IHRoZSBzZXJ2ZXIgaW4gcHJvZmlsaW5nIG1vZGUKLWFjdGlvblByb2ZpbGVSZXN0YXJ0PVJlc3RhcnQgaW4gUHJvZmlsZQotYWN0aW9uUHJvZmlsZVJlc3RhcnRUb29sVGlwPVJlc3RhcnQgdGhlIHNlcnZlciBpbiBwcm9maWxpbmcgbW9kZQotYWN0aW9uU3RvcD1TJnRvcAotYWN0aW9uU3RvcFRvb2xUaXA9U3RvcCB0aGUgc2VydmVyCi1hY3Rpb25SZXN0YXJ0PSZSZXN0YXJ0Ci1hY3Rpb25SZXN0YXJ0VG9vbFRpcD1SZXN0YXJ0IHRoZSBzZXJ2ZXIKLWFjdGlvblB1Ymxpc2g9UHVibGlzaAotYWN0aW9uUHVibGlzaFRvb2xUaXA9UHVibGlzaCB0byB0aGUgc2VydmVyCi1hY3Rpb25QdWJsaXNoQ2xlYW49JkNsZWFuLi4uCi1hY3Rpb25QdWJsaXNoQ2xlYW5Ub29sVGlwPUNsZWFuIHJlc291cmNlcyBvbiB0aGUgc2VydmVyCi1hY3Rpb25Nb2RpZnlNb2R1bGVzPSZBZGQgYW5kIFJlbW92ZS4uLgotYWN0aW9uTW9kaWZ5TW9kdWxlc1Rvb2xUaXA9QWRkIGFuZCBSZW1vdmUgcmVzb3VyY2VzIHRvIHRoZSBzZXJ2ZXIKLWFjdGlvblJlc3RhcnRNb2R1bGU9JlJlc3RhcnQKLWFjdGlvblN0YXJ0TW9kdWxlPSZTdGFydAotYWN0aW9uU3RvcE1vZHVsZT1TJnRvcAotYWN0aW9uU3dpdGNoU2VydmVyTG9jYXRpb249U3dpdGNoIExvY2F0aW9uCi1zd2l0Y2hTZXJ2ZXJMb2NhdGlvbj1Mb2NhdGlvbjoKLXN3aXRjaFNlcnZlckxvY2F0aW9uTWV0YWRhdGE9W3dvcmtzcGFjZSBtZXRhZGF0YV0KLWFjdGlvblJlbmFtZT1SZSZuYW1lCi0KLSMgU3RhdHVzIGNvbHVtbiB0ZXh0Ci12aWV3U3RhdHVzU3RhcnRlZD1TdGFydGVkCi12aWV3U3RhdHVzU3RhcnRlZERlYnVnPURlYnVnZ2luZwotdmlld1N0YXR1c1N0YXJ0ZWRQcm9maWxlPVByb2ZpbGluZwotdmlld1N0YXR1c1N0b3BwZWQ9U3RvcHBlZAotCi12aWV3U3RhdHVzU3RhcnRpbmc9U3RhcnRpbmcKLXZpZXdTdGF0dXNTdGFydGluZzE9U3RhcnRpbmcuCi12aWV3U3RhdHVzU3RhcnRpbmcyPVN0YXJ0aW5nLi4KLXZpZXdTdGF0dXNTdGFydGluZzM9U3RhcnRpbmcuLi4KLQotdmlld1N0YXR1c1N0b3BwaW5nPVN0b3BwaW5nCi12aWV3U3RhdHVzU3RvcHBpbmcxPVN0b3BwaW5nLgotdmlld1N0YXR1c1N0b3BwaW5nMj1TdG9wcGluZy4uCi12aWV3U3RhdHVzU3RvcHBpbmczPVN0b3BwaW5nLi4uCi0KLSMgU2VydmVyIFN0YXRlIHRleHQKLXZpZXdTeW5jT2theT1TeW5jaHJvbml6ZWQKLXZpZXdTeW5jUmVzdGFydD1SZXN0YXJ0Ci12aWV3U3luY1B1Ymxpc2g9UmVwdWJsaXNoCi12aWV3U3luY1Jlc3RhcnRQdWJsaXNoPVJlc3RhcnQgJiByZXB1Ymxpc2gKLXZpZXdTeW5jUHVibGlzaGluZz1QdWJsaXNoaW5nLi4uCi0KLSMgLS0tIHNldCAyIC0tLQotIyBBY3Rpb25zCi1hY3Rpb25TdG9wMj1EaXNjb25uZWN0Ci1hY3Rpb25TdG9wVG9vbFRpcDI9RGlzY29ubmVjdCBmcm9tIHRoZSBzZXJ2ZXIKLQotIyBTdGF0dXMgY29sdW1uIHRleHQKLXZpZXdTdGF0dXNTdGFydGluZzQ9Q29ubmVjdGluZwotdmlld1N0YXR1c1N0YXJ0ZWQyPUNvbm5lY3RlZAotdmlld1N0YXR1c1N0b3BwaW5nND1EaXNjb25uZWN0aW5nCi12aWV3U3RhdHVzU3RvcHBlZDI9RGlzY29ubmVjdGVkCi0KLSMgU2VydmVyIFN0YXRlIHRleHQKLXZpZXdTeW5jT2theTI9U3luY2hyb25pemVkCi12aWV3U3luY1Jlc3RhcnQyPVJlY29ubmVjdAotdmlld1N5bmNQdWJsaXNoMj1SZXB1Ymxpc2gKLXZpZXdTeW5jUmVzdGFydFB1Ymxpc2gyPVJlY29ubmVjdCBhbmQgcmVwdWJsaXNoCi12aWV3U3luY1B1Ymxpc2hpbmcyPVB1Ymxpc2hpbmcuLi4KLQotCi0jIC0tLS0tLS0tLS0tLS0tLSBBY3Rpb24gU2V0cyAodG9vbGJhciBpY29uIGdyb3VwcykgLS0tLS0tLS0tLS0tLS0tCi0KLSMgU2VydmVycyBhY3Rpb24gc2V0Ci1hY3Rpb25TZXROZXdTZXJ2ZXI9Q3JlYXRlIFNlcnZlcgotCi0jIFJ1biBvbiBTZXJ2ZXIgYWN0aW9ucwotYWN0aW9uUnVuT25TZXJ2ZXI9UnVuIG9uIFNlcnZlci4uLgotYWN0aW9uRGVidWdPblNlcnZlcj1EZWJ1ZyBvbiBTZXJ2ZXIuLi4KLWFjdGlvblByb2ZpbGVPblNlcnZlcj1Qcm9maWxlIG9uIFNlcnZlci4uLgotcHJvY2Vzc05hbWU9UnVuIG9uIFNlcnZlcgotCi0KLSMgLS0tLS0tLS0tLS0tLS0tIFByZWZlcmVuY2VzIC0tLS0tLS0tLS0tLS0tLQotCi0jIE5hbWVzIG9mIHRoZSBwcmVmZXJlbmNlIHBhZ2VzCi1wcmVmZXJlbmNlUnVudGltZXNUaXRsZUxvbmc9U2VydmVyIFJ1bnRpbWUgRW52aXJvbm1lbnRzCi0KLSMgU2VydmVyIHByZWZlcmVuY2VzCi1wcmVmQXV0b1B1Ymxpc2g9QXV0b21hdGljYWxseSBwdWJsaXNoIHcmaGVuIHN0YXJ0aW5nIHNlcnZlcnMKLXByZWZTaG93T25BY3Rpdml0eT1TaG93ICZTZXJ2ZXJzIHZpZXcgd2hlbiBzZXJ2ZXIgc3RhdGUgY2hhbmdlcwotCi1wcmVmU2F2ZUVkaXRvcnM9U2F2ZSBkaXJ0eSBlZGl0b3JzIGJlZm9yZSBzdGFydGluZyB0aGUgc2VydmVyCi1wcmVmU2F2ZUVkaXRvcnNBbHdheXM9QSZsd2F5cwotcHJlZlNhdmVFZGl0b3JzTmV2ZXI9Jk5ldmVyCi1wcmVmU2F2ZUVkaXRvcnNQcm9tcHQ9JlByb21wdAotCi1wcmVmTGF1bmNoTW9kZT1XaGVuIHN3aXRjaGluZyB0byBhIGRpZmZlcmVudCBzZXJ2ZXIgbW9kZQotcHJlZkxhdW5jaE1vZGVSZXN0YXJ0PVJlJnN0YXJ0Ci1wcmVmTGF1bmNoTW9kZUNvbnRpbnVlPSZDb250aW51ZQotcHJlZkxhdW5jaE1vZGVQcm9tcHQ9UCZyb21wdAotCi1wcmVmTGF1bmNoTW9kZTI9V2hlbiBzd2l0Y2hpbmcgdGhlIHNlcnZlciBvdXQgb2YgZGVidWcgbW9kZQotcHJlZkxhdW5jaE1vZGUyUmVzdGFydD1SZXN0JmFydAotcHJlZkxhdW5jaE1vZGUyQnJlYWtwb2ludHM9RGlzYWJsZSAmYnJlYWtwb2ludHMKLXByZWZMYXVuY2hNb2RlMkNvbnRpbnVlPUNvbnRpbiZ1ZQotcHJlZkxhdW5jaE1vZGUyUHJvbXB0PVByJm9tcHQKLQotcHJlZkJyZWFrcG9pbnRzPVdoZW4gc3dpdGNoaW5nIHRoZSBzZXJ2ZXIgaW50byBkZWJ1ZyBtb2RlLCByZS1lbmFibGUgYnJlYWtwb2ludHMKLXByZWZCcmVha3BvaW50c0Fsd2F5cz1BbCZ3YXlzCi1wcmVmQnJlYWtwb2ludHNOZXZlcj1OJmV2ZXIKLXByZWZCcmVha3BvaW50c1Byb21wdD1Qcm8mbXB0Ci0KLXByZWZSZXN0YXJ0PVdoZW4gcmVxdWlyZWQsIHJlc3RhcnQgdGhlIHNlcnZlcgotcHJlZlJlc3RhcnRBbHdheXM9QWx3YSZ5cwotcHJlZlJlc3RhcnROZXZlcj1OZSZ2ZXIKLXByZWZSZXN0YXJ0UHJvbXB0PVByb21wJnQKLQotIyBQcm9qZWN0IHByb3BlcnRpZXMgcHJlZmVyZW5jZXMKLXByZWZQcm9qZWN0PVByb2plY3Q6Ci1wcmVmUHJvamVjdERlZmF1bHRTZXJ2ZXI9QWx3YXlzIHVzZSB0aGUgJmZvbGxvd2luZyBzZXJ2ZXIgd2hlbiBydW5uaW5nIHRoaXMgcHJvamVjdDoKLXByZWZQcm9qZWN0Tm90TW9kdWxlPVRoaXMgcHJvamVjdCBjYW5ub3QgYmUgdXNlZCB3aXRoIHNlcnZlcnMuCi1wcmVmUHJvamVjdE5vdENvbmZpZ3VyZWQ9VGhpcyBwcm9qZWN0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHNlcnZlcnMuCi1wcmVmUHJvamVjdE5vU2VydmVyPTxOb25lPgotCi1wcm9wU2VydmVySW5mb05hbWU9TmFtZToKLXByb3BTZXJ2ZXJJbmZvVHlwZT1UeXBlOgotcHJvcFNlcnZlckluZm9WZW5kb3I9VmVuZG9yOgotCi0jIFRvb2x0aXAKLXRvb2xUaXBFbmFibGVGb2N1cz1QcmVzcyAnRjYnIGZvciBGb2N1cy4KLXRvb2xUaXBEaXNhYmxlRm9jdXM9UHJlc3MgJ0VTQycgdG8gSGlkZS4KLQotIyBSdW50aW1lIEVudmlyb25tZW50cwotcHJlZmVyZW5jZVJ1bnRpbWVzRGVzY3JpcHRpb249QWRkLCByZW1vdmUsIG9yIGVkaXQgc2VydmVyIHJ1bnRpbWUgZW52aXJvbm1lbnRzLgotcHJlZmVyZW5jZVJ1bnRpbWVzVGFibGU9U2VydmVyIHJ1bnRpbWUgZSZudmlyb25tZW50czoKLQotCi0jIC0tLS0tLS0tLS0tLS0tLSBUYXNrcyAocHJvZ3Jlc3MgbW9uaXRvcnMpIC0tLS0tLS0tLS0tLS0tLQotCi0jIEdlbmVyYWwgdGFza3MKLXNhdmluZ1Rhc2s9U2F2aW5nIHswfS4KLWxvYWRpbmdUYXNrPUxvYWRpbmcgezB9LgotcGVyZm9ybWluZ1Rhc2tzPVBlcmZvcm1pbmcgdGFza3MuCi1sYXVuY2hpbmdDbGllbnRUYXNrPUxhdW5jaGluZyBjbGllbnQKLWpvYkluaXRpYWxpemluZz1Jbml0aWFsaXppbmcgU2VydmVyIFRvb2xzCi1qb2JSZXN0YXJ0aW5nPVJlc3RhcnRpbmcgezB9Ci1qb2JJbml0aWFsaXppbmdTZXJ2ZXJzVmlldz1Jbml0aWFsaXppbmcgU2VydmVycyB2aWV3Ci0KLSMgLS0tLS0tLS0tLS0tLS0tIERpYWxvZ3MgLS0tLS0tLS0tLS0tLS0tCi0KLSMgRGVsZXRlIFNlcnZlciBkaWFsb2cKLWRlbGV0ZVNlcnZlckRpYWxvZ1RpdGxlPURlbGV0ZSBTZXJ2ZXIKLWRlbGV0ZVNlcnZlckRpYWxvZ01lc3NhZ2U9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB7MH0/Ci1kZWxldGVTZXJ2ZXJEaWFsb2dNZXNzYWdlTWFueT1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSB7MH0gc2VydmVycz8KLWRlbGV0ZVNlcnZlckRpYWxvZ0xvb3NlQ29uZmlndXJhdGlvbnM9RGVsZXRlIHVudXNlZCBzZXJ2ZXIgY29uZmlndXJhdGlvbihzKQotZGVsZXRlU2VydmVyRGlhbG9nUnVubmluZ1NlcnZlcj1EZWxldGUgcnVubmluZyBzZXJ2ZXIocykKLWRlbGV0ZVNlcnZlckRpYWxvZ1J1bm5pbmdTZXJ2ZXJTdG9wPVN0b3Agc2VydmVyKHMpIGJlZm9yZSBkZWxldGluZwotZGVsZXRlU2VydmVyVGFzaz1EZWxldGluZyBzZXJ2ZXIocykuLi4KLQotIyBDcmVhdGUgU2VydmVyIFByb2plY3QgZGlhbG9nCi1jcmVhdGVTZXJ2ZXJQcm9qZWN0RGlhbG9nVGl0bGU9Q3JlYXRlIFNlcnZlciBQcm9qZWN0Ci1jcmVhdGVTZXJ2ZXJQcm9qZWN0RGlhbG9nTWVzc2FnZT1EbyB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgc2VydmVyIHByb2plY3Qgd2l0aCB0aGUgbmFtZSB7MH0/Ci0KLSMgVGVybWluYXRlIFNlcnZlciBkaWFsb2cKLXRlcm1pbmF0ZVNlcnZlckRpYWxvZ1RpdGxlPVRlcm1pbmF0ZSBTZXJ2ZXIKLXRlcm1pbmF0ZVNlcnZlckRpYWxvZ01lc3NhZ2U9U2VydmVyIHswfSBpcyBub3QgcmVzcG9uZGluZy4gRG8geW91IHdhbnQgdG8gdGVybWluYXRlIHRoaXMgc2VydmVyPyBDbGljayBPSyB0byB0ZXJtaW5hdGUgdGhlIHNlcnZlciBvciBjbGljayBDYW5jZWwgdG8gY29udGludWUgd2FpdGluZy4KLQotIyBTZXJ2ZXIgcmVzb3VyY2UgZGlydHkgZGlhbG9nCi1yZXNvdXJjZURpcnR5RGlhbG9nVGl0bGU9U2VydmVyIFJlc291cmNlIERpcnR5Ci1yZXNvdXJjZURpcnR5RGlhbG9nTWVzc2FnZT1UaGUgc2VydmVyIHJlc291cmNlIHswfSBoYXMgdW5zYXZlZCBjaGFuZ2VzLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLXJlc291cmNlRGlydHlEaWFsb2dDb250aW51ZT1Db250aW51ZQotCi0jIEdlbmVyYWwgZGlhbG9ncwotZGVmYXVsdERpYWxvZ1RpdGxlPVNlcnZlcgotZGlhbG9nUmVtZW1iZXI9JlJlbWVtYmVyIG15IGRlY2lzaW9uCi0KLSMgcmVzdGFydCB3YXJuaW5nIGRpYWxvZwotZGlhbG9nTW9kZVdhcm5pbmdSdW49VGhlIHNlcnZlciBpcyBub3QgaW4gcnVuIG1vZGUuIFNlbGVjdCBmcm9tIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6Ci1kaWFsb2dNb2RlV2FybmluZ0RlYnVnPVRoZSBzZXJ2ZXIgaXMgbm90IHJ1bm5pbmcgaW4gZGVidWcgbW9kZS4gU2VsZWN0IGZyb20gb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKLWRpYWxvZ01vZGVXYXJuaW5nUHJvZmlsZT1UaGUgc2VydmVyIGlzIG5vdCBydW5uaW5nIGluIHByb2ZpbGluZyBtb2RlLiBTZWxlY3QgZnJvbSBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOgotZGlhbG9nTW9kZVdhcm5pbmdSZXN0YXJ0PSZTd2l0Y2ggbW9kZSAod2lsbCByZXN0YXJ0IGlmIG5lY2Vzc2FyeSkKLWRpYWxvZ01vZGVXYXJuaW5nQnJlYWtwb2ludHM9RGlzYWJsZSAmYnJlYWtwb2ludHMgYW5kIGNvbnRpbnVlCi1kaWFsb2dNb2RlV2FybmluZ0NvbnRpbnVlPSZDb250aW51ZSBpbiB0aGUgY3VycmVudCBtb2RlCi0KLWRpYWxvZ0JyZWFrcG9pbnRzPVRoZSBzZXJ2ZXIgaXMgcnVubmluZyBpbiBkZWJ1ZyBtb2RlIGJ1dCBicmVha3BvaW50cyBoYXZlIGJlZW4gZGlzYWJsZWQuIFNlbGVjdCBmcm9tIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6Ci1kaWFsb2dCcmVha3BvaW50c1JlZW5hYmxlPVJlLSZlbmFibGUgYnJlYWtwb2ludHMKLWRpYWxvZ0JyZWFrcG9pbnRzQ29udGludWU9JkNvbnRpbnVlIHdpdGhvdXQgZGVidWdnaW5nCi0KLWRpYWxvZ1Jlc3RhcnQ9VGhlIHNlcnZlciBtYXkgbmVlZCBiZSByZXN0YXJ0ZWQuIERvIHlvdSB3YW50IHRvIHJlc3RhcnQgdGhlIHNlcnZlcj8KLWRpYWxvZ1Jlc3RhcnRSZXN0YXJ0PVJlJnN0YXJ0IHNlcnZlcgotZGlhbG9nUmVzdGFydENvbnRpbnVlPSZDb250aW51ZSB3aXRob3V0IHJlc3RhcnRpbmcKLQotIyBNb25pdG9yIGRpYWxvZwotZGlhbG9nTW9uaXRvclRpdGxlPU1vbml0b3JpbmcgUG9ydHMKLWRpYWxvZ01vbml0b3JEZXNjcmlwdGlvbj1UaGUgZm9sbG93aW5nIHBvcnRzIGFyZSBiZWluZyBtb25pdG9yZWQgb24gc2VydmVyIHswfToKLWRpYWxvZ01vbml0b3JBZGREZXNjcmlwdGlvbj1UaGUgc2VydmVyIHswfSBoYXMgdGhlIGZvbGxvd2luZyBwb3J0cyB0aGF0IGNhbiBiZSBtb25pdG9yZWQ6Ci1kaWFsb2dNb25pdG9yQ29sdW1uUG9ydD1TZXJ2ZXIgUG9ydAotZGlhbG9nTW9uaXRvckNvbHVtblR5cGU9VHlwZQotZGlhbG9nTW9uaXRvckNvbHVtbk1vbml0b3JQb3J0PU1vbml0b3IgUG9ydAotZGlhbG9nTW9uaXRvckNvbHVtbkNvbnRlbnRUeXBlPUNvbnRlbnQgVHlwZQotZGlhbG9nTW9uaXRvckNvbHVtblN0YXR1cz1TdGF0dXMKLWRpYWxvZ01vbml0b3JNb25pdG9yUG9ydD1Nb25pdG9yIHBvcnQ6Ci1kaWFsb2dNb25pdG9yQ29udGVudFR5cGU9Q29udGVudCB0eXBlOgotZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlQWxsPUFsbAotZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlV2ViPVdlYgotZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlV2ViU2VydmljZXM9V2ViU2VydmljZXMKLWRpYWxvZ01vbml0b3JOb25lPTxub25lPgotCi1kaWFsb2dQdWJsaXNoQ2xlYW49Q2xlYW4gd2lsbCBkaXNjYXJkIGFsbCBwdWJsaXNoIHN0YXRlIGFuZCByZXB1Ymxpc2ggZnJvbSBzY3JhdGNoLiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2xlYW4gYWxsIHB1Ymxpc2hlZCByZXNvdXJjZXM/Ci0KLXN0YXJ0PVN0YXJ0Ci1zdG9wPVN0b3AKLXN0YXJ0ZWQ9U3RhcnRlZAotc3RvcHBlZD1TdG9wcGVkCi0KLSMgQ29uZmlybSBydW50aW1lIHJlbW92YWwKLWRpYWxvZ1J1bnRpbWVJblVzZT1UaGUgcnVudGltZSBlbnZpcm9ubWVudCBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZCBhbmQgZGVsZXRpbmcgaXQgd2lsbCBjYXVzZSBjb21waWxhdGlvbiBvciBydW4gdGltZSBwcm9ibGVtcy4gRGVsZXRlIHRoZSBydW50aW1lIGVudmlyb25tZW50IGFueXdheT8KLWRpYWxvZ1J1bnRpbWVEZWxldGVTZXJ2ZXJzPURlbGV0ZSBhbGwgYWZmZWN0ZWQgc2VydmVycz8KLWRpYWxvZ1J1bnRpbWVSZW1vdmVUYXJnZXRzPVJlbW92ZSB0aGlzIHJ1bnRpbWUgZW52aXJvbm1lbnQgZnJvbSB0YXJnZXRlZCBwcm9qZWN0cz8KLQotIyBydW50aW1lIGxvY2F0b3Igc2VhcmNoIGRpYWxvZwotZGlhbG9nUnVudGltZVNlYXJjaFRpdGxlPVNlYXJjaCBGb3IgUnVudGltZSBFbnZpcm9ubWVudHMKLWRpYWxvZ1J1bnRpbWVTZWFyY2hNZXNzYWdlPVNlbGVjdCB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIHNlYXJjaCBmb3Igc2VydmVyIHJ1bnRpbWUgZW52aXJvbm1lbnRzOgotZGlhbG9nUnVudGltZVNlYXJjaFByb2dyZXNzPVNlYXJjaGluZyBmb3Igc2VydmVyIHJ1bnRpbWUgZW52aXJvbm1lbnRzLi4uCi0KLSMgQ2FuJ3QgYWRkIHJlbW92ZQotZGlhbG9nQWRkUmVtb3ZlTW9kdWxlc05vbmU9VGhlcmUgYXJlIG5vIHJlc291cmNlcyB0aGF0IGNhbiBiZSBhZGRlZCBvciByZW1vdmVkIGZyb20gdGhlIHNlcnZlci4KLQotZGlhbG9nUmVtb3ZlTW9kdWxlQ29uZmlybT1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIHRoZSByZXNvdXJjZSBmcm9tIHRoZSBzZXJ2ZXI/Ci1kaWFsb2dSZW1vdmVNb2R1bGVzQ29uZmlybT1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIHRoZSByZXNvdXJjZXMgZnJvbSB0aGUgc2VydmVyPwotCi0jIC0tLS0tLS0tLS0tLS0tLSBNaXNjIFVJIC0tLS0tLS0tLS0tLS0tLQotCi0jIHJ1bnRpbWUgY29tcG9zaXRlCi1ydW50aW1lVHlwZUNvbXBUcmVlPVNlbGVjdCB0aGUgdHlwZSBvZiAmcnVudGltZSBlbnZpcm9ubWVudDoKLXNlcnZlclR5cGVDb21wTGFiZWw9U2VsZWN0IHRoZSAmc2VydmVyIHR5cGU6Ci1zZXJ2ZXJOYW1lPVNlcnZlciBuYSZtZToKLXNlcnZlck5hbWVEZWZhdWx0PVJlc2UmdCBkZWZhdWx0Ci1jb25maWd1cmVSdW50aW1lcz0mQ29uZmlndXJlIHJ1bnRpbWUgZW52aXJvbm1lbnRzLi4uCi1hZGRSdW50aW1lPSZBZGQuLi4KLQotIyBpbnN0YWxsYWJsZSBzZXJ2ZXIgY29tcG9zaXRlCi1pbnN0YWxsYWJsZVNlcnZlckNvbXBUcmVlPVNlbGVjdCB0aGUgJnNlcnZlciBzdXBwb3J0IHRvIGluc3RhbGw6Ci1pbnN0YWxsYWJsZVNlcnZlckxpbms9RG93bmxvYWQgYWRkaXRpb25hbCBzZXJ2ZXIgYWRhcHRlcnMKLWluc3RhbGxhYmxlU2VydmVyTG9jYWw9RXhhbWluaW5nIGxvY2FsIGNvbmZpZ3VyYXRpb24KLWluc3RhbGxhYmxlU2VydmVyU2VhcmNoaW5nPVNlYXJjaGluZyB7MH0KLQotIyBtaXNjIGNvbXBvc2l0ZXMKLWhvc3RuYW1lPVNlcnZlcidzICZob3N0IG5hbWU6Ci0KLSMgU2VydmVyIGxhdW5jaCBjb25maWd1cmF0aW9uIHRhYgotc2VydmVyTGF1bmNoRGVzY3JpcHRpb249VGhpcyBsYXVuY2ggY29uZmlndXJhdGlvbiBjYW4gYmUgdXNlZCB0byBsYXVuY2ggdGhlIHNlcnZlciBzcGVjaWZpZWQgYmVsb3cuIFRvIGFjY2VzcyBmdXJ0aGVyIG9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBzZXJ2ZXIsIG9wZW4gdGhlIHNlcnZlcidzIGVkaXRvciBmcm9tIHRoZSBTZXJ2ZXJzIHZpZXcuCi1zZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiPVNlcnZlcgotc2VydmVyTGF1bmNoU2VydmVyPVNlcnZlcjoKLXNlcnZlckxhdW5jaFJ1bnRpbWU9UnVudGltZSBFbnZpcm9ubWVudDoKLXNlcnZlckxhdW5jaEhvc3Q9SG9zdCBuYW1lOgotcnVuT25TZXJ2ZXJMYXVuY2hDb25maWdOYW1lPXswfQotCi0jIEVycm9yIE1lc3NhZ2VzCi1lcnJvckRpYWxvZ1RpdGxlPVNlcnZlciBFcnJvcgotZXJyb3JTZXJ2ZXJBbHJlYWR5UnVubmluZz1TZXJ2ZXIgYWxyZWFkeSBydW5uaW5nCi1lcnJvck5vU2VydmVyU2VsZWN0ZWQ9Tm8gc2VydmVyIHNlbGVjdGVkCi1lcnJvckludmFsaWRTZXJ2ZXI9VGhlIHNlcnZlciBpcyBpbnZhbGlkIG9yIG1pc3NpbmcKLWVycm9yQ291bGROb3RDcmVhdGVTZXJ2ZXJQcm9qZWN0PUNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIHByb2plY3QKLWVycm9yQ291bGROb3RDcmVhdGVTZXJ2ZXJQcm9qZWN0U3RhdHVzPUNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIHByb2plY3Q6IHswfQotZXJyb3JOb0FydGlmYWN0PVRoZSBzZWxlY3Rpb24gZGlkIG5vdCBjb250YWluIGFueSByZXNvdXJjZXMgdGhhdCBjYW4gcnVuIG9uIGEgc2VydmVyLgotZXJyb3JMYXVuY2hDb25maWc9VGhpcyBsYXVuY2ggY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkIGFuZCBtYXkgYmUgb3V0IG9mIHN5bmMgd2l0aCB0aGUgd29ya3NwYWNlCi1lcnJvck5vTW9kdWxlcz1UaGUgc2VsZWN0aW9uIGlzIG5vdCB3aXRoaW4gYSB2YWxpZCBtb2R1bGUuCi1lcnJvck5vU2VydmVyPVRoZSBzZWxlY3Rpb24gY2Fubm90IGJlIHJ1biBvbiBhbnkgc2VydmVyLgotZXJyb3JDb3VsZE5vdFNhdmVQcmVmZXJlbmNlPUNvdWxkIG5vdCBzYXZlIHNlcnZlciBwcmVmZXJlbmNlIGluZm9ybWF0aW9uLgotZXJyb3JFZGl0b3JDYW50U2F2ZT1UaGUgc2VydmVyIGNhbm5vdCBiZSBzYXZlZCBmb3IgdGhlIGZvbGxvd2luZyByZWFzb25zOgotZXJyb3JFZGl0b3I9Q291bGQgbm90IG9wZW4gZWRpdG9yIGJlY2F1c2UgezB9IGlzIG5vdCBhIHZhbGlkIHNlcnZlci4gVXNlIE9wZW4gV2l0aCB0byBvcGVuIHRoaXMgZmlsZSB3aXRoIGEgZGlmZmVyZW50IGVkaXRvci4KLWVycm9yVmVyc2lvbkxldmVsPVRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB2ZXJzaW9uIHsxfSBvZiB0aGUgezB9IHNwZWNpZmljYXRpb24uCi1lcnJvck1pc3NpbmdDb25maWd1cmF0aW9uPVRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBpcyBtaXNzaW5nIG9yIGludmFsaWQKLWVycm9yQ29uZmlndXJhdGlvbk5vdEFjY2Vzc2libGU9VGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGlzIG5vdCBhY2Nlc3NpYmxlLiBUaGUgezB9IHByb2plY3QgaXMgY2xvc2VkLgotZXJyb3JSb290TW9kdWxlPUNvdWxkIG5vdCBmaW5kIGEgdmFsaWQgcGFyZW50IG1vZHVsZSB0byBhZGQgdG8gdGhlIHNlcnZlci4KLWVycm9yRHVwbGljYXRlTmFtZT1UaGUgbmFtZSBpcyBhbHJlYWR5IGluIHVzZS4gU3BlY2lmeSBhIGRpZmZlcmVudCBuYW1lLgotCi0jIEluZm8gbWVzc2FnZXMKLWluZm9Ob1J1bnRpbWVzRm91bmQ9Tm8gbmV3IHNlcnZlciBydW50aW1lIGVudmlyb25tZW50cyB3ZXJlIGZvdW5kLgotCi0jIERlZmF1bHQgc2VydmVyIGNyZWF0aW9uIG5hbWVzCi0jIHswfSB3aWxsIGJlIHJlcGxhY2VkIGJ5IGEgbnVtYmVyIGlmIHRoZSBnaXZlbiBuYW1lIGlzIGFscmVhZHkgYmVpbmcgdXNlZAotZGVmYXVsdFNlcnZlclByb2plY3ROYW1lPVNlcnZlcnN7MH0KLQotIyBVc2VkIHdoZW4gYSBuYW1lIGNhbid0IGJlIGZvdW5kCi1lbGVtZW50VW5rbm93bk5hbWU9PHVua25vd24+Ci0KLWNvbHVtbk5hbWU9TmFtZQotY29sdW1uVHlwZT1UeXBlCi0KLWFkZD0mQWRkLi4uCi1lZGl0PSZFZGl0Li4uCi1yZW1vdmU9JlJlbW92ZQotc2VhcmNoPSZTZWFyY2guLi4KLQotY2xpZW50RGVmYXVsdE5hbWU9RG8gbm90aGluZwotY2xpZW50RGVmYXVsdERlc2NyaXB0aW9uPUxhdW5jaCB0aGUgbW9kdWxlIG9uIHRoZSBzZXJ2ZXIgYnV0IGRvIG5vdCBicmluZyB1cCBhIGNsaWVudCBhcHBsaWNhdGlvbi4KLQotIyBNb2R1bGUgZGVjb3JhdG9yCi1tb2R1bGVEZWNvcmF0b3JQcm9qZWN0PXswfSAoezF9KQotCi0jIFVzZWQgZm9yIGRpc3BsYXlpbmcgdGltZSAoc28gZmFyIG9ubHkgdXNlZCBpbiB0b29sdGlwKQotbWludXRlcz17MH0gbWludXRlcyAKLW1vZHVsZXM9ezB9IG1vZHVsZXMKLQotIyAtLS0tLS0tLS0tLS0tLS0gRWRpdG9yIHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tCi0KLXNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZVRpdGxlPU92ZXJ2aWV3Ci1zZXJ2ZXJFZGl0b3JPdmVydmlld0dlbmVyYWxTZWN0aW9uPUdlbmVyYWwgSW5mb3JtYXRpb24KLXNlcnZlckVkaXRvck92ZXJ2aWV3R2VuZXJhbERlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIGhvc3QgbmFtZSBhbmQgb3RoZXIgY29tbW9uIHNldHRpbmdzLgotc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJOYW1lPVNlcnZlciBuYW1lOgotc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJOYW1lQ29tbWFuZD1zZXQgc2VydmVyIG5hbWUKLXNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyQ29uZmlndXJhdGlvblBhdGg9Q29uZmlndXJhdGlvbiBwYXRoOgotc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJDb25maWd1cmF0aW9uQnJvd3NlPUJyb3dzZS4uLgotc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJDb25maWd1cmF0aW9uQnJvd3NlTWVzc2FnZT1TcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi1zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckhvc3RuYW1lPUhvc3QgbmFtZToKLXNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVySG9zdG5hbWVDb21tYW5kPXNldCBob3N0IG5hbWUKLXNlcnZlckVkaXRvck92ZXJ2aWV3UnVudGltZT1SdW50aW1lIEVudmlyb25tZW50Ogotc2VydmVyRWRpdG9yT3ZlcnZpZXdSdW50aW1lRWRpdD1FZGl0Ci1zZXJ2ZXJFZGl0b3JPdmVydmlld1J1bnRpbWVDb21tYW5kPXNldCBydW50aW1lIGVudmlyb25tZW50Ci0KLXNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaFNlY3Rpb249UHVibGlzaGluZwotc2VydmVyRWRpdG9yT3ZlcnZpZXdQdWJsaXNoRGVzY3JpcHRpb249TW9kaWZ5IHNldHRpbmdzIGZvciBwdWJsaXNoaW5nLgotc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaERpc2FibGU9TmV2ZXIgcHVibGlzaCBhdXRvbWF0aWNhbGx5Ci1zZXJ2ZXJFZGl0b3JPdmVydmlld0F1dG9QdWJsaXNoRW5hYmxlZFJlc291cmNlPUF1dG9tYXRpY2FsbHkgcHVibGlzaCB3aGVuIHJlc291cmNlcyBjaGFuZ2UKLXNlcnZlckVkaXRvck92ZXJ2aWV3QXV0b1B1Ymxpc2hFbmFibGVkQnVpbGQ9QXV0b21hdGljYWxseSBwdWJsaXNoIGFmdGVyIGEgYnVpbGQgZXZlbnQKLXNlcnZlckVkaXRvck92ZXJ2aWV3QXV0b1B1Ymxpc2hFbmFibGVkSW50ZXJ2YWw9UHVibGlzaGluZyBpbnRlcnZhbCAoaW4gc2Vjb25kcyk6Ci1zZXJ2ZXJFZGl0b3JPdmVydmlld1B1Ymxpc2hDb21tYW5kPW1vZGlmeSBwdWJsaXNoIHNldHRpbmdzCi1zZXJ2ZXJFZGl0b3JPdmVydmlld1B1Ymxpc2hlcnM9U2VsZWN0IHB1Ymxpc2hpbmcgYWN0aW9uczoKLXNlcnZlckVkaXRvck92ZXJ2aWV3VGltZW91dFNlY3Rpb249VGltZW91dHMKLXNlcnZlckVkaXRvck92ZXJ2aWV3VGltZW91dERlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIHRpbWUgbGltaXQgdG8gY29tcGxldGUgc2VydmVyIG9wZXJhdGlvbnMuCi1zZXJ2ZXJFZGl0b3JPdmVydmlld1N0YXJ0VGltZW91dD1TdGFydCAoaW4gc2Vjb25kcyk6Ci1zZXJ2ZXJFZGl0b3JPdmVydmlld1N0b3BUaW1lb3V0PVN0b3AgKGluIHNlY29uZHMpOgotc2VydmVyRWRpdG9yT3ZlcnZpZXdUaW1lb3V0Q29tbWFuZD1tb2RpZnkgdGltZW91dCBzZXR0aW5ncwotc2VydmVyRWRpdG9yT3ZlcnZpZXdPcGVuTGF1bmNoQ29uZmlndXJhdGlvbj1PcGVuIGxhdW5jaCBjb25maWd1cmF0aW9uCi0KLXNlcnZlckVkaXRvclNhdmluZz1QZXJmb3JtaW5nIHNlcnZlciBzYXZlIG9wZXJhdGlvbi4KLQotIyBNZW51IGl0ZW1zLiB7MH0gd2lsbCBiZSByZXBsYWNlZCBieSBvbmUgb2YgdGhlIHh4eEVkaXRvckFjdGlvblh4eCBmaWVsZHMKLSMgZnJvbSBiZWxvdy4gQEN0cmwrWiBpcyB0aGUgbWVudSBtbmVtb25pYwotZWRpdG9yVW5kb0VuYWJsZWQ9VW5kbyB7MH1AQ3RybCtaCi1lZGl0b3JVbmRvRGlzYWJsZWQ9VW5kb0BDdHJsK1oKLWVkaXRvclJlZG9FbmFibGVkPVJlZG8gezB9QEN0cmwrWQotZWRpdG9yUmVkb0Rpc2FibGVkPVJlZG9AQ3RybCtZCi0KLWVkaXRvclNhdmVFcnJvckRpYWxvZz1TYXZlIFByb2JsZW1zCi1lZGl0b3JTYXZlRXJyb3JNZXNzYWdlPUVycm9yIHdoaWxlIHNhdmluZy4gezB9Ci0KLWVkaXRvclJlYWRPbmx5PVJlYWQgT25seQotZWRpdG9yV3JpdGFibGU9V3JpdGFibGUKLWVkaXRvclJlYWRPbmx5RmlsZXM9UmVhZCBPbmx5IGZpbGVzOiB7MH0KLQotZWRpdG9yU2VydmVyRWRpdG9yPVNlcnZlciBFZGl0b3IKLWVkaXRvclByb21wdElycmV2ZXJzaWJsZT1UaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkPwotZWRpdG9yUmVuYW1lRmlsZXM9VGhlIHNlcnZlciBoYXMgYmVlbiByZW5hbWVkLiBEbyB5b3Ugd2FudCB0byByZW5hbWUgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZXMgdG8gbWF0Y2g/Ci0KLSMgbWVzc2FnZSBpZiBhIGRpcnR5IHJlc291cmNlIGlzIGRlbGV0ZWQKLWVkaXRvclJlc291cmNlRGVsZXRlVGl0bGU9U2VydmVyIERlbGV0ZWQKLWVkaXRvclJlc291cmNlRGVsZXRlU2VydmVyTWVzc2FnZT1UaGUgc2VydmVyIHswfSBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIGZpbGUgc3lzdGVtLiBEbyB5b3Ugd2FudCB0byBzYXZlIHlvdXIgY2hhbmdlcyBvciBjbG9zZSB0aGUgZWRpdG9yIHdpdGhvdXQgc2F2aW5nPwotZWRpdG9yUmVzb3VyY2VEZWxldGVTYXZlPVNhdmUKLQotZWRpdG9yUmVzb3VyY2VNb2RpZmllZFRpdGxlPUZpbGUgQ2hhbmdlZAotZWRpdG9yU2VydmVyTW9kaWZpZWRNZXNzYWdlPVRoZSBzZXJ2ZXIgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgZmlsZSBzeXN0ZW0uIERvIHlvdSB3YW50IHRvIGxvYWQgdGhlIGNoYW5nZXM/Ci0KLWVkaXRvclZhbGlkYXRlRWRpdEZhaWx1cmVNZXNzYWdlPVRoZSBzZXJ2ZXIgY2Fubm90IGJlIGVkaXRlZC4KLWVkaXRvclJlYWRPbmx5TWVzc2FnZT1GaWxlKHMpIGJlaW5nIGVkaXRlZCBoYXZlIGJlY29tZSByZWFkLW9ubHkuIFRoZSBlZGl0b3Igd2lsbCBiZWNvbWUgcmVhZC1vbmx5IGFuZCBjaGFuZ2VzIHdpbGwgYmUgbG9zdC4KLQotZWRpdG9yUmVzb3VyY2VXYXJuVGl0bGU9U2VydmVyIE1vZGlmaWNhdGlvbiBXYXJuaW5nCi1lZGl0b3JSZXNvdXJjZVdhcm5NZXNzYWdlPVRoZSBzZXJ2ZXIgeW91IGFyZSBtb2RpZnlpbmcgaXMgcmVhZC1vbmx5LiBBbGwgY2hhbmdlcyB3aWxsIGJlIGxvc3QgYmVjYXVzZSB0aGUgc2VydmVyIGNhbm5vdCBiZSBzYXZlZC4KLQotYXVkaW9QcmVmU2VsZWN0RmlsZT1TZWxlY3QgQXVkaW8gRmlsZQotYXVkaW9QcmVmRW5hYmxlPSZFbmFibGUgc291bmRzCi1hdWRpb1ByZWZWb2x1bWU9JlZvbHVtZToKLWF1ZGlvUHJlZlNvdW5kcz0mU291bmRzOgotYXVkaW9QcmVmU291bmQ9U291bmQKLWF1ZGlvUHJlZkZpbGU9QXVkaW8gRmlsZQotYXVkaW9QcmVmUGxheT0mUGxheQotYXVkaW9QcmVmQnJvd3NlPSZCcm93c2UuLi4KLWF1ZGlvUHJlZlJlc2V0PSZSZXNldAotCi1hdWRpb1Vua25vd249KHVua25vd24pCi1hdWRpb0RlZmF1bHQ9KGRlZmF1bHQpCi1hdWRpb05vbmU9KG5vbmUpCi0KLWVycm9yU3RhcnRpbmdNb25pdG9yPUNvdWxkIG5vdCBzdGFydCB0aGUgc2VydmVyIG1vbml0b3I6IHswfQotCi1pbnRlcm5hbFdlYkJyb3dzZXJOYW1lPUludGVybmFsIFdlYiBCcm93c2VyCi1TZXJ2ZXJzVmlldzJfbm9TZXJ2ZXJzPU5vIHNlcnZlcnMgYXZhaWxhYmxlLiBEZWZpbmUgYSBuZXcgc2VydmVyIGZyb20gdGhlIDxhPm5ldyBzZXJ2ZXIgd2l6YXJkPC9hPi4uLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTW9kdWxlTGFiZWxEZWNvcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL01vZHVsZUxhYmVsRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMTJkOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTW9kdWxlTGFiZWxEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5CYXNlTGFiZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIE1vZHVsZUxhYmVsRGVjb3JhdG9yIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxEZWNvcmF0b3IgewotCXB1YmxpYyBNb2R1bGVMYWJlbERlY29yYXRvcigpIHsKLQkJc3VwZXIoZmFsc2UpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBkZWNvcmF0ZUltYWdlKEltYWdlIGltYWdlLCBPYmplY3QgZWxlbWVudCkgewotCQl0cnkgewotCQkJSU1vZHVsZSBtb2R1bGUgPSBudWxsOwotCQkJCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCQltb2R1bGUgPSAoSU1vZHVsZSkgZWxlbWVudDsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gKChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQpLm1vZHVsZTsKLQkJCQltb2R1bGUgPSBtb2R1bGVzW21vZHVsZXMubGVuZ3RoIC0gMV07Ci0JCQl9Ci0JCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBtb2R1bGUuZ2V0UHJvamVjdCgpOwotCQkJCi0JCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJCi0JCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZGVjb3JhdGVJbWFnZShpbWFnZSwgcHJvamVjdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGVjb3JhdGVUZXh0KFN0cmluZyB0ZXh0LCBPYmplY3QgZWxlbWVudCkgewotCQl0cnkgewotCQkJSU1vZHVsZSBtb2R1bGUgPSBudWxsOwotCQkJCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCQltb2R1bGUgPSAoSU1vZHVsZSkgZWxlbWVudDsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gKChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQpLm1vZHVsZTsKLQkJCQltb2R1bGUgPSBtb2R1bGVzW21vZHVsZXMubGVuZ3RoIC0gMV07Ci0JCQl9Ci0JCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBtb2R1bGUuZ2V0UHJvamVjdCgpOwotCQkJCi0JCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJCi0JCQlpZiAoIXByb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh0ZXh0KSkKLQkJCQl0ZXh0ID0gTkxTLmJpbmQoTWVzc2FnZXMubW9kdWxlRGVjb3JhdG9yUHJvamVjdCwgbmV3IFN0cmluZ1tdIHt0ZXh0LCBwcm9qZWN0LmdldE5hbWUoKX0pOwotCQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmRlY29yYXRlVGV4dCh0ZXh0LCBwcm9qZWN0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL01vZHVsZUxhYmVsRGVjb3JhdG9yMi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTW9kdWxlTGFiZWxEZWNvcmF0b3IyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMzFmYTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTW9kdWxlTGFiZWxEZWNvcmF0b3IyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5CYXNlTGFiZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIE1vZHVsZUxhYmVsRGVjb3JhdG9yMiBleHRlbmRzIEJhc2VMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IgewotCXB1YmxpYyBNb2R1bGVMYWJlbERlY29yYXRvcjIoKSB7Ci0JCXN1cGVyKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWNvcmF0ZShPYmplY3QgZWxlbWVudCwgSURlY29yYXRpb24gZGVjb3JhdGlvbikgewotCQl0cnkgewotCQkJSU1vZHVsZSBtb2R1bGUgPSBudWxsOwotCQkJCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCQlkZWNvcmF0aW9uLmFkZFN1ZmZpeCgiICoiKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1vZHVsZSkgewotCQkJCW1vZHVsZSA9IChJTW9kdWxlKSBlbGVtZW50OwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSAoKE1vZHVsZVNlcnZlcikgZWxlbWVudCkubW9kdWxlOwotCQkJCW1vZHVsZSA9IG1vZHVsZXNbbW9kdWxlcy5sZW5ndGggLSAxXTsKLQkJCX0KLQkJCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBtb2R1bGUuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCVN0cmluZyB0ZXh0ID0gbW9kdWxlLmdldE5hbWUoKTsKLQkJCQotCQkJaWYgKCFwcm9qZWN0LmdldE5hbWUoKS5lcXVhbHModGV4dCkpCi0JCQkJZGVjb3JhdGlvbi5hZGRTdWZmaXgoIiAoIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIikiKTsKLQkJCQkvL3RleHQgPSBOTFMuYmluZChNZXNzYWdlcy5tb2R1bGVEZWNvcmF0b3JQcm9qZWN0LCBuZXcgU3RyaW5nW10ge3RleHQsIHByb2plY3QuZ2V0TmFtZSgpfSk7Ci0JCQkvL3JldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5kZWNvcmF0ZVRleHQodGV4dCwgcHJvamVjdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvT3ZlcmxheUltYWdlRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvT3ZlcmxheUltYWdlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTI2NWUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL092ZXJsYXlJbWFnZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1VJVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLS8qKgotICogQSBPdmVybGF5SW1hZ2VEZXNjcmlwdG9yIGNvbnNpc3RzIG9mIGEgbWFpbiBpY29uIGFuZCBvbmUgb3IgbW9yZSBvdmVybGF5cy4KLSAqIFRoZSBvdmVybGF5cyBhcmUgY29tcHV0ZWQgYWNjb3JkaW5nIHRvIGZsYWdzIHNldCBvbiBjcmVhdGlvbiBvZiB0aGUgZGVzY3JpcHRvci4KLSAqLwotcHVibGljIGNsYXNzIE92ZXJsYXlJbWFnZURlc2NyaXB0b3IgZXh0ZW5kcyBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IgewotCS8vIGZsYWcgdG8gcmVuZGVyIHRoZSBlcnJvciBvdmVybGF5Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRVJST1IgPSAweDAwMTsKLQotCXByaXZhdGUgSW1hZ2UgZkJhc2VJbWFnZTsKLQlwcml2YXRlIGludCBmRmxhZ3M7Ci0JcHJpdmF0ZSBQb2ludCBmU2l6ZTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgT3ZlcmxheUltYWdlRGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZUltYWdlIGFuIGltYWdlIGRlc2NyaXB0b3IgdXNlZCBhcyB0aGUgYmFzZSBpbWFnZQotCSAqIEBwYXJhbSBmbGFncyBmbGFncyBpbmRpY2F0aW5nIHdoaWNoIGFkb3JubWVudHMgYXJlIHRvIGJlIHJlbmRlcmVkCi0JICovCi0JcHVibGljIE92ZXJsYXlJbWFnZURlc2NyaXB0b3IoSW1hZ2UgYmFzZUltYWdlLCBpbnQgZmxhZ3MpIHsKLQkJc2V0QmFzZUltYWdlKGJhc2VJbWFnZSk7Ci0JCXNldEZsYWdzKGZsYWdzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciNnZXRTaXplKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpIHsKLQkJaWYgKGZTaXplID09IG51bGwpIHsKLQkJCUltYWdlRGF0YSBkYXRhID0gZ2V0QmFzZUltYWdlKCkuZ2V0SW1hZ2VEYXRhKCk7Ci0JCQlzZXRTaXplKG5ldyBQb2ludChkYXRhLndpZHRoLCBkYXRhLmhlaWdodCkpOwotCQl9Ci0JCXJldHVybiBmU2l6ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgT3ZlcmxheUltYWdlRGVzY3JpcHRvcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJT3ZlcmxheUltYWdlRGVzY3JpcHRvciBvdGhlciA9IChPdmVybGF5SW1hZ2VEZXNjcmlwdG9yKSBvYmplY3Q7Ci0JCXJldHVybiAoZ2V0QmFzZUltYWdlKCkuZXF1YWxzKG90aGVyLmdldEJhc2VJbWFnZSgpKSAmJiBnZXRGbGFncygpID09IG90aGVyLmdldEZsYWdzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGdldEJhc2VJbWFnZSgpLmhhc2hDb2RlKCkgfCBnZXRGbGFncygpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciNkcmF3Q29tcG9zaXRlSW1hZ2UoaW50LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZHJhd0NvbXBvc2l0ZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlJbWFnZURhdGEgYmcgPSBnZXRCYXNlSW1hZ2UoKS5nZXRJbWFnZURhdGEoKTsKLQkJaWYgKGJnID09IG51bGwpCi0JCQliZyA9IERFRkFVTFRfSU1BR0VfREFUQTsKLQotCQlkcmF3SW1hZ2UoYmcsIDAsIDApOwotCQlkcmF3T3ZlcmxheXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYW55IG92ZXJsYXlzIHRvIHRoZSBpbWFnZSBhcyBzcGVjaWZpZWQgaW4gdGhlIGZsYWdzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRyYXdPdmVybGF5cygpIHsKLQkJaW50IGZsYWdzID0gZ2V0RmxhZ3MoKTsKLQkJSW1hZ2VEYXRhIGRhdGEgPSBudWxsOwotCQlpZiAoKGZsYWdzICYgRVJST1IpICE9IDApIHsKLQkJCWRhdGEgPSBEZWJ1Z1VJVG9vbHMuZ2V0SW1hZ2UoSURlYnVnVUlDb25zdGFudHMuSU1HX09WUl9FUlJPUikuZ2V0SW1hZ2VEYXRhKCk7Ci0JCQlpbnQgeCA9IGdldFNpemUoKS54IC0gZGF0YS53aWR0aDsKLQkJCWRyYXdJbWFnZShkYXRhLCB4LCAwKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0QmFzZUltYWdlKCkgewotCQlyZXR1cm4gZkJhc2VJbWFnZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRCYXNlSW1hZ2UoSW1hZ2UgYmFzZUltYWdlKSB7Ci0JCWZCYXNlSW1hZ2UgPSBiYXNlSW1hZ2U7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRGbGFncygpIHsKLQkJcmV0dXJuIGZGbGFnczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGbGFncyhpbnQgZmxhZ3MpIHsKLQkJZkZsYWdzID0gZmxhZ3M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2l6ZShQb2ludCBzaXplKSB7Ci0JCWZTaXplID0gc2l6ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUHJvZ3Jlc3NVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9Qcm9ncmVzc1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVhM2U4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9Qcm9ncmVzc1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotLyoqCi0gKiBQcm9ncmVzcyBNb25pdG9yIHV0aWxpdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9ncmVzc1V0aWwgewotCS8qKgotCSAqIFByb2dyZXNzVXRpbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgUHJvZ3Jlc3NVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZhbGlkIHByb2dyZXNzIG1vbml0b3IuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0TW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlCi0JICogY3VycmVudCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKiBAcGFyYW0gdGlja3MgaW50Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRTdWJNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRpY2tzKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlCi0JICogY3VycmVudCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciBudWxsCi0JICogQHBhcmFtIHRpY2tzIGEgbnVtYmVyIG9mIHRpY2tzCi0JICogQHBhcmFtIHN0eWxlIGEgc3R5bGUKLQkgKiBAcmV0dXJuIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRTdWJNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRpY2tzLCBpbnQgc3R5bGUpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlpZiAobW9uaXRvciBpbnN0YW5jZW9mIE51bGxQcm9ncmVzc01vbml0b3IpCi0JCQlyZXR1cm4gbW9uaXRvcjsKLQkJcmV0dXJuIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgdGlja3MsIHN0eWxlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUHJvamVjdFByb3BlcnR5UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUHJvamVjdFByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTQ3ZjBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1Byb2plY3RQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKLS8qKgotICogUHJvcGVydHlQYWdlIGZvciBJUHJvamVjdHMuIEl0IHNob3dzIHRoZSBzZXJ2ZXIgcHJlZmVyZW5jZSBmb3IgdGhlIHByb2plY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0UHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIHsKLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQlwcm90ZWN0ZWQgSU1vZHVsZSBtb2R1bGU7Ci0JcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOwotCi0JcHJvdGVjdGVkIFRhYmxlIHRhYmxlOwotCXByb3RlY3RlZCBpbnQgY291bnQ7Ci0JcHJvdGVjdGVkIElTZXJ2ZXIgZGVmYXVsdFNlcnZlcjsKLQotCS8qKgotCSAqIFByb2plY3RQcm9wZXJ0eVBhZ2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUHJvamVjdFByb3BlcnR5UGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGJvZHkgb2YgdGhlIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdHJ5IHsKLQkJCUlBZGFwdGFibGUgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJCXByb2plY3QgPSAoSVByb2plY3QpIGVsZW1lbnQuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcyk7Ci0JCQkvL2lmIChlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQkvLwlwcm9qZWN0ID0gKElQcm9qZWN0KSBlbGVtZW50OwotCQkJCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA1OwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkJCi0JCQkvKkxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5wcmVmUHJvamVjdERlc2NyaXB0aW9uKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOyovCi0JCQkKLQkJCW1vZHVsZSA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlKHByb2plY3QpOwotCQkJaWYgKG1vZHVsZSA9PSBudWxsKSB7Ci0JCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5wcmVmUHJvamVjdE5vdE1vZHVsZSk7Ci0JCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCWRhdGEudmVydGljYWxJbmRlbnQgPSA1OwotCQkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQl9IGVsc2UgewotCQkJCUlNb2R1bGVUeXBlIG10ID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKTsKLQkJCQlpZiAobXQgIT0gbnVsbCkgewotCQkJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5wcmVmUHJvamVjdCk7Ci0JCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJCQkJZGF0YS52ZXJ0aWNhbEluZGVudCA9IDU7Ci0JCQkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkJCQotCQkJCQlMYWJlbCBtb2R1bGVLaW5kID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCQkJCWRhdGEudmVydGljYWxJbmRlbnQgPSA1OwotCQkJCQltb2R1bGVLaW5kLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkJCW1vZHVsZUtpbmQuc2V0VGV4dChtb2R1bGUuZ2V0TmFtZSgpICsgIiAoIiArIG10LmdldE5hbWUoKSArICIpIik7Ci0JCQkJfQotCQkJCQotCQkJCWRlZmF1bHRTZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmdldERlZmF1bHRTZXJ2ZXIobW9kdWxlKTsKLQkJCQkKLQkJCQlmaW5hbCBJU2VydmVyW10gc2VydmVycyA9IGdldFNlcnZlcnNCeVN1cHBvcnRlZE1vZHVsZShtb2R1bGUpOwotCQkJCWlmIChzZXJ2ZXJzID09IG51bGwgfHwgc2VydmVycy5sZW5ndGggPT0gMCkgewotCQkJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5wcmVmUHJvamVjdE5vdENvbmZpZ3VyZWQpOwotCQkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCQlkYXRhLnZlcnRpY2FsSW5kZW50ID0gNTsKLQkJCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQl9IGVsc2UgewotCQkJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5wcmVmUHJvamVjdERlZmF1bHRTZXJ2ZXIpOwotCQkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCQlkYXRhLnZlcnRpY2FsSW5kZW50ID0gNTsKLQkJCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQkJCi0JCQkJCXRhYmxlID0gbmV3IFRhYmxlKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwpOwotCQkJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxNTsKLQkJCQkJZGF0YS5oZWlnaHRIaW50ID0gOTA7Ci0JCQkJCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkJCQotCQkJCQkvLyBhZGQgbm9uZSBvcHRpb24KLQkJCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJCWl0ZW0uc2V0VGV4dChNZXNzYWdlcy5wcmVmUHJvamVjdE5vU2VydmVyKTsKLQkJCQkJLy9pdGVtLnNldEltYWdlKCk7Ci0JCQkJCQotCQkJCQlpbnQgc2l6ZTIgPSBzZXJ2ZXJzLmxlbmd0aDsKLQkJCQkJY291bnQgPSAwOwotCQkJCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCQlpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJCQkJaXRlbS5zZXRUZXh0KGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChzZXJ2ZXJzW2pdKSk7Ci0JCQkJCQlpdGVtLnNldEltYWdlKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uoc2VydmVyc1tqXSkpOwotCQkJCQkJaXRlbS5zZXREYXRhKHNlcnZlcnNbal0pOwotCQkJCQkJaWYgKHNlcnZlcnNbal0uZXF1YWxzKGRlZmF1bHRTZXJ2ZXIpKQotCQkJCQkJCWNvdW50ID0gaiArIDE7Ci0JCQkJCX0KLQkJCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQkJCQotCQkJCQl0YWJsZS5zZXRTZWxlY3Rpb24oY291bnQpOwotCQkJCQkKLQkJCQkJdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQkJCWludCBpbmRleCA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJCQkJaWYgKGluZGV4ID09IDApCi0JCQkJCQkJCXNlcnZlciA9IG51bGw7Ci0JCQkJCQkJZWxzZSBpZiAoaW5kZXggPiAwKQotCQkJCQkJCQlzZXJ2ZXIgPSBzZXJ2ZXJzW2luZGV4LTFdOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgY3JlYXRpbmcgcHJvamVjdCBwcm9wZXJ0eSBwYWdlIiwgZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBzZXJ2ZXJzIHRoYXQgdGhpcyBtb2R1bGUgaXMgY29uZmlndXJlZCBvbi4KLQkgKgotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHNlcnZlcnMKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIElTZXJ2ZXJbXSBnZXRTZXJ2ZXJzQnlTdXBwb3J0ZWRNb2R1bGUoSU1vZHVsZSBtb2R1bGUpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJU2VydmVyWzBdOwotCQkKLQkJLy8gZG8gaXQgdGhlIHNsb3cgd2F5IC0gZ28gdGhyb3VnaCBhbGwgc2VydmVycyBhbmQKLQkJLy8gc2VlIGlmIHRoaXMgbW9kdWxlIGlzIGNvbmZpZ3VyZWQgaW4gaXQKLQkJTGlzdDxJU2VydmVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJU2VydmVyPigpOwotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoc2VydmVyc1tpXS5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJgotCQkJCQlzZXJ2ZXJzW2ldLmdldFNlcnZlclR5cGUoKS5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwgJiYKLQkJCQkJU2VydmVyVXRpbC5pc1N1cHBvcnRlZE1vZHVsZShzZXJ2ZXJzW2ldLmdldFNlcnZlclR5cGUoKS5nZXRSdW50aW1lVHlwZSgpLmdldE1vZHVsZVR5cGVzKCksIG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkpKQotCQkJCQlsaXN0LmFkZChzZXJ2ZXJzW2ldKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgSVNlcnZlcltsaXN0LnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJaWYgKHRhYmxlICE9IG51bGwpIHsKLQkJCXRhYmxlLnNlbGVjdChjb3VudCk7Ci0JCQlzZXJ2ZXIgPSBkZWZhdWx0U2VydmVyOwotCQl9Ci0JCQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTZXJ2ZXJDb3JlLnNldERlZmF1bHRTZXJ2ZXIobW9kdWxlLCBzZXJ2ZXIsIG51bGwpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3Igc2V0dGluZyBwcmVmZXJyZWQgc2VydmVyIiwgZSk7Ci0JCQkJfQotCQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcihNZXNzYWdlcy5lcnJvckNvdWxkTm90U2F2ZVByZWZlcmVuY2UsIGUuZ2V0U3RhdHVzKCkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1J1bnRpbWVNYXJrZXJSZXNvbHV0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9SdW50aW1lTWFya2VyUmVzb2x1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTI1MmFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1J1bnRpbWVNYXJrZXJSZXNvbHV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci0KLXB1YmxpYyBjbGFzcyBSdW50aW1lTWFya2VyUmVzb2x1dGlvbiBpbXBsZW1lbnRzIElNYXJrZXJSZXNvbHV0aW9uMiB7Ci0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLndpek5ld1J1bnRpbWVEZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLndpek5ld1NlcnZlclJ1bnRpbWVDcmVhdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElNYXJrZXIgbWFya2VyKSB7Ci0JCXNob3dQcmVmZXJlbmNlUGFnZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3dQcmVmZXJlbmNlUGFnZSgpIHsKLQkJU3RyaW5nIGlkID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJlZmVyZW5jZVBhZ2UiOwotCQlTdHJpbmcgaWQyID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucnVudGltZS5wcmVmZXJlbmNlUGFnZSI7Ci0JCWZpbmFsIFByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihudWxsLCBpZDIsIG5ldyBTdHJpbmdbXSB7IGlkLCBpZDIgfSwgbnVsbCk7Ci0JCXJldHVybiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9SdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1J1bnRpbWVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmI4NmYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1J1bnRpbWVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSVJ1bnRpbWVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLmZhY2V0cy5GYWNldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLlJ1bnRpbWVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuVGFza1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5XaXphcmRUYXNrVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5OZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci0vKioKLSAqIFRoZSBwcmVmZXJlbmNlIHBhZ2UgdGhhdCBob2xkcyBzZXJ2ZXIgcnVudGltZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBlZGl0OwotCXByb3RlY3RlZCBCdXR0b24gcmVtb3ZlOwotCXByb3RlY3RlZCBMYWJlbCBwYXRoTGFiZWw7Ci0JUnVudGltZUNvbXBvc2l0ZSBydW50aW1lQ29tcDsKLQkvKioKLQkgKiBSdW50aW1lUHJlZmVyZW5jZXNQYWdlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJ1bnRpbWVQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQkJU2VydmVyQ29yZS5hZGRSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIodGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgcHJlZmVyZW5jZSBvcHRpb25zLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgQ29udGV4dElkcy5QUkVGX0dFTkVSQUwpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoNCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoMyk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5wcmVmZXJlbmNlUnVudGltZXNEZXNjcmlwdGlvbik7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS52ZXJ0aWNhbEluZGVudCA9IDU7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJlZmVyZW5jZVJ1bnRpbWVzVGFibGUpOwotCQkKLQkJcnVudGltZUNvbXAgPSBuZXcgUnVudGltZUNvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FLCBuZXcgUnVudGltZUNvbXBvc2l0ZS5SdW50aW1lU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW50aW1lU2VsZWN0ZWQoSVJ1bnRpbWUgcnVudGltZSkgewotCQkJCWlmIChydW50aW1lID09IG51bGwpIHsKLQkJCQkJZWRpdC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlwYXRoTGFiZWwuc2V0VGV4dCgiIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBydW50aW1lLnZhbGlkYXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCQkJQ29sb3IgYyA9IHBhdGhMYWJlbC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JCQkJCQlwYXRoTGFiZWwuc2V0Rm9yZWdyb3VuZChjKTsKLQkJCQkJCXBhdGhMYWJlbC5zZXRUZXh0KHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCQl9IGVsc2UgaWYgKHJ1bnRpbWUuZ2V0TG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQlwYXRoTGFiZWwuc2V0Rm9yZWdyb3VuZChlZGl0LmdldEZvcmVncm91bmQoKSk7Ci0JCQkJCQlwYXRoTGFiZWwuc2V0VGV4dChydW50aW1lLmdldExvY2F0aW9uKCkgKyAiIik7Ci0JCQkJCX0gZWxzZQotCQkJCQkJcGF0aExhYmVsLnNldFRleHQoIiIpOwotCQkJCQkKLQkJCQkJaWYgKHJ1bnRpbWUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKSAhPSBudWxsKQotCQkJCQkJCWVkaXQuc2V0RW5hYmxlZChTZXJ2ZXJVSVBsdWdpbi5oYXNXaXphcmRGcmFnbWVudChydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSkpOwotCQkJCQkJZWxzZQotCQkJCQkJCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlyZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXJ1bnRpbWVDb21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQkJCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscygzKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJYnV0dG9uQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJYnV0dG9uQ29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJQnV0dG9uIGFkZCA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLmFkZCk7Ci0JCWZpbmFsIFJ1bnRpbWVDb21wb3NpdGUgcnVudGltZUNvbXAyID0gcnVudGltZUNvbXA7Ci0JCWFkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoc2hvd1dpemFyZChudWxsKSA9PSBXaW5kb3cuQ0FOQ0VMKQotCQkJCQlyZXR1cm47Ci0JCQkJcnVudGltZUNvbXAyLnJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQllZGl0ID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMuZWRpdCk7Ci0JCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVkaXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IHJ1bnRpbWVDb21wMi5nZXRTZWxlY3RlZFJ1bnRpbWUoKTsKLQkJCQlpZiAocnVudGltZSAhPSBudWxsKSB7Ci0JCQkJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZVdvcmtpbmdDb3B5ID0gcnVudGltZS5jcmVhdGVXb3JraW5nQ29weSgpOwotCQkJCQlpZiAoc2hvd1dpemFyZChydW50aW1lV29ya2luZ0NvcHkpICE9IFdpbmRvdy5DQU5DRUwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcnVudGltZUNvbXAyLnJlZnJlc2gocnVudGltZSk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlyZW1vdmUgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5yZW1vdmUpOwotCQlyZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJUnVudGltZSBydW50aW1lID0gcnVudGltZUNvbXAuZ2V0U2VsZWN0ZWRSdW50aW1lKCk7Ci0JCQkJaWYgKHJlbW92ZVJ1bnRpbWUocnVudGltZSkpCi0JCQkJCXJ1bnRpbWVDb21wMi5yZW1vdmUocnVudGltZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQnV0dG9uIHNlYXJjaCA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLnNlYXJjaCk7Ci0JCWRhdGEgPSAoR3JpZERhdGEpIHNlYXJjaC5nZXRMYXlvdXREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxJbmRlbnQgPSA5OwotCQlzZWFyY2guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gc2VsZWN0IGEgdGFyZ2V0IGRpcmVjdG9yeSBmb3IgdGhlIHNlYXJjaAotCQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlyZWN0b3J5RGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhnZXRTaGVsbCgpKTsKLQkJCQkJZGlyZWN0b3J5RGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuZGlhbG9nUnVudGltZVNlYXJjaE1lc3NhZ2UpOwotCQkJCQlkaXJlY3RvcnlEaWFsb2cuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dSdW50aW1lU2VhcmNoVGl0bGUpOwotCi0JCQkJCVN0cmluZyBwYXRoU3RyID0gZGlyZWN0b3J5RGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKHBhdGhTdHIgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQkJCi0JCQkJCWZpbmFsIElQYXRoIHBhdGggPSBuZXcgUGF0aChwYXRoU3RyKTsKLQkJCQkJCi0JCQkJCWZpbmFsIFByb2dyZXNzTW9uaXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNoZWxsKCkpOwotCQkJCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4oZmFsc2UpOwotCQkJCQlkaWFsb2cuc2V0Q2FuY2VsYWJsZSh0cnVlKTsKLQkJCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gZGlhbG9nLmdldFByb2dyZXNzTW9uaXRvcigpOwotCQkJCQlmaW5hbCBJUnVudGltZUxvY2F0b3JbXSBsb2NhdG9ycyA9IFNlcnZlclBsdWdpbi5nZXRSdW50aW1lTG9jYXRvcnMoKTsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuZGlhbG9nUnVudGltZVNlYXJjaFByb2dyZXNzLCAxMDAgKiBsb2NhdG9ycy5sZW5ndGggKyAxMCk7Ci0JCQkJCWZpbmFsIExpc3Q8SVJ1bnRpbWVXb3JraW5nQ29weT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWVXb3JraW5nQ29weT4oKTsKLQkJCQkJCi0JCQkJCWZpbmFsIElSdW50aW1lTG9jYXRvci5JUnVudGltZVNlYXJjaExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElSdW50aW1lTG9jYXRvci5JUnVudGltZVNlYXJjaExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVudGltZUZvdW5kKGZpbmFsIElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSkgewotCQkJCQkJCWRpYWxvZy5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCW1vbml0b3Iuc3ViVGFzayhydW50aW1lLmdldE5hbWUoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQkJCQlsaXN0LmFkZChydW50aW1lKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQkJCi0JCQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yMikgewotCQkJCQkJCWludCBzaXplID0gbG9jYXRvcnMubGVuZ3RoOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQkJCWlmICghbW9uaXRvcjIuaXNDYW5jZWxlZCgpKQotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlsb2NhdG9yc1tpXS5zZWFyY2hGb3JSdW50aW1lcyhwYXRoLCBsaXN0ZW5lciwgbW9uaXRvcjIpOwotCQkJCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQkJCQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLAotCQkJCQkJCQkJCQkJCSJFcnJvciBsb2NhdGluZyBydW50aW1lczogIiArIGxvY2F0b3JzW2ldLmdldElkKCksIGNlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChUcmFjZS5JTkZPKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19JTkZPLCAiRG9uZSBzZWFyY2giKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCWRpYWxvZy5ydW4odHJ1ZSwgdHJ1ZSwgcnVubmFibGUpOwotCQkJCQkKLQkJCQkJaWYgKFRyYWNlLkZJTkVSKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVIsICJGb3VuZCBydW50aW1lczogIiArIGxpc3Quc2l6ZSgpKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKCFtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJaWYgKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKGdldFNoZWxsKCksIE1lc3NhZ2VzLmluZm9Ob1J1bnRpbWVzRm91bmQpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCW1vbml0b3Iud29ya2VkKDUpOwotCQkJCQkJaWYgKFRyYWNlLkZJTkVSKSB7Ci0JCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVSLCAiUmVtb3ZpbmcgZHVwbGljYXRlcyIpOwotCQkJCQkJfQotCQkJCQkJTGlzdDxJUnVudGltZT4gZ29vZCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWU+KCk7Ci0JCQkJCQlJdGVyYXRvciBpdGVyYXRvcjIgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZSAoaXRlcmF0b3IyLmhhc05leHQoKSkgewotCQkJCQkJCWJvb2xlYW4gZHVwID0gZmFsc2U7Ci0JCQkJCQkJSVJ1bnRpbWUgd2MgPSAoSVJ1bnRpbWUpIGl0ZXJhdG9yMi5uZXh0KCk7Ci0JCQkJCQkJCi0JCQkJCQkJSVJ1bnRpbWVbXSBydW50aW1lcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZXMoKTsKLQkJCQkJCQlpZiAocnVudGltZXMgIT0gbnVsbCkgewotCQkJCQkJCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCQkJCWlmIChydW50aW1lc1tpXS5nZXRMb2NhdGlvbigpICE9IG51bGwgJiYgcnVudGltZXNbaV0uZ2V0TG9jYXRpb24oKS5lcXVhbHMod2MuZ2V0TG9jYXRpb24oKSkpCi0JCQkJCQkJCQkJZHVwID0gdHJ1ZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIWR1cCkKLQkJCQkJCQkJZ29vZC5hZGQod2MpOwotCQkJCQkJfQotCQkJCQkJbW9uaXRvci53b3JrZWQoNSk7Ci0JCQkJCQkKLQkJCQkJCWlmIChUcmFjZS5GSU5FUikgewotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FUiwgIkFkZGluZyBydW50aW1lczogIiArIGdvb2Quc2l6ZSgpKTsKLQkJCQkJCX0KLQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ29vZC5pdGVyYXRvcigpOwotCQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCUlSdW50aW1lV29ya2luZ0NvcHkgd2MgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCXdjLnNhdmUoZmFsc2UsIG1vbml0b3IpOwotCQkJCQkJfQotCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCX0KLQkJCQkJZGlhbG9nLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBmaW5kaW5nIHJ1bnRpbWVzIiwgZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJ1bnRpbWVDb21wLnJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlwYXRoTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhdGhMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlUnVudGltZShJUnVudGltZSBydW50aW1lKSB7Ci0JCWlmIChydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gY2hlY2sgZm9yIHVzZQotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlMaXN0PElTZXJ2ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXI+KCk7Ci0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChydW50aW1lLmVxdWFscyhzZXJ2ZXJzW2ldLmdldFJ1bnRpbWUoKSkpCi0JCQkJCWxpc3QuYWRkKHNlcnZlcnNbaV0pOwotCQkJfQotCQl9Ci0JCQotCQlib29sZWFuIGluVXNlID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpblVzZSA9IEZhY2V0VXRpbC5pc1J1bnRpbWVUYXJnZXRlZChydW50aW1lKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCS8vIGlnbm9yZSAtIGZhY2V0IGZyYW1ld29yayBub3QgZm91bmQKLQkJfQotCQkKLQkJaWYgKCFsaXN0LmlzRW1wdHkoKSB8fCBpblVzZSkgewotCQkJRGVsZXRlUnVudGltZURpYWxvZyBkaWFsb2cgPSBuZXcgRGVsZXRlUnVudGltZURpYWxvZyhnZXRTaGVsbCgpLCAhbGlzdC5pc0VtcHR5KCksIGluVXNlKTsKLQkJCWlmIChkaWFsb2cub3BlbigpICE9IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlpZiAoZGlhbG9nLmlzRGVsZXRlU2VydmVycygpKSB7Ci0JCQkJSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGl0ZXIubmV4dCgpOwotCQkJCQkJc2VydmVyLmRlbGV0ZSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBkZWxldGluZyBzZXJ2ZXIiLCBlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChkaWFsb2cuaXNSZW1vdmVUYXJnZXRzKCkpIHsKLQkJCQl0cnkgewotCQkJCQlGYWNldFV0aWwucmVtb3ZlVGFyZ2V0cyhydW50aW1lLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCQkvLyBpZ25vcmUgLSBmYWNldCBmcmFtZXdvcmsgbm90IGZvdW5kCi0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQl0cnkgewotCQkJcnVudGltZS5kZWxldGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgZGVsZXRpbmcgcnVudGltZSIsIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IHNob3dXaXphcmQoZmluYWwgSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lV29ya2luZ0NvcHkpIHsKLQkJU3RyaW5nIHRpdGxlID0gbnVsbDsKLQkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSBudWxsOwotCQlUYXNrTW9kZWwgdGFza01vZGVsID0gbmV3IFRhc2tNb2RlbCgpOwotCQlpZiAocnVudGltZVdvcmtpbmdDb3B5ID09IG51bGwpIHsKLQkJCXRpdGxlID0gTWVzc2FnZXMud2l6TmV3UnVudGltZVdpemFyZFRpdGxlOwotCQkJZnJhZ21lbnQgPSBuZXcgV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgewotCQkJCQlsaXN0LmFkZChuZXcgTmV3UnVudGltZVdpemFyZEZyYWdtZW50KCkpOwotCQkJCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5TYXZlUnVudGltZUZyYWdtZW50KTsKLQkJCQl9Ci0JCQl9OwotCQl9IGVsc2UgewotCQkJdGl0bGUgPSBNZXNzYWdlcy53aXpFZGl0UnVudGltZVdpemFyZFRpdGxlOwotCQkJZmluYWwgV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQyID0gU2VydmVyVUlQbHVnaW4uZ2V0V2l6YXJkRnJhZ21lbnQocnVudGltZVdvcmtpbmdDb3B5LmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSk7Ci0JCQlpZiAoZnJhZ21lbnQyID09IG51bGwpIHsKLQkJCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJldHVybiBXaW5kb3cuQ0FOQ0VMOwotCQkJfQotCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FLCBydW50aW1lV29ya2luZ0NvcHkpOwotCQkJZnJhZ21lbnQgPSBuZXcgV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgewotCQkJCQlsaXN0LmFkZChmcmFnbWVudDIpOwotCQkJCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5TYXZlUnVudGltZUZyYWdtZW50KTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCVRhc2tXaXphcmQgd2l6YXJkID0gbmV3IFRhc2tXaXphcmQodGl0bGUsIGZyYWdtZW50LCB0YXNrTW9kZWwpOwotCQl3aXphcmQuc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQpOwotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVJ1bnRpbWUgZ2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsMikgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDI7Ci0JCXJldHVybiAoSVJ1bnRpbWUpIHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHByZWZlcmVuY2UgcGFnZSB1c2luZyB0aGUgcGFzc2VkIHdvcmtiZW5jaC4KLQkgKgotCSAqIEBwYXJhbSB3b3JrYmVuY2ggdGhlIGN1cnJlbnQgd29ya2JlbmNoCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsgCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlI3NldFZpc2libGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkKLQkJCXNldFRpdGxlKE1lc3NhZ2VzLnByZWZlcmVuY2VSdW50aW1lc1RpdGxlTG9uZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVNlcnZlckNvcmUucmVtb3ZlUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVudGltZUNoYW5nZWQoZmluYWwgSVJ1bnRpbWUgcnVudGltZSkgewotCQlmaW5hbCBSdW50aW1lQ29tcG9zaXRlIHJ1bnRpbWVDb21wMiA9IHRoaXMucnVudGltZUNvbXA7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJCXJ1bnRpbWVDb21wMi5yZWZyZXNoKHJ1bnRpbWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW50aW1lQWRkZWQoZmluYWwgSVJ1bnRpbWUgcnVudGltZSkgewotCQlmaW5hbCBSdW50aW1lQ29tcG9zaXRlIHJ1bnRpbWVDb21wMiA9IHRoaXMucnVudGltZUNvbXA7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJCXJ1bnRpbWVDb21wMi5hZGQocnVudGltZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQlwdWJsaWMgdm9pZCBydW50aW1lUmVtb3ZlZChmaW5hbCBJUnVudGltZSBydW50aW1lKSB7Ci0JCWZpbmFsIFJ1bnRpbWVDb21wb3NpdGUgcnVudGltZUNvbXAyID0gdGhpcy5ydW50aW1lQ29tcDsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpewotCQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQkJcnVudGltZUNvbXAyLnJlbW92ZShydW50aW1lKTsKLQkJCX0KLQkJfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NXVFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NXVFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc3NDljZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLS8qKgotICogU1dUIFV0aWxpdHkgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBGb250TWV0cmljcyBmb250TWV0cmljczsKLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0aWFsaXplRGlhbG9nVW5pdHMoQ29udHJvbCB0ZXN0Q29udHJvbCkgewotCQkvLyBDb21wdXRlIGFuZCBzdG9yZSBhIGZvbnQgbWV0cmljCi0JCUdDIGdjID0gbmV3IEdDKHRlc3RDb250cm9sKTsKLQkJZ2Muc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQlmb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgd2lkdGggaGludCBmb3IgYSBidXR0b24gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRCdXR0b25XaWR0aEhpbnQoQnV0dG9uIGJ1dHRvbikgewotCQlpbnQgd2lkdGhIaW50ID0gRGlhbG9nLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7Ci0JCXJldHVybiBNYXRoLm1heCh3aWR0aEhpbnQsIGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLngpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBidXR0b24gd2l0aCB0aGUgc3RhbmRhcmQgc2l6ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcCB0aGUgY29tcG9uZW50IHRvIGFkZCB0aGUgYnV0dG9uIHRvCi0JICogQHBhcmFtIGxhYmVsIHRoZSBidXR0b24gbGFiZWwKLQkgKiBAcmV0dXJuIGEgYnV0dG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBjb21wLCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQkJYi5zZXRUZXh0KGxhYmVsKTsKLQkJaWYgKGZvbnRNZXRyaWNzID09IG51bGwpCi0JCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoY29tcCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBnZXRCdXR0b25XaWR0aEhpbnQoYik7Ci0JCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGI7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgRExVcyB0byBwaXhlbHMuCi0JICogCi0JICogQHBhcmFtIGNvbXAgYSBjb21wb25lbnQKLQkgKiBAcGFyYW0geCBwaXhlbHMKLQkgKiBAcmV0dXJuIGRsdXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhDb21wb3NpdGUgY29tcCwgaW50IHgpIHsKLQkJaWYgKGZvbnRNZXRyaWNzID09IG51bGwpCi0JCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoY29tcCk7Ci0JCXJldHVybiBEaWFsb2cuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoZm9udE1ldHJpY3MsIHgpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgRExVcyB0byBwaXhlbHMuCi0JICogCi0JICogQHBhcmFtIGNvbXAgYSBjb21wb25lbnQKLQkgKiBAcGFyYW0geSBwaXhlbHMKLQkgKiBAcmV0dXJuIGRsdXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoQ29tcG9zaXRlIGNvbXAsIGludCB5KSB7Ci0JCWlmIChmb250TWV0cmljcyA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKGNvbXApOwotCQlyZXR1cm4gRGlhbG9nLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhmb250TWV0cmljcywgeSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB0b29sdGlwIG9mIGEgc3Bpbm5lciB0aGF0IHJlcHJlc2VudHMgYSB0aW1lIGluIHNlY29uZHMuCi0JICogCi0JICogQHBhcmFtIHNwaW5uZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3Bpbm5lclRvb2x0aXAoU3Bpbm5lciBzcGlubmVyKSB7CQkKLQkJaW50IHNlY29uZHMgPSBzcGlubmVyLmdldFNlbGVjdGlvbigpOwotCQlTdHJpbmcgdG9vbHRpcFRleHQ7Ci0JCWlmIChzZWNvbmRzIDw9IDYwKQotCQkJdG9vbHRpcFRleHQgPSBudWxsOwotCQllbHNlIGlmICgoc2Vjb25kcyAlIDYwKSA9PSAwKSB7IC8vIHRoZSBzZWNvbmRzIGFyZSBleGFjdCBtaW51dGVzCi0JCQlpbnQgbWludXRlcyA9IHNlY29uZHMgLyA2MDsKLQkJCXRvb2x0aXBUZXh0ID0gTkxTLmJpbmQoTWVzc2FnZXMubWludXRlcywgbWludXRlcyArICIiKTsKLQkJfSBlbHNlIHsKLQkJCWludCBtaW51dGVzID0gc2Vjb25kcyAvIDYwOwotCQkJaW50IG1vZFNlYyA9IChzZWNvbmRzICUgNjApOwotCQkJU3RyaW5nIHNlY29uZHNUZXh0ID0gKG1vZFNlYyA8IDEwKSA/ICIwIiArIG1vZFNlYyA6IEludGVnZXIudG9TdHJpbmcobW9kU2VjKTsgCi0JCQl0b29sdGlwVGV4dCA9IE5MUy5iaW5kKE1lc3NhZ2VzLm1pbnV0ZXMsIG1pbnV0ZXMgKyAiOiIgKyBzZWNvbmRzVGV4dCk7Ci0JCX0KLQkJc3Bpbm5lci5zZXRUb29sVGlwVGV4dCh0b29sdGlwVGV4dCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NhdmVFZGl0b3JQcm9tcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2F2ZUVkaXRvclByb21wdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZDIwNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2F2ZUVkaXRvclByb21wdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnVUlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBTYXZlRWRpdG9yUHJvbXB0ZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2F2ZUVkaXRvclByb21wdGVyIHsgCi0JCi0JcHJpdmF0ZSBTdHJpbmcgY2FjaGVkU2F2ZUJlZm9yZUxhdW5jaDsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzYXZlQWxsRWRpdG9ycygpIHsKLQkJSVdvcmtiZW5jaCB3ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJU3RyaW5nIHNhdmVCZWZvcmVMYXVuY2ggPSBEZWJ1Z1VJVG9vbHMuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKG9yZy5lY2xpcHNlLmRlYnVnLmludGVybmFsLnVpLklJbnRlcm5hbERlYnVnVUlDb25zdGFudHMuUFJFRl9TQVZFX0RJUlRZX0VESVRPUlNfQkVGT1JFX0xBVU5DSCk7Ci0JCWlmIChzYXZlQmVmb3JlTGF1bmNoLmVxdWFsc0lnbm9yZUNhc2Uob3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5BTFdBWVMpKXsKLQkJCURpc3BsYXkgZCA9UGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCk7Ci0JCQlkLmFzeW5jRXhlYyhuZXcgU2F2ZUFsbEVkaXRvcnNSdW5uYWJsZSh3LGZhbHNlKSk7Ci0JCX0KLQkJZWxzZSBpZiAoc2F2ZUJlZm9yZUxhdW5jaC5lcXVhbHNJZ25vcmVDYXNlKG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuUFJPTVBUKSl7Ci0JCQlEaXNwbGF5IGQgPVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCQkJZC5hc3luY0V4ZWMobmV3IFNhdmVBbGxFZGl0b3JzUnVubmFibGUodyx0cnVlKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBTYXZlQWxsRWRpdG9yc1J1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGV7Ci0JCUlXb3JrYmVuY2ggdzsKLQkJYm9vbGVhbiBjb25maXJtOwotCQlwdWJsaWMgU2F2ZUFsbEVkaXRvcnNSdW5uYWJsZShJV29ya2JlbmNoIHcsIGJvb2xlYW4gY29uZmlybSl7Ci0JCQl0aGlzLncgPSB3OwotCQkJdGhpcy5jb25maXJtID0gY29uZmlybTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdy5zYXZlQWxsRWRpdG9ycyhjb25maXJtKTsKLQkJfQotCX0KLQkJCi0JLyoqCi0JICogU2V0cyA8Y29kZT5vcmcuZWNsaXBzZS5kZWJ1Zy5pbnRlcm5hbC51aS5JSW50ZXJuYWxEZWJ1Z1VJQ29uc3RhbnRzLlBSRUZfU0FWRV9ESVJUWV9FRElUT1JTX0JFRk9SRV9MQVVOQ0g8L2NvZGU+IHRvIAotCSAqIHRoZSBnaXZlbiB2YWx1ZS4gVGhlIGdpdmVuIHZhbHVlIHNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQkgKiA8dWw+Ci0JICogPGxpPjxjb2RlPm9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuQUxXQVlTPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPm9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuTkVWRVI8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+b3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFQ8L2NvZGU+PC9saT4KLQkgKiA8L3VsPiAgCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlCi0JICovCi0JcHVibGljIFN0cmluZyBzZXREZWJ1Z1NhdmVCZWZvcmVMYXVuY2hpbmcoU3RyaW5nIG5ld1ZhbHVlKXsKLQkJSVByZWZlcmVuY2VTdG9yZSBkZWJ1Z1ByZWZzID0gRGVidWdVSVRvb2xzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlTdHJpbmcgb2xkVmFsdWUgPSBkZWJ1Z1ByZWZzLmdldFN0cmluZyhvcmcuZWNsaXBzZS5kZWJ1Zy5pbnRlcm5hbC51aS5JSW50ZXJuYWxEZWJ1Z1VJQ29uc3RhbnRzLlBSRUZfU0FWRV9ESVJUWV9FRElUT1JTX0JFRk9SRV9MQVVOQ0gpOwotCQlkZWJ1Z1ByZWZzLnNldFZhbHVlKG9yZy5lY2xpcHNlLmRlYnVnLmludGVybmFsLnVpLklJbnRlcm5hbERlYnVnVUlDb25zdGFudHMuUFJFRl9TQVZFX0RJUlRZX0VESVRPUlNfQkVGT1JFX0xBVU5DSCwgbmV3VmFsdWUpOwotCQlyZXR1cm4gb2xkVmFsdWU7IAotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZWJ1Z05ldmVyU2F2ZSgpewotCQljYWNoZWRTYXZlQmVmb3JlTGF1bmNoID0gc2V0RGVidWdTYXZlQmVmb3JlTGF1bmNoaW5nKG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuTkVWRVIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZWJ1Z09yaWdpbmFsVmFsdWUoKXsKLQkJaWYgKGNhY2hlZFNhdmVCZWZvcmVMYXVuY2ggPT0gbnVsbCl7Ci0JCQljYWNoZWRTYXZlQmVmb3JlTGF1bmNoID0gb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFQ7Ci0JCX0KLQkJc2V0RGVidWdTYXZlQmVmb3JlTGF1bmNoaW5nKGNhY2hlZFNhdmVCZWZvcmVMYXVuY2gpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGY1OTA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJVSUNvcmU7Ci0vKioKLSAqIEFkYXB0ZXIgZmFjdG9yeSB0byBhZGFwdCBzZXJ2ZXJzIHRvIElBY3Rpb25GaWx0ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0JSUFjdGlvbkZpbHRlciBhY3Rpb25GaWx0ZXIgPSBuZXcgSUFjdGlvbkZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gdGVzdEF0dHJpYnV0ZShPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCQlyZXR1cm4gU2VydmVyUHJvcGVydHlUZXN0ZXIuY2hlY2tQcm9wZXJ0eSh0YXJnZXQsIG5hbWUsIHZhbHVlKTsKLQkJfQotCX07Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRlclR5cGUgPT0gSUFjdGlvbkZpbHRlci5jbGFzcykKLQkJCXJldHVybiBhY3Rpb25GaWx0ZXI7Ci0JCQotCQlpZiAoYWRhcHRlclR5cGUgPT0gSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MpCi0JCQlyZXR1cm4gU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tdIHsgSUFjdGlvbkZpbHRlci5jbGFzcyB9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOTVlODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVycy5Nb2R1bGVTZXJ2ZXI7Ci0vKioKLSAqIEEgbGFiZWwgcHJvdmlkZXIgZm9yIGFsbCBzZXJ2ZXIgcmVsYXRlZCBvYmplY3RzLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyLCBJQ29sb3JQcm92aWRlciwgSVdvcmtiZW5jaEFkYXB0ZXIgewotCXByaXZhdGUgSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcjsKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IExpc3Q8SUxhYmVsUHJvdmlkZXJMaXN0ZW5lcj4gbGlzdGVuZXJzOwotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlckxpc3RlbmVyIHByb3ZpZGVyTGlzdGVuZXI7Ci0KLQlwdWJsaWMgU2VydmVyTGFiZWxQcm92aWRlcigpIHsKLQkJZGVjb3JhdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKTsKLQkJcHJvdmlkZXJMaXN0ZW5lciA9IG5ldyBJTGFiZWxQcm92aWRlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWZpcmVMaXN0ZW5lcihldmVudCk7Ci0JCQl9Ci0JCX07Ci0JCWRlY29yYXRvci5hZGRMaXN0ZW5lcihwcm92aWRlckxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGlzdGVuZXIgY2Fubm90IGJlIG51bGwiKTsKLQkJCi0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCWxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SUxhYmVsUHJvdmlkZXJMaXN0ZW5lcj4oKTsKLQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyIGNhbm5vdCBiZSBudWxsIik7Ci0JCQotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpCi0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTGlzdGVuZXIoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAobGlzdGVuZXJzID09IG51bGwgfHwgbGlzdGVuZXJzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJCi0JCWludCBzaXplID0gbGlzdGVuZXJzLnNpemUoKTsKLQkJSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcltdIHNybCA9IG5ldyBJTGFiZWxQcm92aWRlckxpc3RlbmVyW3NpemVdOwotCQlsaXN0ZW5lcnMudG9BcnJheShzcmwpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJc3JsW2ldLmxhYmVsUHJvdmlkZXJDaGFuZ2VkKGV2ZW50KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICIgIEVycm9yIGZpcmluZyBsYWJlbCBjaGFuZ2UgZXZlbnQgdG8gIiArIHNybFtpXSwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGdldE1vZHVsZUltYWdlKFN0cmluZyB0eXBlSWQpIHsKLQkJaWYgKHR5cGVJZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSW1hZ2UgaW1hZ2UgPSBJbWFnZVJlc291cmNlLmdldEltYWdlKHR5cGVJZCk7Ci0JCWludCBpbmQgPSB0eXBlSWQuaW5kZXhPZigiLiIpOwotCQl3aGlsZSAoaW1hZ2UgPT0gbnVsbCAmJiBpbmQgPj0gMCkgewotCQkJdHlwZUlkID0gdHlwZUlkLnN1YnN0cmluZygwLCBpbmQpOwotCQkJaW1hZ2UgPSBJbWFnZVJlc291cmNlLmdldEltYWdlKHR5cGVJZCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZ2V0TW9kdWxlSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyB0eXBlSWQpIHsKLQkJaWYgKHR5cGVJZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2UgPSBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcih0eXBlSWQpOwotCQlpbnQgaW5kID0gdHlwZUlkLmluZGV4T2YoIi4iKTsKLQkJd2hpbGUgKGltYWdlID09IG51bGwgJiYgaW5kID49IDApIHsKLQkJCXR5cGVJZCA9IHR5cGVJZC5zdWJzdHJpbmcoMCwgaW5kKTsKLQkJCWltYWdlID0gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IodHlwZUlkKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElMYWJlbFByb3ZpZGVyI2dldEltYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3QgZWxlbWVudCkgewotCQl0cnkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUnVudGltZVR5cGUpIHsKLQkJCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSAoSVJ1bnRpbWVUeXBlKSBlbGVtZW50OwotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihydW50aW1lVHlwZS5nZXRJZCgpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSdW50aW1lKSB7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZWxlbWVudDsKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IocnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclR5cGUpIHsKLQkJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gKElTZXJ2ZXJUeXBlKSBlbGVtZW50OwotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihzZXJ2ZXJUeXBlLmdldElkKCkpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7Ci0JCQkJSU1vZHVsZSBtb2R1bGUgPSAoSU1vZHVsZSkgZWxlbWVudDsKLQkJCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7Ci0JCQkJcmV0dXJuIGdldE1vZHVsZUltYWdlRGVzY3JpcHRvcihtdC5nZXRJZCgpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNb2R1bGVbXSkgewotCQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gKElNb2R1bGVbXSkgZWxlbWVudDsKLQkJCQlJTW9kdWxlIG1vZHVsZSA9IG1vZHVsZXNbbW9kdWxlcy5sZW5ndGggLSAxXTsKLQkJCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7Ci0JCQkJcmV0dXJuIGdldE1vZHVsZUltYWdlRGVzY3JpcHRvcihtdC5nZXRJZCgpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXb3JrYmVuY2hBZGFwdGVyKSB7Ci0JCQkJcmV0dXJuICgoSVdvcmtiZW5jaEFkYXB0ZXIpIGVsZW1lbnQpLmdldEltYWdlRGVzY3JpcHRvcihudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IGdldCBpbWFnZSBkZXNjcmlwdG9yIiwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJbWFnZSBkZWNvcmF0ZShJbWFnZSBpbWFnZSwgT2JqZWN0IG9iaikgewotCQlJbWFnZSBkZWMgPSBkZWNvcmF0b3IuZGVjb3JhdGVJbWFnZShpbWFnZSwgb2JqKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJcmV0dXJuIGRlYzsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGRlY29yYXRlKFN0cmluZyB0ZXh0LCBPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBkZWMgPSBkZWNvcmF0b3IuZGVjb3JhdGVUZXh0KHRleHQsIG9iaik7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCXJldHVybiBkZWM7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qCi0JICogQHNlZSBJTGFiZWxQcm92aWRlciNnZXRJbWFnZShPYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSkgewotCQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IChJUnVudGltZVR5cGUpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIGRlY29yYXRlKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UocnVudGltZVR5cGUuZ2V0SWQoKSksIHJ1bnRpbWVUeXBlKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSdW50aW1lKSB7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZWxlbWVudDsKLQkJCQlyZXR1cm4gZGVjb3JhdGUoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSksIHJ1bnRpbWUpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclR5cGUpIHsKLQkJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gKElTZXJ2ZXJUeXBlKSBlbGVtZW50OwotCQkJCXJldHVybiBkZWNvcmF0ZShJbWFnZVJlc291cmNlLmdldEltYWdlKHNlcnZlclR5cGUuZ2V0SWQoKSksIHNlcnZlclR5cGUpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJcmV0dXJuIGRlY29yYXRlKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2Uoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKSwgc2VydmVyKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBlbGVtZW50OwotCQkJCUlNb2R1bGVUeXBlIG10ID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKTsKLQkJCQlpZiAobXQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJcmV0dXJuIGRlY29yYXRlKGdldE1vZHVsZUltYWdlKG10LmdldElkKCkpLCBtb2R1bGUpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1vZHVsZVtdKSB7Ci0JCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSAoSU1vZHVsZVtdKSBlbGVtZW50OwotCQkJCUlNb2R1bGUgbW9kdWxlID0gbW9kdWxlc1ttb2R1bGVzLmxlbmd0aCAtIDFdOwotCQkJCUlNb2R1bGVUeXBlIG10ID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKTsKLQkJCQlpZiAobXQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJcmV0dXJuIGRlY29yYXRlKGdldE1vZHVsZUltYWdlKG10LmdldElkKCkpLCBtb2R1bGVzKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCQkJSU1vZHVsZSBtb2R1bGUgPSBtcy5tb2R1bGVbbXMubW9kdWxlLmxlbmd0aCAtIDFdOwotCQkJCUlNb2R1bGVUeXBlIG10ID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKTsKLQkJCQlpZiAobXQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJcmV0dXJuIGRlY29yYXRlKGdldE1vZHVsZUltYWdlKG10LmdldElkKCkpLCBtcyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkNvdWxkIG5vdCBnZXQgaW1hZ2UgZGVzY3JpcHRvciIsIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ci0JCQotCQlyZXR1cm4gczsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ci0JCQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSdW50aW1lKSB7Ci0JCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBlbGVtZW50OwotCQkJcmV0dXJuIGRlY29yYXRlKGdldFN0cmluZygocnVudGltZSkuZ2V0TmFtZSgpKSwgcnVudGltZSk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gZGVjb3JhdGUoZ2V0U3RyaW5nKChzZXJ2ZXIpLmdldE5hbWUoKSksIHNlcnZlcik7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSkgewotCQkJSVJ1bnRpbWVUeXBlIHJ0ID0gKElSdW50aW1lVHlwZSkgZWxlbWVudDsKLQkJCXJldHVybiBkZWNvcmF0ZShydC5nZXROYW1lKCksIHJ0KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclR5cGUpIHsKLQkJCUlTZXJ2ZXJUeXBlIHN0ID0gKElTZXJ2ZXJUeXBlKSBlbGVtZW50OwotCQkJcmV0dXJuIGRlY29yYXRlKHN0LmdldE5hbWUoKSwgc3QpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2xpZW50KSB7Ci0JCQlJQ2xpZW50IGNsaWVudCA9IChJQ2xpZW50KSBlbGVtZW50OwotCQkJcmV0dXJuIGRlY29yYXRlKGNsaWVudC5nZXROYW1lKCksIGNsaWVudCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCUlNb2R1bGUgbW9kdWxlID0gKElNb2R1bGUpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gZGVjb3JhdGUobW9kdWxlLmdldE5hbWUoKSwgbW9kdWxlKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1vZHVsZVtdKSB7Ci0JCQlJTW9kdWxlW10gbW9kdWxlcyA9IChJTW9kdWxlW10pIGVsZW1lbnQ7Ci0JCQlJTW9kdWxlIG1vZHVsZSA9IG1vZHVsZXNbbW9kdWxlcy5sZW5ndGggLSAxXTsKLQkJCXJldHVybiBkZWNvcmF0ZShtb2R1bGUuZ2V0TmFtZSgpLCBtb2R1bGVzKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBlbGVtZW50OwotCQkJSU1vZHVsZSBtb2R1bGUgPSBtcy5tb2R1bGVbbXMubW9kdWxlLmxlbmd0aCAtIDFdOwotCQkJcmV0dXJuIGRlY29yYXRlKG1vZHVsZS5nZXROYW1lKCksIG1zKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVdvcmtiZW5jaEFkYXB0ZXIpIHsKLQkJCXJldHVybiAoKElXb3JrYmVuY2hBZGFwdGVyKSBlbGVtZW50KS5nZXRMYWJlbChudWxsKTsKLQkJfQotCQkKLQkJcmV0dXJuICIiOwotCX0KLQotCS8qCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KE9iamVjdCwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRlY29yYXRvci5yZW1vdmVMaXN0ZW5lcihwcm92aWRlckxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29sb3IgZ2V0QmFja2dyb3VuZChPYmplY3QgZWxlbWVudCkgewkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKWVsZW1lbnQ7Ci0JCQkKLQkJCUlNb2R1bGUgbW9kdWxlID0gbXMubW9kdWxlWzBdOwotCQkJaWYgKG1vZHVsZS5pc0V4dGVybmFsKCkpIHsKLQkJCQlDb2xvciBjID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSQVkpOwotCQkJCXJldHVybiBjOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgeyAKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgewotCQlyZXR1cm4gZ2V0VGV4dChvKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyTGF1bmNoU2hvcnRjdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlckxhdW5jaFNob3J0Y3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMDUwNGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyTGF1bmNoU2hvcnRjdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hTaG9ydGN1dDI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnMuUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJMYXVuY2hTaG9ydGN1dCBpbXBsZW1lbnRzIElMYXVuY2hTaG9ydGN1dDIgewotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElMYXVuY2hTaG9ydGN1dCNsYXVuY2goSVNlbGVjdGlvbiwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGxhdW5jaChJU2VsZWN0aW9uIHNlbGVjdGlvbiwgZmluYWwgU3RyaW5nIG1vZGUpIHsKLQkJUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSByb3MgPSBuZXcgUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSgpOwotCQlyb3Muc2V0TGF1bmNoTW9kZShtb2RlKTsKLQkJSUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJLy8gZHVtbXkgYWN0aW9uCi0JCX07Ci0JCXJvcy5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgc2VsZWN0aW9uKTsKLQkJcm9zLnJ1bihhY3Rpb24pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElMYXVuY2hTaG9ydGN1dCNsYXVuY2goSUVkaXRvclBhcnQsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBsYXVuY2goSUVkaXRvclBhcnQgZWRpdG9yLCBTdHJpbmcgbW9kZSkgewotCQlpZiAoZWRpdG9yID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBjaGVjayBpZiB0aGUgZWRpdG9yIGlucHV0IGl0c2VsZiBjYW4gYmUgcnVuLiBPdGhlcndpc2UsIGNoZWNrIGlmCi0JCS8vIHRoZSBlZGl0b3IgaGFzIGEgZmlsZSBpbnB1dCB0aGF0IGNhbiBiZSBydW4KLQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQotCQlpZiAoU2VydmVyUGx1Z2luLmhhc01vZHVsZUFydGlmYWN0KGlucHV0KSkgewotCQkJbGF1bmNoKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGlucHV0KSwgbW9kZSk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZUVkaXRvcklucHV0IGZlaSA9IChJRmlsZUVkaXRvcklucHV0KSBpbnB1dDsKLQkJCUlGaWxlIGZpbGUgPSBmZWkuZ2V0RmlsZSgpOwotCQkJaWYgKFNlcnZlclBsdWdpbi5oYXNNb2R1bGVBcnRpZmFjdChmaWxlKSkKLQkJCQlsYXVuY2gobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmlsZSksIG1vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNwZWNpZmllZCA8Y29kZT5JU2VsZWN0aW9uPC9jb2RlPiB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IG9mIAotCSAqIDxjb2RlPklMYXVuY2hDb25maWd1cmF0aW9uPC9jb2RlPnMgdGhhdCBhcHBseSB0byB0aGUgY3VycmVudCBzZWxlY3Rpb24sIAotCSAqIGkuZS4gYWxsIG9mIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbnMgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIGxhdW5jaCB0aGUgZ2l2ZW4gCi0JICogc2VsZWN0aW9uLgotCSAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0JICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5JTGF1bmNoQ29uZmlndXJhdGlvbjwvY29kZT5zIHRoYXQgY291bGQgYmUgCi0JICogdXNlZCB0byBsYXVuY2ggdGhlIGdpdmVuIHNlbGVjdGlvbiwgb3IgYW4gZW1wdHkgYXJyYXksIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIElMYXVuY2hDb25maWd1cmF0aW9uW10gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbnMoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBJTGF1bmNoQ29uZmlndXJhdGlvblswXTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTGF1bmNoU2hvcnRjdXQyI2dldExhdW5jaENvbmZpZ3VyYXRpb25zKElFZGl0b3JQYXJ0KQotCSAqLwotCXB1YmxpYyBJTGF1bmNoQ29uZmlndXJhdGlvbltdIGdldExhdW5jaENvbmZpZ3VyYXRpb25zKElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlpZiAoZWRpdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElMYXVuY2hDb25maWd1cmF0aW9uWzBdOwotCQkKLQkJLy8gY2hlY2sgaWYgdGhlIGVkaXRvciBpbnB1dCBpdHNlbGYgY2FuIGJlIHJ1bi4gT3RoZXJ3aXNlLCBjaGVjayBpZgotCQkvLyB0aGUgZWRpdG9yIGhhcyBhIGZpbGUgaW5wdXQgdGhhdCBjYW4gYmUgcnVuCi0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkKLQkJaWYgKFNlcnZlclBsdWdpbi5oYXNNb2R1bGVBcnRpZmFjdChpbnB1dCkpIHsKLQkJCXJldHVybiBnZXRMYXVuY2hDb25maWd1cmF0aW9ucyhuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihpbnB1dCkpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJSUZpbGVFZGl0b3JJbnB1dCBmZWkgPSAoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCQlJRmlsZSBmaWxlID0gZmVpLmdldEZpbGUoKTsKLQkJCWlmIChTZXJ2ZXJQbHVnaW4uaGFzTW9kdWxlQXJ0aWZhY3QoZmlsZSkpCi0JCQkJcmV0dXJuIGdldExhdW5jaENvbmZpZ3VyYXRpb25zKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbGUpKTsKLQkJfQotCQlyZXR1cm4gbmV3IElMYXVuY2hDb25maWd1cmF0aW9uWzBdOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSBzcGVjaWZpZWQgPGNvZGU+SVNlbGVjdGlvbjwvY29kZT4gdGhpcyBtZXRob2QgcmV0dXJucyBhbgotCSAqIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gdGhhdCBkaXJlY3RseSBtYXBzIHRvIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLQkgKiBUaGlzIG1hcHBpbmcgaXMgdGhlbiBsZXZlcmFnZWQgYnkgdGhlIGNvbnRleHQgbGF1bmNoaW5nIGZyYW1ld29yawotCSAqIHRvIHRyeSBhbmQgbGF1bmNoIHRoZSByZXNvdXJjZS4gCi0JICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuIGFuIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gdGhhdCB3b3VsZCBiZSB1c2VkIGR1cmluZyBjb250ZXh0Ci0JICogc2Vuc2l0aXZlIGxhdW5jaGluZyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBvbmUgaXMgbm90IHRvIGJlIHByb3ZpZGVkIG9yIGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0TGF1bmNoYWJsZVJlc291cmNlKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElMYXVuY2hTaG9ydGN1dDIjZ2V0TGF1bmNoYWJsZVJlc291cmNlKElFZGl0b3JQYXJ0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0TGF1bmNoYWJsZVJlc291cmNlKElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlpZiAoZWRpdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCS8vIGNoZWNrIGlmIHRoZSBlZGl0b3IgaW5wdXQgaXRzZWxmIGNhbiBiZSBydW4uIE90aGVyd2lzZSwgY2hlY2sgaWYKLQkJLy8gdGhlIGVkaXRvciBoYXMgYSBmaWxlIGlucHV0IHRoYXQgY2FuIGJlIHJ1bgotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCi0JCWlmIChTZXJ2ZXJQbHVnaW4uaGFzTW9kdWxlQXJ0aWZhY3QoaW5wdXQpKSB7Ci0JCQlyZXR1cm4gZ2V0TGF1bmNoYWJsZVJlc291cmNlKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGlucHV0KSk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZUVkaXRvcklucHV0IGZlaSA9IChJRmlsZUVkaXRvcklucHV0KSBpbnB1dDsKLQkJCUlGaWxlIGZpbGUgPSBmZWkuZ2V0RmlsZSgpOwotCQkJaWYgKFNlcnZlclBsdWdpbi5oYXNNb2R1bGVBcnRpZmFjdChmaWxlKSkKLQkJCQlyZXR1cm4gZ2V0TGF1bmNoYWJsZVJlc291cmNlKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbGUpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMjMzMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQcmVmZXJlbmNlczsKLS8qKgotICogVGhlIHByZWZlcmVuY2UgcGFnZSB0aGF0IGhvbGRzIHNlcnZlciBwcm9wZXJ0aWVzLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JcHJvdGVjdGVkIFNlcnZlclByZWZlcmVuY2VzIHByZWZlcmVuY2VzOwotCXByb3RlY3RlZCBTZXJ2ZXJVSVByZWZlcmVuY2VzIHVpUHJlZmVyZW5jZXM7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHNob3dPbkFjdGl2aXR5OwotCi0JLyoqCi0JICogU2VydmVyUHJlZmVyZW5jZXNQYWdlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlcnZlclByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCQotCQlwcmVmZXJlbmNlcyA9IFNlcnZlclByZWZlcmVuY2VzLmdldEluc3RhbmNlKCk7Ci0JCXVpUHJlZmVyZW5jZXMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIHByZWZlcmVuY2Ugb3B0aW9ucy4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCXdocy5zZXRIZWxwKHBhcmVudCwgQ29udGV4dElkcy5QUkVGX0dFTkVSQUwpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoNCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoNCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlzaG93T25BY3Rpdml0eSA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlzaG93T25BY3Rpdml0eS5zZXRUZXh0KE1lc3NhZ2VzLnByZWZTaG93T25BY3Rpdml0eSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXNob3dPbkFjdGl2aXR5LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXNob3dPbkFjdGl2aXR5LnNldFNlbGVjdGlvbih1aVByZWZlcmVuY2VzLmdldFNob3dPbkFjdGl2aXR5KCkpOwotCQl3aHMuc2V0SGVscChzaG93T25BY3Rpdml0eSwgQ29udGV4dElkcy5QUkVGX0dFTkVSQUxfU0hPV19PTl9BQ1RJVklUWSk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgcHJlZmVyZW5jZSBwYWdlIHVzaW5nIHRoZSBwYXNzZWQgd29ya2JlbmNoLgotCSAqCi0JICogQHBhcmFtIHdvcmtiZW5jaCB0aGUgY3VycmVudCB3b3JrYmVuY2gKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBzcGVjaWFsIHByb2Nlc3Npbmcgd2hlbiB0aGlzIHBhZ2UncyBEZWZhdWx0cyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXNob3dPbkFjdGl2aXR5LnNldFNlbGVjdGlvbih1aVByZWZlcmVuY2VzLmdldERlZmF1bHRTaG93T25BY3Rpdml0eSgpKTsKLQkJCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXVpUHJlZmVyZW5jZXMuc2V0U2hvd09uQWN0aXZpdHkoc2hvd09uQWN0aXZpdHkuZ2V0U2VsZWN0aW9uKCkpOwotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclByb3BlcnR5UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNDUyMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci0vKioKLSAqIFByb3BlcnR5UGFnZSBmb3Igc2VydmVycy4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOwotCi0JcHJvdGVjdGVkIElTZXJ2ZXIgZGVmYXVsdFNlcnZlcjsKLQotCS8qKgotCSAqIFNlcnZlclByb3BlcnR5UGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJQcm9wZXJ0eVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBib2R5IG9mIHRoZSBwYWdlLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRyeSB7Ci0JCQlJQWRhcHRhYmxlIGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCQlzZXJ2ZXIgPSAoSVNlcnZlcikgZWxlbWVudC5nZXRBZGFwdGVyKElTZXJ2ZXIuY2xhc3MpOwotCQkJCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCQotCQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCQl3aHMuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuU0VSVkVSX1BST1BFUlRZX1BBR0UpOwkJCQotCQkJCi0JCQkvLyBuYW1lCi0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJvcFNlcnZlckluZm9OYW1lKTsKLQkJCQotCQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KHNlcnZlci5nZXROYW1lKCkpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCi0JCQkvLyB0eXBlCi0JCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJvcFNlcnZlckluZm9UeXBlKTsKLQkJCQotCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCk7Ci0JCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWlmIChzZXJ2ZXJUeXBlICE9IG51bGwpCi0JCQkJbGFiZWwuc2V0VGV4dChzZXJ2ZXJUeXBlLmdldE5hbWUoKSk7Ci0JCQllbHNlCi0JCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5lbGVtZW50VW5rbm93bk5hbWUpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCi0JCQkvLyB2ZW5kb3IKLQkJCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5wcm9wU2VydmVySW5mb1ZlbmRvcik7Ci0JCQkKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IG51bGw7Ci0JCQlpZiAoc2VydmVyVHlwZSAhPSBudWxsKQotCQkJCXJ1bnRpbWVUeXBlID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpOwotCQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlpZiAocnVudGltZVR5cGUgIT0gbnVsbCkKLQkJCQlsYWJlbC5zZXRUZXh0KHJ1bnRpbWVUeXBlLmdldFZlbmRvcigpKTsKLQkJCWVsc2UKLQkJCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmVsZW1lbnRVbmtub3duTmFtZSk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJCS8vIGxvY2F0aW9uCi0JCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuc3dpdGNoU2VydmVyTG9jYXRpb24pOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCQkKLQkJCWZpbmFsIExhYmVsIHNlcnZlckxvY2F0aW9uID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZmluYWwgU2VydmVyIHN2ciA9IChTZXJ2ZXIpIHNlcnZlcjsKLQkJCWlmIChzdnIuZ2V0RmlsZSgpICE9IG51bGwpCi0JCQkJc2VydmVyTG9jYXRpb24uc2V0VGV4dChzdnIuZ2V0RmlsZSgpLmdldEZ1bGxQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpKTsKLQkJCWVsc2UKLQkJCQlzZXJ2ZXJMb2NhdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLnN3aXRjaFNlcnZlckxvY2F0aW9uTWV0YWRhdGEpOwotCQkJCi0JCQlzZXJ2ZXJMb2NhdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJCQotCQkJQnV0dG9uIHN3aXRjaExvY2F0aW9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJCXN3aXRjaExvY2F0aW9uLnNldFRleHQoTWVzc2FnZXMuYWN0aW9uU3dpdGNoU2VydmVyTG9jYXRpb24pOwotCQkJc3dpdGNoTG9jYXRpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJCXN3aXRjaExvY2F0aW9uLnNldEVuYWJsZWQoIXNlcnZlci5pc1JlYWRPbmx5KCkpOwotCQkJc3dpdGNoTG9jYXRpb24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0cnkgewotCQkJCQkJU2VydmVyLnN3aXRjaExvY2F0aW9uKHN2ciwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3Igc3dpdGNoaW5nIHNlcnZlciBsb2NhdGlvbiIsIGNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoc3ZyLmdldEZpbGUoKSAhPSBudWxsKQotCQkJCQkJc2VydmVyTG9jYXRpb24uc2V0VGV4dChzdnIuZ2V0RmlsZSgpLmdldEZ1bGxQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpKTsKLQkJCQkJZWxzZQotCQkJCQkJc2VydmVyTG9jYXRpb24uc2V0VGV4dChNZXNzYWdlcy5zd2l0Y2hTZXJ2ZXJMb2NhdGlvbk1ldGFkYXRhKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQkJCi0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjcmVhdGluZyBwcm9wZXJ0eSBwYWdlIiwgZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlyZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclByb3BlcnR5VGVzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJQcm9wZXJ0eVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzg1M2QwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclByb3BlcnR5VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVycy5Nb2R1bGVTZXJ2ZXI7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyUHJvcGVydHlUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlciB7Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5JUHJvcGVydHlUZXN0ZXIjdGVzdChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLQkJaWYgKGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQlyZXR1cm4gY2hlY2tQcm9wZXJ0eShyZWNlaXZlciwgcHJvcGVydHksIChTdHJpbmcpIGV4cGVjdGVkVmFsdWUpOwotCQlpZiAoZXhwZWN0ZWRWYWx1ZSAhPSBudWxsKQotCQkJcmV0dXJuIGNoZWNrUHJvcGVydHkocmVjZWl2ZXIsIHByb3BlcnR5LCBleHBlY3RlZFZhbHVlLnRvU3RyaW5nKCkpOwotCQkKLQkJcmV0dXJuIGNoZWNrUHJvcGVydHkocmVjZWl2ZXIsIHByb3BlcnR5LCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gY2hlY2tQcm9wZXJ0eShPYmplY3QgdGFyZ2V0LCBTdHJpbmcgcHJvcGVydHksIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoImlzUnVubmFibGUiLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCS8vIGNoZWNrIGlmIHByb2plY3QgaGFzIGEgbW9kdWxlIGFzc29jaWF0ZWQgd2l0aCBpdAotCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJSU1vZHVsZSBtID0gU2VydmVyVXRpbC5nZXRNb2R1bGUoKElQcm9qZWN0KSB0YXJnZXQpOwotCQkJCWlmIChtID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJLy8gY2hlY2sgZm9yIHJ1bm5hYmxlIG9iamVjdAotCQkJYm9vbGVhbiBiID0gU2VydmVyUGx1Z2luLmhhc01vZHVsZUFydGlmYWN0KHRhcmdldCk7Ci0JCQlpZiAoYikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQkJLyppZiAoIShyZWNlaXZlciBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCS8vCSBjaGVjayBpZiB0aGUgZWRpdG9yIGlucHV0IGl0c2VsZiBjYW4gYmUgcnVuLiBPdGhlcndpc2UsIGNoZWNrIGlmCi0JCQkvLyB0aGUgZWRpdG9yIGhhcyBhIGZpbGUgaW5wdXQgdGhhdCBjYW4gYmUgcnVuCi0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSAoSUVkaXRvclBhcnQpIHJlY2VpdmVyOwotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQkKLQkJCWIgPSBTZXJ2ZXJQbHVnaW4uaGFzTW9kdWxlQXJ0aWZhY3QoaW5wdXQpOwotCQkJaWYgKGIpCi0JCQkJcmV0dXJuIHRydWU7Ki8KLQkJCQotCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCQlJRmlsZUVkaXRvcklucHV0IGZlaSA9IChJRmlsZUVkaXRvcklucHV0KSB0YXJnZXQ7Ci0JCQkJSUZpbGUgZmlsZSA9IGZlaS5nZXRGaWxlKCk7Ci0JCQkJYiA9IFNlcnZlclBsdWdpbi5oYXNNb2R1bGVBcnRpZmFjdChmaWxlKTsKLQkJCQlpZiAoYikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoInNlcnZlclR5cGUiLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCUlTZXJ2ZXIgc2VydmVyID0gbnVsbDsKLQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQkJc2VydmVyID0gKElTZXJ2ZXIpIHRhcmdldDsKLQkJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgdGFyZ2V0OwotCQkJCXNlcnZlciA9IG1zLnNlcnZlcjsKLQkJCX0KLQkJCWlmIChzZXJ2ZXIgPT0gbnVsbCB8fCBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlTdHJpbmdbXSB0eXBlSWRzID0gU2VydmVyUGx1Z2luLnRva2VuaXplKHZhbHVlLCAiLCIpOwotCQkJcmV0dXJuIG1hdGNoZXMoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpLCB0eXBlSWRzKTsKLQkJfSBlbHNlIGlmICgibW9kdWxlVHlwZSIuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJSU1vZHVsZVtdIG1vZHVsZSA9IG51bGw7Ci0JCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSU1vZHVsZVtdKSB7Ci0JCQkJbW9kdWxlID0gKElNb2R1bGVbXSkgdGFyZ2V0OwotCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7Ci0JCQkJbW9kdWxlID0gbmV3IElNb2R1bGVbXSB7KElNb2R1bGUpIHRhcmdldH07Ci0JCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIHRhcmdldDsKLQkJCQltb2R1bGUgPSBtcy5tb2R1bGU7Ci0JCQl9Ci0JCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG1vZHVsZS5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IFNlcnZlclBsdWdpbi50b2tlbml6ZSh2YWx1ZSwgIiwiKTsKLQkJCUlNb2R1bGUgbSA9IG1vZHVsZVttb2R1bGUubGVuZ3RoIC0gMV07Ci0JCQlyZXR1cm4gbWF0Y2hlcyhtLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpLCB2YWx1ZXMpOwotCQl9IGVsc2UgaWYgKCJtb2R1bGVWZXJzaW9uIi5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlJTW9kdWxlW10gbW9kdWxlID0gbnVsbDsKLQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJTW9kdWxlW10pIHsKLQkJCQltb2R1bGUgPSAoSU1vZHVsZVtdKSB0YXJnZXQ7Ci0JCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCQltb2R1bGUgPSBuZXcgSU1vZHVsZVtdIHsoSU1vZHVsZSkgdGFyZ2V0fTsKLQkJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgdGFyZ2V0OwotCQkJCW1vZHVsZSA9IG1zLm1vZHVsZTsKLQkJCX0KLQkJCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAobW9kdWxlLmxlbmd0aCA9PSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQkJU3RyaW5nW10gdmFsdWVzID0gU2VydmVyUGx1Z2luLnRva2VuaXplKHZhbHVlLCAiLCIpOwotCQkJSU1vZHVsZSBtID0gbW9kdWxlW21vZHVsZS5sZW5ndGggLSAxXTsKLQkJCXJldHVybiBtYXRjaGVzKG0uZ2V0TW9kdWxlVHlwZSgpLmdldFZlcnNpb24oKSwgdmFsdWVzKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSAoZ2l2ZW4gYnkgdGhlIGlkKSBjYW4gdXNlIHRoaXMgYWN0aW9uLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIGlkLCBTdHJpbmdbXSB0eXBlSWRzKSB7Ci0JCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKHR5cGVJZHMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWludCBzaXplID0gdHlwZUlkcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAodHlwZUlkc1tpXS5lbmRzV2l0aCgiKiIpKSB7Ci0JCQkJaWYgKGlkLmxlbmd0aCgpID49IHR5cGVJZHNbaV0ubGVuZ3RoKCkgJiYgaWQuc3RhcnRzV2l0aCh0eXBlSWRzW2ldLnN1YnN0cmluZygwLCB0eXBlSWRzW2ldLmxlbmd0aCgpIC0gMSkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoaWQuZXF1YWxzKHR5cGVJZHNbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyVG9vbFRpcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyVG9vbFRpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTUwMjRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclRvb2xUaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLnRleHQuaHRtbC5IVE1MMlRleHRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5Ub29sVGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLklTZXJ2ZXJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VydmVyVG9vbFRpcDsKLQotcHVibGljIGNsYXNzIFNlcnZlclRvb2xUaXAgZXh0ZW5kcyBUb29sVGlwIHsJCi0JcHJvdGVjdGVkIEhhc2h0YWJsZTxTdHJpbmcsQXJyYXlMaXN0PElTZXJ2ZXJUb29sVGlwPj4gdG9vbFRpcFByb3ZpZGVycyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLEFycmF5TGlzdDxJU2VydmVyVG9vbFRpcD4+KCk7CQotCXByb3RlY3RlZCBzdGF0aWMgU2hlbGwgQ1VSUkVOVF9UT09MVElQOwotCXByb3RlY3RlZCBMYWJlbCBoaW50TGFiZWw7Ci0JcHJvdGVjdGVkIFRyZWUgdHJlZTsKLQlwcm90ZWN0ZWQgaW50IHg7Ci0JcHJvdGVjdGVkIGludCB5OwotCi0JcHVibGljIFNlcnZlclRvb2xUaXAoZmluYWwgVHJlZSB0cmVlKSB7Ci0JCXN1cGVyKHRyZWUpOwotCQkKLQkJdGhpcy50cmVlID0gdHJlZTsKLQkJCi0JCXRyZWUuYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgewotCQkJCXggPSBlLng7Ci0JCQkJeSA9IGUueTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0cmVlLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgIGUpIHsKLQkJCQlpZiAoZSA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJCi0JCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuRVNDKSB7Ci0JCQkJCWlmIChDVVJSRU5UX1RPT0xUSVAgIT0gbnVsbCkgewotCQkJCQkJQ1VSUkVOVF9UT09MVElQLmRpc3Bvc2UoKTsKLQkJCQkJCUNVUlJFTlRfVE9PTFRJUCA9IG51bGw7Ci0JCQkJCX0KLQkJCQkJYWN0aXZhdGUoKTsKLQkJCQl9Ci0JCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuRjYpIHsKLQkJCQkJaWYgKENVUlJFTlRfVE9PTFRJUCA9PSBudWxsKSB7Ci0JCQkJCQlkZWFjdGl2YXRlKCk7Ci0JCQkJCQloaWRlKCk7Ci0JCQkJCQljcmVhdGVGb2N1c2VkVG9vbHRpcCh0cmVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpewotCQkJCS8vIG5vdGhpbmcgdG8gZG8gCi0JCQl9Ci0JCX0pOwotCQkKLQkJbG9hZEV4dGVuc2lvbnMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlRm9jdXNlZFRvb2x0aXAoZmluYWwgQ29udHJvbCBjb250cm9sKSB7Ci0JCWZpbmFsIFNoZWxsIHN0aWNreVRvb2x0aXAgPSBuZXcgU2hlbGwoY29udHJvbC5nZXRTaGVsbCgpLCBTV1QuT05fVE9QIHwgU1dULlRPT0wKLQkJCQl8IFNXVC5OT19GT0NVUyk7Ci0JCXN0aWNreVRvb2x0aXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlzdGlja3lUb29sdGlwLnNldEJhY2tncm91bmQoc3RpY2t5VG9vbHRpcC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotCQkKLQkJY29udHJvbC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCQkJCWV2ZW50LnggPSB4OwotCQkJCWV2ZW50LnkgPSB5OwotCQkJCWV2ZW50LndpZGdldCA9IHRyZWU7Ci0JCQkJCi0JCQkJY3JlYXRlVG9vbFRpcENvbnRlbnRBcmVhKGV2ZW50LCBzdGlja3lUb29sdGlwKTsKLQkJCQlzdGlja3lUb29sdGlwLnBhY2soKTsKLQkJCQkKLQkJCQlzdGlja3lUb29sdGlwLnNldExvY2F0aW9uKHN0aWNreVRvb2x0aXAuZ2V0RGlzcGxheSgpLmdldEN1cnNvckxvY2F0aW9uKCkpOwkJCQkKLQkJCQloaW50TGFiZWwuc2V0VGV4dChNZXNzYWdlcy50b29sVGlwRGlzYWJsZUZvY3VzKTsKLQkJCQlzdGlja3lUb29sdGlwLnNldFZpc2libGUodHJ1ZSk7Ci0vLwkJCQlFdmVudHVhbGx5IHdlIHdhbnQgdG8gYWRkIGEgbGlzdGVuZXIgdGhhdCBjaGVja3MgaWYKLS8vICAgICAgICAgICAgICB0aGUgbW91c2VEb3duIGV2ZW50IGlzIG9jY3VycmluZyBvdXRzaWRlIG9mIHRoZSBib3VuZHMgb2YgdGhlIHRvb2x0aXAKLS8vICAgICAgICAgICAgICBpZiBpdCBpcywgdGhlbiBoaWRlIHRoZSB0b29sdGlwCi0vLwkJCQlhZGRMaXN0ZW5lcihzdGlja3lUb29sdGlwKTsKLQkJCX0KLQkJfSk7Ci0JCUNVUlJFTlRfVE9PTFRJUCA9IHN0aWNreVRvb2x0aXA7Ci0JfQotCi0vLyAgcmVhZCB0aGUgY3JlYXRlRm9jdXNlZFRvb2x0aXAgbWV0aG9kIGZvciBpbmZvcm1hdGlvbiBvbiB3aHkgdGhpcyBpcyBjb21tZW50ZWQgb3V0Ci0vLwotLy8JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVyKENvbnRyb2wgY29udHJvbCl7Ci0vLwkJY29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKG5ldyBTdGlja3lUaXBNb3VzZUxpc3RlbmVyKCkpOwotLy8JCWlmIChjb250cm9sIGluc3RhbmNlb2YgQ29tcG9zaXRlKXsKLS8vCQkJQ29udHJvbFtdIGNoaWxkcmVucyA9ICgoQ29tcG9zaXRlKWNvbnRyb2wpLmdldENoaWxkcmVuKCk7Ci0vLwkJCWZvciAoQ29udHJvbCBjaGlsZCA6Y2hpbGRyZW5zKXsKLS8vCQkJCWFkZExpc3RlbmVyKGNoaWxkKTsKLS8vCQkJfQotLy8JCX0KLS8vCQkKLS8vCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFRvb2xUaXBBcmVhKEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBvID0gdHJlZS5nZXRJdGVtKG5ldyBQb2ludChldmVudC54LGV2ZW50LnkpKTsKLQkJcmV0dXJuIG87Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gc2hvdWxkQ3JlYXRlVG9vbFRpcChFdmVudCBldmVudCkgewotCQlpZiAodHJlZS5nZXRJdGVtKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHN1cGVyLnNob3VsZENyZWF0ZVRvb2xUaXAoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9vbFRpcENvbnRlbnRBcmVhKEV2ZW50IGV2ZW50LCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCU9iamVjdCBvID0gdHJlZS5nZXRJdGVtKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JCWlmIChvID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUlTZXJ2ZXIgc2VydmVyID0gbnVsbDsKLQkJSVNlcnZlck1vZHVsZSBtb2R1bGUgPSBudWxsOwotCQlpZiAobyBpbnN0YW5jZW9mIFRyZWVJdGVtKSB7Ci0JCQlPYmplY3Qgb2JqID0gKChUcmVlSXRlbSlvKS5nZXREYXRhKCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikKLQkJCQlzZXJ2ZXIgPSAoSVNlcnZlcikgb2JqOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXJNb2R1bGUpCi0JCQkJbW9kdWxlID0gKElTZXJ2ZXJNb2R1bGUpIG9iajsKLQkJfQotCQkKLQkJRmlsbExheW91dCBsYXlvdXQgPSAoRmlsbExheW91dClwYXJlbnQuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC50eXBlID0gU1dULlZFUlRJQ0FMOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXBhcmVudC5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotCQkKLQkJLy8gc2V0IHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSB0b29sdGlwCi0JCVN0eWxlZFRleHQgc1RleHQgPSBuZXcgU3R5bGVkVGV4dChwYXJlbnQsIFNXVC5OT05FKTsKLQkJc1RleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlzVGV4dC5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXRCYWNrZ3JvdW5kKCkpOwotCQkKLQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQlJTW9kdWxlW10gbW9kdWxlcyA9IG1vZHVsZS5nZXRNb2R1bGUoKTsKLQkJCUlNb2R1bGUgbSA9IG1vZHVsZXNbbW9kdWxlcy5sZW5ndGggLSAxXTsKLQkJCXNUZXh0LnNldFRleHQoIjxiPiIgKyBtLmdldE5hbWUoKSArICI8L2I+Iik7Ci0JCQkvL3NUZXh0LnNldFRleHQoIjxiPiIgKyBtLmdldE5hbWUoKSArICI8L2I+PC9wPiIgKyBtLmdldE1vZHVsZVR5cGUoKS5nZXROYW1lKCkpOwotCQkJCi0JCQlTdHlsZWRUZXh0IHNUZXh0MiA9IG5ldyBTdHlsZWRUZXh0KHBhcmVudCwgU1dULk5PTkUpOwotCQkJc1RleHQyLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCXNUZXh0Mi5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXRCYWNrZ3JvdW5kKCkpOwotCQkJc1RleHQyLnNldFRleHQobS5nZXRNb2R1bGVUeXBlKCkuZ2V0TmFtZSgpKTsKLQkJfQotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlzVGV4dC5zZXRUZXh0KCI8Yj4iICsgc2VydmVyLmdldE5hbWUoKSArICI8L2I+Iik7Ci0JCQkKLQkJCS8vIGFkZCBhZG9wdGVycyBjb250ZW50Ci0JCQlpZiAoc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJQXJyYXlMaXN0PElTZXJ2ZXJUb29sVGlwPiBsaXN0T2ZQcm92aWRlcnMgPSB0b29sVGlwUHJvdmlkZXJzLmdldChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotCQkJCQotCQkJCWlmIChsaXN0T2ZQcm92aWRlcnMgIT0gbnVsbCkgewotCQkJCQlmb3IgKElTZXJ2ZXJUb29sVGlwIHRpcFByb3ZpZGVyIDogbGlzdE9mUHJvdmlkZXJzKSB7Ci0JCQkJCQl0aXBQcm92aWRlci5jcmVhdGVDb250ZW50KHBhcmVudCxzZXJ2ZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBhZGQgdGhlIEYzIHRleHQKLQkJaGludExhYmVsID0gbmV3IExhYmVsKHBhcmVudCxTV1QuQk9SREVSKTsKLQkJaGludExhYmVsLnNldEFsaWdubWVudChTV1QuUklHSFQpOwotCQloaW50TGFiZWwuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKLQkJaGludExhYmVsLnNldFRleHQoTWVzc2FnZXMudG9vbFRpcEVuYWJsZUZvY3VzKTsKLQkJaGludExhYmVsLnNldEZvcmVncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19HUkFZKSk7Ci0JCQotCQlmaW5hbCBGb250IGZvbnQ7Ci0JCURpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0JCUZvbnREYXRhW10gZmQgPSBwYXJlbnQuZ2V0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0JCWludCBzaXplMiA9IGZkLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKQotCQkJZmRbaV0uc2V0SGVpZ2h0KDcpOwotCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZmQpOwotCQlwYXJlbnQuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWZvbnQuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJaGludExhYmVsLnNldEZvbnQoZm9udCk7Ci0JCQotCQlwYXJzZVRleHQoc1RleHQuZ2V0VGV4dCgpLHNUZXh0KTsKLQkJCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VUZXh0KFN0cmluZyBodG1sVGV4dCxTdHlsZWRUZXh0IHNUZXh0KSB7CQotCQlUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbiA9IG5ldyBUZXh0UHJlc2VudGF0aW9uKCk7Ci0JCUhUTUwyVGV4dFJlYWRlciByZWFkZXIgPSBuZXcgSFRNTDJUZXh0UmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoaHRtbFRleHQpLCBwcmVzZW50YXRpb24pOwotCQlTdHJpbmcgdGV4dDsKLQkJCi0JCXRyeSB7Ci0JCQl0ZXh0ID0gcmVhZGVyLmdldFN0cmluZygpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0ZXh0PSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlzVGV4dC5zZXRUZXh0KHRleHQpOwkJCi0JCUl0ZXJhdG9yIGl0ZXIgPSBwcmVzZW50YXRpb24uZ2V0QWxsU3R5bGVSYW5nZUl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJU3R5bGVSYW5nZSBzciA9IChTdHlsZVJhbmdlKWl0ZXIubmV4dCgpOwotCQkJc1RleHQuc2V0U3R5bGVSYW5nZShzcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChUcmFjZS5FWFRFTlNJT05fUE9JTlQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19FWFRFTlNJT05fUE9JTlQsICItPi0gTG9hZGluZyBzZXJ2ZXJUb29sVGlwIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJfQotCQkKLQkJLy8gc2VhcmNoIGZvciBleHRlbnNpb24gcG9pbnRzIAotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZXh0ZW5zaW9ucyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZXJ2ZXJUb29sVGlwIik7Ci0JCQotCQlJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOwotCQkKLQkJZm9yIChpbnQgaT0wOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKyl7CQkJCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZXhFbGVtZW50ID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQotCQkJdHJ5IHsKLQkJCQkvLyBzb3J0IHRoZSBleHRlbnNpb25zIGJhc2VkIG9uIHNlcnZlclR5cGUKLQkJCQlTdHJpbmcgZXhTZXJ2ZXJUeXBlID0gZXhFbGVtZW50LmdldEF0dHJpYnV0ZSgic2VydmVyVHlwZXMiKTsKLQkJCQkKLQkJCQlmb3IgKElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgOiBzZXJ2ZXJUeXBlcykgewotCQkJCQlpZiAoIioiLmVxdWFscyhleFNlcnZlclR5cGUpIHx8IHNlcnZlclR5cGUuZ2V0SWQoKS5tYXRjaGVzKGV4U2VydmVyVHlwZSkpIHsKLQkJCQkJCUlTZXJ2ZXJUb29sVGlwIGV4VG9vbHRpcCA9IChJU2VydmVyVG9vbFRpcCkgZXhFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQkJCQlBcnJheUxpc3Q8SVNlcnZlclRvb2xUaXA+IGxpc3RPZlByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8SVNlcnZlclRvb2xUaXA+KCk7IAotCQkJCQkJaWYgKHRvb2xUaXBQcm92aWRlcnMuY29udGFpbnNLZXkoc2VydmVyVHlwZS5nZXRJZCgpKSkKLQkJCQkJCQlsaXN0T2ZQcm92aWRlcnMgPSB0b29sVGlwUHJvdmlkZXJzLmdldChzZXJ2ZXJUeXBlLmdldElkKCkpOwotCQkJCQkJCi0JCQkJCQlsaXN0T2ZQcm92aWRlcnMuYWRkKGV4VG9vbHRpcCk7Ci0JCQkJCQl0b29sVGlwUHJvdmlkZXJzLnB1dChzZXJ2ZXJUeXBlLmdldElkKCksIGxpc3RPZlByb3ZpZGVycyk7Ci0JCQkJCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0VYVEVOU0lPTl9QT0lOVCwKLQkJCQkJCQkJCSIgIExvYWRlZCBzZXJ2ZXJUb29sVGlwOiAiICsgZXhFbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKSArICIgZm9yIHNlcnZlciB0eXBlOiAiCi0JCQkJCQkJCQkJCSsgc2VydmVyVHlwZS5nZXRJZCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIlRvb2x0aXAgZmFpbGVkIHRvIGxvYWQiICsgZXhFbGVtZW50LnRvU3RyaW5nKCksIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoVHJhY2UuRVhURU5TSU9OX1BPSU5UKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRVhURU5TSU9OX1BPSU5ULCAiLTwtIERvbmUgbG9hZGluZyBzZXJ2ZXJUb29sVGlwIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQkJfQotCX0KLQotLy8gIHJlYWQgdGhlIGNyZWF0ZUZvY3VzZWRUb29sdGlwIG1ldGhvZCBmb3IgaW5mb3JtYXRpb24gb24gd2h5IHRoaXMgaXMgY29tbWVudGVkIG91dAotLy8KLS8vCXByb3RlY3RlZCBjbGFzcyBTdGlja3lUaXBNb3VzZUxpc3RlbmVyIGltcGxlbWVudHMgTW91c2VMaXN0ZW5lcnsKLS8vCi0vLwkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLS8vCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLS8vCQkJCi0vLwkJfQotLy8KLS8vCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0vLwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJtb3VzZURvd24iKTsKLS8vCQkJaWYgKENVUlJFTlRfVE9PTFRJUC5nZXRCb3VuZHMoKS5jb250YWlucyhuZXcgUG9pbnQoZS54LGUueSkpID09IHRydWUpewotLy8JCQkJQ1VSUkVOVF9UT09MVElQLnNldFZpc2libGUoZmFsc2UpOwotLy8JCQkJQ1VSUkVOVF9UT09MVElQLmRpc3Bvc2UoKTsKLS8vCQkJCWFjdGl2YXRlKCk7Ci0vLwkJCQlDVVJSRU5UX1RPT0xUSVAucmVtb3ZlTW91c2VMaXN0ZW5lcih0aGlzKTsKLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLS8vCQkJLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLS8vCQl9Ci0vLwl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjdkYjljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRlYnVnLkRlYnVnT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGVidWcuRGVidWdPcHRpb25zTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkxhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHVibGlzaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuU2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zLlJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3IuSVNlcnZlckVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLlNlcnZlckVkaXRvckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3IuU2VydmVyRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdFNlcnZlckxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5Jbml0aWFsU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuVGFza1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5XaXphcmRUYXNrVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLlNlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgc2VydmVyIFVJIHBsdWdpbiBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19JRCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlcnNWaWV3IjsKLQotCS8vIHNlcnZlciBVSSBwbHVnaW4gaWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fU0VSVkVSX0lNQUdFUyA9ICJzZXJ2ZXJJbWFnZXMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fV0laQVJEX0ZSQUdNRU5UUyA9ICJ3aXphcmRGcmFnbWVudHMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9FRElUT1JfUEFHRVMgPSAiZWRpdG9yUGFnZXMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9FRElUT1JfUEFHRV9TRUNUSU9OUyA9ICJlZGl0b3JQYWdlU2VjdGlvbnMiOwotCi0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU1RBUlQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTVE9QID0gMTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBSRVNUQVJUID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdExhdW5jaGFibGVBZGFwdGVyIGV4dGVuZHMgTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkubGF1bmNoYWJsZS5hZGFwdGVyLmRlZmF1bHQiOwotCQlwdWJsaWMgT2JqZWN0IGdldExhdW5jaGFibGUoSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCkgewotCQkJcmV0dXJuICJsYXVuY2hhYmxlIjsKLQkJfQotCX0KLQotCS8vIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmVyVUlQbHVnaW4gc2luZ2xldG9uOwotCi0JcHJvdGVjdGVkIE1hcCBpbWFnZURlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIGNhY2hlZCBjb3B5IG9mIGFsbCBydW50aW1lIHdpemFyZHMKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBXaXphcmRGcmFnbWVudERhdGE+IHdpemFyZEZyYWdtZW50czsKLQkKLQkvLyBDYWNoZWQgY29weSBvZiBhbGwgc2VydmVyIHdpemFyZCBVSSBtb2RpZmllcgotCXByaXZhdGUgc3RhdGljIExpc3Q8U2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9uPiBzZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb25zOwotCQotCS8vIENhY2hlZCBjb3B5IG9mIGFsbCBzZXJ2ZXIgZWRpdG9yIFVJIG1vZGlmaWVycwotCXByaXZhdGUgc3RhdGljIExpc3Q8U2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlTW9kaWZpZXI+IHNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZU1vZGlmaWVyOwotCQotCS8vIENhY2hlZCBjb3B5IG9mIHNlcnZlciBzdGF0ZSBsYWJlbCBwcm92aWRlcgotCXByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLEFic3RyYWN0U2VydmVyTGFiZWxQcm92aWRlcj4gc2VydmVyTGFiZWxQcm92aWRlcnM7Ci0JLy8gQ3JlYXRlIGEgZGVmYXVsdCBzZXJ2ZXIgc3RhdGUgbGFiZWwgcHJvdmlkZXIKLQlwcml2YXRlIHN0YXRpYyBBYnN0cmFjdFNlcnZlckxhYmVsUHJvdmlkZXIgZGVmYXVsdFNlcnZlckxhYmVsUHJvdmlkZXIgPSBuZXcgQWJzdHJhY3RTZXJ2ZXJMYWJlbFByb3ZpZGVyKCk7Ci0JCi0JLy8gY2FjaGVkIGluaXRpYWwgc2VsZWN0aW9uIHByb3ZpZGVyCi0JcHJpdmF0ZSBzdGF0aWMgSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgSVJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIgcmVnaXN0cnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZWdpc3RyeUNoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgcmVnaXN0cnlDaGFuZ2VkKElSZWdpc3RyeUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlJRXh0ZW5zaW9uRGVsdGFbXSBkZWx0YXMgPSBldmVudC5nZXRFeHRlbnNpb25EZWx0YXMoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fV0laQVJEX0ZSQUdNRU5UUyk7Ci0JCQlpZiAoZGVsdGFzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQloYW5kbGVXaXphcmRGcmFnbWVudERlbHRhKGRlbHRhc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlkZWx0YXMgPSBldmVudC5nZXRFeHRlbnNpb25EZWx0YXMoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fU0VSVkVSX0lNQUdFUyk7Ci0JCQlpZiAoZGVsdGFzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQlJbWFnZVJlc291cmNlLmhhbmRsZVNlcnZlckltYWdlRGVsdGEoZGVsdGFzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWRlbHRhcyA9IGV2ZW50LmdldEV4dGVuc2lvbkRlbHRhcyhTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIEVYVEVOU0lPTl9FRElUT1JfUEFHRVMpOwotCQkJaWYgKGRlbHRhcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJU2VydmVyRWRpdG9yQ29yZS5oYW5kbGVFZGl0b3JQYWdlRmFjdG9yaWVzRGVsdGEoZGVsdGFzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWRlbHRhcyA9IGV2ZW50LmdldEV4dGVuc2lvbkRlbHRhcyhTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIEVYVEVOU0lPTl9FRElUT1JfUEFHRV9TRUNUSU9OUyk7Ci0JCQlpZiAoZGVsdGFzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQlTZXJ2ZXJFZGl0b3JDb3JlLmhhbmRsZUVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzRGVsdGEoZGVsdGFzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgV2l6YXJkRnJhZ21lbnREYXRhIHsKLQkJU3RyaW5nIGlkOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2U7Ci0JCVdpemFyZEZyYWdtZW50IGZyYWdtZW50OwotCQkKLQkJcHVibGljIFdpemFyZEZyYWdtZW50RGF0YShTdHJpbmcgaWQsIElDb25maWd1cmF0aW9uRWxlbWVudCBjZSkgewotCQkJdGhpcy5pZCA9IGlkOwotCQkJdGhpcy5jZSA9IGNlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0PElTZXJ2ZXI+IHRlcm1pbmF0aW9uV2F0Y2hlcyA9IG5ldyBBcnJheUxpc3Q8SVNlcnZlcj4oKTsKLQotCXByb3RlY3RlZCBJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIgc2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzZXJ2ZXJBZGRlZChJU2VydmVyIHNlcnZlcikgewotCQkJc2VydmVyLmFkZFNlcnZlckxpc3RlbmVyKHNlcnZlckxpc3RlbmVyKTsKLQkJCSgoU2VydmVyKSBzZXJ2ZXIpLmFkZFB1Ymxpc2hMaXN0ZW5lcihwdWJsaXNoTGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChJU2VydmVyIHNlcnZlcikgewotCQkJLy8gaWdub3JlCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXJ2ZXJSZW1vdmVkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCQlzZXJ2ZXIucmVtb3ZlU2VydmVyTGlzdGVuZXIoc2VydmVyTGlzdGVuZXIpOwotCQkJKChTZXJ2ZXIpIHNlcnZlcikucmVtb3ZlUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBJU2VydmVyTGlzdGVuZXIgc2VydmVyTGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKFNlcnZlckV2ZW50IGV2ZW50KSB7Ci0JCQlpbnQgZXZlbnRLaW5kID0gZXZlbnQuZ2V0S2luZCgpOwotCQkJLy8gaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKLQkJCWlmICgoZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSAhPSAwKSB7Ci0JCQkJc2hvd1NlcnZlcnNWaWV3KHRydWUpOwotCQkJfSBlbHNlIGlmICgoZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSkgIT0gMCkgewotCQkJCXNob3dTZXJ2ZXJzVmlldyhmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBJUHVibGlzaExpc3RlbmVyIHB1Ymxpc2hMaXN0ZW5lciA9IG5ldyBQdWJsaXNoQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgcHVibGlzaFN0YXJ0ZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJCXNob3dTZXJ2ZXJzVmlldyhmYWxzZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwdWJsaXNoRmluaXNoZWQoSVNlcnZlciBzZXJ2ZXIsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCQlzaG93U2VydmVyc1ZpZXcoZmFsc2UpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgU2VydmVyVUlQbHVnaW4uCi0JICovCi0JcHVibGljIFNlcnZlclVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlzaW5nbGV0b24gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkgKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wbHVnaW4uU2VydmVyVUlQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZlclVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgbG9nZ2luZy4KLQkgKgotCSAqIEBwYXJhbSBzdGF0dXMgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgVUkgcHJlZmVyZW5jZXMuCi0JICogCi0JICogQHJldHVybiBTZXJ2ZXJVSVByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXJ2ZXJVSVByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gU2VydmVyVUlQcmVmZXJlbmNlcy5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0KLQkJaWYgKFRyYWNlLkNPTkZJRykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0NPTkZJRywgIi0tLS0tPi0tLS0tIFNlcnZlciBVSSBwbHVnaW4gc3RhcnQgLS0tLS0+LS0tLS0iKTsKLQkJfQotCQkKLQkJU2VydmVyQ29yZS5hZGRTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihzZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcik7Ci0KLQkJLy8gcHJlbG9hZCB0aGUgc2VydmVyIHN0YXRlIGxhYmVsIHByb3ZpZGVycyBmb3IgZmFzdGVyIFVJIHJlc3BvbnNlCi0JCWxvYWRTZXJ2ZXJMYWJlbFByb3ZpZGVyKCk7Ci0JCQotCQlJbml0aWFsaXplSm9iIGpvYiA9IG5ldyBJbml0aWFsaXplSm9iKCk7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCi0JCS8vIHJlZ2lzdGVyIHRoZSBkZWJ1ZyBvcHRpb25zIGxpc3RlbmVyCi0JCWZpbmFsIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gcHJvcHMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPig0KTsKLQkJcHJvcHMucHV0KERlYnVnT3B0aW9ucy5MSVNURU5FUl9TWU1CT0xJQ05BTUUsIFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCk7Ci0JCWNvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKERlYnVnT3B0aW9uc0xpc3RlbmVyLmNsYXNzLmdldE5hbWUoKSwgbmV3IFRyYWNlKCksIHByb3BzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKFRyYWNlLkNPTkZJRykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0NPTkZJRywgIi0tLS0tPC0tLS0tIFNlcnZlciBVSSBwbHVnaW4gc3RvcCAtLS0tLTwtLS0tLSIpOwotCQl9Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCQotCQlpZiAocmVnaXN0cnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJcmVnaXN0cnkucmVtb3ZlUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcihyZWdpc3RyeUxpc3RlbmVyKTsKLQkJfQotCQkKLQkJSW1hZ2VSZXNvdXJjZS5kaXNwb3NlKCk7Ci0JCQotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlzZXJ2ZXJzW2ldLnJlbW92ZVNlcnZlckxpc3RlbmVyKHNlcnZlckxpc3RlbmVyKTsKLQkJCQkoKFNlcnZlcikgc2VydmVyc1tpXSkucmVtb3ZlUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJCi0JCVNlcnZlckNvcmUucmVtb3ZlU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoc2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSB3YXRjaCB0byB0aGlzIHNlcnZlci4gSWYgaXQgaGFzbid0IHN0b3BwZWQgaW4gYQotCSAqIHJlYXNvbmFibGUgYW1vdW50IG9mIHRpbWUsIHRoZSB1c2VyIHdpbGwgYmUgcHJvbXB0ZWQgdG8KLQkgKiB0ZXJtaW5hdGUgdGhlIHNlcnZlci4KLQkgKgotCSAqIEBwYXJhbSBzaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBtb2RlIGEgZGVidWcgbW9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUZXJtaW5hdGlvbldhdGNoKGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBJU2VydmVyIHNlcnZlciwgZmluYWwgaW50IG1vZGUpIHsKLQkJaWYgKHRlcm1pbmF0aW9uV2F0Y2hlcy5jb250YWlucyhzZXJ2ZXIpKQotCQkJcmV0dXJuOwotCQkKLQkJdGVybWluYXRpb25XYXRjaGVzLmFkZChzZXJ2ZXIpOwotCQkKLQkJY2xhc3MgVGVybWluYXRlVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkJCXB1YmxpYyBib29sZWFuIGFsaXZlID0gdHJ1ZTsKLQkJCXB1YmxpYyBJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkJCXB1YmxpYyBUZXJtaW5hdGVUaHJlYWQoKSB7Ci0JCQkJc3VwZXIoIlNlcnZlciBUZXJtaW5hdGlvbiBUaHJlYWQiKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXdoaWxlIChhbGl2ZSkgewotCQkJCQlpbnQgZGVsYXkgPSBzZXJ2ZXIuZ2V0U3RhcnRUaW1lb3V0KCkgKiAxMDAwOwotCQkJCQlpZiAobW9kZSA9PSAxKQotCQkJCQkJZGVsYXkgPSBzZXJ2ZXIuZ2V0U3RvcFRpbWVvdXQoKSAqIDEwMDA7Ci0JCQkJCWVsc2UgaWYgKG1vZGUgPT0gMikKLQkJCQkJCWRlbGF5ICs9IHNlcnZlci5nZXRTdG9wVGltZW91dCgpICogMTAwMDsKLQkJCQkJCi0JCQkJCWlmIChkZWxheSA8IDApCi0JCQkJCQlyZXR1cm47Ci0JCQkJCQotCQkJCQl0cnkgewotCQkJCQkJVGhyZWFkLnNsZWVwKGRlbGF5KTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQkJCQlhbGl2ZSA9IGZhbHNlOwotCQotCQkJCQlpZiAoYWxpdmUpIHsKLQkJCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCVRlcm1pbmF0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBUZXJtaW5hdGlvbkRpYWxvZyhzaGVsbCwgc2VydmVyLmdldE5hbWUoKSk7Ci0JCQkJCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJCQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCQkJCQkJCS8vIG9ubHkgdHJ5IGNhbGxpbmcgdGVybWluYXRlIG9uY2UuIEFsc28sIG1ha2Ugc3VyZSB0aGF0IGl0IGRpZG4ndCBzdG9wIHdoaWxlCi0JCQkJCQkJCQkvLyB0aGUgZGlhbG9nIHdhcyBvcGVuCi0JCQkJCQkJCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJCQkJCQkJCXNlcnZlci5zdG9wKHRydWUpOwotCQkJCQkJCQkJYWxpdmUgPSBmYWxzZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJCWlmICghYWxpdmUpIHsKLQkJCQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJCQkJCXNlcnZlci5yZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQkJCQl0ZXJtaW5hdGlvbldhdGNoZXMucmVtb3ZlKHNlcnZlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQkJZmluYWwgVGVybWluYXRlVGhyZWFkIHQgPSBuZXcgVGVybWluYXRlVGhyZWFkKCk7Ci0JCXQuc2V0RGFlbW9uKHRydWUpOwotCQl0LnNldFByaW9yaXR5KFRocmVhZC5OT1JNX1BSSU9SSVRZIC0gMik7Ci0JCi0JCS8vIGFkZCBsaXN0ZW5lciB0byBzdG9wIHRoZSB0aHJlYWQgaWYvd2hlbiB0aGUgc2VydmVyIHN0b3BzCi0JCUlTZXJ2ZXJMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJU2VydmVyTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKFNlcnZlckV2ZW50IGV2ZW50KSB7Ci0JCQkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKLQkJCQlJU2VydmVyIHNlcnZlcjIgPSBldmVudC5nZXRTZXJ2ZXIoKTsKLQkJCQlpZiAoZXZlbnRLaW5kID09IChTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFIHwgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSkgewotCQkJCQlpZiAoc2VydmVyMi5nZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCQkJCXQuYWxpdmUgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXQubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQkJc2VydmVyLmFkZFNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkKLQkJdC5zdGFydCgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgdGhhdCBjYW1lIGZyb20gdGhlIGdpdmVuIGZpbGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24KLQkgKiBzZXJ2ZXJzICh7QGxpbmsgU2VydmVyQ29yZSNnZXRTZXJ2ZXJzKCl9KSBmb3IgdGhlIG9uZSB3aXRoIGEgbWF0Y2hpbmcKLQkgKiBsb2NhdGlvbiAoe0BsaW5rIFNlcnZlciNnZXRGaWxlKCl9KS4gVGhlIGZpbGUgbWF5IG5vdCBiZSBudWxsLgotCSAqCi0JICogQHBhcmFtIGZpbGUgYSBzZXJ2ZXIgZmlsZQotCSAqIEByZXR1cm4gdGhlIHNlcnZlciBpbnN0YW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgCi0JICogdGhlcmUgaXMgbm8gc2VydmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNlcnZlciBmaW5kU2VydmVyKElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChmaWxlLmVxdWFscygoKFNlcnZlcilzZXJ2ZXJzW2ldKS5nZXRGaWxlKCkpKQotCQkJCQlyZXR1cm4gc2VydmVyc1tpXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gcnVudGltZSBpbnN0YW5jZXMgb2YKLQkgKiB0aGUgZ2l2ZW4gcnVudGltZSB0eXBlLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBmaWx0ZXJzIHRoZSBsaXN0IG9mIGtub3duCi0JICogcnVudGltZSAoe0BsaW5rIFNlcnZlckNvcmUjZ2V0UnVudGltZXMoKX0pIGZvciBvbmVzIHdpdGggYSBtYXRjaGluZwotCSAqIHJ1bnRpbWUgdHlwZSAoe0BsaW5rIElSdW50aW1lI2dldFJ1bnRpbWVUeXBlKCl9KS4gVGhlIGFycmF5IHdpbGwgbm90Ci0JICogY29udGFpbiBhbnkgd29ya2luZyBjb3BpZXMuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHJ1bnRpbWVUeXBlIHRoZSBydW50aW1lIHR5cGUKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgbGlzdCBvZiBydW50aW1lIGluc3RhbmNlcyB7QGxpbmsgSVJ1bnRpbWV9Ci0JICogb2YgdGhlIGdpdmVuIHJ1bnRpbWUgdHlwZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJ1bnRpbWVbXSBnZXRSdW50aW1lcyhJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKLQkJTGlzdDxJUnVudGltZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWU+KCk7Ci0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCWlmIChydW50aW1lcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKHJ1bnRpbWVzW2ldLmdldFJ1bnRpbWVUeXBlKCkgIT0gbnVsbCAmJiBydW50aW1lc1tpXS5nZXRSdW50aW1lVHlwZSgpLmVxdWFscyhydW50aW1lVHlwZSkpCi0JCQkJCWxpc3QuYWRkKHJ1bnRpbWVzW2ldKTsKLQkJCX0KLQkJfQotCQkKLQkJSVJ1bnRpbWVbXSByID0gbmV3IElSdW50aW1lW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHIpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIHRoZSBnaXZlbiBzZXJ2ZXIgd2l0aCB0aGUgc2VydmVyIGVkaXRvci4KLQkgKgotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZWRpdFNlcnZlcihJU2VydmVyIHNlcnZlcikgewotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQllZGl0U2VydmVyKHNlcnZlci5nZXRJZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIHRoZSBnaXZlbiBzZXJ2ZXIgaWQgd2l0aCB0aGUgc2VydmVyIGVkaXRvci4KLQkgKgotCSAqIEBwYXJhbSBzZXJ2ZXJJZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBlZGl0U2VydmVyKFN0cmluZyBzZXJ2ZXJJZCkgewotCQlpZiAoc2VydmVySWQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQotCQl0cnkgewotCQkJSVNlcnZlckVkaXRvcklucHV0IGlucHV0ID0gbmV3IFNlcnZlckVkaXRvcklucHV0KHNlcnZlcklkKTsKLQkJCXBhZ2Uub3BlbkVkaXRvcihpbnB1dCwgSVNlcnZlckVkaXRvcklucHV0LkVESVRPUl9JRCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIG9wZW5pbmcgc2VydmVyIGVkaXRvciIsIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoZSBwcmVmZXJlbmNlIHRvIHByb21wdCB0aGUgdXNlciB0byBzYXZlIGRpcnR5IGVkaXRvcnMsIGlmIGFwcGxpY2FibGUuCi0JICogCi0JICogQHJldHVybiBib29sZWFuICAtIFJldHVybnMgZmFsc2UgaWYgdGhlIHVzZXIgY2FuY2VsbGVkIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2F2ZUVkaXRvcnMoKSB7Ci0JCWJ5dGUgYiA9IFNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuZ2V0U2F2ZUVkaXRvcnMoKTsKLQkJaWYgKGIgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5TQVZFX0VESVRPUlNfTkVWRVIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuc2F2ZUFsbEVkaXRvcnMoYiA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLlNBVkVfRURJVE9SU19QUk9NUFQpOwkJCQotCX0KLQotCS8qKgotCSAqIFByb21wdHMgdGhlIHVzZXIgaWYgdGhlIHNlcnZlciBpcyBkaXJ0eS4gUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgd2FzCi0JICogbm90IGRpcnR5IG9yIGlmIHRoZSB1c2VyIGRlY2lkZWQgdG8gY29udGludWUgYW55d2F5LiBSZXR1cm5zIGZhbHNlIGlmCi0JICogdGhlIHNlcnZlciBpcyBkaXJ0eSBhbmQgdGhlIHVzZXIgY2hvc2UgdG8gY2FuY2VsIHRoZSBvcGVyYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvbXB0SWZEaXJ0eShTaGVsbCBzaGVsbCwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKCEoc2VydmVyIGluc3RhbmNlb2YgSVNlcnZlcldvcmtpbmdDb3B5KSkKLQkJCXJldHVybiB0cnVlOwotCi0JCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VzLnJlc291cmNlRGlydHlEaWFsb2dUaXRsZTsKLQkJCi0JCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IChJU2VydmVyV29ya2luZ0NvcHkpIHNlcnZlcjsKLQkJaWYgKHdjLmlzRGlydHkoKSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChNZXNzYWdlcy5yZXNvdXJjZURpcnR5RGlhbG9nTWVzc2FnZSwgc2VydmVyLmdldE5hbWUoKSk7Ci0JCQlTdHJpbmdbXSBsYWJlbHMgPSBuZXcgU3RyaW5nW10ge01lc3NhZ2VzLnJlc291cmNlRGlydHlEaWFsb2dDb250aW51ZSwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUx9OwotCQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhzaGVsbCwgdGl0bGUsIG51bGwsIG1lc3NhZ2UsIE1lc3NhZ2VEaWFsb2cuSU5GT1JNQVRJT04sIGxhYmVscywgMCk7Ci0JCi0JCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTaG93IHRoZSBTZXJ2ZXJzIHZpZXcuIFRoZSBTZXJ2ZXJzIGlzIG5ldmVyIGdpdmVuIGZvY3VzLgotCSAqIAotCSAqIEBwYXJhbSBicmluZ1RvRnJvbnQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgU2VydmVycyB2aWV3IHB1c2ggdG8gdGhlIHRvcAotCSAqICAgIG9mIHRoZSB6LW9yZGVyLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGp1c3QgaGlnaGxpZ2h0IGl0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNob3dTZXJ2ZXJzVmlldyhmaW5hbCBib29sZWFuIGJyaW5nVG9Gcm9udCkgewotCQlpZiAoIWdldFByZWZlcmVuY2VzKCkuZ2V0U2hvd09uQWN0aXZpdHkoKSkKLQkJCXJldHVybjsKLQkJCi0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpOwotCQkJCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQkJaWYgKHdvcmtiZW5jaFdpbmRvdyA9PSBudWxsKSB7Ci0JCQkJCQlpZiAoVHJhY2UuRklORVIpIHsKLQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVIsICJObyBhY3RpdmUgd29ya2JlbmNoIHdpbmRvdyIpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCi0JCQkJCUlWaWV3UGFydCB2aWV3MiA9IHBhZ2UuZmluZFZpZXcoVklFV19JRCk7Ci0JCQkJCQotCQkJCQlpZiAodmlldzIgIT0gbnVsbCkgewotCQkJCQkJaWYgKGJyaW5nVG9Gcm9udCkKLQkJCQkJCQlwYWdlLmJyaW5nVG9Ub3AodmlldzIpOwotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2Ugd3NwcyA9IChJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZSkKLQkJCQkJCQkJdmlldzIuZ2V0U2l0ZSgpLmdldEFkYXB0ZXIoSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UuY2xhc3MpOwotCQkJCQkJCXdzcHMud2Fybk9mQ29udGVudENoYW5nZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIG9wZW5pbmcgU2VydmVycyB2aWV3IiwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VydmVyIGlzIGFscmVhZHkgc3RhcnRlZCBpbiB0aGUgZ2l2ZW4KLQkgKiBtb2RlLCBvciBjb3VsZCBiZSAocmUpc3RhcnRlZCBpbiB0aGUgc3RhcnQgbW9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyCi0JICogQHBhcmFtIGxhdW5jaE1vZGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb21wYXRpYmxlV2l0aExhdW5jaE1vZGUoSVNlcnZlciBzZXJ2ZXIsIFN0cmluZyBsYXVuY2hNb2RlKSB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCB8fCBsYXVuY2hNb2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKTsKLQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCAmJiBsYXVuY2hNb2RlLmVxdWFscyhzZXJ2ZXIuZ2V0TW9kZSgpKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLnN1cHBvcnRzTGF1bmNoTW9kZShsYXVuY2hNb2RlKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogT3BlbiB0aGUgbmV3IHJ1bnRpbWUgd2l6YXJkLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIHR5cGUgYSBtb2R1bGUgdHlwZSBpZAotCSAqIEBwYXJhbSB2ZXJzaW9uIGEgbW9kdWxlIHZlcnNpb24gaWQKLQkgKiBAcGFyYW0gcnVudGltZVR5cGVJZCBhIHJ1bnRpbWUgdHlwZSBpZAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBhIG5ldyBydW50aW1lIHdhcyBjcmVhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3dOZXdSdW50aW1lV2l6YXJkKFNoZWxsIHNoZWxsLCBmaW5hbCBTdHJpbmcgdHlwZSwgZmluYWwgU3RyaW5nIHZlcnNpb24sIGZpbmFsIFN0cmluZyBydW50aW1lVHlwZUlkKSB7Ci0JCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gbmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgewotCQkJCWxpc3QuYWRkKG5ldyBOZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQodHlwZSwgdmVyc2lvbiwgcnVudGltZVR5cGVJZCkpOwotCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVSdW50aW1lRnJhZ21lbnQpOwotCQkJfQotCQl9OwotCQlUYXNrV2l6YXJkIHdpemFyZCA9IG5ldyBUYXNrV2l6YXJkKE1lc3NhZ2VzLndpek5ld1J1bnRpbWVXaXphcmRUaXRsZSwgZnJhZ21lbnQpOwotCQl3aXphcmQuc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJcmV0dXJuIChkaWFsb2cub3BlbigpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotCX0KLQotCS8qKgotCSAqIE9wZW4gdGhlIG5ldyBydW50aW1lIHdpemFyZC4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAotCSAqIEBwYXJhbSBydW50aW1lVHlwZUlkIGEgcnVudGltZSB0eXBlIGlkCi0JICogQHJldHVybiB0cnVlIGlmIGEgbmV3IHJ1bnRpbWUgd2FzIGNyZWF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd05ld1J1bnRpbWVXaXphcmQoU2hlbGwgc2hlbGwsIGZpbmFsIFN0cmluZyBydW50aW1lVHlwZUlkKSB7Ci0JCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IG51bGw7Ci0JCWlmIChydW50aW1lVHlwZUlkICE9IG51bGwpCi0JCQlydW50aW1lVHlwZSA9IFNlcnZlckNvcmUuZmluZFJ1bnRpbWVUeXBlKHJ1bnRpbWVUeXBlSWQpOwotCQlpZiAocnVudGltZVR5cGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmaW5hbCBJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUgPSBydW50aW1lVHlwZS5jcmVhdGVSdW50aW1lKG51bGwsIG51bGwpOwotCQkJCVRhc2tNb2RlbCB0YXNrTW9kZWwgPSBuZXcgVGFza01vZGVsKCk7Ci0JCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FLCBydW50aW1lKTsKLQkJCQkKLQkJCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgewotCQkJCQkJbGlzdC5hZGQoZ2V0V2l6YXJkRnJhZ21lbnQocnVudGltZVR5cGVJZCkpOwotCQkJCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuU2F2ZVJ1bnRpbWVGcmFnbWVudCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCVRhc2tXaXphcmQgd2l6YXJkID0gbmV3IFRhc2tXaXphcmQoTWVzc2FnZXMud2l6TmV3UnVudGltZVdpemFyZFRpdGxlLCBmcmFnbWVudCwgdGFza01vZGVsKTsKLQkJCQl3aXphcmQuc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQkJCXJldHVybiAoZGlhbG9nLm9wZW4oKSA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzaG93TmV3UnVudGltZVdpemFyZChzaGVsbCwgbnVsbCwgbnVsbCwgcnVudGltZVR5cGVJZCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbiB0aGUgbmV3IHNlcnZlciB3aXphcmQuCi0JICogCi0JICogQHBhcmFtIHNoZWxsIGEgc2hlbGwKLQkgKiBAcGFyYW0gdHlwZUlkIGEgbW9kdWxlIHR5cGUgaWQsIG9yIG51bGwgZm9yIGFueSBtb2R1bGUgdHlwZQotCSAqIEBwYXJhbSB2ZXJzaW9uSWQgYSBtb2R1bGUgdmVyc2lvbiwgb3IgbnVsbCBmb3IgYW55IHZlcnNpb24KLQkgKiBAcGFyYW0gc2VydmVyVHlwZUlkIGEgc2VydmVyIHJ1bnRpbWUgdHlwZSwgb3IgbnVsbCBmb3IgYW55IHR5cGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgc2VydmVyIHdhcyBjcmVhdGVkLCBvcgotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd05ld1NlcnZlcldpemFyZChTaGVsbCBzaGVsbCwgZmluYWwgU3RyaW5nIHR5cGVJZCwgZmluYWwgU3RyaW5nIHZlcnNpb25JZCwgZmluYWwgU3RyaW5nIHNlcnZlclR5cGVJZCkgewotCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKLQkJCQlsaXN0LmFkZChuZXcgTmV3U2VydmVyV2l6YXJkRnJhZ21lbnQobmV3IE1vZHVsZVR5cGUodHlwZUlkLCB2ZXJzaW9uSWQpLCBzZXJ2ZXJUeXBlSWQpKTsKLQkJCQkKLQkJCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5UZW1wU2F2ZVJ1bnRpbWVGcmFnbWVudCk7Ci0JCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuVGVtcFNhdmVTZXJ2ZXJGcmFnbWVudCk7Ci0JCQkJCi0JCQkJbGlzdC5hZGQobmV3IE1vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudCgpKTsKLQkJCQlsaXN0LmFkZChuZXcgVGFza3NXaXphcmRGcmFnbWVudCgpKTsKLQkJCQkKLQkJCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5TYXZlUnVudGltZUZyYWdtZW50KTsKLQkJCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5TYXZlU2VydmVyRnJhZ21lbnQpOwotCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVIb3N0bmFtZUZyYWdtZW50KTsKLQkJCX0KLQkJfTsKLQkJCi0JCVRhc2tXaXphcmQgd2l6YXJkID0gbmV3IFRhc2tXaXphcmQoTWVzc2FnZXMud2l6TmV3U2VydmVyV2l6YXJkVGl0bGUsIGZyYWdtZW50KTsKLQkJd2l6YXJkLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCXJldHVybiAoZGlhbG9nLm9wZW4oKSA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGlkIGhhcyBwb3NzaWJsZSB3aXphcmQgZnJhZ21lbnRzLCBhbmQKLQkgKiBmYWxzZSBvdGhlcndpc2UuCi0JICoKLQkgKiBAcGFyYW0gdHlwZUlkIHRoZSBzZXJ2ZXIgb3IgcnVudGltZSB0eXBlIGlkCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBpZCBoYXMgcG9zc2libGUgd2l6YXJkIGZyYWdtZW50cywgYW5kCi0JICogICAgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1dpemFyZEZyYWdtZW50KFN0cmluZyB0eXBlSWQpIHsKLQkJaWYgKHR5cGVJZCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKHdpemFyZEZyYWdtZW50cyA9PSBudWxsKQotCQkJbG9hZFdpemFyZEZyYWdtZW50cygpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB3aXphcmRGcmFnbWVudHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh0eXBlSWQuZXF1YWxzKGtleSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpemFyZCBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKgotCSAqIEBwYXJhbSB0eXBlSWQgdGhlIHNlcnZlciBvciBydW50aW1lIHR5cGUgaWQKLQkgKiBAcmV0dXJuIGEgd2l6YXJkIGZyYWdtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGNvdWxkIGJlIGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBXaXphcmRGcmFnbWVudCBnZXRXaXphcmRGcmFnbWVudChTdHJpbmcgdHlwZUlkKSB7Ci0JCWlmICh0eXBlSWQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaWYgKHdpemFyZEZyYWdtZW50cyA9PSBudWxsKQotCQkJbG9hZFdpemFyZEZyYWdtZW50cygpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB3aXphcmRGcmFnbWVudHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh0eXBlSWQuZXF1YWxzKGtleSkpIHsKLQkJCQlXaXphcmRGcmFnbWVudERhdGEgZGF0YSA9IHdpemFyZEZyYWdtZW50cy5nZXQoa2V5KTsKLQkJCQlyZXR1cm4gZ2V0V2l6YXJkRnJhZ21lbnQoZGF0YSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgd2l6YXJkIGZyYWdtZW50cy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkV2l6YXJkRnJhZ21lbnRzKCkgewotCQlpZiAod2l6YXJkRnJhZ21lbnRzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChUcmFjZS5DT05GSUcpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19DT05GSUcsICItPi0gTG9hZGluZyAud2l6YXJkRnJhZ21lbnRzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJfQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIEVYVEVOU0lPTl9XSVpBUkRfRlJBR01FTlRTKTsKLQkJCi0JCU1hcDxTdHJpbmcsIFdpemFyZEZyYWdtZW50RGF0YT4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBXaXphcmRGcmFnbWVudERhdGE+KGNmLmxlbmd0aCk7Ci0JCWxvYWRXaXphcmRGcmFnbWVudHMoY2YsIG1hcCk7Ci0JCWFkZFJlZ2lzdHJ5TGlzdGVuZXIoKTsKLQkJd2l6YXJkRnJhZ21lbnRzID0gbWFwOwotCQkKLQkJaWYgKFRyYWNlLkNPTkZJRykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0NPTkZJRywgIi08LSBEb25lIGxvYWRpbmcgLndpemFyZEZyYWdtZW50cyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHdpemFyZCBmcmFnbWVudHMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZFdpemFyZEZyYWdtZW50cyhJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiwgTWFwPFN0cmluZywgV2l6YXJkRnJhZ21lbnREYXRhPiBtYXApIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjZi5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgaWQgPSBjZltpXS5nZXRBdHRyaWJ1dGUoInR5cGVJZHMiKTsKLQkJCQlTdHJpbmdbXSBpZHMgPSB0b2tlbml6ZShpZCwgIiwiKTsKLQkJCQlpbnQgc2l6ZSA9IGlkcy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspCi0JCQkJCW1hcC5wdXQoaWRzW2pdLCBuZXcgV2l6YXJkRnJhZ21lbnREYXRhKGlkLCBjZltpXSkpOwotCQkJCWlmIChUcmFjZS5DT05GSUcpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0NPTkZJRywgIiAgTG9hZGVkIHdpemFyZEZyYWdtZW50OiAiICsgaWQpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCB3aXphcmRGcmFnbWVudDogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gcHJvdmlkZXIuCi0JICoKLQkgKiBAcmV0dXJuIGFuIGluaXRpYWwgc2VsZWN0aW9uIHByb3ZpZGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGNvdWxkIGJlIGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBJbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIgZ2V0SW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyKCkgewotCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgPT0gbnVsbCkKLQkJCWxvYWRJbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCi0JCXJldHVybiBzZWxlY3Rpb25Qcm92aWRlcjsKLQl9Ci0KLSAJLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIGxhYmVsIHByb3ZpZGVyLiBUaGVyZSBpcyBhbHdheXMgYSBzZXJ2ZXIgbGFiZWwgcHJvdmlkZXIgZm9yIGEgc2VydmVyIHR5cGUKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNlcnZlciBsYWJlbCBwcm92aWRlciwgaWYgb25lIGlzIHByb3ZpZGVyIGJ5IHRoZSBhZG9wdGVyIG90aGVyd2lzZSBpdCByZXR1cm5zIGEgZGVmYXVsdCBvbmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFic3RyYWN0U2VydmVyTGFiZWxQcm92aWRlciBnZXRTZXJ2ZXJMYWJlbFByb3ZpZGVyKFN0cmluZyBzZXJ2ZXJUeXBlSWQpIHsKLQkJaWYgKHNlcnZlckxhYmVsUHJvdmlkZXJzID09IG51bGwpCi0JCQlsb2FkU2VydmVyTGFiZWxQcm92aWRlcigpOwotCQkKLQkJQWJzdHJhY3RTZXJ2ZXJMYWJlbFByb3ZpZGVyIHNlcnZlckxhYmVsUHJvdmlkZXIgPSBzZXJ2ZXJMYWJlbFByb3ZpZGVycy5nZXQoc2VydmVyVHlwZUlkKTsKLQkJCi0JCS8vIElmIHRoZXJlIGlzbid0IG9uZSBkZWZpbmVkIGJ5IGFuIGFkb3B0ZXIsIHRoZW4gYm91bmQgdGhlIGRlZmF1bHRTZXJ2ZXJMYWJlbFByb3ZpZGVyIHRvIHRoZSBsaXN0Ci0JCWlmIChzZXJ2ZXJMYWJlbFByb3ZpZGVyID09IG51bGwpewotCQkJc2VydmVyTGFiZWxQcm92aWRlciA9IGRlZmF1bHRTZXJ2ZXJMYWJlbFByb3ZpZGVyOwotCQkJc2VydmVyTGFiZWxQcm92aWRlcnMucHV0KHNlcnZlclR5cGVJZCwgc2VydmVyTGFiZWxQcm92aWRlcik7Ci0JCX0KLQkJCi0JCXJldHVybiBzZXJ2ZXJMYWJlbFByb3ZpZGVyOyAKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHNlcnZlciBjcmVhdGlvbiB3aXphcmQgbW9kaWZpZXIuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHNlcnZlciBjcmVhdGlvbiB3aXphcmQgbW9kaWZpZXIsIG9yIGFuIGVtcHR5IGxpc3QgaWYgbm9uZSBjb3VsZCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxTZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb24+IGdldFNlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbnMoKSB7Ci0JCWlmIChzZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb25zID09IG51bGwpCi0JCQlsb2FkU2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9ucygpOwotCi0JCXJldHVybiBzZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb25zOwotCX0KLQotIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHNlcnZlciBlZGl0b3IgbW9kaWZpZXJzLgotCSAqCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiBzZXJ2ZXIgZWRpdG9yIG1vZGlmaWVycywgb3IgYW4gZW1wdHkgbGlzdCBpZiBub25lIGNvdWxkIGJlIGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZU1vZGlmaWVyPiBnZXRTZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2VNb2RpZmllcnMoKSB7Ci0JCWlmIChzZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2VNb2RpZmllciA9PSBudWxsKQotCQkJbG9hZFNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZU1vZGlmaWVycygpOwotCQlyZXR1cm4gc2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlTW9kaWZpZXI7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgU2VydmVyIGNyZWF0aW9uIHdpemFyZCBwYWdlIG1vZGlmaWVycy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkU2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9ucygpIHsKLQkJaWYgKHNlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbnMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChUcmFjZS5DT05GSUcpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19DT05GSUcsICItPi0gTG9hZGluZyAuc2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9uIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJfQotCQlzZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdDxTZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb24+KCk7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgInNlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbiIpOwotCQkKLQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY3VyQ29uZmlnRWxlbWVudDogY2YpIHsKLQkJCXRyeSB7Ci0JCQkJLy8gQ3JlYXRlIHRoZSBjbGFzcyBoZXJlIGFscmVhZHkgc2luY2UgdGhlIHVzYWdlIG9mIHRoZSBzZXJ2ZXIgd2l6YXJkIHBhZ2Ugd2lsbCBuZWVkIHRvIHVzZSBhbGwgdGhlIGV4dGVuc2lvbnMKLQkJCQkvLyBpbiBhbGwgdGhlIGNhbGxzLiAgVGhlcmVmb3JlLCB0aGVyZSBpcyBubyBuZWVkIGZvciBsYXp5IGxvYWRpbmcgaGVyZS4KLQkJCQlTZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb24gY3VyRXh0ZW5zaW9uID0gKFNlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbiljdXJDb25maWdFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQkJaWYgKFRyYWNlLkNPTkZJRykgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfQ09ORklHLAotCQkJCQkJCSIgIExvYWRlZCAuc2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9uOiAiICsgY2ZbMF0uZ2V0QXR0cmlidXRlKCJpZCIpCi0JCQkJCQkJCQkrICIsIGxvYWRlZCBjbGFzcz0iICsgY3VyRXh0ZW5zaW9uKTsKLQkJCQl9Ci0JCQkJaWYgKGN1ckV4dGVuc2lvbiAhPSBudWxsKQotCQkJCQlzZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb25zLmFkZChjdXJFeHRlbnNpb24pOwotCi0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwKLQkJCQkJCQkiICBDb3VsZCBub3QgbG9hZCAuc2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9uOiAiICsgY2ZbMF0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChUcmFjZS5DT05GSUcpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19DT05GSUcsICItPC0gRG9uZSBsb2FkaW5nIC5zZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb24gZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgU2VydmVyIGVkaXRvciBwYWdlIG1vZGlmaWVycy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkU2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlTW9kaWZpZXJzKCkgewotCQlpZiAoc2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlTW9kaWZpZXIgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChUcmFjZS5DT05GSUcpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19DT05GSUcsICItPi0gTG9hZGluZyAuc2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlTW9kaWZpZXIgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQl9Ci0JCXNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZU1vZGlmaWVyID0gbmV3IEFycmF5TGlzdDxTZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2VNb2RpZmllcj4oKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCAic2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlTW9kaWZpZXIiKTsKLQkJCi0JCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGN1ckNvbmZpZ0VsZW1lbnQ6IGNmKSB7Ci0JCQl0cnkgewotCQkJCVNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZU1vZGlmaWVyIGN1ckV4dGVuc2lvbiA9IChTZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2VNb2RpZmllciljdXJDb25maWdFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQkJaWYgKFRyYWNlLkNPTkZJRykgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfQ09ORklHLAotCQkJCQkJCSIgIExvYWRlZCAuc2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlTW9kaWZpZXI6ICIgKyBjZlswXS5nZXRBdHRyaWJ1dGUoImlkIikKLQkJCQkJCQkJCSsgIiwgbG9hZGVkIGNsYXNzPSIgKyBjdXJFeHRlbnNpb24pOwotCQkJCX0KLQkJCQlpZiAoY3VyRXh0ZW5zaW9uICE9IG51bGwpCi0JCQkJCXNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZU1vZGlmaWVyLmFkZChjdXJFeHRlbnNpb24pOwotCi0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwKLQkJCQkJCQkiICBDb3VsZCBub3QgbG9hZCAuc2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlTW9kaWZpZXI6ICIgKyBjZlswXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKFRyYWNlLkNPTkZJRykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0NPTkZJRywgIi08LSBEb25lIGxvYWRpbmcgLnNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZU1vZGlmaWVyIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBMb2FkIHRoZSBTZXJ2ZXIgTGFiZWwgUHJvdmlkZXJzLiBJZiB0aGVyZSBpcyB0d28gaW1wbGVtZW50ZWQgZm9yIGEgU2VydmVyVHlwZSB0aGUgYWRvcHRlcnMgU2VydmVyTGFiZWxQcm92aWRlcnMKLQkgKiB3aWxsIGJlIGlnbm9yZWQgYW4gYSBkZWZhdWx0IHdpbGwgYmUgcmV0dXJuZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkU2VydmVyTGFiZWxQcm92aWRlcigpIHsKLQkJaWYgKHNlcnZlckxhYmVsUHJvdmlkZXJzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoVHJhY2UuQ09ORklHKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfQ09ORklHLCAiLT4tIExvYWRpbmcgLnNlcnZlckxhYmVsUHJvdmlkZXIgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQl9Ci0JCXNlcnZlckxhYmVsUHJvdmlkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLEFic3RyYWN0U2VydmVyTGFiZWxQcm92aWRlcj4oKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCAic2VydmVyTGFiZWxQcm92aWRlciIpOwotCQkKLQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY3VyQ29uZmlnRWxlbWVudDogY2YpIHsKLQkJCS8vIGxvYWQgdGhlIGV4dGVuc2lvbiBpbiBhIHNhZmUgZW52aXJvbWVudC4gSWYgdGhlcmUgYXJlIE5QRXMgb3IgbWlzc2NvbmZpZ3VyYXRpb25zIHRoZXkgd2lsbCBiZSBjYXVnaHQgYnkgdHJ5L2NhdGNoCi0JCQlTdHJpbmdbXSBleFNlcnZlclR5cGVzID0gU2VydmVyUGx1Z2luLnRva2VuaXplKGN1ckNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJzZXJ2ZXJUeXBlcyIpLCAiLCIpOwotCQkJZm9yIChTdHJpbmcgZXhTZXJ2ZXJUeXBlIDogZXhTZXJ2ZXJUeXBlcykgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChzZXJ2ZXJMYWJlbFByb3ZpZGVycy5jb250YWluc0tleShleFNlcnZlclR5cGUpKXsKLQkJCQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJNb3JlIHRoYXQgb25lIC5zZXJ2ZXJMYWJlbFByb3ZpZGVyIGZvdW5kIC0gaWdub3JpbmciKTsKLQkJCQkJCX0KLQkJCQkJCXNlcnZlckxhYmVsUHJvdmlkZXJzLnB1dChleFNlcnZlclR5cGUsIGRlZmF1bHRTZXJ2ZXJMYWJlbFByb3ZpZGVyKTsKLQkJCQkJfQotCQkJCQllbHNlewotCQkJCQkJQWJzdHJhY3RTZXJ2ZXJMYWJlbFByb3ZpZGVyIGV4Q2xhc3MgPSAoQWJzdHJhY3RTZXJ2ZXJMYWJlbFByb3ZpZGVyKWN1ckNvbmZpZ0VsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCQkJCWlmIChUcmFjZS5DT05GSUcpIHsKLQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfQ09ORklHLAotCQkJCQkJCQkJIiAgTG9hZGVkIC5zZXJ2ZXJMYWJlbFByb3ZpZGVyOiAiICsgY3VyQ29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIikKLQkJCQkJCQkJCQkJKyAiLCBsb2FkZWQgY2xhc3M9IiArIGV4Q2xhc3MpOwotCQkJCQkJfQotCQkJCQkJc2VydmVyTGFiZWxQcm92aWRlcnMucHV0KGV4U2VydmVyVHlwZSwgZXhDbGFzcyk7IAotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwKLQkJCQkJCQkJIiAgQ291bGQgbm90IGxvYWQgLnNlcnZlckxhYmVsUHJvdmlkZXI6ICIgKyBjdXJDb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCQlpZiAoVHJhY2UuQ09ORklHKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfQ09ORklHLCAiLTwtIERvbmUgbG9hZGluZyAuc2VydmVyTGFiZWxQcm92aWRlciBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JCX0KLQl9CQotCQotCS8qKgotCSAqIExvYWQgdGhlIGluaXRpYWwgc2VsZWN0aW9uIHByb3ZpZGVyLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRJbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIoKSB7Ci0JCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKFRyYWNlLkNPTkZJRykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0NPTkZJRywgIi0+LSBMb2FkaW5nIC5pbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQl9Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgImluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciIpOwotCQkKLQkJaWYgKGNmLmxlbmd0aCA9PSAxKSB7Ci0JCQl0cnkgewotCQkJCXNlbGVjdGlvblByb3ZpZGVyID0gKEluaXRpYWxTZWxlY3Rpb25Qcm92aWRlcikgY2ZbMF0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCQlpZiAoVHJhY2UuQ09ORklHKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19DT05GSUcsICIgIExvYWRlZCBpbml0aWFsU2VsZWN0aW9uUHJvdmlkZXI6ICIgKyBjZlswXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLAotCQkJCQkJCSIgIENvdWxkIG5vdCBsb2FkIGluaXRpYWxTZWxlY3Rpb25Qcm92aWRlcjogIiArIGNmWzBdLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGNmLmxlbmd0aCA+IDEpCi0JCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiTW9yZSB0aGF0IG9uZSBpbml0aWFsIHNlbGVjdGlvbiBwcm92aWRlciBmb3VuZCAtIGlnbm9yaW5nIik7Ci0JCQl9Ci0JCWVsc2UgaWYgKFRyYWNlLkNPTkZJRykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0NPTkZJRywgIk5vIGluaXRpYWwgc2VsZWN0aW9uIHByb3ZpZGVyIGZvdW5kIik7Ci0JCX0KLQkJCi0JCWlmIChzZWxlY3Rpb25Qcm92aWRlciA9PSBudWxsKQotCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBuZXcgSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQotCQlpZiAoVHJhY2UuQ09ORklHKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfQ09ORklHLCAiLTwtIERvbmUgbG9hZGluZyAuaW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgV2l6YXJkRnJhZ21lbnQgZ2V0V2l6YXJkRnJhZ21lbnQoV2l6YXJkRnJhZ21lbnREYXRhIGZyYWdtZW50KSB7Ci0JCWlmIChmcmFnbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlpZiAoZnJhZ21lbnQuZnJhZ21lbnQgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlmcmFnbWVudC5mcmFnbWVudCA9IChXaXphcmRGcmFnbWVudCkgZnJhZ21lbnQuY2UuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCQlpZiAoVHJhY2UuUEVSRk9STUFOQ0UpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1BFUkZPUk1BTkNFLAotCQkJCQkJCSJTZXJ2ZXJVSVBsdWdpbi5nZXRXaXphcmRGcmFnbWVudCgpOiA8IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpICsgIj4gIgotCQkJCQkJCQkJKyBmcmFnbWVudC5jZS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLAotCQkJCQkJCSJDb3VsZCBub3QgY3JlYXRlIHdpemFyZEZyYWdtZW50OiAiICsgZnJhZ21lbnQuY2UuZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZyYWdtZW50LmZyYWdtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5PblNlcnZlcihPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlIGRlbGVnYXRlID0gbmV3IFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUoKTsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQkvLyBkdW1teSBhY3Rpb24KLQkJfTsKLQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG9iamVjdCk7Ci0JCQlkZWxlZ2F0ZS5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgc2VsKTsKLQkJfSBlbHNlCi0JCQlkZWxlZ2F0ZS5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgbnVsbCk7Ci0KLQkJZGVsZWdhdGUucnVuKGFjdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRSZWdpc3RyeUxpc3RlbmVyKCkgewotCQlpZiAocmVnaXN0cnlMaXN0ZW5lciAhPSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJcmVnaXN0cnlMaXN0ZW5lciA9IG5ldyBSZWdpc3RyeUNoYW5nZUxpc3RlbmVyKCk7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCXJlZ2lzdHJ5LmFkZFJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIocmVnaXN0cnlMaXN0ZW5lciwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaGFuZGxlV2l6YXJkRnJhZ21lbnREZWx0YShJRXh0ZW5zaW9uRGVsdGEgZGVsdGEpIHsKLQkJaWYgKHdpemFyZEZyYWdtZW50cyA9PSBudWxsKSAvLyBub3QgbG9hZGVkIHlldAotCQkJcmV0dXJuOwotCQkKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSBkZWx0YS5nZXRFeHRlbnNpb24oKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCi0JCU1hcDxTdHJpbmcsIFdpemFyZEZyYWdtZW50RGF0YT4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBXaXphcmRGcmFnbWVudERhdGE+KHdpemFyZEZyYWdtZW50cyk7Ci0JCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUV4dGVuc2lvbkRlbHRhLkFEREVEKSB7Ci0JCQlsb2FkV2l6YXJkRnJhZ21lbnRzKGNmLCBtYXApOwotCQl9IGVsc2UgewotCQkJLyppbnQgc2l6ZSA9IHdpemFyZEZyYWdtZW50cy5zaXplKCk7Ci0JCQlXaXphcmRGcmFnbWVudFtdIHdmID0gbmV3IFdpemFyZEZyYWdtZW50W3NpemVdOwotCQkJd2l6YXJkRnJhZ21lbnRzLnRvQXJyYXkod2YpOwotCQkJaW50IHNpemUyID0gY2YubGVuZ3RoOwotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQlpZiAod2ZbaV0uZ2V0SWQoKS5lcXVhbHMoY2Zbal0uZ2V0QXR0cmlidXRlKCJpZCIpKSkgewotCQkJCQkJd2ZbaV0uZGlzcG9zZSgpOwotCQkJCQkJd2l6YXJkRnJhZ21lbnRzLnJlbW92ZSh3ZltpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ki8KLQkJfQotCQl3aXphcmRGcmFnbWVudHMgPSBtYXA7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdG8gdG9rZW5pemUgYSBzdHJpbmcgaW50byBhbiBhcnJheS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyIGEgc3RyaW5nIHRvIGJlIHBhcnNlZAotCSAqIEBwYXJhbSBkZWxpbSB0aGUgZGVsaW1pdGVycwotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgdG9rZW5pemVkIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdG9rZW5pemUoU3RyaW5nIHN0ciwgU3RyaW5nIGRlbGltKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQkKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCBkZWxpbSk7Ci0JCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBzID0gc3QubmV4dFRva2VuKCk7Ci0JCQlpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKQotCQkJCWxpc3QuYWRkKHMudHJpbSgpKTsKLQkJfQotCQkKLQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocyk7Ci0JCXJldHVybiBzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxhdW5jaGFibGUgY2xpZW50cyBmb3IgdGhlIGdpdmVuIHNlcnZlciBhbmQgbGF1bmNoYWJsZQotCSAqIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICogQHBhcmFtIGxhdW5jaGFibGUKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBTdHJpbmcKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNsaWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDbGllbnRbXSBnZXRDbGllbnRzKElTZXJ2ZXIgc2VydmVyLCBPYmplY3QgbGF1bmNoYWJsZSwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsIHx8IGxhdW5jaGFibGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUNsaWVudFswXTsKLQkJCi0JCUFycmF5TGlzdDxJQ2xpZW50PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJQ2xpZW50Pig1KTsKLQkJSUNsaWVudFtdIGNsaWVudHMgPSBTZXJ2ZXJQbHVnaW4uZ2V0Q2xpZW50cygpOwotCQlpZiAoY2xpZW50cyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGNsaWVudHMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJjbGllbnQ9ICIgKyBjbGllbnRzW2ldKTsKLQkJCQl9Ci0JCQkJaWYgKGNsaWVudHNbaV0uc3VwcG9ydHMoc2VydmVyLCBsYXVuY2hhYmxlLCBsYXVuY2hNb2RlKSkKLQkJCQkJbGlzdC5hZGQoY2xpZW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlDbGllbnRbXSBjbGllbnRzMiA9IG5ldyBJQ2xpZW50W2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KGNsaWVudHMyKTsKLQkJcmV0dXJuIGNsaWVudHMyOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gZ2V0TGF1bmNoYWJsZUFkYXB0ZXIoSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTGF1bmNoYWJsZUFkYXB0ZXJbXSBhZGFwdGVycyA9IFNlcnZlclBsdWdpbi5nZXRMYXVuY2hhYmxlQWRhcHRlcnMoKTsKLQkJaWYgKGFkYXB0ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplMiA9IGFkYXB0ZXJzLmxlbmd0aDsKLQkJCUlTdGF0dXMgbGFzdFN0YXR1cyA9IG51bGw7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQlJTGF1bmNoYWJsZUFkYXB0ZXIgYWRhcHRlciA9IGFkYXB0ZXJzW2pdOwotCQkJCXRyeSB7Ci0JCQkJCU9iamVjdCBsYXVuY2hhYmxlMiA9IGFkYXB0ZXIuZ2V0TGF1bmNoYWJsZShzZXJ2ZXIsIG1vZHVsZUFydGlmYWN0KTsKLQkJCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgImFkYXB0ZXI9ICIgKyBhZGFwdGVyICsgIiwgbGF1bmNoYWJsZT0gIiArIGxhdW5jaGFibGUyKTsKLQkJCQkJfQotCQkJCQlpZiAobGF1bmNoYWJsZTIgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBuZXcgT2JqZWN0W10geyBhZGFwdGVyLCBsYXVuY2hhYmxlMiB9OwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJbGFzdFN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBpbiBsYXVuY2hhYmxlIGFkYXB0ZXIiLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChsYXN0U3RhdHVzICE9IG51bGwpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obGFzdFN0YXR1cyk7Ci0JCX0KLQkJCi0JCS8vIGJhY2t1cAotCQlJTGF1bmNoYWJsZUFkYXB0ZXIgbGF1bmNoYWJsZUFkYXB0ZXIgPSBTZXJ2ZXJQbHVnaW4uZmluZExhdW5jaGFibGVBZGFwdGVyKERlZmF1bHRMYXVuY2hhYmxlQWRhcHRlci5JRCk7Ci0JCU9iamVjdCBsYXVuY2hhYmxlID0gbGF1bmNoYWJsZUFkYXB0ZXIuZ2V0TGF1bmNoYWJsZShzZXJ2ZXIsIG1vZHVsZUFydGlmYWN0KTsKLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGxhdW5jaGFibGVBZGFwdGVyLCBsYXVuY2hhYmxlIH07Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBhZGFwdExhYmVsQ2hhbmdlT2JqZWN0cyhPYmplY3RbXSBvYmopIHsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIG9iajsKLQkJCi0JCUxpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWludCBzaXplID0gb2JqLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChvYmpbaV0gaW5zdGFuY2VvZiBJTW9kdWxlKSB7Ci0JCQkJbGlzdC5hZGQob2JqW2ldKTsKLQkJCX0gZWxzZSBpZiAob2JqW2ldIGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJCWxpc3QuYWRkKG9ialtpXSk7Ci0JCQl9IGVsc2UgaWYgKG9ialtpXSBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJCWxpc3QuYWRkKG9ialtpXSk7Ci0JCQl9IGVsc2UgaWYgKG9ialtpXSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJSVByb2plY3QgcHJvaiA9IChJUHJvamVjdCkgb2JqW2ldOwotCQkJCUlNb2R1bGVbXSBtID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHByb2opOwotCQkJCWludCBzaXplMiA9IG0ubGVuZ3RoOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykKLQkJCQkJbGlzdC5hZGQobVtqXSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCU9iamVjdFtdIG8gPSBuZXcgT2JqZWN0W2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KG8pOwotCQlyZXR1cm4gbzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyVUlQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyVUlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWUzOTEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclVJUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci0vKioKLSAqIEhlbHBlciBjbGFzcyB0aGF0IHN0b3JlcyBwcmVmZXJlbmNlIGluZm9ybWF0aW9uIGZvciBzZXJ2ZXIgdG9vbHMgVUkuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJVSVByZWZlcmVuY2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9JTVBPUlRfTE9DQVRJT04gPSAiaW1wb3J0LWxvY2F0aW9uIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TQVZFX0VESVRPUlMgPSAic2F2ZS1lZGl0b3JzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9IT1NUX05BTUVTID0gImhvc3QtbmFtZXMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1NIT1dfT05fQUNUSVZJVFkgPSAic2hvdy1vbi1hY3Rpdml0eSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTEFVTkNIX01PREUgPSAibGF1bmNoLW1vZGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0xBVU5DSF9NT0RFMiA9ICJsYXVuY2gtbW9kZTIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0VOQUJMRV9CUkVBS1BPSU5UUyA9ICJlbmFibGUtYnJlYWtwb2ludHMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1JFU1RBUlQgPSAicmVzdGFydCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQ1JFQVRFX1NFUlZFUl9XSVRIX1JVTlRJTUUgPSAiY3JlYXRlLXNlcnZlciI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUFVCTElTSF9PTl9BRERfUkVNT1ZFID0gInB1Ymxpc2gtb24tYWRkLXJlbW92ZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0FWRV9FRElUT1JTX0FMV0FZUyA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNBVkVfRURJVE9SU19ORVZFUiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNBVkVfRURJVE9SU19QUk9NUFQgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIExBVU5DSF9NT0RFX1BST01QVCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIExBVU5DSF9NT0RFX0NPTlRJTlVFID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTEFVTkNIX01PREVfUkVTVEFSVCA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTEFVTkNIX01PREUyX1BST01QVCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIExBVU5DSF9NT0RFMl9DT05USU5VRSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIExBVU5DSF9NT0RFMl9SRVNUQVJUID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTEFVTkNIX01PREUyX0RJU0FCTEVfQlJFQUtQT0lOVFMgPSAzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEVOQUJMRV9CUkVBS1BPSU5UU19QUk9NUFQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFTkFCTEVfQlJFQUtQT0lOVFNfQUxXQVlTID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRU5BQkxFX0JSRUFLUE9JTlRTX05FVkVSID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBSRVNUQVJUX1BST01QVCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFJFU1RBUlRfQUxXQVlTID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUkVTVEFSVF9ORVZFUiA9IDI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0hPU1ROQU1FUyA9IDEwOwotCi0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlczsKLQotCXByaXZhdGUgc3RhdGljIFNlcnZlclVJUHJlZmVyZW5jZXMgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJVSVByZWZlcmVuY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFNlcnZlclVJUHJlZmVyZW5jZXMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXByZWZlcmVuY2VzID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlzZXREZWZhdWx0cygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2VydmVyVUlQcmVmZXJlbmNlcyBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBTZXJ2ZXJVSVByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9MQVVOQ0hfTU9ERSwgZ2V0RGVmYXVsdExhdW5jaE1vZGUoKSk7Ci0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9MQVVOQ0hfTU9ERTIsIGdldERlZmF1bHRMYXVuY2hNb2RlMigpKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX0VOQUJMRV9CUkVBS1BPSU5UUywgZ2V0RGVmYXVsdEVuYWJsZUJyZWFrcG9pbnRzKCkpOwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfUkVTVEFSVCwgZ2V0RGVmYXVsdFJlc3RhcnQoKSk7Ci0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9TQVZFX0VESVRPUlMsIGdldERlZmF1bHRTYXZlRWRpdG9ycygpKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX0hPU1RfTkFNRVMsICJsb2NhbGhvc3QiKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX1NIT1dfT05fQUNUSVZJVFksIHRydWUpOwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfQ1JFQVRFX1NFUlZFUl9XSVRIX1JVTlRJTUUsIGZhbHNlKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX1BVQkxJU0hfT05fQUREX1JFTU9WRSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB3aGV0aGVyIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZAotCSAqIHdoZW4gdGhlIGxhdW5jaCBtb2RlIG9mIHRoZSBzZXJ2ZXIgZG9lc24ndCBtYXRjaC4KLQkgKgotCSAqIEByZXR1cm4gYnl0ZQotCSAqLwotCXB1YmxpYyBieXRlIGdldERlZmF1bHRMYXVuY2hNb2RlKCkgewotCQlyZXR1cm4gTEFVTkNIX01PREVfUFJPTVBUOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgd2hlbiB0aGUgbGF1bmNoIG1vZGUKLQkgKiBvZiB0aGUgc2VydmVyIGRvZXNuJ3QgbWF0Y2guCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExhdW5jaE1vZGUoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlcy5nZXRJbnQoUFJFRl9MQVVOQ0hfTU9ERSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCB3aGVuIHRoZSBsYXVuY2ggbW9kZQotCSAqIG9mIHRoZSBzZXJ2ZXIgZG9lc24ndCBtYXRjaC4KLQkgKgotCSAqIEBwYXJhbSBiIGEgbGF1bmNoIG1vZGUgY29uc3RhbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXVuY2hNb2RlKGludCBiKSB7Ci0JCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfTEFVTkNIX01PREUsIGIpOwotCQlTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgb2Ygd2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQKLQkgKiB3aGVuIHRoZSBsYXVuY2ggbW9kZSBvZiB0aGUgc2VydmVyIGRvZXNuJ3QgbWF0Y2guCi0JICoKLQkgKiBAcmV0dXJuIGJ5dGUKLQkgKi8KLQlwdWJsaWMgYnl0ZSBnZXREZWZhdWx0TGF1bmNoTW9kZTIoKSB7Ci0JCXJldHVybiBMQVVOQ0hfTU9ERTJfUFJPTVBUOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgd2hlbiB0aGUgbGF1bmNoIG1vZGUKLQkgKiBvZiB0aGUgc2VydmVyIGRvZXNuJ3QgbWF0Y2guCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExhdW5jaE1vZGUyKCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0SW50KFBSRUZfTEFVTkNIX01PREUyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIHdoZW4gdGhlIGxhdW5jaCBtb2RlCi0JICogb2YgdGhlIHNlcnZlciBkb2Vzbid0IG1hdGNoLgotCSAqCi0JICogQHBhcmFtIGIgYSBsYXVuY2ggbW9kZSBjb25zdGFudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhdW5jaE1vZGUyKGludCBiKSB7Ci0JCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfTEFVTkNIX01PREUyLCBiKTsKLQkJU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkCi0JICogd2hlbiB0aGUgYnJlYWtwb2ludCBlbmFibGVtZW50IGRvZXNuJ3QgbWF0Y2ggdGhlIHNlcnZlciBzdGF0ZS4KLQkgKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGJ5dGUgZ2V0RGVmYXVsdEVuYWJsZUJyZWFrcG9pbnRzKCkgewotCQlyZXR1cm4gRU5BQkxFX0JSRUFLUE9JTlRTX1BST01QVDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIHdoZW4gdGhlIGJyZWFrcG9pbnQKLQkgKiBlbmFibGVtZW50IGRvZXNuJ3QgbWF0Y2ggdGhlIHNlcnZlciBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5hYmxlQnJlYWtwb2ludHMoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlcy5nZXRJbnQoUFJFRl9FTkFCTEVfQlJFQUtQT0lOVFMpOwotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgd2hlbiB0aGUgYnJlYWtwb2ludAotCSAqIGVuYWJsZW1lbnQgZG9lc24ndCBtYXRjaCB0aGUgc2VydmVyIHN0YXRlLgotCSAqCi0JICogQHBhcmFtIGIgYSBicmVha3BvaW50IGVuYWJsZW1lbnQgY29uc3RhbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVCcmVha3BvaW50cyhpbnQgYikgewotCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX0VOQUJMRV9CUkVBS1BPSU5UUywgYik7Ci0JCVNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB3aGV0aGVyIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZAotCSAqIHdoZW4gdGhlIHNlcnZlciByZXF1aXJlcyByZXN0YXJ0aW5nLgotCSAqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgYnl0ZSBnZXREZWZhdWx0UmVzdGFydCgpIHsKLQkJcmV0dXJuIFJFU1RBUlRfUFJPTVBUOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgd2hlbiB0aGUgc2VydmVyIHJlcXVpcmVzCi0JICogcmVzdGFydGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVzdGFydCgpIHsKLQkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEludChQUkVGX1JFU1RBUlQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgd2hlbiB0aGUgc2VydmVyIHJlcXVpcmVzIHJlc3RhcnRpbmcuCi0JICoKLQkgKiBAcGFyYW0gYiBhIGJyZWFrcG9pbnQgZW5hYmxlbWVudCBjb25zdGFudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc3RhcnQoaW50IGIpIHsKLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9SRVNUQVJULCBiKTsKLQkJU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbXBvcnQgbG9jYXRpb24uCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEltcG9ydExvY2F0aW9uKCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFBSRUZfSU1QT1JUX0xPQ0FUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbXBvcnQgbG9jYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcyB0aGUgaW1wb3J0IGxvY2F0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1wb3J0TG9jYXRpb24oU3RyaW5nIHMpIHsKLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9JTVBPUlRfTE9DQVRJT04sIHMpOwotCQlTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3Igc2F2aW5nIGVkaXRvcnMgYmVmb3JlIGxhdW5jaGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGJ5dGUKLQkgKi8KLQlwdWJsaWMgYnl0ZSBnZXREZWZhdWx0U2F2ZUVkaXRvcnMoKSB7Ci0JCXJldHVybiBTQVZFX0VESVRPUlNfUFJPTVBUOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNldHRpbmcgZm9yIHNhdmluZyBlZGl0b3JzIGJlZm9yZSBsYXVuY2hpbmcuCi0JICogCi0JICogQHJldHVybiBieXRlCi0JICovCi0JcHVibGljIGJ5dGUgZ2V0U2F2ZUVkaXRvcnMoKSB7Ci0JCXJldHVybiAoYnl0ZSkgcHJlZmVyZW5jZXMuZ2V0SW50KFBSRUZfU0FWRV9FRElUT1JTKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBmb3Igc2F2aW5nIGVkaXRvcnMgYmVmb3JlIGxhdW5jaGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNhdmVFZGl0b3JzKGJ5dGUgYikgewotCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX1NBVkVfRURJVE9SUywgYik7Ci0JCVNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciBvcGVuaW5nIHRoZSBzZXJ2ZXJzIHZpZXcgb24gYWN0aXZpdHkuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFNob3dPbkFjdGl2aXR5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXR0aW5nIGZvciBvcGVuaW5nIHRoZSBzZXJ2ZXJzIHZpZXcgb24gYWN0aXZpdHkuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U2hvd09uQWN0aXZpdHkoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFBSRUZfU0hPV19PTl9BQ1RJVklUWSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgZm9yIG9wZW5pbmcgdGhlIHNlcnZlcnMgdmlldyBvbiBhY3Rpdml0eS4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNob3dPbkFjdGl2aXR5KGJvb2xlYW4gYikgewotCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX1NIT1dfT05fQUNUSVZJVFksIGIpOwotCQlTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBvZiBtb3N0IHJlY2VudGx5IHVzZWQgaG9zdG5hbWVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGhvc3RuYW1lcwotCSAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SG9zdG5hbWVzKCkgewotCQlTdHJpbmcgcyA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhQUkVGX0hPU1RfTkFNRVMpOwotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHMsICJ8KnwiKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJbGlzdC5hZGQoc3QubmV4dFRva2VuKCkpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIEFkZCBhIG5ldyBob3N0bmFtZSB0byB0aGUgbW9zdCByZWNlbnRseSB1c2VkIGxpc3QuCi0JICogIAotCSAqIEBwYXJhbSBob3N0bmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEhvc3RuYW1lKFN0cmluZyBob3N0bmFtZSkgewotCQlpZiAoImxvY2FsaG9zdCIuZXF1YWxzKGhvc3RuYW1lKSkKLQkJCXJldHVybjsKLQkJCi0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gZ2V0SG9zdG5hbWVzKCk7Ci0JCQotCQkvLyByZW1vdmUgZHVwbGljYXRlcwotCQlpZiAobGlzdC5jb250YWlucyhob3N0bmFtZSkpCi0JCQlsaXN0LnJlbW92ZShob3N0bmFtZSk7Ci0JCQotCQkvLyBhbHdheXMgYWRkIHNlY29uZCAobGVhdmUgbG9jYWxob3N0IGZpcnN0KQotCQlsaXN0LmFkZCgxLCBob3N0bmFtZSk7Ci0JCQotCQkvLyByZW1vdmUgbGVhc3QgdXNlZCBob3N0bmFtZQotCQlpZiAobGlzdC5zaXplKCkgPiBNQVhfSE9TVE5BTUVTKQotCQkJbGlzdC5yZW1vdmUobGlzdC5zaXplKCkgLSAxKTsKLQkJCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBzID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJc2IuYXBwZW5kKHMpOwotCQkJc2IuYXBwZW5kKCJ8KnwiKTsKLQkJfQotCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX0hPU1RfTkFNRVMsIHNiLnRvU3RyaW5nKCkpOwotCQlTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNldHRpbmcgZm9yIHdoZXRoZXIgYSBzZXJ2ZXIgc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aCBydW50aW1lcwotCSAqIHdoZW4gcG9zc2libGUuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Q3JlYXRlU2VydmVyV2l0aFJ1bnRpbWUoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFBSRUZfQ1JFQVRFX1NFUlZFUl9XSVRIX1JVTlRJTUUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIGZvciB3aGV0aGVyIGEgc2VydmVyIHNob3VsZCBiZSBjcmVhdGVkIHdpdGggcnVudGltZXMKLQkgKiB3aGVuIHBvc3NpYmxlLgotCSAqIAotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRlU2VydmVyV2l0aFJ1bnRpbWUoYm9vbGVhbiBiKSB7Ci0JCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfQ1JFQVRFX1NFUlZFUl9XSVRIX1JVTlRJTUUsIGIpOwotCQlTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNldHRpbmcgZm9yIHB1Ymxpc2hpbmcgd2hlbiBtb2R1bGVzIGFyZSBhZGRlZCBvciByZW1vdmVkLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFB1Ymxpc2hPbkFkZFJlbW92ZU1vZHVsZSgpIHsKLQkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oUFJFRl9QVUJMSVNIX09OX0FERF9SRU1PVkUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIGZvciBwdWJsaXNoaW5nIHdoZW4gbW9kdWxlcyBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hPbkFkZFJlbW92ZU1vZHVsZShib29sZWFuIGIpIHsKLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9QVUJMSVNIX09OX0FERF9SRU1PVkUsIGIpOwotCQlTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TdGFydHVwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TdGFydHVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZjFhZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU3RhcnR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSVN0YXJ0dXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5QdWJsaXNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmF1ZGlvLkF1ZGlvOwotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3RhcnR1cCBpbXBsZW1lbnRzIElTdGFydHVwIHsKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JU3RhcnR1cCNzdGFydHVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydHVwKCkgewotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiQXVkaW8gc3RhcnR1cCIpOwotCQl9Ci0KLQkJZmluYWwgSVB1Ymxpc2hMaXN0ZW5lciBwdWJsaXNoTGlzdGVuZXIgPSBuZXcgUHVibGlzaEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwdWJsaXNoRmluaXNoZWQoSVNlcnZlciBzZXJ2ZXIsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCQkJQXVkaW8ucGxheVNvdW5kKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnNvdW5kLnB1Ymxpc2hGaW5pc2hlZCIpOwotCQkJfQotCQl9OwotCQkKLQkJZmluYWwgSVNlcnZlckxpc3RlbmVyIHNlcnZlckxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKLQkJCQlpbnQgZXZlbnRLaW5kID0gZXZlbnQuZ2V0S2luZCgpOwotCQkJCUlTZXJ2ZXIgc2VydmVyID0gZXZlbnQuZ2V0U2VydmVyKCk7Ci0JCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKLQkJCQkJaW50IHN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0JCQkJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpCi0JCQkJCQlBdWRpby5wbGF5U291bmQoIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuc291bmQuc2VydmVyU3RhcnQiKTsKLQkJCQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJCQkJQXVkaW8ucGxheVNvdW5kKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnNvdW5kLnNlcnZlclN0b3AiKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlcnZlckFkZGVkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCQkJc2VydmVyLmFkZFNlcnZlckxpc3RlbmVyKHNlcnZlckxpc3RlbmVyKTsKLQkJCQkoKFNlcnZlcikgc2VydmVyKS5hZGRQdWJsaXNoTGlzdGVuZXIocHVibGlzaExpc3RlbmVyKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChJU2VydmVyIHNlcnZlcikgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2VydmVyUmVtb3ZlZChJU2VydmVyIHNlcnZlcikgewotCQkJCXNlcnZlci5yZW1vdmVTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7Ci0JCQkJKChTZXJ2ZXIpIHNlcnZlcikucmVtb3ZlUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7Ci0JCQl9Ci0JCX07Ci0JCVNlcnZlckNvcmUuYWRkU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9UZXJtaW5hdGlvbkRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvVGVybWluYXRpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0ZWI3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9UZXJtaW5hdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotLyoqCi0gKiBEaWFsb2cgdGhhdCBwcm9tcHRzIGEgdXNlciB0byBzZWUgaWYgYSBzZXJ2ZXIgc2hvdWxkCi0gKiBiZSB0ZXJtaW5hdGVkLgotICovCi1wdWJsaWMgY2xhc3MgVGVybWluYXRpb25EaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBTdHJpbmcgc2VydmVyTmFtZTsKLQotCS8qKgotCSAqIFRlcm1pbmF0aW9uRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsIGEgc2hlbGwKLQkgKiBAcGFyYW0gc2VydmVyTmFtZSBhIHNlcnZlciBuYW1lCi0JICovCi0JcHVibGljIFRlcm1pbmF0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgc2VydmVyTmFtZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuc2VydmVyTmFtZSA9IHNlcnZlck5hbWU7Ci0JCXNldEJsb2NrT25PcGVuKHRydWUpOwotCX0KLQotCS8qKgotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQluZXdTaGVsbC5zZXRUZXh0KE1lc3NhZ2VzLnRlcm1pbmF0ZVNlcnZlckRpYWxvZ1RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgdXBwZXIgcGFydCAKLQkgKiBvZiB0aGlzIGRpYWxvZyAoYWJvdmUgdGhlIGJ1dHRvbiBiYXIpLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBkaWFsb2cgYXJlYQotCSAqIEByZXR1cm4gdGhlIGRpYWxvZyBhcmVhIGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIGEgY29tcG9zaXRlIHdpdGggc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLlRFUk1JTkFURV9TRVJWRVJfRElBTE9HKTsKLQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudGVybWluYXRlU2VydmVyRGlhbG9nTWVzc2FnZSwgbmV3IFN0cmluZ1tdIHtzZXJ2ZXJOYW1lfSkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gNDAwOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9UaW1lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvVGltZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiMTAyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9UaW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKLQotLyoqCi0gKiBNYW5hZ2VzIGEgc2luZ2xlIHRpbWVyIHRoYXQgd2lsbCBydW4gYW5kIG5vdGlmeSBhbiBBY3Rpb25MaXN0ZW5lciB3aGVuIHRoZQotICogdGltZXIgZXhwaXJlcy4gVGhlIGRpc3Bvc2UoKSBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHRpbWVyIG9iamVjdAotICogaXMgdGFrZW4gZG93biBpbiBvcmRlciB0byBzYWZlbHkgYnJpbmcgZG93biB0aGUgZXhlY3V0b3IgYW5kIGFueSBhc3NvY2lhdGVkIHRocmVhZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lciB7Ci0KLQlwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOwotCXByaXZhdGUgVGltZXJSdW5uYWJsZSB0aW1lclJ1bm5hYmxlID0gbmV3IFRpbWVyUnVubmFibGUoKTsKLQlwcm90ZWN0ZWQgQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBudWxsOwotCXByaXZhdGUgbG9uZyBkZWxheTsKLQotCXB1YmxpYyBUaW1lcihsb25nIGRlbGF5LCBBY3Rpb25MaXN0ZW5lciBjdXJMaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQl0aGlzLmRlbGF5ID0gZGVsYXk7Ci0JCWxpc3RlbmVyID0gY3VyTGlzdGVuZXI7Ci0JfQotCi0JLyoqCi0JICogUnVucyB0aGUgdGltZXIgaWYgaXQgaXMgc3RvcHBlZCBvciB1cGRhdGVzIHRoZSBzdG9wIHRpbWUgZGlyZWN0bHkKLQkgKiB0byBlZmZlY3RpdmVseSByZXN0YXJ0IHRoZSB0aW1lci4KLQkgKiBvbmx5IG9uZSBjb21tYW5kIHNob3VsZCBiZSBleGVjdXRlZCBhdCBhIHRpbWUuIAotCSAqLwotCXB1YmxpYyB2b2lkIHJ1blRpbWVyKCl7Ci0JCXRpbWVyUnVubmFibGUuc2V0U3RvcFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBkZWxheSk7Ci0KLQkJaWYoIXRpbWVyUnVubmFibGUuaXNSdW5uaW5nKCkgJiYgIXRpbWVyUnVubmFibGUuaXNTY2hlZHVsZWQoKSl7Ci0JCQl0aW1lclJ1bm5hYmxlLnNldElzU2NoZWR1bGVkKHRydWUpOwotCQkJZXhlY3V0b3IuZXhlY3V0ZSh0aW1lclJ1bm5hYmxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbmNlbHMgdGhlIHRpbWVyIGFuZCB0aGVuIGtpbGxzIHRoZSBleGVjdXRvciB3aGljaCBicmluZ3MgZG93biB0aGUgdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKXsKLQkJaWYodGltZXJSdW5uYWJsZS5pc1J1bm5pbmcoKSkgewotCQkJdGltZXJSdW5uYWJsZS5zZXRJc0NhbmNlbGxlZCh0cnVlKTsKLQkJfQotCQlraWxsRXhlY3V0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBraWxsRXhlY3V0b3IoKXsKLQkJZXhlY3V0b3Iuc2h1dGRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKXsKLQkJcmV0dXJuIHRpbWVyUnVubmFibGUuaXNSdW5uaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTY2hlZHVsZWQoKXsKLQkJcmV0dXJuIHRpbWVyUnVubmFibGUuaXNTY2hlZHVsZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBSdW5uYWJsZSB0aGF0IGlzIGNhbGxlZCBieSB0aGUgZXhlY3V0b3IgZWFjaCB0aW1lIHdlIHdhbnQgdG8KLQkgKiBydW4gdGhlIHRpbWVyLgotCSAqLwotCWNsYXNzIFRpbWVyUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzU2NoZWR1bGVkID0gZmFsc2U7Ci0JCXByaXZhdGUgYm9vbGVhbiBpc1J1bm5pbmcgPSBmYWxzZTsKLQkJcHJpdmF0ZSBib29sZWFuIGlzQ2FuY2VsbGVkID0gZmFsc2U7Ci0JCXByaXZhdGUgbG9uZyBzdG9wVGltZSA9IDA7Ci0JCS8vIGRlZmF1bHQgaXMgNTAgbXMKLQkJcHJpdmF0ZSBsb25nIHdhaXRUaW1lID0gNTA7Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaXNSdW5uaW5nID0gdHJ1ZTsKLQkJCWlzU2NoZWR1bGVkID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCXdoaWxlIChzdG9wVGltZSAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpID4gMCAmJiBpc1J1bm5pbmcgJiYgIWlzQ2FuY2VsbGVkKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJCQl3YWl0KHdhaXRUaW1lKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkKLQkJCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gRG8gbm90aGluZwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghaXNDYW5jZWxsZWQpIHsKLQkJCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJCWxpc3RlbmVyLmFjdGlvblBlcmZvcm1lZChuZXcgQWN0aW9uRXZlbnQoVGltZXIudGhpcywgMCwgIiIsIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLCAwKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlzZXRJc0NhbmNlbGxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpc1J1bm5pbmcgPSBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1J1bm5pbmcoKSB7Ci0JCQlyZXR1cm4gaXNSdW5uaW5nOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFJ1bm5pbmcoYm9vbGVhbiBzZXR0aW5nKSB7Ci0JCQlpc1J1bm5pbmcgPSBzZXR0aW5nOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldFN0b3BUaW1lKCkgewotCQkJcmV0dXJuIHN0b3BUaW1lOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFN0b3BUaW1lKGxvbmcgdGltZSkgewotCQkJc3RvcFRpbWUgPSB0aW1lOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldFdhaXRUaW1lKCkgewotCQkJcmV0dXJuIHdhaXRUaW1lOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldElzQ2FuY2VsbGVkKGJvb2xlYW4gY2FuY2VsbGVkKSB7Ci0JCQlpc0NhbmNlbGxlZCA9IGNhbmNlbGxlZDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzU2NoZWR1bGVkKCkgewotCQkJcmV0dXJuIGlzU2NoZWR1bGVkOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0SXNTY2hlZHVsZWQoYm9vbGVhbiBpc1NjaGVkdWxlZCkgewotCQkJdGhpcy5pc1NjaGVkdWxlZCA9IGlzU2NoZWR1bGVkOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvVHJhY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1RyYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTkwYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvVHJhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kZWJ1Zy5EZWJ1Z09wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRlYnVnLkRlYnVnT3B0aW9uc0xpc3RlbmVyOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFjZSBpbXBsZW1lbnRzIERlYnVnT3B0aW9uc0xpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiZGQvTU0veXkgSEg6bW0uc3MuU1NTIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU2V0PFN0cmluZz4gbG9nZ2VkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0JLy8gdHJhY2luZyBlbmFibGVtZW50IGZsYWdzCi0JcHVibGljIHN0YXRpYyBib29sZWFuIENPTkZJRyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBJTkZPID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIFdBUk5JTkcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gU0VWRVJFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIEZJTkVTVCA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBGSU5FUiA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBQRVJGT1JNQU5DRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBFWFRFTlNJT05fUE9JTlQgPSBmYWxzZTsKLQotCS8vIHRyYWNpbmcgbGV2ZWxzLiBPbmUgbW9zdCBleGlzdCBmb3IgZWFjaCBkZWJ1ZyBvcHRpb24KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFJJTkdfQ09ORklHID0gIi9jb25maWciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSSU5HX0lORk8gPSAiL2luZm8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSSU5HX1dBUk5JTkcgPSAiL3dhcm5pbmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSSU5HX1NFVkVSRSA9ICIvc2V2ZXJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUUklOR19GSU5FU1QgPSAiL2ZpbmVzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFJJTkdfRklORVIgPSAiL2ZpbmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUUklOR19FWFRFTlNJT05fUE9JTlQgPSAiL2V4dGVuc2lvbl9wb2ludCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFJJTkdfUEVSRk9STUFOQ0UgPSAiL3BlcmZvcm1hbmNlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRyYWNlIGNvbnN0cnVjdG9yLiBUaGlzIHNob3VsZCBuZXZlciBiZSBleHBsaWNpdGx5IGNhbGxlZCBieSBjbGllbnRzIGFuZCBpcyB1c2VkIHRvIHJlZ2lzdGVyIHRoaXMgY2xhc3Mgd2l0aCB0aGUKLQkgKiB7QGxpbmsgRGVidWdPcHRpb25zfSBzZXJ2aWNlLgotCSAqLwotCXB1YmxpYyBUcmFjZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlCi0JICogb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRlYnVnLkRlYnVnT3B0aW9uc0xpc3RlbmVyI29wdGlvbnNDaGFuZ2VkKG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kZWJ1Zy5EZWJ1Z09wdGlvbnMpCi0JICovCi0JcHVibGljIHZvaWQgb3B0aW9uc0NoYW5nZWQoRGVidWdPcHRpb25zIG9wdGlvbnMpIHsKLQkJVHJhY2UuQ09ORklHID0gb3B0aW9ucy5nZXRCb29sZWFuT3B0aW9uKFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArIFRyYWNlLlNUUklOR19DT05GSUcsIGZhbHNlKTsKLQkJVHJhY2UuSU5GTyA9IG9wdGlvbnMuZ2V0Qm9vbGVhbk9wdGlvbihTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyBUcmFjZS5TVFJJTkdfSU5GTywgZmFsc2UpOwotCQlUcmFjZS5XQVJOSU5HID0gb3B0aW9ucy5nZXRCb29sZWFuT3B0aW9uKFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArIFRyYWNlLlNUUklOR19XQVJOSU5HLCBmYWxzZSk7Ci0JCVRyYWNlLlNFVkVSRSA9IG9wdGlvbnMuZ2V0Qm9vbGVhbk9wdGlvbihTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyBUcmFjZS5TVFJJTkdfU0VWRVJFLCBmYWxzZSk7Ci0JCVRyYWNlLkZJTkVSID0gb3B0aW9ucy5nZXRCb29sZWFuT3B0aW9uKFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArIFRyYWNlLlNUUklOR19GSU5FUiwgZmFsc2UpOwotCQlUcmFjZS5GSU5FU1QgPSBvcHRpb25zLmdldEJvb2xlYW5PcHRpb24oU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgVHJhY2UuU1RSSU5HX0ZJTkVTVCwgZmFsc2UpOwotCQlUcmFjZS5FWFRFTlNJT05fUE9JTlQgPSBvcHRpb25zCi0JCQkJLmdldEJvb2xlYW5PcHRpb24oU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgVHJhY2UuU1RSSU5HX0VYVEVOU0lPTl9QT0lOVCwgZmFsc2UpOwotCQlUcmFjZS5QRVJGT1JNQU5DRSA9IG9wdGlvbnMuZ2V0Qm9vbGVhbk9wdGlvbihTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyBUcmFjZS5TVFJJTkdfUEVSRk9STUFOQ0UsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIFRoZSB0cmFjaW5nIGxldmVsLgotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBUaGUgbWVzc2FnZSB0byB0cmFjZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShmaW5hbCBTdHJpbmcgbGV2ZWwsIGZpbmFsIFN0cmluZyBzKSB7Ci0JCVRyYWNlLnRyYWNlKGxldmVsLCBzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgVGhlIHRyYWNpbmcgbGV2ZWwuCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIHRyYWNlCi0JICogQHBhcmFtIHQKLQkgKiAgICAgICAgICAgIEEge0BsaW5rIFRocm93YWJsZX0gdG8gdHJhY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoZmluYWwgU3RyaW5nIGxldmVsLCBmaW5hbCBTdHJpbmcgcywgZmluYWwgVGhyb3dhYmxlIHQpIHsKLQkJaWYgKHMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChUcmFjZS5TVFJJTkdfU0VWRVJFLmVxdWFscyhsZXZlbCkpIHsKLQkJCWlmICghbG9nZ2VkLmNvbnRhaW5zKHMpKSB7Ci0JCQkJU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIHMsIHQpKTsKLQkJCQlsb2dnZWQuYWRkKHMpOwotCQkJfQotCQl9Ci0JCWlmIChTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEKTsKLQkJCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQlzYi5hcHBlbmQobGV2ZWwpOwotCQkJc2IuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCXNiLmFwcGVuZChzZGYuZm9ybWF0KG5ldyBEYXRlKCkpKTsKLQkJCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQlzYi5hcHBlbmQocyk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oc2IudG9TdHJpbmcoKSk7Ci0JCQlpZiAodCAhPSBudWxsKSB7Ci0JCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9XZWJMYXVuY2hhYmxlQ2xpZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9XZWJMYXVuY2hhYmxlQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYjA1YTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvV2ViTGF1bmNoYWJsZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkNsaWVudERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLkh0dHBMYXVuY2hhYmxlOwotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgV2ViTGF1bmNoYWJsZUNsaWVudCBleHRlbmRzIENsaWVudERlbGVnYXRlIHsKLQkvKgotCSAqIEBzZWUgQ2xpZW50RGVsZWdhdGUjc3VwcG9ydHMoSUxhdW5jaGFibGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSVNlcnZlciBzZXJ2ZXIsIE9iamVjdCBsYXVuY2hhYmxlLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlyZXR1cm4gKGxhdW5jaGFibGUgaW5zdGFuY2VvZiBIdHRwTGF1bmNoYWJsZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENsaWVudERlbGVnYXRlI2xhdW5jaChJTGF1bmNoYWJsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBsYXVuY2goSVNlcnZlciBzZXJ2ZXIsIE9iamVjdCBsYXVuY2hhYmxlLCBTdHJpbmcgbGF1bmNoTW9kZSwgSUxhdW5jaCBsYXVuY2gpIHsKLQkJSHR0cExhdW5jaGFibGUgaHR0cCA9IChIdHRwTGF1bmNoYWJsZSkgbGF1bmNoYWJsZTsKLQkJdHJ5IHsKLQkJCUlXb3JrYmVuY2hCcm93c2VyU3VwcG9ydCBicm93c2VyU3VwcG9ydCA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QnJvd3NlclN1cHBvcnQoKTsKLQkJCUlXZWJCcm93c2VyIGJyb3dzZXIgPSBicm93c2VyU3VwcG9ydC5jcmVhdGVCcm93c2VyKElXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5MT0NBVElPTl9CQVIgfCBJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuTkFWSUdBVElPTl9CQVIsIG51bGwsIG51bGwsIG51bGwpOwotCQkJYnJvd3Nlci5vcGVuVVJMKGh0dHAuZ2V0VVJMKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBvcGVuaW5nIGJyb3dzZXIiLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdFNlcnZlckFjdGlvbkRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0U2VydmVyQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkZTEzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0U2VydmVyQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5FY2xpcHNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJvdGVjdGVkIExpc3Q8SVNlcnZlcj4gc2VydmVyczsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgc2VydmVyIGNhbiBjdXJyZW50bHkgYmUgYWN0ZWQgb24uCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYWNjZXB0KElTZXJ2ZXIgc2VydmVyKTsKLQotCS8qKgotCSAqIFBlcmZvcm0gYWN0aW9uIG9uIHRoaXMgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHBlcmZvcm0oU2hlbGwgc2hlbGwsIElTZXJ2ZXIgc2VydmVyKTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVNoZWxsIHNoZWxsID0gRWNsaXBzZVV0aWwuZ2V0U2hlbGwoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2ZXJzLml0ZXJhdG9yKCk7Ci0JCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBvYmo7Ci0JCQlpZiAoYWNjZXB0KHNlcnZlcikpCi0JCQkJcGVyZm9ybShzaGVsbCwgc2VydmVyKTsKLQkJCXNlbGVjdGlvbkNoYW5nZWQoYWN0aW9uLCBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZXJ2ZXJzKSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlcnZlcnMgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXI+KCk7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIG9iajsKLQkJCQlpZiAoYWNjZXB0KHNlcnZlcikpIHsKLQkJCQkJc2VydmVycy5hZGQoc2VydmVyKTsKLQkJCQkJZW5hYmxlZCA9IHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvQnJlYWtwb2ludERpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9CcmVha3BvaW50RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyODU4MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9CcmVha3BvaW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQ3VzdG9tIG1lc3NhZ2UgZGlhbG9nIHRoYXQgaXMgdXNlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgbm90IGluIHRoZSBjb3JyZWN0IGxhdW5jaCBtb2RlLgotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtwb2ludERpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgewotCXByb3RlY3RlZCBib29sZWFuIHJlbWVtYmVyOwotCi0JcHVibGljIEJyZWFrcG9pbnREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIE1lc3NhZ2VzLndpekRlYnVnT25TZXJ2ZXJUaXRsZSwgbnVsbCwKLQkJCU1lc3NhZ2VzLmRpYWxvZ0JyZWFrcG9pbnRzLCBNZXNzYWdlRGlhbG9nLldBUk5JTkcsCi0JCQluZXcgU3RyaW5nW10ge0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuUFJPQ0VFRF9MQUJFTCwKLQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMfSwgMCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIEJ1dHRvbiByZW1lbWJlckIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJcmVtZW1iZXJCLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nUmVtZW1iZXIpOwotCQlyZW1lbWJlckIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVtZW1iZXIgPSByZW1lbWJlckIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gcmVtZW1iZXJCOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVtZW1iZXIoKSB7Ci0JCXJldHVybiByZW1lbWJlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9MYXVuY2hXaXphcmRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvTGF1bmNoV2l6YXJkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZWU3NjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9MYXVuY2hXaXphcmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotLyoqCi0gKiBBbiBhYnN0cmFjdCBhY3Rpb24gdGhhdCBvcGVucyB1cCBhIHdvcmtiZW5jaCB3aXphcmQgd2hlbiBydW4uCi0gKi8KLWFic3RyYWN0IGNsYXNzIExhdW5jaFdpemFyZEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JLyoqCi0JICogTGF1bmNoV2l6YXJkQWN0aW9uCi0JICovCi0JcHVibGljIExhdW5jaFdpemFyZEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHdvcmtiZW5jaCB3aXphcmQgdGhhdCBzaG91bGQgYmUgb3BlbmVkLgotCSAqCi0JICogQHJldHVybiB0aGUgd2l6YXJkIHRvIG9wZW4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSVdvcmtiZW5jaFdpemFyZCBnZXRXaXphcmQoKTsKLQotCS8qCi0JICogQHNlZSBJQWN0aW9uLnJ1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdvcmtiZW5jaFdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvblRvUGFzcyA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCXNlbGVjdGlvblRvUGFzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQllbHNlCi0JCQlzZWxlY3Rpb25Ub1Bhc3MgPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCQotCQlJV29ya2JlbmNoV2l6YXJkIHdpemFyZCA9IGdldFdpemFyZCgpOwotCQl3aXphcmQuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvblRvUGFzcyk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1NlcnZlckFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdTZXJ2ZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2MjM1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1NlcnZlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuTmV3U2VydmVyV2l6YXJkOwotLyoqCi0gKiBBY3Rpb24gdG8gY3JlYXRlIGEgbmV3IHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIE5ld1NlcnZlckFjdGlvbiBleHRlbmRzIE5ld1dpemFyZEFjdGlvbiB7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGlkczsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gdmFsdWVzOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IE5ld1NlcnZlckFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgTmV3U2VydmVyQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBOZXdTZXJ2ZXJBY3Rpb24gd2l0aCBzb21lIGluaXRpYWwgdGFzayBtb2RlbAotCSAqIHByb3BlcnRpZXMuCi0JICogCi0JICogQHBhcmFtIGlkcwotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgTmV3U2VydmVyQWN0aW9uKFN0cmluZ1tdIGlkcywgU3RyaW5nW10gdmFsdWVzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaWRzID0gaWRzOwotCQl0aGlzLnZhbHVlcyA9IHZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGlzIGFjdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgZGVsZWdhdGluZyBhY3Rpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLgotCSAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBkbyB0aGUgYWN0dWFsIHdvcmsuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyB0aGUgcHJlc2VudGF0aW9uIHBvcnRpb24gb2YgdGhlCi0JICogICBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJTmV3U2VydmVyV2l6YXJkIHdpemFyZCA9IG51bGw7Ci0JCWlmIChpZHMgPT0gbnVsbCkKLQkJCXdpemFyZCA9IG5ldyBOZXdTZXJ2ZXJXaXphcmQoKTsKLQkJZWxzZQotCQkJd2l6YXJkID0gbmV3IE5ld1NlcnZlcldpemFyZChpZHMsIHZhbHVlcyk7Ci0JCXdpemFyZC5pbml0KHdvcmtiZW5jaCwgc2VsZWN0aW9uKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2cod29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3U2VydmVyV2l6YXJkQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1NlcnZlcldpemFyZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzFhMmY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3U2VydmVyV2l6YXJkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuTmV3U2VydmVyV2l6YXJkOwotLyoqCi0gKiBBbiBhY3Rpb24gdG8gaW52b2tlIHRoZSBuZXcgc2VydmVyIGFuZCBzZXJ2ZXIgY29uZmlndXJhdGlvbiB3aXphcmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdTZXJ2ZXJXaXphcmRBY3Rpb24gZXh0ZW5kcyBMYXVuY2hXaXphcmRBY3Rpb24gewotCXByb3RlY3RlZCBTdHJpbmdbXSBpZHM7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIHZhbHVlczsKLQotCS8qKgotCSAqIE5ldyBzZXJ2ZXIgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBOZXdTZXJ2ZXJXaXphcmRBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCi0JCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DVE9PTF9ORVdfU0VSVkVSKSk7Ci0JCXNldFRleHQoTWVzc2FnZXMuYWN0aW9uU2V0TmV3U2VydmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogTmV3IHNlcnZlciBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGlkcyBpZHMgdG8gcGFzcyBpbnRvIHRoZSBhY3Rpb24KLQkgKiBAcGFyYW0gdmFsdWVzIHZhbHVlcyB0byBwYXNzIGludG8gdGhlIGFjdGlvbgotCSAqLwotCXB1YmxpYyBOZXdTZXJ2ZXJXaXphcmRBY3Rpb24oU3RyaW5nW10gaWRzLCBTdHJpbmdbXSB2YWx1ZXMpIHsKLQkJdGhpcygpOwotCQl0aGlzLmlkcyA9IGlkczsKLQkJdGhpcy52YWx1ZXMgPSB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB3aXphcmQgdGhhdCBzaG91bGQgYmUgb3BlbmVkLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkCi0JICovCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hXaXphcmQgZ2V0V2l6YXJkKCkgewotCQlyZXR1cm4gbmV3IE5ld1NlcnZlcldpemFyZChpZHMsIHZhbHVlcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3V2l6YXJkQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1dpemFyZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmNmMzZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3V2l6YXJkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci0vKioKLSAqIEFjdGlvbiB0byBjcmVhdGUgYSBuZXcgc2VydmVyIGVsZW1lbnQgdGhyb3VnaCBhIHdpemFyZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5ld1dpemFyZEFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJvdGVjdGVkIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBOZXdXaXphcmRBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTmV3V2l6YXJkQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoaXMgYWN0aW9uIGRlbGVnYXRlLiAgVGhlIGltcGxlbWVudG9yIHNob3VsZCB1bmhvb2sgYW55IHJlZmVyZW5jZXMKLQkgKiB0byBpdHNlbGYgc28gdGhhdCBnYXJiYWdlIGNvbGxlY3Rpb24gY2FuIG9jY3VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIGFjdGlvbiBkZWxlZ2F0ZSB3aXRoIHRoZSB3b3JrYmVuY2ggd2luZG93IGl0IHdpbGwgd29yayBpbi4KLQkgKgotCSAqIEBwYXJhbSB3aW5kb3cgdGhlIHdpbmRvdyB0aGF0IHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGlzIGRlbGVnYXRlCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl3b3JrYmVuY2ggPSB3aW5kb3cuZ2V0V29ya2JlbmNoKCk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBhY3Rpb24gZGVsZWdhdGUgdGhhdCB0aGUgc2VsZWN0aW9uIGluIHRoZSB3b3JrYmVuY2ggaGFzIGNoYW5nZWQuCi0JICogPHA+Ci0JICogSW1wbGVtZW50ZXJzIGNhbiB1c2UgdGhpcyBvcHBvcnR1bml0eSB0byBjaGFuZ2UgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUKLQkgKiBhY3Rpb24gb3IgdG8gbW9kaWZ5IG90aGVyIHByZXNlbnRhdGlvbiBwcm9wZXJ0aWVzLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiBwcm94eSB0aGF0IGhhbmRsZXMgcHJlc2VudGF0aW9uIHBvcnRpb24gb2YgdGhlIGFjdGlvbgotCSAqIEBwYXJhbSBzZWwgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluIHRoZSB3b3JrYmVuY2gKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbCkgewotCQlpZiAoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDsKLQkJZWxzZQotCQkJc2VsZWN0aW9uID0gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9PcHRpb25zTWVzc2FnZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9PcHRpb25zTWVzc2FnZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGU3N2UzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvT3B0aW9uc01lc3NhZ2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDdXN0b20gbWVzc2FnZSBkaWFsb2cgdGhhdCBkaXNwbGF5cyBhIHNldCBvZiBvcHRpb25zLgotICogUmV0dXJuIHZhbHVlIGlzIHRoZSBvcHRpb24KLSAqLwotcHVibGljIGNsYXNzIE9wdGlvbnNNZXNzYWdlRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyB7Ci0JcHJvdGVjdGVkIGludCByYWRpbzsKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1lbWJlcjsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gb3B0aW9uczsKLQotCXB1YmxpYyBPcHRpb25zTWVzc2FnZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGlhbG9nTWVzc2FnZSwgU3RyaW5nW10gb3B0aW9ucykgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgdGl0bGUsIG51bGwsIGRpYWxvZ01lc3NhZ2UsIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sCi0JCQluZXcgU3RyaW5nW10ge0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMfSwgMCk7Ci0JCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7Ci0JCWlmIChvcHRpb25zID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG9wdGlvbiIpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgLy8gY3JlYXRlIG1lc3NhZ2UgYXJlYQotICAgICAgY3JlYXRlTWVzc2FnZUFyZWEocGFyZW50KTsKLSAgICAgIC8vIGNyZWF0ZSB0aGUgdG9wIGxldmVsIGNvbXBvc2l0ZSBmb3IgdGhlIGRpYWxvZyBhcmVhCi0gICAgICAvKkNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsqLwotICAgICAgY3JlYXRlQ3VzdG9tQXJlYShwYXJlbnQpOwotICAgICAgcmV0dXJuIHBhcmVudDsKLSAgfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWludCBzaXplID0gb3B0aW9ucy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQkKLQkJCUJ1dHRvbiByYWRpb0IgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLQkJCXJhZGlvQi5zZXRUZXh0KG9wdGlvbnNbaV0pOwotCQkJZmluYWwgaW50IHggPSBpOwotCQkJcmFkaW9CLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJcmFkaW8gPSB4OwotCQkJCX0KLQkJCX0pOwotCQkJaWYgKGkgPT0gMCkgewotCQkJCXJhZGlvQi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJcmFkaW8gPSAwOwotCQkJfQotCQl9Ci0JCQotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCi0JCWZpbmFsIEJ1dHRvbiByZW1lbWJlckIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJcmVtZW1iZXJCLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nUmVtZW1iZXIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlyZW1lbWJlckIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmVtZW1iZXJCLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlbWVtYmVyID0gcmVtZW1iZXJCLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHJlbWVtYmVyQjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gMCkKLQkJCXNldFJldHVybkNvZGUocmFkaW8pOwotCQllbHNlCi0JCQlzZXRSZXR1cm5Db2RlKDkpOwotCQljbG9zZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVtZW1iZXIoKSB7Ci0JCXJldHVybiByZW1lbWJlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9SdW5PblNlcnZlckFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9SdW5PblNlcnZlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTE2YTkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogIlJ1biBvbiBTZXJ2ZXIiIG1lbnUgYWN0aW9uLiBBbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IGFuCi0gKiBvYmplY3QsIGFuZCBoYXZlIGF1dG9tYXRpYyBzZXJ2ZXIgY3JlYXRpb24sIGxhdW5jaGluZywgYW5kCi0gKiB0aGUgYXBwcm9wcmlhdGUgY2xpZW50IHRvIGFwcGVhci4gQSBuZXcgaW5zdGFuY2Ugb2YgdGhpcwotICogYWN0aW9uIG11c3QgYmUgY3JlYXRlZCBmb3IgZWFjaCBvYmplY3QgdGhhdCB0aGUgdXNlciBzZWxlY3RzLgotICovCi1wdWJsaWMgY2xhc3MgUnVuT25TZXJ2ZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlIGRlbGVnYXRlOwotCi0JcHJvdGVjdGVkIEhhc2hNYXA8U3RyaW5nLE9iamVjdD4gbWFwOwotCS8qKgotCSAqIFJ1biBvbiBzZXJ2ZXIgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBhdHRlbXB0IHRvIGRlYnVnCi0JICovCi0JcHVibGljIFJ1bk9uU2VydmVyQWN0aW9uKE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIoTWVzc2FnZXMuYWN0aW9uUnVuT25TZXJ2ZXIpOwotCQotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19EVE9PTF9SVU5fT05fU0VSVkVSKSk7Ci0JCXNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NUT09MX1JVTl9PTl9TRVJWRVIpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VUT09MX1JVTl9PTl9TRVJWRVIpKTsKLQkKLQkJZGVsZWdhdGUgPSBuZXcgUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSgpOwotCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KTsKLQkJCWRlbGVnYXRlLnNlbGVjdGlvbkNoYW5nZWQodGhpcywgc2VsKTsKLQkJfSBlbHNlCi0JCQlkZWxlZ2F0ZS5zZWxlY3Rpb25DaGFuZ2VkKHRoaXMsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgUnVuT25TZXJ2ZXJBY3Rpb24oT2JqZWN0IG9iamVjdCwgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PiBtYXApewkJCi0JCXRoaXMob2JqZWN0KTsKLQkJZGVsZWdhdGUuc2V0TWFwKG1hcCk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50YXRpb24gb2YgbWV0aG9kIGRlZmluZWQgb24gPGNvZGU+SUFjdGlvbjwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlkZWxlZ2F0ZS5ydW4odGhpcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9SdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkM2NmZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9SdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JTGF1bmNoYWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuTW9kdWxlQXJ0aWZhY3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuUnVuT25TZXJ2ZXJXaXphcmQ7Ci0vKioKLSAqIFN1cHBvcnQgZm9yIHN0YXJ0aW5nL3N0b3BwaW5nIHNlcnZlciBhbmQgY2xpZW50cyBmb3IgcmVzb3VyY2VzIHJ1bm5pbmcgb24gYSBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGxhdW5jaE1vZGVzID0gewotCQlJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSwgSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERSwgSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFIH07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBST1NfQ0xJRU5UID0gInJvc19jbGllbnQiOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJPU19MQVVOQ0hBQkxFID0gInJvc19sYXVuY2hhYmxlIjsKLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IHNlbGVjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotCXByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGdsb2JhbFNlbGVjdGlvbjsKLQotCXByb3RlY3RlZCBzdGF0aWMgTWFwPFN0cmluZywgQm9vbGVhbj4gZ2xvYmFsTGF1bmNoTW9kZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGxhdW5jaE1vZGUgPSBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERTsKLQotCXByb3RlY3RlZCBib29sZWFuIHRhc2tzQW5kQ2xpZW50U2hvd247Ci0JCi0JcHJvdGVjdGVkIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IHdpel9wcm9wZXJ0aWVzOyAKLQotCXByb3RlY3RlZCBJTGF1bmNoYWJsZUFkYXB0ZXIgbGF1bmNoYWJsZUFkYXB0ZXI7Ci0JcHJvdGVjdGVkIElDbGllbnQgY2xpZW50OwotCi0JLyoqCi0JICogUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUoSGFzaE1hcDxTdHJpbmcsIE9iamVjdD5wcm9wZXJ0aWVzKSB7Ci0JCXRoaXMud2l6X3Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25Qcm9wZXJ0aWVzKEhhc2hNYXA8U3RyaW5nLE9iamVjdD5wcm9wZXJ0aWVzKXsKLQkJdGhpcy53aXpfcHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhpcyBhY3Rpb24gZGVsZWdhdGUuICBUaGUgaW1wbGVtZW50b3Igc2hvdWxkIHVuaG9vayBhbnkgcmVmZXJlbmNlcwotCSAqIHRvIGl0c2VsZiBzbyB0aGF0IGdhcmJhZ2UgY29sbGVjdGlvbiBjYW4gb2NjdXIuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJd2luZG93ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIGFjdGlvbiBkZWxlZ2F0ZSB3aXRoIHRoZSB3b3JrYmVuY2ggd2luZG93IGl0IHdpbGwgd29yayBpbi4KLQkgKgotCSAqIEBwYXJhbSBuZXdXaW5kb3cgdGhlIHdpbmRvdyB0aGF0IHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGlzIGRlbGVnYXRlCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IG5ld1dpbmRvdykgewotCQl3aW5kb3cgPSBuZXdXaW5kb3c7Ci0JfQotCi0JcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKElNb2R1bGUgbW9kdWxlLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZ2V0RGVmYXVsdFNlcnZlcihtb2R1bGUpOwotCQkKLQkJLy8gaWdub3JlIHByZWZlcmVuY2UgaWYgdGhlIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgdGhpcyBtb2RlLgotCQlpZiAoc2VydmVyICE9IG51bGwgJiYgIVNlcnZlclVJUGx1Z2luLmlzQ29tcGF0aWJsZVdpdGhMYXVuY2hNb2RlKHNlcnZlciwgbGF1bmNoTW9kZSkpCi0JCQlzZXJ2ZXIgPSBudWxsOwotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsICYmICFTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKHNlcnZlciwgbW9kdWxlLCBtb25pdG9yKSkgewotCQkJSVNlcnZlcldvcmtpbmdDb3B5IHdjID0gc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCQl0cnkgewotCQkJCVNlcnZlclV0aWwubW9kaWZ5TW9kdWxlcyh3YywgbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBuZXcgSU1vZHVsZVswXSwgbW9uaXRvcik7Ci0JCQkJd2Muc2F2ZShmYWxzZSwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IGFkZCBtb2R1bGUgdG8gc2VydmVyIiwgY2UpOwotCQkJCX0KLQkJCQlzZXJ2ZXIgPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlTaGVsbCBzaGVsbDsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKQotCQkJc2hlbGwgPSB3aW5kb3cuZ2V0U2hlbGwoKTsKLQkJZWxzZQotCQkJc2hlbGwgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCQotCQlpZiAoc2VydmVyID09IG51bGwpIHsKLQkJCS8vIHRyeSB0aGUgZnVsbCB3aXphcmQKLQkJCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiTGF1bmNoaW5nIHdpemFyZCIpOwotCQkJfQotCQkJUnVuT25TZXJ2ZXJXaXphcmQgd2l6YXJkID0gbmV3IFJ1bk9uU2VydmVyV2l6YXJkKG1vZHVsZSwgbGF1bmNoTW9kZSwgbW9kdWxlQXJ0aWZhY3QsIHdpel9wcm9wZXJ0aWVzKTsKLQotCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQkJbW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJdHJ5IHsKLQkJCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZmFtaWx5IiwgbnVsbCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiRXJyb3Igd2FpdGluZyBmb3Igam9iIiwgZSk7Ci0JCQkJfQotCQkJfQotCQkJc2VydmVyID0gd2l6YXJkLmdldFNlcnZlcigpOwotCQkJYm9vbGVhbiBwcmVmZXJyZWQgPSB3aXphcmQuaXNQcmVmZXJyZWRTZXJ2ZXIoKTsKLQkJCXRhc2tzQW5kQ2xpZW50U2hvd24gPSB0cnVlOwotCQkJaWYgKGNsaWVudCA9PSBudWxsIHx8IGxhdW5jaGFibGVBZGFwdGVyID09IG51bGwpewotCQkJCWNsaWVudCA9IHdpemFyZC5nZXRTZWxlY3RlZENsaWVudCgpOwotCQkJCWxhdW5jaGFibGVBZGFwdGVyID0gd2l6YXJkLmdldExhdW5jaGFibGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIHNldCBwcmVmZXJyZWQgc2VydmVyIGlmIHJlcXVlc3RlZAotCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHByZWZlcnJlZCkgewotCQkJCXRyeSB7Ci0JCQkJCVNlcnZlckNvcmUuc2V0RGVmYXVsdFNlcnZlcihtb2R1bGUsIHNlcnZlciwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmVycm9yQ291bGROb3RTYXZlUHJlZmVyZW5jZTsKLQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBNZXNzYWdlcy5lcnJvckRpYWxvZ1RpdGxlLCBtZXNzYWdlLCBjZS5nZXRTdGF0dXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQl0cnkgewotCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmZhbWlseSIsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkVycm9yIHdhaXRpbmcgZm9yIGpvYiIsIGUpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gc2VydmVyOwotCX0KLQotCS8qKgotCSAqIFJ1biB0aGUgcmVzb3VyY2Ugb24gYSBzZXJ2ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcnVuKCkgewotCQlmaW5hbCBJTW9kdWxlQXJ0aWZhY3RbXSBtb2R1bGVBcnRpZmFjdHMgPSBTZXJ2ZXJQbHVnaW4uZ2V0TW9kdWxlQXJ0aWZhY3RzKHNlbGVjdGlvbik7Ci0JCWlmIChtb2R1bGVBcnRpZmFjdHMgPT0gbnVsbCB8fCBtb2R1bGVBcnRpZmFjdHMubGVuZ3RoID09IDAgfHwgbW9kdWxlQXJ0aWZhY3RzWzBdID09IG51bGwpIHsKLQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcihNZXNzYWdlcy5lcnJvck5vQXJ0aWZhY3QpOwotCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJObyBtb2R1bGUgYXJ0aWZhY3QgZm91bmQiKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU2hlbGwgc2hlbGwyID0gbnVsbDsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKQotCQkJc2hlbGwyID0gd2luZG93LmdldFNoZWxsKCk7Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQlzaGVsbDIgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJaWYgKHNoZWxsMiA9PSBudWxsKQotCQkJCXNoZWxsMiA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCX0KLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBzaGVsbDI7Ci0JCWZpbmFsIElBZGFwdGFibGUgaW5mbyA9IG5ldyBJQWRhcHRhYmxlKCkgewotCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQlpZiAoU2hlbGwuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJCQlyZXR1cm4gc2hlbGw7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCQotCQkvLyBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gMSBtb2R1bGVBcnRpZmFjdCwgZ2V0IGEgdmFsaWQgTW9kdWxlQXJ0aWZhY3QgdGhhdCB3ZSBjYW4gdXNlIGZvciBsYXVuY2hpbmcKLQkJLy8gVE9ETyBUaGUgTW9kdWxlQXJ0aWZhY3RDb21wb3NpdGUgc2hvdWxkIGJlIHBhcnQgb2YgdGhlIFJ1bk9uU2VydmVyV2l6YXJkCi0JCWZpbmFsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdDsKLQkJaWYgKG1vZHVsZUFydGlmYWN0cy5sZW5ndGggPiAxKSB7Ci0JCQlNb2R1bGVBcnRpZmFjdENvbXBvc2l0ZSBhcnRpZmFjdENvbXBvc2l0ZSA9IG5ldyBNb2R1bGVBcnRpZmFjdENvbXBvc2l0ZShzaGVsbCwgbW9kdWxlQXJ0aWZhY3RzLCBsYXVuY2hNb2RlKTsKLQkJCWlmIChhcnRpZmFjdENvbXBvc2l0ZS5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCW1vZHVsZUFydGlmYWN0ID0gYXJ0aWZhY3RDb21wb3NpdGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCX0gZWxzZQotCQkJbW9kdWxlQXJ0aWZhY3QgPSBtb2R1bGVBcnRpZmFjdHNbMF07Ci0JCQotCQlpZiAobW9kdWxlQXJ0aWZhY3QuZ2V0TW9kdWxlKCkgPT0gbnVsbCkgeyAvLyAxNDk0MjUKLQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcihNZXNzYWdlcy5lcnJvck5vTW9kdWxlcyk7Ci0JCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIk1vZHVsZSBhcnRpZmFjdCBub3QgY29udGFpbmVkIGluIGEgbW9kdWxlIik7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmluYWwgSU1vZHVsZSBtb2R1bGUgPSBtb2R1bGVBcnRpZmFjdC5nZXRNb2R1bGUoKTsKLQkJCi0JCS8vIGNoZWNrIGZvciBzZXJ2ZXJzIHdpdGggdGhlIGdpdmVuIHN0YXJ0IG1vZGUKLQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplICYmICFmb3VuZDsgaSsrKSB7Ci0JCQkJaWYgKFNlcnZlclVJUGx1Z2luLmlzQ29tcGF0aWJsZVdpdGhMYXVuY2hNb2RlKHNlcnZlcnNbaV0sIGxhdW5jaE1vZGUpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJTW9kdWxlW10gcGFyZW50cyA9IHNlcnZlcnNbaV0uZ2V0Um9vdE1vZHVsZXMobW9kdWxlLCBudWxsKTsKLQkJCQkJCWlmIChwYXJlbnRzICE9IG51bGwgJiYgcGFyZW50cy5sZW5ndGggPiAwKQotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAoIWZvdW5kKSB7Ci0JCQkvLyBubyBleGlzdGluZyBzZXJ2ZXIgc3VwcG9ydHMgdGhlIHByb2plY3QgYW5kIHN0YXJ0IG1vZGUhCi0JCQkvLyBjaGVjayBpZiB0aGVyZSBtaWdodCBiZSBhbm90aGVyIG9uZSB0aGF0IGNhbiBiZSBjcmVhdGVkCi0JCQlJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOwotCQkJaWYgKHNlcnZlclR5cGVzICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IHNlcnZlclR5cGVzLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUgJiYgIWZvdW5kOyBpKyspIHsKLQkJCQkJSVNlcnZlclR5cGUgdHlwZSA9IHNlcnZlclR5cGVzW2ldOwotCQkJCQlJTW9kdWxlVHlwZVtdIG1vZHVsZVR5cGVzID0gdHlwZS5nZXRSdW50aW1lVHlwZSgpLmdldE1vZHVsZVR5cGVzKCk7Ci0JCQkJCWlmICh0eXBlLnN1cHBvcnRzTGF1bmNoTW9kZShsYXVuY2hNb2RlKSAmJiBTZXJ2ZXJVdGlsLmlzU3VwcG9ydGVkTW9kdWxlKG1vZHVsZVR5cGVzLCBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpKSkgewotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCkgewotCQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcihNZXNzYWdlcy5lcnJvck5vU2VydmVyKTsKLQkJCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJObyBzZXJ2ZXIgZm9yIHN0YXJ0IG1vZGUiKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoIVNlcnZlclVJUGx1Z2luLnNhdmVFZGl0b3JzKCkpCi0JCQlyZXR1cm47Ci0KLQkJdGFza3NBbmRDbGllbnRTaG93biA9IGZhbHNlOwotCQlJU2VydmVyIHNlcnZlcjIgPSBudWxsOwotCQkvLyBpbml0aWFsaXplIGl0cyB2YWx1ZSB1c2luZyB0aGUgcHJlZGVmaW5lZCB2YWx1ZSBpZiBvbmUgaGFzIGJlZW4gZ2l2ZW4KLQkJY2xpZW50ID0gKElDbGllbnQpZ2V0T3ZlcndyaXRlVmFsdWUoUk9TX0NMSUVOVCk7Ci0JCWxhdW5jaGFibGVBZGFwdGVyID0gKElMYXVuY2hhYmxlQWRhcHRlcikgZ2V0T3ZlcndyaXRlVmFsdWUoUk9TX0xBVU5DSEFCTEUpOwotCQkKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgCi0JCQkJCSJDbGllbnQgYW5kIGxhdW5jaGFibGVBZGFwdGVyIGFmdGVyIHNldHRpbmcgcHJlZGVmaW5lZCB2YWx1ZXM6IGxhdW5jaGFibGVBZGFwdGVyPSIKLQkJCQkJKyBsYXVuY2hhYmxlQWRhcHRlciArICIgY2xpZW50PSIgKyBjbGllbnQpOwotCQl9CQkKLQkJCi0JCXRyeSB7Ci0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJc2VydmVyMiA9IGdldFNlcnZlcihtb2R1bGUsIG1vZHVsZUFydGlmYWN0LCBtb25pdG9yKTsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCWlmIChzZXJ2ZXIyICE9IG51bGwpIHsKLQkJCQlJRm9sZGVyIGZvbGRlciA9IHNlcnZlcjIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCQkJCWlmIChmb2xkZXIgIT0gbnVsbCAmJiBmb2xkZXIuZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgIWZvbGRlci5nZXRQcm9qZWN0KCkuaXNPcGVuKCkpCi0JCQkJCWZvbGRlci5nZXRQcm9qZWN0KCkub3Blbihtb25pdG9yKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKHNoZWxsLCBjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZpbmFsIElTZXJ2ZXIgc2VydmVyID0gc2VydmVyMjsKLQkJLy9pZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCS8vCXJldHVybjsKLQkJCi0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJTZXJ2ZXI6ICIgKyBzZXJ2ZXIpOwotCQl9Ci0JCQotCQlpZiAoc2VydmVyID09IG51bGwpIHsKLQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcihNZXNzYWdlcy5lcnJvck5vU2VydmVyKTsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiTm8gc2VydmVyIGZvdW5kIik7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICghU2VydmVyVUlQbHVnaW4ucHJvbXB0SWZEaXJ0eShzaGVsbCwgc2VydmVyKSkKLQkJCXJldHVybjsKLQkJCi0JCS8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGNsaWVudCBhbmQgbGF1bmNoYWJsZSB3ZXJlIHByZS1wb3B1bGF0ZWQKLQkJaWYgKCF0YXNrc0FuZENsaWVudFNob3duKSB7Ci0JCQlSdW5PblNlcnZlcldpemFyZCB3aXphcmQgPSBuZXcgUnVuT25TZXJ2ZXJXaXphcmQoc2VydmVyLCBsYXVuY2hNb2RlLCBtb2R1bGVBcnRpZmFjdCwgd2l6X3Byb3BlcnRpZXMpOwotCQkJaWYgKHdpemFyZC5zaG91bGRBcHBlYXIoKSkgewotCQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpCi0JCQkJCXJldHVybjsKLQkJCX0gZWxzZQotCQkJCXdpemFyZC5wZXJmb3JtRmluaXNoKCk7Ci0KLQkJCS8vIERvIG5vdCBvdmVyd3JpdGUgdGhlIGNsaWVudCBvciBsYXVuY2hhYmxlQWRhcHRlciB2YWx1ZSwgYXMgaXQgbWF5Ci0JCQkvLyBoYXZlIGJlZW4gc2V0IGJ5IGdldE92ZXJ3cml0ZVZhbHVlLCB3aGljaCB3aWxsIGFkZCBwcmVkZWZpbmVkIHZhbHVlcyAKLQkJCS8vIGlmIHByb3ZpZGVkLiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBnZXR0aW5nIHRoZSB2YWx1ZXMgKGNsaWVudCBhbmQgCi0JCQkvLyBsYXVuY2hhYmxlQWFkYXB0ZXIpIGZyb20gdGhlIHdpemFyZCB3aWxsIGJlIHZhbGlkLCBzaW5jZSB0aGUgdmFsdWVzIGZyb20KLQkJCS8vIHRoZSB3aXphcmQgYXJlIHVzZWQgb25seSBpZiB0aGUgY2xpZW50IGFuZCBsYXVuY2hhYmxlQWRhcHRlciBhcmUgbnVsbAotCQkJaWYgKGNsaWVudCA9PSBudWxsKXsKLQkJCQljbGllbnQgPSB3aXphcmQuZ2V0U2VsZWN0ZWRDbGllbnQoKTsKLQkJCX0KLQkJCWlmIChsYXVuY2hhYmxlQWRhcHRlciA9PSBudWxsKXsKLQkJCQlsYXVuY2hhYmxlQWRhcHRlciA9IHdpemFyZC5nZXRMYXVuY2hhYmxlQWRhcHRlcigpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBpZiB0aGVyZSBpcyBubyBjbGllbnQsIHVzZSBhIGR1bW15Ci0JCWlmIChjbGllbnQgPT0gbnVsbCkgewkJCi0JCQljbGllbnQgPSBuZXcgSUNsaWVudCgpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJCQlyZXR1cm4gTWVzc2FnZXMuY2xpZW50RGVmYXVsdERlc2NyaXB0aW9uOwotCQkJCX0KLQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5jbGllbnQuZGVmYXVsdCI7Ci0JCQkJfQotCi0JCQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJCQlyZXR1cm4gTWVzc2FnZXMuY2xpZW50RGVmYXVsdE5hbWU7Ci0JCQkJfQotCi0JCQkJcHVibGljIElTdGF0dXMgbGF1bmNoKElTZXJ2ZXIgc2VydmVyMywgT2JqZWN0IGxhdW5jaGFibGUyLCBTdHJpbmcgbGF1bmNoTW9kZTMsIElMYXVuY2ggbGF1bmNoKSB7Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKElTZXJ2ZXIgc2VydmVyMywgT2JqZWN0IGxhdW5jaGFibGUyLCBTdHJpbmcgbGF1bmNoTW9kZTMpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgCi0JCQkJCSJQcmlvciB0byBjcmVhdGluZyBsYXVuY2ggY2xpZW50IGpvYnM6IGxhdW5jaGFibGVBZGFwdGVyPSIrIGxhdW5jaGFibGVBZGFwdGVyICsgIiBjbGllbnQ9IiArIGNsaWVudCk7Ci0JCX0KLQkJCi0JCWlmIChtb2R1bGVBcnRpZmFjdCBpbnN0YW5jZW9mIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUpIHsKLQkJCWJvb2xlYW4gY2FuTG9hZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlDbGFzcyBjID0gQ2xhc3MuZm9yTmFtZShtb2R1bGVBcnRpZmFjdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQkJaWYgKGMubmV3SW5zdGFuY2UoKSAhPSBudWxsKQotCQkJCQljYW5Mb2FkID0gdHJ1ZTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsCi0JCQkJCQkJIkNvdWxkIG5vdCBsb2FkIG1vZHVsZSBhcnRpZmFjdCBkZWxlZ2F0ZSBjbGFzcywgc3dpdGNoaW5nIHRvIGJhY2t1cCIpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjYW5Mb2FkKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihzZXJ2ZXIsIChNb2R1bGVBcnRpZmFjdERlbGVnYXRlKSBtb2R1bGVBcnRpZmFjdCwgbGF1bmNoYWJsZUFkYXB0ZXIsIGNsaWVudCwgbW9uaXRvcik7Ci0JCQkJCWNvbmZpZy5sYXVuY2gobGF1bmNoTW9kZSwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IGxhdW5jaCBSdW4gb24gU2VydmVyIiwgY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQoIlJ1biBvbiBTZXJ2ZXIiKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiUmVhZHkgdG8gbGF1bmNoIik7Ci0JCQkJfQotCQkJCQotCQkJCS8vIHN0YXJ0IHNlcnZlciBpZiBpdCdzIG5vdCBhbHJlYWR5IHN0YXJ0ZWQKLQkJCQkvLyBhbmQgY3VlIHRoZSBjbGllbnQgdG8gc3RhcnQKLQkJCQlJTW9kdWxlW10gbW9kdWxlcyA9IG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfTsgLy8gVE9ETzogZ2V0IHBhcmVudCBoaWVyYXJjaHkgY29ycmVjdAotCQkJCWludCBzdGF0ZSA9IHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpOwotCQkJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKSB7Ci0JCQkJCUxhdW5jaENsaWVudEpvYiBjbGllbnRKb2IgPSBuZXcgTGF1bmNoQ2xpZW50Sm9iKHNlcnZlciwgbW9kdWxlcywgbGF1bmNoTW9kZSwgbW9kdWxlQXJ0aWZhY3QsIGxhdW5jaGFibGVBZGFwdGVyLCBjbGllbnQpOwotCQkJCQljbGllbnRKb2Iuc2NoZWR1bGUoKTsKLQkJCQl9IGVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewotCQkJCQlib29sZWFuIHJlc3RhcnQgPSBmYWxzZTsKLQkJCQkJU3RyaW5nIG1vZGUgPSBzZXJ2ZXIuZ2V0TW9kZSgpOwotCQkJCQlJQnJlYWtwb2ludE1hbmFnZXIgYnJlYWtwb2ludE1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKTsKLQkJCQkJYm9vbGVhbiBkaXNhYmxlZEJyZWFrcG9pbnRzID0gZmFsc2U7Ci0JCQkJCQotCQkJCQlpZiAoc2VydmVyLmdldFNlcnZlclJlc3RhcnRTdGF0ZSgpKSB7Ci0JCQkJCQlpbnQgcmVzdWx0ID0gb3BlblJlc3RhcnREaWFsb2coc2hlbGwpOwotCQkJCQkJaWYgKHJlc3VsdCA9PSAwKSB7Ci0JCQkJCQkJbGF1bmNoTW9kZSA9IG1vZGU7Ci0JCQkJCQkJcmVzdGFydCA9IHRydWU7Ci0JCQkJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSA5KSAvLyBjYW5jZWwKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKCFyZXN0YXJ0KSB7Ci0JCQkJCQlpZiAoIUlMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLmVxdWFscyhtb2RlKSAmJiBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERS5lcXVhbHMobGF1bmNoTW9kZSkpIHsKLQkJCQkJCQlib29sZWFuIGJyZWFrcG9pbnRzT3B0aW9uID0gZmFsc2U7Ci0JCQkJCQkJaWYgKGJyZWFrcG9pbnRNYW5hZ2VyLmlzRW5hYmxlZCgpICYmIElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQotCQkJCQkJCQlicmVha3BvaW50c09wdGlvbiA9IHRydWU7Ci0JCQkJCQkJaW50IHJlc3VsdCA9IG9wZW5PcHRpb25zRGlhbG9nKHNoZWxsLCBNZXNzYWdlcy53aXpSdW5PblNlcnZlclRpdGxlLCBNZXNzYWdlcy5kaWFsb2dNb2RlV2FybmluZ1J1biwgYnJlYWtwb2ludHNPcHRpb24pOwotCQkJCQkJCWlmIChyZXN1bHQgPT0gMCkKLQkJCQkJCQkJcmVzdGFydCA9IHRydWU7Ci0JCQkJCQkJZWxzZSBpZiAocmVzdWx0ID09IDEpIHsKLQkJCQkJCQkJYnJlYWtwb2ludE1hbmFnZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQkJCWRpc2FibGVkQnJlYWtwb2ludHMgPSB0cnVlOwotCQkJCQkJCQlsYXVuY2hNb2RlID0gbW9kZTsKLQkJCQkJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSAyKQotCQkJCQkJCQlsYXVuY2hNb2RlID0gbW9kZTsKLQkJCQkJCQllbHNlIC8vIHJlc3VsdCA9PSA5IC8vIGNhbmNlbAotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9IGVsc2UgaWYgKCFJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSAmJiBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkgewotCQkJCQkJCWludCByZXN1bHQgPSBvcGVuT3B0aW9uc0RpYWxvZyhzaGVsbCwgTWVzc2FnZXMud2l6RGVidWdPblNlcnZlclRpdGxlLCBNZXNzYWdlcy5kaWFsb2dNb2RlV2FybmluZ0RlYnVnLCBmYWxzZSk7Ci0JCQkJCQkJaWYgKHJlc3VsdCA9PSAwKQotCQkJCQkJCQlyZXN0YXJ0ID0gdHJ1ZTsKLQkJCQkJCQllbHNlIGlmIChyZXN1bHQgPT0gMSkKLQkJCQkJCQkJbGF1bmNoTW9kZSA9IG1vZGU7Ci0JCQkJCQkJZWxzZSAvLyByZXN1bHQgPT0gOSAvLyBjYW5jZWwKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJfSBlbHNlIGlmICghSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSAmJiBJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKSB7Ci0JCQkJCQkJYm9vbGVhbiBicmVha3BvaW50c09wdGlvbiA9IGZhbHNlOwotCQkJCQkJCWlmIChicmVha3BvaW50TWFuYWdlci5pc0VuYWJsZWQoKSAmJiBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKLQkJCQkJCQkJYnJlYWtwb2ludHNPcHRpb24gPSB0cnVlOwotCQkJCQkJCWludCByZXN1bHQgPSBvcGVuT3B0aW9uc0RpYWxvZyhzaGVsbCwgTWVzc2FnZXMud2l6UHJvZmlsZU9uU2VydmVyVGl0bGUsIE1lc3NhZ2VzLmRpYWxvZ01vZGVXYXJuaW5nUHJvZmlsZSwgYnJlYWtwb2ludHNPcHRpb24pOwotCQkJCQkJCWlmIChyZXN1bHQgPT0gMCkKLQkJCQkJCQkJcmVzdGFydCA9IHRydWU7Ci0JCQkJCQkJZWxzZSBpZiAocmVzdWx0ID09IDEpIHsKLQkJCQkJCQkJYnJlYWtwb2ludE1hbmFnZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQkJCWRpc2FibGVkQnJlYWtwb2ludHMgPSB0cnVlOwotCQkJCQkJCQlsYXVuY2hNb2RlID0gbW9kZTsKLQkJCQkJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSAyKQotCQkJCQkJCQlsYXVuY2hNb2RlID0gbW9kZTsKLQkJCQkJCQllbHNlIC8vIHJlc3VsdCA9PSA5IC8vIGNhbmNlbAotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkgewotCQkJCQkJCWlmICghYnJlYWtwb2ludE1hbmFnZXIuaXNFbmFibGVkKCkgJiYgIWRpc2FibGVkQnJlYWtwb2ludHMpIHsKLQkJCQkJCQkJaW50IHJlc3VsdCA9IG9wZW5CcmVha3BvaW50RGlhbG9nKHNoZWxsKTsKLQkJCQkJCQkJaWYgKHJlc3VsdCA9PSAwKQotCQkJCQkJCQkJYnJlYWtwb2ludE1hbmFnZXIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQkJZWxzZSBpZiAocmVzdWx0ID09IDEpIHsKLQkJCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJCQl9IGVsc2UgLy8gcmVzdWx0ID09IDIKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWZpbmFsIExhdW5jaENsaWVudEpvYiBjbGllbnRKb2IgPSBuZXcgTGF1bmNoQ2xpZW50Sm9iKHNlcnZlciwgbW9kdWxlcywgbGF1bmNoTW9kZSwgbW9kdWxlQXJ0aWZhY3QsIGxhdW5jaGFibGVBZGFwdGVyLCBjbGllbnQpOwotCQkJCQlpZiAocmVzdGFydCkgewotCQkJCQkJZmluYWwgSVNlcnZlciBzZXJ2ZXIzID0gc2VydmVyOwotCQkJCQkJc2VydmVyLnJlc3RhcnQobGF1bmNoTW9kZSwgbmV3IElTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIGRvbmUoSVN0YXR1cyByZXN1bHQpIHsKLQkJCQkJCQkJLy8gT25seSBwdWJsaXNoIGlmIHRoZSBzZXJ2ZXIgcmVxdWlyZXMgcHVibGlzaCBiZWZvcmUgbGF1bmNoaW5nIHRoZSBjbGllbnQuCi0JCQkJCQkJCWlmIChzZXJ2ZXIzLnNob3VsZFB1Ymxpc2goKSkgewotCQkJCQkJCQkJc2VydmVyMy5wdWJsaXNoKElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgbnVsbCwgaW5mbywgbmV3IElTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyKCkgewotCQkJCQkJCQkJCXB1YmxpYyB2b2lkIGRvbmUoSVN0YXR1cyByZXN1bHQyKSB7Ci0JCQkJCQkJCQkJCWlmIChyZXN1bHQyLmlzT0soKSkKLQkJCQkJCQkJCQkJCWNsaWVudEpvYi5zY2hlZHVsZSgpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0pOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJY2xpZW50Sm9iLnNjaGVkdWxlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIE9ubHkgcHVibGlzaCBpZiB0aGUgc2VydmVyIHJlcXVpcmVzIHB1Ymxpc2ggYmVmb3JlIGxhdW5jaGluZyB0aGUgY2xpZW50LgotCQkJCQkJaWYgKHNlcnZlci5zaG91bGRQdWJsaXNoKCkpIHsKLQkJCQkJCQlzZXJ2ZXIucHVibGlzaChJU2VydmVyLlBVQkxJU0hfSU5DUkVNRU5UQUwsIG51bGwsIGluZm8sIG5ldyBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcigpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgZG9uZShJU3RhdHVzIHJlc3VsdCkgewotCQkJCQkJCQkJaWYgKHJlc3VsdC5pc09LKCkpCi0JCQkJCQkJCQkJY2xpZW50Sm9iLnNjaGVkdWxlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY2xpZW50Sm9iLnNjaGVkdWxlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHN0YXRlICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpIHsKLQkJCQkJZmluYWwgTGF1bmNoQ2xpZW50Sm9iIGNsaWVudEpvYiA9IG5ldyBMYXVuY2hDbGllbnRKb2Ioc2VydmVyLCBtb2R1bGVzLCBsYXVuY2hNb2RlLCBtb2R1bGVBcnRpZmFjdCwgbGF1bmNoYWJsZUFkYXB0ZXIsIGNsaWVudCk7Ci0JCQkJCQotCQkJCQlzZXJ2ZXIuc3RhcnQobGF1bmNoTW9kZSwgbmV3IElTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgZG9uZShJU3RhdHVzIHJlc3VsdCkgewotCQkJCQkJCWlmIChyZXN1bHQuaXNPSygpKQotCQkJCQkJCQljbGllbnRKb2Iuc2NoZWR1bGUoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0aHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQl0aHJlYWQuc3RhcnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cExhdW5jaENvbmZpZ3VyYXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcsIElTZXJ2ZXIgc2VydmVyLCBNb2R1bGVBcnRpZmFjdERlbGVnYXRlIG1vZHVsZUFydGlmYWN0LCBJTGF1bmNoYWJsZUFkYXB0ZXIgbGF1bmNoYWJsZUFkYXB0ZXIsIElDbGllbnQgY2xpZW50KSB7Ci0JCVN0cmluZyBsYXVuY2hOYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMucnVuT25TZXJ2ZXJMYXVuY2hDb25maWdOYW1lLCBtb2R1bGVBcnRpZmFjdC5nZXROYW1lKCkpOwotCQlsYXVuY2hOYW1lID0gZ2V0VmFsaWRMYXVuY2hDb25maWd1cmF0aW9uTmFtZShsYXVuY2hOYW1lKTsKLQkJaWYgKCFsYXVuY2hOYW1lLmVxdWFscyhjb25maWcuZ2V0TmFtZSgpKSkgewotCQkJSUxhdW5jaE1hbmFnZXIgbGF1bmNoTWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCk7Ci0JCQlsYXVuY2hOYW1lID0gbGF1bmNoTWFuYWdlci5nZW5lcmF0ZVVuaXF1ZUxhdW5jaENvbmZpZ3VyYXRpb25OYW1lRnJvbShsYXVuY2hOYW1lKTsKLQkJCWNvbmZpZy5yZW5hbWUobGF1bmNoTmFtZSk7Ci0JCX0KLQkJCi0JCWNvbmZpZy5zZXRBdHRyaWJ1dGUoUnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuQVRUUl9TRVJWRVJfSUQsIHNlcnZlci5nZXRJZCgpKTsKLQkJY29uZmlnLnNldEF0dHJpYnV0ZShSdW5PblNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5BVFRSX01PRFVMRV9BUlRJRkFDVCwgbW9kdWxlQXJ0aWZhY3Quc2VyaWFsaXplKCkpOwotCQljb25maWcuc2V0QXR0cmlidXRlKFJ1bk9uU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLkFUVFJfTU9EVUxFX0FSVElGQUNUX0NMQVNTLCBtb2R1bGVBcnRpZmFjdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCWlmIChsYXVuY2hhYmxlQWRhcHRlciAhPSBudWxsKQotCQkJY29uZmlnLnNldEF0dHJpYnV0ZShSdW5PblNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5BVFRSX0xBVU5DSEFCTEVfQURBUFRFUl9JRCwgbGF1bmNoYWJsZUFkYXB0ZXIuZ2V0SWQoKSk7Ci0JCWVsc2UKLQkJCWNvbmZpZy5zZXRBdHRyaWJ1dGUoUnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuQVRUUl9MQVVOQ0hBQkxFX0FEQVBURVJfSUQsIChTdHJpbmcpbnVsbCk7Ci0JCWNvbmZpZy5zZXRBdHRyaWJ1dGUoUnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuQVRUUl9DTElFTlRfSUQsIGNsaWVudC5nZXRJZCgpKTsKLQkJCi0JCXRyeSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gbW9kdWxlQXJ0aWZhY3QuZ2V0TW9kdWxlKCkuZ2V0UHJvamVjdCgpOwotCQkJY29uZmlnLnNldE1hcHBlZFJlc291cmNlcyhuZXcgSVJlc291cmNlW10geyBwcm9qZWN0IH0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkNvdWxkIG5vdCBhc3NvY2lhdGUgbGF1bmNoIHdpdGggYSBwcm9qZWN0IiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUxhdW5jaENvbmZpZ3VyYXRpb24gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihJU2VydmVyIHNlcnZlciwgTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSBtb2R1bGVBcnRpZmFjdCwgSUxhdW5jaGFibGVBZGFwdGVyIGxhdW5jaGFibGVBZGFwdGVyMiwgSUNsaWVudCBjbGllbnQyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHNlcnZlcklkID0gc2VydmVyLmdldElkKCk7Ci0JCUlMYXVuY2hNYW5hZ2VyIGxhdW5jaE1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgbGF1bmNoQ29uZmlnVHlwZSA9IGxhdW5jaE1hbmFnZXIuZ2V0TGF1bmNoQ29uZmlndXJhdGlvblR5cGUoIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBsYXVuY2hDb25maWdzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWxhdW5jaENvbmZpZ3MgPSBsYXVuY2hNYW5hZ2VyLmdldExhdW5jaENvbmZpZ3VyYXRpb25zKGxhdW5jaENvbmZpZ1R5cGUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCQotCQlpZiAobGF1bmNoQ29uZmlncyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGxhdW5jaENvbmZpZ3MubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlMaXN0IGxpc3QgPSBsYXVuY2hDb25maWdzW2ldLmdldEF0dHJpYnV0ZShJRGVidWdVSUNvbnN0YW50cy5BVFRSX0ZBVk9SSVRFX0dST1VQUywgKExpc3QpbnVsbCk7Ci0JCQkJaWYgKGxpc3QgPT0gbnVsbCB8fCBsaXN0LmlzRW1wdHkoKSkgewotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIHNlcnZlcklkMiA9IGxhdW5jaENvbmZpZ3NbaV0uZ2V0QXR0cmlidXRlKFJ1bk9uU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLkFUVFJfU0VSVkVSX0lELCAoU3RyaW5nKSBudWxsKTsKLQkJCQkJCWlmIChzZXJ2ZXJJZC5lcXVhbHMoc2VydmVySWQyKSkgewotCQkJCQkJCWZpbmFsIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2MgPSBsYXVuY2hDb25maWdzW2ldLmdldFdvcmtpbmdDb3B5KCk7Ci0JCQkJCQkJc2V0dXBMYXVuY2hDb25maWd1cmF0aW9uKHdjLCBzZXJ2ZXIsIG1vZHVsZUFydGlmYWN0LCBsYXVuY2hhYmxlQWRhcHRlcjIsIGNsaWVudDIpOwotCQkJCQkJCWlmICh3Yy5pc0RpcnR5KCkpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCXJldHVybiB3Yy5kb1NhdmUoKTsKLQkJCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjb25maWd1cmluZyBsYXVuY2giLCBjZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIGxhdW5jaENvbmZpZ3NbaV07Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjb25maWd1cmluZyBsYXVuY2giLCBlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gY3JlYXRlIGEgbmV3IGxhdW5jaCBjb25maWd1cmF0aW9uCi0JCVN0cmluZyBsYXVuY2hOYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMucnVuT25TZXJ2ZXJMYXVuY2hDb25maWdOYW1lLCBtb2R1bGVBcnRpZmFjdC5nZXROYW1lKCkpOwotCQlsYXVuY2hOYW1lID0gZ2V0VmFsaWRMYXVuY2hDb25maWd1cmF0aW9uTmFtZShsYXVuY2hOYW1lKTsKLQkJbGF1bmNoTmFtZSA9IGxhdW5jaE1hbmFnZXIuZ2VuZXJhdGVVbmlxdWVMYXVuY2hDb25maWd1cmF0aW9uTmFtZUZyb20obGF1bmNoTmFtZSk7IAotCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gbGF1bmNoQ29uZmlnVHlwZS5uZXdJbnN0YW5jZShudWxsLCBsYXVuY2hOYW1lKTsKLQkJd2Muc2V0QXR0cmlidXRlKFJ1bk9uU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLkFUVFJfU0VSVkVSX0lELCBzZXJ2ZXJJZCk7Ci0JCXNldHVwTGF1bmNoQ29uZmlndXJhdGlvbih3Yywgc2VydmVyLCBtb2R1bGVBcnRpZmFjdCwgbGF1bmNoYWJsZUFkYXB0ZXIyLCBjbGllbnQyKTsKLQkJcmV0dXJuIHdjLmRvU2F2ZSgpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhcltdIElOVkFMSURfQ0hBUlMgPSBuZXcgY2hhcltdIHsnLycsJ1xcJywgJzonLCAnKicsICc/JywgJyInLCAnPCcsICc+JywgJ3wnLCAnXDAnLCAnQCcsICcmJ307Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZExhdW5jaENvbmZpZ3VyYXRpb25OYW1lKFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuICIxIjsKLQkJaW50IHNpemUgPSBJTlZBTElEX0NIQVJTLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXMgPSBzLnJlcGxhY2UoSU5WQUxJRF9DSEFSU1tpXSwgJ18nKTsKLQkJfQotCQlyZXR1cm4gczsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGFuIG9wdGlvbnMgZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbAotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIGJyZWFrcG9pbnRzT3B0aW9uCi0JICogQHJldHVybiBhIGRpYWxvZyByZXR1cm4gY29uc3RhbnQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBvcGVuT3B0aW9uc0RpYWxvZyhmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgYm9vbGVhbiBicmVha3BvaW50c09wdGlvbikgewotCQlpZiAoYnJlYWtwb2ludHNPcHRpb24pIHsKLQkJCWludCBjdXJyZW50ID0gU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5nZXRMYXVuY2hNb2RlMigpOwotCQkJaWYgKGN1cnJlbnQgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERTJfUkVTVEFSVCkKLQkJCQlyZXR1cm4gMDsKLQkJCWVsc2UgaWYgKGN1cnJlbnQgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERTJfRElTQUJMRV9CUkVBS1BPSU5UUykKLQkJCQlyZXR1cm4gMTsKLQkJCWVsc2UgaWYgKGN1cnJlbnQgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERTJfQ09OVElOVUUpCi0JCQkJcmV0dXJuIDI7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgY3VycmVudCA9IFNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuZ2V0TGF1bmNoTW9kZSgpOwotCQkJaWYgKGN1cnJlbnQgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERV9SRVNUQVJUKQotCQkJCXJldHVybiAwOwotCQkJZWxzZSBpZiAoY3VycmVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFX0NPTlRJTlVFKQotCQkJCXJldHVybiAxOwotCQl9Ci0JCWZpbmFsIGludFtdIGkgPSBuZXcgaW50WzFdOwotCQlzaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCU9wdGlvbnNNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG51bGw7Ci0JCQkJU3RyaW5nW10gaXRlbXMgPSBudWxsOwotCQkJCWlmIChicmVha3BvaW50c09wdGlvbikgewotCQkJCQlpdGVtcyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQkJCQlNZXNzYWdlcy5kaWFsb2dNb2RlV2FybmluZ1Jlc3RhcnQsCi0JCQkJCQlNZXNzYWdlcy5kaWFsb2dNb2RlV2FybmluZ0JyZWFrcG9pbnRzLAotCQkJCQkJTWVzc2FnZXMuZGlhbG9nTW9kZVdhcm5pbmdDb250aW51ZQotCQkJCQl9OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWl0ZW1zID0gbmV3IFN0cmluZ1tdIHsKLQkJCQkJCU1lc3NhZ2VzLmRpYWxvZ01vZGVXYXJuaW5nUmVzdGFydCwKLQkJCQkJCU1lc3NhZ2VzLmRpYWxvZ01vZGVXYXJuaW5nQ29udGludWUKLQkJCQkJfTsKLQkJCQl9Ci0JCQkJCi0JCQkJZGlhbG9nID0gbmV3IE9wdGlvbnNNZXNzYWdlRGlhbG9nKHNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgaXRlbXMpOwotCQkJCWlbMF0gPSBkaWFsb2cub3BlbigpOwotCQkJCQotCQkJCWlmIChkaWFsb2cuaXNSZW1lbWJlcigpKSB7Ci0JCQkJCWlmIChicmVha3BvaW50c09wdGlvbikgewotCQkJCQkJaWYgKGlbMF0gPT0gMCkKLQkJCQkJCQlTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLnNldExhdW5jaE1vZGUyKFNlcnZlclVJUHJlZmVyZW5jZXMuTEFVTkNIX01PREUyX1JFU1RBUlQpOwotCQkJCQkJZWxzZSBpZiAoaVswXSA9PSAxKQotCQkJCQkJCVNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuc2V0TGF1bmNoTW9kZTIoU2VydmVyVUlQcmVmZXJlbmNlcy5MQVVOQ0hfTU9ERTJfRElTQUJMRV9CUkVBS1BPSU5UUyk7Ci0JCQkJCQllbHNlIGlmIChpWzBdID09IDIpCi0JCQkJCQkJU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5zZXRMYXVuY2hNb2RlMihTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFMl9DT05USU5VRSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoaVswXSA9PSAwKQotCQkJCQkJCVNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuc2V0TGF1bmNoTW9kZShTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFX1JFU1RBUlQpOwotCQkJCQkJZWxzZSBpZiAoaVswXSA9PSAxKQotCQkJCQkJCVNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuc2V0TGF1bmNoTW9kZShTZXJ2ZXJVSVByZWZlcmVuY2VzLkxBVU5DSF9NT0RFX0NPTlRJTlVFKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBpWzBdOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYW4gb3B0aW9ucyBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHNoZWxsCi0JICogQHJldHVybiBhIGRpYWxvZyByZXR1cm4gY29uc3RhbnQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBvcGVuQnJlYWtwb2ludERpYWxvZyhmaW5hbCBTaGVsbCBzaGVsbCkgewotCQlpbnQgY3VycmVudCA9IFNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuZ2V0RW5hYmxlQnJlYWtwb2ludHMoKTsKLQkJaWYgKGN1cnJlbnQgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5FTkFCTEVfQlJFQUtQT0lOVFNfQUxXQVlTKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UgaWYgKGN1cnJlbnQgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5FTkFCTEVfQlJFQUtQT0lOVFNfTkVWRVIpCi0JCQlyZXR1cm4gMTsKLQkJCi0JCWZpbmFsIGludFtdIGkgPSBuZXcgaW50WzFdOwotCQlzaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCU9wdGlvbnNNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBPcHRpb25zTWVzc2FnZURpYWxvZyhzaGVsbCwKLQkJCQkJCU1lc3NhZ2VzLndpekRlYnVnT25TZXJ2ZXJUaXRsZSwgTWVzc2FnZXMuZGlhbG9nQnJlYWtwb2ludHMsIG5ldyBTdHJpbmdbXSB7Ci0JCQkJCQlNZXNzYWdlcy5kaWFsb2dCcmVha3BvaW50c1JlZW5hYmxlLCBNZXNzYWdlcy5kaWFsb2dNb2RlV2FybmluZ0NvbnRpbnVlfSk7Ci0JCQkJaVswXSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5pc1JlbWVtYmVyKCkpIHsKLQkJCQkJaWYgKGlbMF0gPT0gMCkKLQkJCQkJCVNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuc2V0RW5hYmxlQnJlYWtwb2ludHMoU2VydmVyVUlQcmVmZXJlbmNlcy5FTkFCTEVfQlJFQUtQT0lOVFNfQUxXQVlTKTsKLQkJCQkJZWxzZSBpZiAoaVswXSA9PSAxKQotCQkJCQkJU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5zZXRFbmFibGVCcmVha3BvaW50cyhTZXJ2ZXJVSVByZWZlcmVuY2VzLkVOQUJMRV9CUkVBS1BPSU5UU19ORVZFUik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGlbMF07Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhIHJlc3RhcnQgb3B0aW9ucyBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHNoZWxsCi0JICogQHJldHVybiBhIGRpYWxvZyByZXR1cm4gY29uc3RhbnQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBvcGVuUmVzdGFydERpYWxvZyhmaW5hbCBTaGVsbCBzaGVsbCkgewotCQlpbnQgY3VycmVudCA9IFNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuZ2V0UmVzdGFydCgpOwotCQlpZiAoY3VycmVudCA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLlJFU1RBUlRfQUxXQVlTKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UgaWYgKGN1cnJlbnQgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5SRVNUQVJUX05FVkVSKQotCQkJcmV0dXJuIDE7Ci0JCQotCQlmaW5hbCBpbnRbXSBpID0gbmV3IGludFsxXTsKLQkJc2hlbGwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlPcHRpb25zTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgT3B0aW9uc01lc3NhZ2VEaWFsb2coc2hlbGwsCi0JCQkJCQlNZXNzYWdlcy5kZWZhdWx0RGlhbG9nVGl0bGUsIE1lc3NhZ2VzLmRpYWxvZ1Jlc3RhcnQsIG5ldyBTdHJpbmdbXSB7Ci0JCQkJCQlNZXNzYWdlcy5kaWFsb2dSZXN0YXJ0UmVzdGFydCwgTWVzc2FnZXMuZGlhbG9nUmVzdGFydENvbnRpbnVlfSk7Ci0JCQkJaVswXSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5pc1JlbWVtYmVyKCkpIHsKLQkJCQkJaWYgKGlbMF0gPT0gMCkKLQkJCQkJCVNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuc2V0UmVzdGFydChTZXJ2ZXJVSVByZWZlcmVuY2VzLlJFU1RBUlRfQUxXQVlTKTsKLQkJCQkJZWxzZSBpZiAoaVswXSA9PSAxKQotCQkJCQkJU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5zZXRSZXN0YXJ0KFNlcnZlclVJUHJlZmVyZW5jZXMuUkVTVEFSVF9ORVZFUik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGlbMF07Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlbGVnYXRpbmcgYWN0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZC4gSW1wbGVtZW50Ci0JICogdGhpcyBtZXRob2QgdG8gZG8gdGhlIGFjdHVhbCB3b3JrLgotCSAqCi0JICogQHBhcmFtIGFjdGlvbiBhY3Rpb24gcHJveHkgdGhhdCBoYW5kbGVzIHRoZSBwcmVzZW50YXRpb24KLQkgKiBwb3J0aW9uIG9mIHRoZSBwbHVnaW4gYWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJSdW5uaW5nIG9uIFNlcnZlci4uLiIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlydW4oKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiUnVuIG9uIFNlcnZlciBFcnJvciIsIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQl0cnkgewotCQkJQm9vbGVhbiBiID0gZ2xvYmFsTGF1bmNoTW9kZS5nZXQoZ2V0TGF1bmNoTW9kZSgpKTsKLQkJCXJldHVybiBiLmJvb2xlYW5WYWx1ZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXJ0IG1vZGUgdGhhdCB0aGUgc2VydmVyIHNob3VsZCB1c2UuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYXVuY2hNb2RlKCkgewotCQlyZXR1cm4gbGF1bmNoTW9kZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGxhdW5jaCBtb2RlLgotCSAqIAotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEge0BsaW5rIElMYXVuY2hNYW5hZ2VyfSBsYXVuY2ggbW9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhdW5jaE1vZGUoU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgd2hpY2ggY2xpZW50cyBjYW4gYWN0IG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBhY3Rpb24gYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyBwcmVzZW50YXRpb24KLQkgKiAgICBwb3J0aW9uIG9mIHRoZSBwbHVnaW4gYWN0aW9uCi0JICogQHBhcmFtIHNlbCBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgZGVza3RvcAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsKSB7Ci0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICI+IHNlbGVjdGlvbkNoYW5nZWQiKTsKLQkJfQotCQlzZWxlY3Rpb24gPSBudWxsOwotCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJaWYgKHNlbCA9PSBudWxsIHx8IHNlbC5pc0VtcHR5KCkgfHwgIShzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWdsb2JhbFNlbGVjdGlvbiA9IG51bGw7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlbGVjdC5pdGVyYXRvcigpOwotCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKQotCQkJc2VsZWN0aW9uID0gaXRlcmF0b3IubmV4dCgpOwotCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7IC8vIG1vcmUgdGhhbiBvbmUgc2VsZWN0aW9uIChzaG91bGQgbmV2ZXIgaGFwcGVuKQotCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJc2VsZWN0aW9uID0gbnVsbDsKLQkJCWdsb2JhbFNlbGVjdGlvbiA9IG51bGw7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChzZWxlY3Rpb24gIT0gZ2xvYmFsU2VsZWN0aW9uKSB7Ci0JCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIlNlbGVjdGlvbjogIiArIHNlbGVjdGlvbik7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0JCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiU2VsZWN0aW9uIHR5cGU6ICIgKyBzZWxlY3Rpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCWdsb2JhbFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJCWdsb2JhbExhdW5jaE1vZGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+KCk7Ci0JCQlpZiAoIVNlcnZlclBsdWdpbi5oYXNNb2R1bGVBcnRpZmFjdChnbG9iYWxTZWxlY3Rpb24pKSB7Ci0JCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJjaGVja2luZyBmb3IgbW9kdWxlIGFydGlmYWN0Iik7Ci0JCQl9Ci0JCQkvLyBUT0RPIC0gbXVsdGlwbGUgbW9kdWxlIGFydGlmYWN0cwotCQkJSU1vZHVsZUFydGlmYWN0W10gbW9kdWxlQXJ0aWZhY3RzID0gU2VydmVyUGx1Z2luLmdldE1vZHVsZUFydGlmYWN0cyhnbG9iYWxTZWxlY3Rpb24pOwotCQkJSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0ID0gbnVsbDsKLQkJCWlmIChtb2R1bGVBcnRpZmFjdHMgIT0gbnVsbCAmJiBtb2R1bGVBcnRpZmFjdHMubGVuZ3RoID4gMCkKLQkJCQltb2R1bGVBcnRpZmFjdCA9IG1vZHVsZUFydGlmYWN0c1swXTsKLQkJCQotCQkJSU1vZHVsZSBtb2R1bGUgPSBudWxsOwotCQkJaWYgKG1vZHVsZUFydGlmYWN0ICE9IG51bGwpCi0JCQkJbW9kdWxlID0gbW9kdWxlQXJ0aWZhY3QuZ2V0TW9kdWxlKCk7Ci0JCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIm1vZHVsZUFydGlmYWN0PSAiICsgbW9kdWxlQXJ0aWZhY3QgKyAiLCBtb2R1bGU9ICIgKyBtb2R1bGUpOwotCQkJfQotCQkJaWYgKG1vZHVsZSAhPSBudWxsKQotCQkJCWZpbmRHbG9iYWxMYXVuY2hNb2Rlcyhtb2R1bGUpOwotCQkJZWxzZSB7Ci0JCQkJZ2xvYmFsTGF1bmNoTW9kZS5wdXQoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG5ldyBCb29sZWFuKHRydWUpKTsKLQkJCQlnbG9iYWxMYXVuY2hNb2RlLnB1dChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJZ2xvYmFsTGF1bmNoTW9kZS5wdXQoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWFjdGlvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCgpKTsKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIjwgc2VsZWN0aW9uQ2hhbmdlZCAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZXJlIGlzIGEgc2VydmVyIGZhY3RvcnkgYXZhaWxhYmxlIGZvciB0aGUgZ2l2ZW4gbW9kdWxlCi0JICogYW5kIHRoZSB2YXJpb3VzIHN0YXJ0IG1vZGVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbmRHbG9iYWxMYXVuY2hNb2RlcyhJTW9kdWxlIG1vZHVsZSkgewotCQlJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOwotCQlpZiAoc2VydmVyVHlwZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXJUeXBlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlTZXJ2ZXJUeXBlIHR5cGUgPSBzZXJ2ZXJUeXBlc1tpXTsKLQkJCQlpZiAoaXNWYWxpZFNlcnZlclR5cGUodHlwZSwgbW9kdWxlKSkgewotCQkJCQlmb3IgKGJ5dGUgYiA9IDA7IGIgPCBsYXVuY2hNb2Rlcy5sZW5ndGg7IGIrKykgewotCQkJCQkJaWYgKHR5cGUuc3VwcG9ydHNMYXVuY2hNb2RlKGxhdW5jaE1vZGVzW2JdKSkgewotCQkJCQkJCWdsb2JhbExhdW5jaE1vZGUucHV0KGxhdW5jaE1vZGVzW2JdLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNlcnZlciB0eXBlIGNhbiBsYXVuY2ggdGhlIG1vZHVsZS4gCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFNlcnZlclR5cGUoSVNlcnZlclR5cGUgdHlwZSwgSU1vZHVsZSBtb2R1bGUpIHsKLQkJdHJ5IHsKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHR5cGUuZ2V0UnVudGltZVR5cGUoKTsKLQkJCVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUocnVudGltZVR5cGUuZ2V0TW9kdWxlVHlwZXMoKSwgbW9kdWxlLmdldE1vZHVsZVR5cGUoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldE1hcChIYXNoTWFwPFN0cmluZyxPYmplY3Q+IG1hcCl7Ci0JCXRoaXMud2l6X3Byb3BlcnRpZXMgPSBtYXA7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIGZyb20gdGhlIGhhc2htYXAgcHJvdmlkZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoaXMgY2xhc3MKLQkgKiAgCi0JICogQHBhcmFtIGtleSAgCi0JICogQHBhcmFtIG9iaiB0aGUgdHlwZSBvZiBvYmplY3QgdG8gYmUgcmV0dXJuZWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRPdmVyd3JpdGVWYWx1ZShTdHJpbmcga2V5KXsKLQkJaWYgKHdpel9wcm9wZXJ0aWVzICE9IG51bGwpeyAKLQkJCU9iamVjdCBvID0gd2l6X3Byb3BlcnRpZXMuZ2V0KGtleSk7Ci0JCQlyZXR1cm4gbzsJCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZmODIyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL1J1bk9uU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JQnJlYWtwb2ludE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLkxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JTGF1bmNoYWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkVjbGlwc2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTGF1bmNoQ2xpZW50Sm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotCi1wdWJsaWMgY2xhc3MgUnVuT25TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgZXh0ZW5kcyBMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU0VSVkVSX0lEID0gInNlcnZlci1pZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NT0RVTEVfQVJUSUZBQ1QgPSAibW9kdWxlLWFydGlmYWN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01PRFVMRV9BUlRJRkFDVF9DTEFTUyA9ICJtb2R1bGUtYXJ0aWZhY3QtY2xhc3MiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9MQVVOQ0hBQkxFX0FEQVBURVJfSUQgPSAibGF1bmNoYWJsZS1hZGFwdGVyLWlkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NMSUVOVF9JRCA9ICJjbGllbnQtaWQiOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2F2ZUJlZm9yZUxhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGlnbm9yZQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsYXVuY2goSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIGxhdW5jaE1vZGUsIGZpbmFsIElMYXVuY2ggbGF1bmNoMiwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJU3RyaW5nIHNlcnZlcklkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9TRVJWRVJfSUQsIChTdHJpbmcpbnVsbCk7Ci0JCVN0cmluZyBtb2R1bGVBcnQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX01PRFVMRV9BUlRJRkFDVCwgKFN0cmluZyludWxsKTsKLQkJU3RyaW5nIG1vZHVsZUFydGlmYWN0Q2xhc3MgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX01PRFVMRV9BUlRJRkFDVF9DTEFTUywgKFN0cmluZyludWxsKTsKLQkJU3RyaW5nIGxhSWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX0xBVU5DSEFCTEVfQURBUFRFUl9JRCwgKFN0cmluZyludWxsKTsKLQkJU3RyaW5nIGNsaWVudElkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9DTElFTlRfSUQsIChTdHJpbmcpbnVsbCk7Ci0JCQotCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2ZXJJZCk7Ci0JCUlNb2R1bGUgbW9kdWxlID0gbnVsbDsKLQkJTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSBtb2R1bGVBcnRpZmFjdCA9IG51bGw7Ci0JCUlMYXVuY2hhYmxlQWRhcHRlciBsYXVuY2hhYmxlQWRhcHRlciA9IG51bGw7Ci0JCWlmIChsYUlkICE9IG51bGwpCi0JCQlsYXVuY2hhYmxlQWRhcHRlciA9IFNlcnZlclBsdWdpbi5maW5kTGF1bmNoYWJsZUFkYXB0ZXIobGFJZCk7Ci0JCUlDbGllbnQgY2xpZW50ID0gU2VydmVyUGx1Z2luLmZpbmRDbGllbnQoY2xpZW50SWQpOwotCQkKLQkJdHJ5IHsKLQkJCUNsYXNzIGMgPSBDbGFzcy5mb3JOYW1lKG1vZHVsZUFydGlmYWN0Q2xhc3MpOwotCQkJbW9kdWxlQXJ0aWZhY3QgPSAoTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSkgYy5uZXdJbnN0YW5jZSgpOwotCQkJbW9kdWxlQXJ0aWZhY3QuZGVzZXJpYWxpemUobW9kdWxlQXJ0KTsKLQkJCW1vZHVsZSA9IG1vZHVsZUFydGlmYWN0LmdldE1vZHVsZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIG1vZHVsZSBhcnRpZmFjdCBkZWxlZ2F0ZSBjbGFzcyIpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAobW9kdWxlQXJ0aWZhY3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBNZXNzYWdlcy5lcnJvckxhdW5jaENvbmZpZykpOwotCQkKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIE1lc3NhZ2VzLmVycm9yTGF1bmNoQ29uZmlnKSk7Ci0JCQotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgTWVzc2FnZXMuZXJyb3JJbnZhbGlkU2VydmVyKSk7Ci0JCQotCQlpZiAobGF1bmNoYWJsZUFkYXB0ZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBNZXNzYWdlcy5lcnJvckxhdW5jaENvbmZpZykpOwotCQkKLQkJZmluYWwgU2hlbGxbXSBzaGVsbDIgPSBuZXcgU2hlbGxbMV07Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzaGVsbDJbMF0gPSBFY2xpcHNlVXRpbC5nZXRTaGVsbCgpOwotCQkJfQotCQl9KTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBzaGVsbDJbMF07Ci0JCWZpbmFsIElBZGFwdGFibGUgaW5mbyA9IG5ldyBJQWRhcHRhYmxlKCkgewotCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQlpZiAoU2hlbGwuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJCQlyZXR1cm4gc2hlbGw7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCQotCQlpZiAoY2xpZW50ID09IG51bGwpIHsKLQkJCS8vIGlmIHRoZXJlIGlzIG5vIGNsaWVudCwgdXNlIGEgZHVtbXkKLQkJCWNsaWVudCA9IG5ldyBJQ2xpZW50KCkgewotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQkJCXJldHVybiBNZXNzYWdlcy5jbGllbnREZWZhdWx0RGVzY3JpcHRpb247Ci0JCQkJfQotCi0JCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmNsaWVudC5kZWZhdWx0IjsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQkJCXJldHVybiBNZXNzYWdlcy5jbGllbnREZWZhdWx0TmFtZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSVN0YXR1cyBsYXVuY2goSVNlcnZlciBzZXJ2ZXIzLCBPYmplY3QgbGF1bmNoYWJsZTIsIFN0cmluZyBsYXVuY2hNb2RlMywgSUxhdW5jaCBsYXVuY2gpIHsKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSVNlcnZlciBzZXJ2ZXIzLCBPYmplY3QgbGF1bmNoYWJsZTIsIFN0cmluZyBsYXVuY2hNb2RlMykgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiUmVhZHkgdG8gbGF1bmNoIik7Ci0JCX0KLQkJbGF1bmNoMi5hZGRQcm9jZXNzKG5ldyBSdW5PblNlcnZlclByb2Nlc3MobGF1bmNoMikpOwotCQkKLQkJLy8gc3RhcnQgc2VydmVyIGlmIGl0J3Mgbm90IGFscmVhZHkgc3RhcnRlZAotCQkvLyBhbmQgY3VlIHRoZSBjbGllbnQgdG8gc3RhcnQKLQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH07IC8vIFRPRE86IGdldCBwYXJlbnQgaGllcmFyY2h5IGNvcnJlY3QKLQkJaW50IHN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0JCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKSB7Ci0JCQlMYXVuY2hDbGllbnRKb2IgY2xpZW50Sm9iID0gbmV3IExhdW5jaENsaWVudEpvYihzZXJ2ZXIsIG1vZHVsZXMsIGxhdW5jaE1vZGUsIG1vZHVsZUFydGlmYWN0LCBsYXVuY2hhYmxlQWRhcHRlciwgY2xpZW50KTsKLQkJCWNsaWVudEpvYi5zY2hlZHVsZSgpOwotCQl9IGVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewotCQkJYm9vbGVhbiByZXN0YXJ0ID0gZmFsc2U7Ci0JCQlTdHJpbmcgbW9kZSA9IHNlcnZlci5nZXRNb2RlKCk7Ci0JCQlJQnJlYWtwb2ludE1hbmFnZXIgYnJlYWtwb2ludE1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKTsKLQkJCWJvb2xlYW4gZGlzYWJsZWRCcmVha3BvaW50cyA9IGZhbHNlOwotCQkJCi0JCQlpZiAoc2VydmVyLmdldFNlcnZlclJlc3RhcnRTdGF0ZSgpKSB7IC8vIFRPRE8gLSByZXN0YXJ0IHN0YXRlIG1pZ2h0IG5vdCBiZSBzZXQgdW50aWwgYWZ0ZXIgcHVibGlzaAotCQkJCWludCByZXN1bHQgPSBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlLm9wZW5SZXN0YXJ0RGlhbG9nKHNoZWxsKTsKLQkJCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCQkJbGF1bmNoTW9kZSA9IG1vZGU7Ci0JCQkJCXJlc3RhcnQgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAocmVzdWx0ID09IDkpIHsgLy8gY2FuY2VsCi0JCQkJCWxhdW5jaDIudGVybWluYXRlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXJlc3RhcnQpIHsKLQkJCQlpZiAoIUlMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLmVxdWFscyhtb2RlKSAmJiBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERS5lcXVhbHMobGF1bmNoTW9kZSkpIHsKLQkJCQkJYm9vbGVhbiBicmVha3BvaW50c09wdGlvbiA9IGZhbHNlOwotCQkJCQlpZiAoYnJlYWtwb2ludE1hbmFnZXIuaXNFbmFibGVkKCkgJiYgSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJCQlicmVha3BvaW50c09wdGlvbiA9IHRydWU7Ci0JCQkJCWludCByZXN1bHQgPSBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlLm9wZW5PcHRpb25zRGlhbG9nKHNoZWxsLCBNZXNzYWdlcy53aXpSdW5PblNlcnZlclRpdGxlLCBNZXNzYWdlcy5kaWFsb2dNb2RlV2FybmluZ1J1biwgYnJlYWtwb2ludHNPcHRpb24pOwotCQkJCQlpZiAocmVzdWx0ID09IDApCi0JCQkJCQlyZXN0YXJ0ID0gdHJ1ZTsKLQkJCQkJZWxzZSBpZiAocmVzdWx0ID09IDEpIHsKLQkJCQkJCWJyZWFrcG9pbnRNYW5hZ2VyLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJZGlzYWJsZWRCcmVha3BvaW50cyA9IHRydWU7Ci0JCQkJCQlsYXVuY2hNb2RlID0gbW9kZTsKLQkJCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gMikKLQkJCQkJCWxhdW5jaE1vZGUgPSBtb2RlOwotCQkJCQllbHNlIHsgLy8gcmVzdWx0ID09IDkgLy8gY2FuY2VsCi0JCQkJCQlsYXVuY2gyLnRlcm1pbmF0ZSgpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICghSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkgJiYgSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobGF1bmNoTW9kZSkpIHsKLQkJCQkJaW50IHJlc3VsdCA9IFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUub3Blbk9wdGlvbnNEaWFsb2coc2hlbGwsIE1lc3NhZ2VzLndpekRlYnVnT25TZXJ2ZXJUaXRsZSwgTWVzc2FnZXMuZGlhbG9nTW9kZVdhcm5pbmdEZWJ1ZywgZmFsc2UpOwotCQkJCQlpZiAocmVzdWx0ID09IDApCi0JCQkJCQlyZXN0YXJ0ID0gdHJ1ZTsKLQkJCQkJZWxzZSBpZiAocmVzdWx0ID09IDEpCi0JCQkJCQlsYXVuY2hNb2RlID0gbW9kZTsKLQkJCQkJZWxzZSB7IC8vIHJlc3VsdCA9PSA5IC8vIGNhbmNlbAotCQkJCQkJbGF1bmNoMi50ZXJtaW5hdGUoKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoIUlMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobW9kZSkgJiYgSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkgewotCQkJCQlib29sZWFuIGJyZWFrcG9pbnRzT3B0aW9uID0gZmFsc2U7Ci0JCQkJCWlmIChicmVha3BvaW50TWFuYWdlci5pc0VuYWJsZWQoKSAmJiBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKLQkJCQkJCWJyZWFrcG9pbnRzT3B0aW9uID0gdHJ1ZTsKLQkJCQkJaW50IHJlc3VsdCA9IFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUub3Blbk9wdGlvbnNEaWFsb2coc2hlbGwsIE1lc3NhZ2VzLndpelByb2ZpbGVPblNlcnZlclRpdGxlLCBNZXNzYWdlcy5kaWFsb2dNb2RlV2FybmluZ1Byb2ZpbGUsIGJyZWFrcG9pbnRzT3B0aW9uKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSAwKQotCQkJCQkJcmVzdGFydCA9IHRydWU7Ci0JCQkJCWVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7Ci0JCQkJCQlicmVha3BvaW50TWFuYWdlci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCWRpc2FibGVkQnJlYWtwb2ludHMgPSB0cnVlOwotCQkJCQkJbGF1bmNoTW9kZSA9IG1vZGU7Ci0JCQkJCX0gZWxzZSBpZiAocmVzdWx0ID09IDIpCi0JCQkJCQlsYXVuY2hNb2RlID0gbW9kZTsKLQkJCQkJZWxzZSB7Ly8gcmVzdWx0ID09IDkgLy8gY2FuY2VsCi0JCQkJCQlsYXVuY2gyLnRlcm1pbmF0ZSgpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkgewotCQkJCQlpZiAoIWJyZWFrcG9pbnRNYW5hZ2VyLmlzRW5hYmxlZCgpICYmICFkaXNhYmxlZEJyZWFrcG9pbnRzKSB7Ci0JCQkJCQlpbnQgcmVzdWx0ID0gUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZS5vcGVuQnJlYWtwb2ludERpYWxvZyhzaGVsbCk7Ci0JCQkJCQlpZiAocmVzdWx0ID09IDApCi0JCQkJCQkJYnJlYWtwb2ludE1hbmFnZXIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCWVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7Ci0JCQkJCQkJLy8gaWdub3JlCi0JCQkJCQl9IGVsc2UgeyAvLyByZXN1bHQgPT0gMgotCQkJCQkJCWxhdW5jaDIudGVybWluYXRlKCk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlmaW5hbCBMYXVuY2hDbGllbnRKb2IgY2xpZW50Sm9iID0gbmV3IExhdW5jaENsaWVudEpvYihzZXJ2ZXIsIG1vZHVsZXMsIGxhdW5jaE1vZGUsIG1vZHVsZUFydGlmYWN0LCBsYXVuY2hhYmxlQWRhcHRlciwgY2xpZW50KTsKLQkJCWlmIChyZXN0YXJ0KSB7Ci0JCQkJZmluYWwgU3RyaW5nIGxhdW5jaE1vZGUyID0gbGF1bmNoTW9kZTsKLQkJCQlmaW5hbCBJU2VydmVyIHNlcnZlcjIgPSBzZXJ2ZXI7Ci0JCQkJLy8gSWYgdGhlIHNlcnZlciByZXF1aXJlcyBwdWJsaXNoIGJlZm9yZSBzdGFydGluZyBhbmQgYmVmb3JlIGxhdW5jaGluZyB0aGUgY2xpZW50LCBwdWJsaXNoCi0JCQkJLy8gYmVmb3JlIHRoZSByZXN0YXJ0IChzZWUgYnVnIyAyODgwMDgpCi0JCQkJZmluYWwgYm9vbGVhbiBzdGFydEJlZm9yZVB1Ymxpc2ggPSAoKFNlcnZlclR5cGUpc2VydmVyMi5nZXRTZXJ2ZXJUeXBlKCkpLnN0YXJ0QmVmb3JlUHVibGlzaCgpOwotCQkJCWlmIChzZXJ2ZXIyLnNob3VsZFB1Ymxpc2goKSAmJiAhc3RhcnRCZWZvcmVQdWJsaXNoICkgewotCQkJCQlzZXJ2ZXIyLnB1Ymxpc2goSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCBudWxsLCBpbmZvLG51bGwpOwotCQkJCX0KLQotCQkJCXNlcnZlcjIucmVzdGFydChsYXVuY2hNb2RlMiwgbmV3IElTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBkb25lKElTdGF0dXMgcmVzdWx0MikgewotCQkJCQkJaWYgKHJlc3VsdDIuaXNPSygpKSB7Ci0JCQkJCQkJLy8gSWYgdGhlIHNlcnZlciByZXF1aXJlcyBwdWJsaXNoIGJ1dCB0aGUgc2VydmVyRGVmaW5pdGlvbiBzYXlzIHRvIHB1Ymxpc2ggYWZ0ZXIgc3RhcnQsCi0JCQkJCQkJLy8gcHVibGlzaCBhZnRlciB0aGUgcmVzdGFydAotCQkJCQkJCWlmIChzZXJ2ZXIyLnNob3VsZFB1Ymxpc2goKSAmJiBzdGFydEJlZm9yZVB1Ymxpc2gpIHsKLQkJCQkJCQkJc2VydmVyMi5wdWJsaXNoKElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgbnVsbCwgaW5mbywgbmV3IElTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyKCkgewotCQkJCQkJCQkJcHVibGljIHZvaWQgZG9uZShJU3RhdHVzIHJlc3VsdDMpIHsKLQkJCQkJCQkJCQlpZiAocmVzdWx0My5pc09LKCkpIHsKLQkJCQkJCQkJCQkJY2xpZW50Sm9iLnNjaGVkdWxlKCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCQl9IGVsc2UKLQkJCQkJCQkJY2xpZW50Sm9iLnNjaGVkdWxlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gT25seSBwdWJsaXNoIGlmIHRoZSBzZXJ2ZXIgcmVxdWlyZXMgcHVibGlzaCBiZWZvcmUgbGF1bmNoaW5nIHRoZSBjbGllbnQuCi0JCQkJaWYgKHNlcnZlci5zaG91bGRQdWJsaXNoKCkpIHsKLQkJCQkJc2VydmVyLnB1Ymxpc2goSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCBudWxsLCBpbmZvLCBuZXcgSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBkb25lKElTdGF0dXMgcmVzdWx0KSB7Ci0JCQkJCQkJaWYgKHJlc3VsdC5pc09LKCkpCi0JCQkJCQkJCWNsaWVudEpvYi5zY2hlZHVsZSgpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9IGVsc2UgewotCQkJCQljbGllbnRKb2Iuc2NoZWR1bGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc3RhdGUgIT0gSVNlcnZlci5TVEFURV9TVE9QUElORykgewotCQkJZmluYWwgTGF1bmNoQ2xpZW50Sm9iIGNsaWVudEpvYiA9IG5ldyBMYXVuY2hDbGllbnRKb2Ioc2VydmVyLCBtb2R1bGVzLCBsYXVuY2hNb2RlLCBtb2R1bGVBcnRpZmFjdCwgbGF1bmNoYWJsZUFkYXB0ZXIsIGNsaWVudCk7Ci0JCQkKLQkJCXNlcnZlci5zdGFydChsYXVuY2hNb2RlLCBuZXcgSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZG9uZShJU3RhdHVzIHJlc3VsdCkgewotCQkJCQlpZiAocmVzdWx0LmlzT0soKSkKLQkJCQkJCWNsaWVudEpvYi5zY2hlZHVsZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWxhdW5jaDIudGVybWluYXRlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJQcm9jZXNzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL1J1bk9uU2VydmVyUHJvY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzc2Y2UxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJQcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RyZWFtc1Byb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIER1bW15IElQcm9jZXNzIHNvIHRoYXQgYSBSdW4gb24gU2VydmVyIGxhdW5jaCBjYW4gYmUgdGVybWluYXRlZC4KLSAqLwotcHVibGljIGNsYXNzIFJ1bk9uU2VydmVyUHJvY2VzcyBpbXBsZW1lbnRzIElQcm9jZXNzIHsKLQlwcm90ZWN0ZWQgSUxhdW5jaCBsYXVuY2g7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUZXJtaW5hdGVkOwotCi0JcHVibGljIFJ1bk9uU2VydmVyUHJvY2VzcyhJTGF1bmNoIGxhdW5jaCkgewotCQl0aGlzLmxhdW5jaCA9IGxhdW5jaDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgYXJnMCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEV4aXRWYWx1ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5wcm9jZXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgSUxhdW5jaCBnZXRMYXVuY2goKSB7Ci0JCXJldHVybiBsYXVuY2g7Ci0JfQotCi0JcHVibGljIElTdHJlYW1zUHJveHkgZ2V0U3RyZWFtc1Byb3h5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB7Ci0JCS8vIGlnbm9yZQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhcmcwKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblRlcm1pbmF0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNUZXJtaW5hdGVkKCkgewotCQlyZXR1cm4gaXNUZXJtaW5hdGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlzVGVybWluYXRlZCA9IHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGY3NzE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW87Ci0KLS8qKgotICogQXVkaW8gaXMgdGhlIG1haW4gaW50ZXJmYWNlIHRvIHRoZSBhdWRpbyBwbHVnaW4uPHA+Ci0gKgotICogQWRkaW5nIGEgbmV3IHNvdW5kIHRvIHlvdXIgcGx1Z2luIGlzIGFzIGVhc3kgYXMgQUJDOgotICogPHVsPgotICogPGxpPkE6IEFkZCB0aGUgZm9sbG93aW5nIHJlcXVpcmVzIHRvIHlvdXIgcGx1Z2luLnhtbDo8YnI+Ci0gKiAgIDxwcmU+Jmx0O2ltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudXRpbCImZ3Q7PC9wcmU+PC9saT4KLSAqCi0gKiA8bGk+QjogRGVmaW5lIGEgbmV3IHNvdW5kIGV4dGVuc2lvbiBwb2ludCBpbiB5b3VyIHBsdWdpbi54bWw6PGJyPgotICogICA8cHJlPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudXRpbC5zb3VuZCImZ3Q7Ci0gKiAgICAgJmx0O2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5teVBsdWdpbiIKLSAqICAgICAgIG5hbWU9Ik15IFBsdWdpbiBOYW1lIi8mZ3Q7Ci0gKiAgICAgJmx0O3NvdW5kIGlkPSJvcmcuZWNsaXBzZS5teVBsdWdpbi5teVNvdW5kIgotICogICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLm15UGx1Z2luIgotICogICAgICAgbmFtZT0iU29tZXRoaW5nIEhhcHBlbmVkIgotICogICAgICAgbG9jYXRpb249InNvdW5kcy9teVNvdW5kLndhdiIvJmd0OwotICogICAgICZsdDtzb3VuZCBpZD0ib3JnLmVjbGlwc2UubXlQbHVnaW4ubXlPdGhlclNvdW5kcyIKLSAqICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5teVBsdWdpbiIKLSAqICAgICAgIG5hbWU9IkFub3RoZXIgRXZlbnQgSGFwcGVuZWQiLyZndDsKLSAqICAgJmx0Oy9leHRlbnNpb24mZ3Q7PC9wcmU+PGJyPgotICogICAodGhlIGxvY2F0aW9uIGlzIG9wdGlvbmFsLiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgc291bmQKLSAqICAgIHdpbGwgbm90IHBsYXkgdW50aWwgdGhlIHVzZXIgc3BlY2lmaWVzIGFuIGF1ZGlvIGZpbGUpPC9saT4KLSAqCi0gKiA8bGk+QzogQ2FsbCB0aGUgc291bmRzIHdoZW4gdGhlIGFwcHJvcHJpYXRlIGV2ZW50cyBvY2N1ciB3aXRoaW4KLSAqICAgeW91ciBwbHVnaW46PGJyPgotICogICA8cHJlPm9yZy5lY2xpcHNlLndzdC5hdWRpby5BdWRpby5wbGF5U291bmQoIm9yZy5lY2xpcHNlLm15UGx1Z2luLm15U291bmQiKTs8L3ByZT48L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIEF1ZGlvIHsKLQkvKioKLQkgKiBBdWRpb0NvcmUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIEF1ZGlvKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFBsYXlzIHRoZSBzb3VuZCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKgotCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBsYXlTb3VuZChTdHJpbmcgaWQpIHsKLQkJQXVkaW9Db3JlLmdldEluc3RhbmNlKCkucGxheVNvdW5kKGlkKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vQXVkaW9Db3JlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpb0NvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJkMTM3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpb0NvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hdWRpbzsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YXguc291bmQuc2FtcGxlZC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLS8qKgotICogTWFpbiBhdWRpbyBwbHVnaW4gY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBBdWRpb0NvcmUgewotCXByb3RlY3RlZCBzdGF0aWMgQXVkaW9Db3JlIGluc3RhbmNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TT1VORF9FTkFCTEVEID0gInNvdW5kRW5hYmxlZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9WT0xVTUUgPSAidm9sdW1lIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVU5EU19GSUxFID0gInNvdW5kcy54bWwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0ZJTEUgPSAiZGlzYWJsZWQtc291bmRzLnhtbCI7Ci0KLQkvLyBDYXRlZ29yaWVzIC0gbWFwIG9mIFN0cmluZyBpZCB0byBTdHJpbmcgbmFtZXMKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gY2F0ZWdvcmllczsKLQotCS8vIFNvdW5kcyAtIG1hcCBvZiBTdHJpbmcgaWQgdG8gU291bmQKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFNvdW5kPiBzb3VuZHM7Ci0KLQkvLyBzcGVjaWZpYyBzb3VuZHMgb3IgY2F0ZWdvcmllcyB0aGF0IGhhdmUgYmVlbiBkaXNhYmxlZCwgYnkgaWQKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBkaXNhYmxlZFNvdW5kczsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBkaXNhYmxlZENhdGVnb3JpZXM7Ci0KLQkvLyBTb3VuZE1hcCAtIG1hcCBvZiBTdHJpbmcgaWQgdG8gYW4gSVBhdGgKLQlwcml2YXRlIE1hcDxTdHJpbmcsIElQYXRoPiB1c2VyU291bmRNYXA7Ci0KLQkvKioKLQkgKiBBdWRpb0NvcmUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIEF1ZGlvQ29yZSgpIHsKLQkJc3VwZXIoKTsKLQkKLQkJbG9hZEV4dGVuc2lvblBvaW50cygpOwotCQotCQlsb2FkU291bmRNYXAoKTsKLQkJbG9hZERpc2FibGVkTGlzdHMoKTsKLQkJCi0JCQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2F0ZWdvcmllcwotCSAqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTWFwCi0JICovCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0Q2F0ZWdvcmllcygpIHsKLQkJcmV0dXJuIGNhdGVnb3JpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXVkaW8gY2xpcC4KLQkgKgotCSAqIEBwYXJhbSB1cmwgamF2YS5uZXQuVVJMCi0JICogQHJldHVybiBqYXZheC5zb3VuZC5zYW1wbGVkLkNsaXAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENsaXAgZ2V0Q2xpcChVUkwgdXJsKSB7Ci0JCXRyeSB7Ci0JCQlBdWRpb0lucHV0U3RyZWFtIGF1ZGlvSW5wdXRTdHJlYW0gPSBBdWRpb1N5c3RlbS5nZXRBdWRpb0lucHV0U3RyZWFtKHVybCk7Ci0JCi0JCQlBdWRpb0Zvcm1hdCBmb3JtYXQgPSBhdWRpb0lucHV0U3RyZWFtLmdldEZvcm1hdCgpOwotCQotCQkJLyoqCi0JCQkgKiB3ZSBjYW4ndCB5ZXQgb3BlbiB0aGUgZGV2aWNlIGZvciBBTEFXL1VMQVcgcGxheWJhY2ssCi0JCQkgKiBjb252ZXJ0IEFMQVcvVUxBVyB0byBQQ00KLQkJCSAqLwotCQkJaWYgKChmb3JtYXQuZ2V0RW5jb2RpbmcoKSA9PSBBdWRpb0Zvcm1hdC5FbmNvZGluZy5VTEFXKSB8fAotCQkJCShmb3JtYXQuZ2V0RW5jb2RpbmcoKSA9PSBBdWRpb0Zvcm1hdC5FbmNvZGluZy5BTEFXKSkgewotCQkJCUF1ZGlvRm9ybWF0IHRtcCA9IG5ldyBBdWRpb0Zvcm1hdCgKLQkJCQkJQXVkaW9Gb3JtYXQuRW5jb2RpbmcuUENNX1NJR05FRCwgCi0JCQkJCWZvcm1hdC5nZXRTYW1wbGVSYXRlKCksCi0JCQkJCWZvcm1hdC5nZXRTYW1wbGVTaXplSW5CaXRzKCkgKiAyLAotCQkJCQlmb3JtYXQuZ2V0Q2hhbm5lbHMoKSwKLQkJCQkJZm9ybWF0LmdldEZyYW1lU2l6ZSgpICogMiwKLQkJCQkJZm9ybWF0LmdldEZyYW1lUmF0ZSgpLCB0cnVlKTsKLQkJCQlhdWRpb0lucHV0U3RyZWFtID0gQXVkaW9TeXN0ZW0uZ2V0QXVkaW9JbnB1dFN0cmVhbSh0bXAsIGF1ZGlvSW5wdXRTdHJlYW0pOwotCQkJCWZvcm1hdCA9IHRtcDsKLQkJCX0KLQkJCURhdGFMaW5lLkluZm8gaW5mbyA9IG5ldyBEYXRhTGluZS5JbmZvKAotCQkJCUNsaXAuY2xhc3MsIGF1ZGlvSW5wdXRTdHJlYW0uZ2V0Rm9ybWF0KCksIAotCQkJCSgoaW50KSBhdWRpb0lucHV0U3RyZWFtLmdldEZyYW1lTGVuZ3RoKCkgKgotCQkJCWZvcm1hdC5nZXRGcmFtZVNpemUoKSkpOwotCQkKLQkJCUNsaXAgY2xpcCA9IChDbGlwKSBBdWRpb1N5c3RlbS5nZXRMaW5lKGluZm8pOwotCQkJY2xpcC5vcGVuKGF1ZGlvSW5wdXRTdHJlYW0pOwotCQkJcmV0dXJuIGNsaXA7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkNvdWxkIG5vdCBnZXQgY2xpcDogIiArIHVybCwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBhdWRpbyBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIG9uIHRoaXMgc3lzdGVtLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzQXVkaW9TdXBwb3J0ZWQoKSB7Ci0JCXRyeSB7Ci0JCQlib29sZWFuIHNvdW5kID0gZmFsc2U7Ci0JCQlNaXhlci5JbmZvW10gaW5mbzIgPSBBdWRpb1N5c3RlbS5nZXRNaXhlckluZm8oKTsKLQkJCWlmIChpbmZvMiAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSBpbmZvMi5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJLy9UcmFjZS50cmFjZSgiICIgKyBpbmZvMltpXSk7Ci0JCQkJCU1peGVyIG1peGVyID0gQXVkaW9TeXN0ZW0uZ2V0TWl4ZXIoaW5mbzJbaV0pOwotCQkJCQlpZiAobWl4ZXIgIT0gbnVsbCkgewotCQkJCQkJLy9UcmFjZS50cmFjZSgiICAgTWl4ZXI6IiArIG1peGVyKTsKLQkJCQkJCS8vVHJhY2UudHJhY2UoIiAgICIgKyBtaXhlci5nZXRMaW5lSW5mbygpKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJTGluZS5JbmZvIGluZm8gPSBtaXhlci5nZXRMaW5lSW5mbygpOwotCQkJCQkJCUxpbmUgbGluZSA9IG1peGVyLmdldExpbmUoaW5mbyk7Ci0JCQkJCQkJLy9UcmFjZS50cmFjZSgiICAgTGluZToiICsgbGluZSk7Ci0JCQkJCQkJaWYgKGxpbmUgIT0gbnVsbCAmJiBsaW5lLnRvU3RyaW5nKCkuaW5kZXhPZigiT3V0cHV0IikgPj0gMCkKLQkJCQkJCQkJc291bmQgPSB0cnVlOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzb3VuZDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IHZlcmlmeSBhdWRpbyBzdGF0dXMiLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHNvdW5kIGlzIGVuYWJsZWQuCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0U291bmRzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRCb29sZWFuKFBSRUZfU09VTkRfRU5BQkxFRCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB2b2x1bWUuCi0JICoKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFZvbHVtZSgpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRJbnQoUFJFRl9WT0xVTUUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuYXVkaW8uaW50ZXJuYWwuQXVkaW9Db3JlCi0JICovCi0JcHVibGljIHN0YXRpYyBBdWRpb0NvcmUgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgQXVkaW9Db3JlKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc291bmQgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICoKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuYXVkaW8uU291bmQKLQkgKi8KLQlwcm90ZWN0ZWQgU291bmQgZ2V0U291bmQoU3RyaW5nIGlkKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc291bmRzLmdldChpZCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc291bmRzLgotCSAqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTWFwCi0JICovCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFNvdW5kPiBnZXRTb3VuZHMoKSB7Ci0JCXJldHVybiBzb3VuZHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbCB1c2VyIHNvdW5kIG1hcC4KLQkgKgotCSAqIEByZXR1cm4gamF2YS51dGlsLk1hcAotCSAqLwotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBJUGF0aD4gZ2V0VXNlclNvdW5kTWFwKCkgewotCQlpZiAodXNlclNvdW5kTWFwID09IG51bGwpCi0JCQlsb2FkU291bmRNYXAoKTsKLQkJcmV0dXJuIHVzZXJTb3VuZE1hcDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgVVJMIGZvciB0aGlzIHNvdW5kLgotCSAqCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIGphdmEubmV0LlVSTAotCSAqLwotCXByb3RlY3RlZCBJUGF0aCBnZXRVc2VyU291bmRQYXRoKFN0cmluZyBpZCkgewotCQl0cnkgewotCQkJaWYgKHVzZXJTb3VuZE1hcCA9PSBudWxsKQotCQkJCWxvYWRTb3VuZE1hcCgpOwotCQotCQkJSVBhdGggcGF0aCA9IHVzZXJTb3VuZE1hcC5nZXQoaWQpOwotCQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCQlyZXR1cm4gcGF0aDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IGdldCBzb3VuZCBVUkw6ICIgKyBpZCwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJlZmVycmVkIHZvbHVtZS4KLQkgKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRWb2x1bWUoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRJbnQoUFJFRl9WT0xVTUUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZXMuCi0JICoKLQkgKiBAcGFyYW0gc3RvcmUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlzdG9yZS5zZXREZWZhdWx0KFBSRUZfVk9MVU1FLCAxOCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjYXRlZ29yeSBpcyBlbmFibGVkLgotCSAqCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NhdGVnb3J5RW5hYmxlZChTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCi0JCWlmIChkaXNhYmxlZENhdGVnb3JpZXMgPT0gbnVsbCkKLQkJCWxvYWREaXNhYmxlZExpc3RzKCk7Ci0JCi0JCXJldHVybiAoIWRpc2FibGVkQ2F0ZWdvcmllcy5jb250YWlucyhpZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBzb3VuZCBpcyBlbmFibGVkLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTb3VuZEVuYWJsZWQoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKFBSRUZfU09VTkRfRU5BQkxFRCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzb3VuZCBpcyBlbmFibGVkLgotCSAqCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NvdW5kRW5hYmxlZChTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCi0JCWlmIChkaXNhYmxlZFNvdW5kcyA9PSBudWxsKQotCQkJbG9hZERpc2FibGVkTGlzdHMoKTsKLQkKLQkJcmV0dXJuICghZGlzYWJsZWRTb3VuZHMuY29udGFpbnMoaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZGlzYWJsZWQgc291bmQgbGlzdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERpc2FibGVkTGlzdHMoKSB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChESVNBQkxFRF9GSUxFKS50b09TU3RyaW5nKCk7Ci0JCi0JCUZpbGVJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCWRpc2FibGVkQ2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlkaXNhYmxlZFNvdW5kcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0cnkgewotCQkJaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVuYW1lKTsKLQkJCUlNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGluKTsKLQkKLQkJCUlNZW1lbnRvIGNhdCA9IG1lbWVudG8uZ2V0Q2hpbGQoImNhdGVnb3JpZXMiKTsKLQkJCUlNZW1lbnRvW10gY2hpbGRyZW4gPSBjYXQuZ2V0Q2hpbGRyZW4oImNhdGVnb3J5Iik7Ci0JCi0JCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSU1lbWVudG8gY2hpbGQgPSBjaGlsZHJlbltpXTsKLQkJCQkJU3RyaW5nIGlkID0gY2hpbGQuZ2V0U3RyaW5nKCJpZCIpOwotCQotCQkJCQlkaXNhYmxlZENhdGVnb3JpZXMuYWRkKGlkKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIHJlYWRpbmcgVVJMIG1hcCAiLCBleCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCi0JCQlJTWVtZW50byBzb3VuZCA9IG1lbWVudG8uZ2V0Q2hpbGQoInNvdW5kcyIpOwotCQkJY2hpbGRyZW4gPSBzb3VuZC5nZXRDaGlsZHJlbigic291bmQiKTsKLQkKLQkJCXNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCUlNZW1lbnRvIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQkJCVN0cmluZyBpZCA9IGNoaWxkLmdldFN0cmluZygiaWQiKTsKLQkKLQkJCQkJZGlzYWJsZWRTb3VuZHMuYWRkKGlkKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIHJlYWRpbmcgVVJMIG1hcCAiLCBleCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0F1ZGlvUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQXVkaW9QbHVnaW4uUExVR0lOX0lELCAwLCAiQ291bGQgbm90IGxvYWQgZGlzYWJsZWQgc291bmQgaW5mb3JtYXRpb24iLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRFeHRlbnNpb25Qb2ludHMoKSB7Ci0JCS8vIGxvYWQgZXh0ZW5zaW9uIHBvaW50cwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsICJhdWRpbyIpOwotCQotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJY2F0ZWdvcmllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQlzb3VuZHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNvdW5kPigpOwotCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBjZltpXS5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIGlkID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpOwotCQkJCVN0cmluZyBuYW1lID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JCQkJaWYgKCJjYXRlZ29yeSIuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotCQkJCQljYXRlZ29yaWVzLnB1dChpZCwgbmFtZSk7Ci0JCQkJfSBlbHNlIGlmICgic291bmQiLmVxdWFscyhlbGVtZW50TmFtZSkpIHsKLQkJCQkJU3RyaW5nIGNhdGVnb3J5ID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJjYXRlZ29yeSIpOwotCQkJCQlTdHJpbmcgbG9jYXRpb24gPSBjZltpXS5nZXRBdHRyaWJ1dGUoImxvY2F0aW9uIik7Ci0JCi0JCQkJCVVSTCByZWFsVVJMID0gbnVsbDsKLQkJCQkJaWYgKGxvY2F0aW9uICE9IG51bGwgJiYgbG9jYXRpb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBjZltpXS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQkJCQkJCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5maW5kKFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCksIG5ldyBQYXRoKGxvY2F0aW9uKSwgbnVsbCk7Ci0JCQkJCQlyZWFsVVJMID0gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpOwotCQkJCQl9Ci0JCi0JCQkJCVNvdW5kIHNvdW5kID0gbmV3IFNvdW5kKGlkLCBjYXRlZ29yeSwgbmFtZSwgcmVhbFVSTCk7Ci0JCQkJCXNvdW5kcy5wdXQoaWQsIHNvdW5kKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkNvdWxkIG5vdCBsb2FkIGF1ZGlvOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZGlzYWJsZWQgc291bmQgbGlzdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFNvdW5kTWFwKCkgewotCQlTdHJpbmcgZmlsZW5hbWUgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoU09VTkRTX0ZJTEUpLnRvT1NTdHJpbmcoKTsKLQkKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQl1c2VyU291bmRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElQYXRoPigpOwotCQl0cnkgewotCQkJaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVuYW1lKTsKLQkJCUlNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGluKTsKLQkKLQkJCUlNZW1lbnRvW10gY2hpbGRyZW4gPSBtZW1lbnRvLmdldENoaWxkcmVuKCJtYXAiKTsKLQkKLQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlJTWVtZW50byBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCQkJCQlTdHJpbmcgaWQgPSBjaGlsZC5nZXRTdHJpbmcoImlkIik7Ci0JCQkJCVN0cmluZyBwYXRoU3RyID0gY2hpbGQuZ2V0U3RyaW5nKCJwYXRoIik7Ci0JCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChwYXRoU3RyKTsKLQkKLQkJCQkJdXNlclNvdW5kTWFwLnB1dChpZCwgcGF0aCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciByZWFkaW5nIFVSTCBtYXAgIiwgZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUGxheSB0aGUgc291bmQgd2l0aCB0aGUgZ2l2ZW4gaWQuIChwcm92aWRlZCB0aGF0Ci0JICogdGhlIHVzZXIgaGFzIGVuYWJsZWQgdGhlIHNvdW5kKQotCSAqCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBwbGF5U291bmQoU3RyaW5nIGlkKSB7Ci0JCWlmICghaXNTb3VuZEVuYWJsZWQoKSkKLQkJCXJldHVybjsKLQkKLQkJaWYgKCFpc1NvdW5kRW5hYmxlZChpZCkpCi0JCQlyZXR1cm47Ci0JCi0JCXRyeSB7Ci0JCQlTb3VuZCBzb3VuZCA9IHNvdW5kcy5nZXQoaWQpOwotCQkJU3RyaW5nIGNhdGVnb3J5ID0gc291bmQuZ2V0Q2F0ZWdvcnkoKTsKLQkJCWlmIChjYXRlZ29yeSAhPSBudWxsICYmIGNhdGVnb3JpZXMuY29udGFpbnNLZXkoY2F0ZWdvcnkpKSB7Ci0JCQkJaWYgKCFpc0NhdGVnb3J5RW5hYmxlZChjYXRlZ29yeSkpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkKLQkJCVVSTCB1cmwgPSBzb3VuZC5nZXRMb2NhdGlvbigpOwotCQkJSVBhdGggcGF0aCA9IGdldFVzZXJTb3VuZFBhdGgoaWQpOwotCQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCQl1cmwgPSBwYXRoLnRvRmlsZSgpLnRvVVJMKCk7Ci0JCi0JCQlwbGF5U291bmQodXJsLCBnZXRWb2x1bWUoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIHBsYXlpbmcgYXVkaW86ICIgKyBpZCwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQbGF5cyB0aGUgc291bmQgYXQgdGhlIGdpdmVuIHVybC4KLQkgKgotCSAqIEBwYXJhbSB1cmwgamF2YS5uZXQuVVJMCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHBsYXlTb3VuZChVUkwgdXJsLCBmaW5hbCBpbnQgdm9sdW1lKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgInBsYXlTb3VuZCIpOwotCQkJfQotCQkJaWYgKHVybCA9PSBudWxsIHx8IHZvbHVtZSA8PSAwKQotCQkJCXJldHVybjsKLQkKLQkJCWZpbmFsIENsaXAgY2xpcCA9IGdldENsaXAodXJsKTsKLQkJCWlmIChjbGlwID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJCQotCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJwbGF5aW5nIik7Ci0JCQl9Ci0JCi0JCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQoIlNvdW5kIFRocmVhZCIpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCS8vIHNldCBnYWluCi0JCQkJCUZsb2F0Q29udHJvbCBnYWluQ29udHJvbCA9IChGbG9hdENvbnRyb2wpIGNsaXAuZ2V0Q29udHJvbChGbG9hdENvbnRyb2wuVHlwZS5NQVNURVJfR0FJTik7Ci0JCQkJCWRvdWJsZSB2YWx1ZSA9IHZvbHVtZSAvIDIwLjA7Ci0JCQkJCWZsb2F0IGRCID0gKGZsb2F0KSAoTWF0aC5sb2codmFsdWU9PTAuMD8wLjAwMDE6dmFsdWUpL01hdGgubG9nKDEwLjApKjIwLjApOwotCQkJCQlnYWluQ29udHJvbC5zZXRWYWx1ZShkQik7Ci0JCi0JCQkJCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJzdGFydCIpOwotCQkJCQl9Ci0JCQkJCWNsaXAuc3RhcnQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXNsZWVwKDk5KTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCi0JCQkJCXdoaWxlIChjbGlwLmlzQWN0aXZlKCkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJc2xlZXAoOTkpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljbGlwLnN0b3AoKTsKLQkJCQkJY2xpcC5jbG9zZSgpOwotCQkJCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAic3RvcCIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCXQuc2V0RGFlbW9uKHRydWUpOwotCQkJdC5zdGFydCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBwbGF5aW5nIGF1ZGlvOiAiICsgdXJsLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBkaXNhYmxlZCBzb3VuZHMgYW5kIGNhdGVnb3JpZXMgbGlzdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2F2ZURpc2FibGVkTGlzdHMoKSB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChESVNBQkxFRF9GSUxFKS50b09TU3RyaW5nKCk7Ci0JCi0JCUZpbGVPdXRwdXRTdHJlYW0gZm91dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlYTUxNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgiZGlzYWJsZWQiKTsKLQkKLQkJCUlNZW1lbnRvIGNhdCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoImNhdGVnb3JpZXMiKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZGlzYWJsZWRDYXRlZ29yaWVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU1lbWVudG8gY2hpbGQgPSBjYXQuY3JlYXRlQ2hpbGQoImNhdGVnb3J5Iik7Ci0JCQkJU3RyaW5nIGlkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCWNoaWxkLnB1dFN0cmluZygiaWQiLCBpZCk7Ci0JCQl9Ci0JCi0JCQlJTWVtZW50byBzb3VuZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoInNvdW5kcyIpOwotCQkJaXRlcmF0b3IgPSBkaXNhYmxlZFNvdW5kcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlNZW1lbnRvIGNoaWxkID0gc291bmQuY3JlYXRlQ2hpbGQoInNvdW5kIik7Ci0JCQkJU3RyaW5nIGlkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCWNoaWxkLnB1dFN0cmluZygiaWQiLCBpZCk7Ci0JCQl9Ci0JCi0JCQlmb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpOwotCQkJbWVtZW50by5zYXZlKGZvdXQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBkaXNhYmxlZCBpbmZvcm1hdGlvbiIsIGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGZvdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZGlzYWJsZWQgc291bmQgbGlzdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2F2ZVNvdW5kTWFwKCkgewotCQlTdHJpbmcgZmlsZW5hbWUgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoU09VTkRTX0ZJTEUpLnRvT1NTdHJpbmcoKTsKLQkKLQkJRmlsZU91dHB1dFN0cmVhbSBmb3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJzb3VuZC1tYXAiKTsKLQkKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdXNlclNvdW5kTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJtYXAiKTsKLQkJCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJY2hpbGQucHV0U3RyaW5nKCJpZCIsIGlkKTsKLQkJCQlJUGF0aCBwYXRoID0gdXNlclNvdW5kTWFwLmdldChpZCk7Ci0JCQkJY2hpbGQucHV0U3RyaW5nKCJwYXRoIiwgcGF0aC50b1N0cmluZygpKTsKLQkJCX0KLQkKLQkJCWZvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSk7Ci0JCQltZW1lbnRvLnNhdmUoZm91dCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIFVSTCBtYXAgaW5mb3JtYXRpb24iLCBlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChmb3V0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlmb3V0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlIG9yIGRpc2FibGUgYSBzcGVjaWZpYyBjYXRlZ29yeS4KLQkgKgotCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGIgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5RW5hYmxlZChTdHJpbmcgaWQsIGJvb2xlYW4gYikgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkKLQkJaWYgKGRpc2FibGVkQ2F0ZWdvcmllcyA9PSBudWxsKQotCQkJbG9hZERpc2FibGVkTGlzdHMoKTsKLQkKLQkJaWYgKGIpIHsKLQkJCWlmIChkaXNhYmxlZENhdGVnb3JpZXMuY29udGFpbnMoaWQpKSB7Ci0JCQkJZGlzYWJsZWRDYXRlZ29yaWVzLnJlbW92ZShpZCk7Ci0JCQkJc2F2ZURpc2FibGVkTGlzdHMoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICghZGlzYWJsZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGlkKSkgewotCQkJCWRpc2FibGVkQ2F0ZWdvcmllcy5hZGQoaWQpOwotCQkJCXNhdmVEaXNhYmxlZExpc3RzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUgb3IgZGlzYWJsZSBhIHNwZWNpZmljIHNvdW5kLgotCSAqCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gYiBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291bmRFbmFibGVkKFN0cmluZyBpZCwgYm9vbGVhbiBiKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQotCQlpZiAoZGlzYWJsZWRTb3VuZHMgPT0gbnVsbCkKLQkJCWxvYWREaXNhYmxlZExpc3RzKCk7Ci0JCi0JCWlmIChiKSB7Ci0JCQlpZiAoZGlzYWJsZWRTb3VuZHMuY29udGFpbnMoaWQpKSB7Ci0JCQkJZGlzYWJsZWRTb3VuZHMucmVtb3ZlKGlkKTsKLQkJCQlzYXZlRGlzYWJsZWRMaXN0cygpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKCFkaXNhYmxlZFNvdW5kcy5jb250YWlucyhpZCkpIHsKLQkJCQlkaXNhYmxlZFNvdW5kcy5hZGQoaWQpOwotCQkJCXNhdmVEaXNhYmxlZExpc3RzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgc291bmQgaXMgZW5hYmxlZC4KLQkgKgotCSAqIEBwYXJhbSBlbmFibGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291bmRzRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoUFJFRl9TT1VORF9FTkFCTEVELCBlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IFVSTCBmb3IgdGhpcyBzb3VuZC4KLQkgKgotCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBhdGggSVBhdGgKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTb3VuZFVSTChTdHJpbmcgaWQsIElQYXRoIHBhdGgpIHsKLQkJaWYgKGlkID09IG51bGwgfHwgcGF0aCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQotCQl0cnkgewotCQkJaWYgKHVzZXJTb3VuZE1hcCA9PSBudWxsKQotCQkJCWxvYWRTb3VuZE1hcCgpOwotCQotCQkJdXNlclNvdW5kTWFwLnB1dChpZCwgcGF0aCk7Ci0JCQlzYXZlU291bmRNYXAoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IGdldCBzb3VuZCBVUkw6ICIgKyBpZCwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmdWxsIHVzZXIgc291bmQgbWFwLgotCSAqCi0JICogQHBhcmFtIG1hcCB0aGUgc291bmQgbWFwCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXNlclNvdW5kTWFwKE1hcDxTdHJpbmcsIElQYXRoPiBtYXApIHsKLQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQl1c2VyU291bmRNYXAgPSBtYXA7Ci0JCQlzYXZlU291bmRNYXAoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZvbHVtZS4KLQkgKgotCSAqIEBwYXJhbSB2b2x1bWUgdGhlIHZvbHVtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFBSRUZfVk9MVU1FLCB2b2x1bWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y0NDQyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpb1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW87Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLS8qKgotICogQXVkaW8gcHJlZmVyZW5jZSBwYWdlLgotICovCi1wdWJsaWMgY2xhc3MgQXVkaW9QcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlwcm90ZWN0ZWQgQnV0dG9uIGVuYWJsZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgU3Bpbm5lciB2b2x1bWU7Ci0KLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgSVBhdGg+IHVzZXJTb3VuZE1hcDsKLQotCXByb3RlY3RlZCBDYXRlZ29yeVRhYmxlVmlld2VyIHZpZXdlcjsKLQkKLQlib29sZWFuIHNvdW5kQXZhaWxhYmxlID0gdHJ1ZTsKLQotCS8qKgotCSAqIEF1ZGlvUHJlZmVyZW5jZVBhZ2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQXVkaW9QcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkKLQkJbG9hZFVzZXJNYXBJbmZvKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJUGF0aCBjaG9vc2VBdWRpb0ZpbGUoKSB7Ci0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0U2hlbGwoKSwgU1dULlNJTkdMRSk7Ci0JCWRpYWxvZy5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZlNlbGVjdEZpbGUpOwotCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmF1Oyoud2F2In0pOwotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChudWxsKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkKLQkJU3RyaW5nW10gZmlsZW5hbWVzID0gZGlhbG9nLmdldEZpbGVOYW1lcygpOwotCQlpZiAoZmlsZW5hbWVzICE9IG51bGwgJiYgZmlsZW5hbWVzLmxlbmd0aCA+IDApIHsKLQkJCVN0cmluZyBmaWx0ZXJQYXRoID0gZGlhbG9nLmdldEZpbHRlclBhdGgoKTsKLQkJCXJldHVybiBuZXcgUGF0aChmaWx0ZXJQYXRoICsgamF2YS5pby5GaWxlLnNlcGFyYXRvciArIGZpbGVuYW1lc1swXSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgU1dUIGNvbnRyb2wgZm9yIHRoZSBjdXN0b21pemVkIGJvZHkgCi0JICogb2YgdGhpcyBwcmVmZXJlbmNlIHBhZ2UgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCBjb21wb3NpdGUuCi0JICogPHA+Ci0JICogVGhpcyBmcmFtZXdvcmsgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUKLQkgKiBzdWJjbGFzc2VzLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBuZXcgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscChwYXJlbnQsIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVMpOwotCQotCQlmaW5hbCBBdWRpb0NvcmUgY29yZSA9IEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpOwotCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDMpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQkJZW5hYmxlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWVuYWJsZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZkVuYWJsZSk7Ci0JCWVuYWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oQXVkaW9Db3JlLmdldEluc3RhbmNlKCkuaXNTb3VuZEVuYWJsZWQoKSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWVuYWJsZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl3aHMuc2V0SGVscChlbmFibGVCdXR0b24sIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVNfRU5BQkxFKTsKLQkJCi0JCWZpbmFsIExhYmVsIHZvbHVtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl2b2x1bWVMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZlZvbHVtZSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCXZvbHVtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXZvbHVtZUxhYmVsLnNldEVuYWJsZWQoZW5hYmxlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCi0JCXZvbHVtZSA9IG5ldyBTcGlubmVyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXZvbHVtZS5zZXRNaW5pbXVtKDApOwotCQl2b2x1bWUuc2V0TWF4aW11bSgyMCk7Ci0JCXZvbHVtZS5zZXRTZWxlY3Rpb24oQXVkaW9Db3JlLmdldEluc3RhbmNlKCkuZ2V0Vm9sdW1lKCkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEud2lkdGhIaW50ID0gNjA7Ci0JCXZvbHVtZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl2b2x1bWUuc2V0RW5hYmxlZChlbmFibGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQl3aHMuc2V0SGVscCh2b2x1bWUsIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVNfVk9MVU1FKTsKLQkJCi0JCWVuYWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl2b2x1bWVMYWJlbC5zZXRFbmFibGVkKGVuYWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJdm9sdW1lLnNldEVuYWJsZWQoZW5hYmxlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZlNvdW5kcyk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkNIRUNLKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJd2hzLnNldEhlbHAodGFibGUsIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVNfU09VTkRTX1RBQkxFKTsKLQkJCi0JCXZpZXdlciA9IG5ldyBDYXRlZ29yeVRhYmxlVmlld2VyKHRhYmxlKTsKLQkJCi0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCQotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5QaXhlbERhdGEoMjMsIGZhbHNlKSk7Ci0JCVRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUiwgMCk7Ci0JCWNvbC5zZXRSZXNpemFibGUoZmFsc2UpOwotCQkKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMSwgMTEwLCB0cnVlKSk7Ci0JCWNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIDEpOwotCQljb2wuc2V0VGV4dChNZXNzYWdlcy5hdWRpb1ByZWZTb3VuZCk7Ci0JCWNvbC5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCQotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDE1LCAxNTAsIHRydWUpKTsKLQkJY29sID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgMik7Ci0JCWNvbC5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZkZpbGUpOwotCQljb2wuc2V0UmVzaXphYmxlKHRydWUpOwotCQkKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXVkaW9UYWJsZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEF1ZGlvVGFibGVMYWJlbFByb3ZpZGVyKHRoaXMpKTsKLQkJdmlld2VyLnNldElucHV0KCJyb290Iik7Ci0JCQotCQlzZXRDaGVja1N0YXRlKHZpZXdlcik7Ci0JCQotCQl2aWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWJvb2xlYW4gY2hlY2tlZCA9IGV2ZW50LmdldENoZWNrZWQoKTsKLQkJCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCQkJCQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIGlkID0gKFN0cmluZykgb2JqOwotCQkJCQljb3JlLnNldENhdGVnb3J5RW5hYmxlZChpZCwgY2hlY2tlZCk7Ci0JCQkJCS8vdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBBdWRpb1RhYmxlQ29udGVudFByb3ZpZGVyLmdldFNvdW5kc0J5Q2F0ZWdvcnkoaWQpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCVNvdW5kIHMgPSAoU291bmQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCXZpZXdlci5zZXRDaGVja2VkKHMsIGNoZWNrZWQpOwotCQkJCQkJY29yZS5zZXRTb3VuZEVuYWJsZWQocy5nZXRJZCgpLCBjaGVja2VkKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCVNvdW5kIHNvdW5kID0gKFNvdW5kKSBvYmo7Ci0JCQkJCWNvcmUuc2V0U291bmRFbmFibGVkKHNvdW5kLmdldElkKCksIGNoZWNrZWQpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlDb21wb3NpdGUgcmlnaHQgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJcmlnaHQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJcmlnaHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQkJLy8gcGxheSBidXR0b24gYW5kIHRhYmxlIHNlbGVjdGlvbiBsaXN0ZW5lcgotCQlmaW5hbCBCdXR0b24gcGxheUJ1dHRvbiA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKHJpZ2h0LCBNZXNzYWdlcy5hdWRpb1ByZWZQbGF5KTsKLQkJcGxheUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJd2hzLnNldEhlbHAocGxheUJ1dHRvbiwgQ29udGV4dElkcy5BVURJT19QUkVGRVJFTkNFU19QTEFZKTsKLQkKLQkJZmluYWwgQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKHJpZ2h0LCBNZXNzYWdlcy5hdWRpb1ByZWZCcm93c2UpOwotCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXdocy5zZXRIZWxwKGJyb3dzZUJ1dHRvbiwgQ29udGV4dElkcy5BVURJT19QUkVGRVJFTkNFU19CUk9XU0UpOwotCQotCQlmaW5hbCBCdXR0b24gcmVzZXRCdXR0b24gPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihyaWdodCwgTWVzc2FnZXMuYXVkaW9QcmVmUmVzZXQpOwotCQlyZXNldEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJd2hzLnNldEhlbHAocmVzZXRCdXR0b24sIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVNfUkVTRVQpOwotCQkKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJT2JqZWN0IG9iaiA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNvdW5kKSB7Ci0JCQkJCQlTb3VuZCBzb3VuZCA9IChTb3VuZCkgb2JqOwotCQkJCQkJVVJMIHVybCA9IGdldFNvdW5kVVJMKHNvdW5kLmdldElkKCkpOwotCQkJCQkJaWYgKHVybCAhPSBudWxsICYmIHNvdW5kQXZhaWxhYmxlKQotCQkJCQkJCXBsYXlCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlwbGF5QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkKLQkJCQkJCWlmIChnZXRVc2VyU291bmRQYXRoKHNvdW5kLmdldElkKCkpICE9IG51bGwpCi0JCQkJCQkJcmVzZXRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXNldEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBsYXlCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlyZXNldEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgaW4gdGFibGUgc2VsZWN0aW9uIiwgZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkKLQkJc291bmRBdmFpbGFibGUgPSBBdWRpb0NvcmUuaXNBdWRpb1N1cHBvcnRlZCgpOwotCQlpZiAoc291bmRBdmFpbGFibGUpIHsKLQkJCXBsYXlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0cnkgewotCQkJCQkJaW50IHNlbCA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJCQlTb3VuZCBzb3VuZCA9IChTb3VuZCkgdGFibGUuZ2V0SXRlbShzZWwpLmdldERhdGEoKTsKLQkJCQkJCUF1ZGlvQ29yZS5wbGF5U291bmQoZ2V0U291bmRVUkwoc291bmQuZ2V0SWQoKSksIHZvbHVtZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBpbiB0YWJsZSBzZWxlY3Rpb24iLCBleCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBlbHNlCi0JCQlwbGF5QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRyeSB7Ci0JCQkJCUlQYXRoIHBhdGggPSBjaG9vc2VBdWRpb0ZpbGUoKTsKLQkJCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCQkJaW50IHNlbCA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJCQlTb3VuZCBzb3VuZCA9IChTb3VuZCkgdGFibGUuZ2V0SXRlbShzZWwpLmdldERhdGEoKTsKLQkJCQkJCXNldFVzZXJTb3VuZFBhdGgoc291bmQuZ2V0SWQoKSwgcGF0aCk7Ci0JCQkJCQl2aWV3ZXIucmVmcmVzaChzb3VuZCk7Ci0JCQkJCQlwbGF5QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGJyb3dzaW5nIiwgZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCXJlc2V0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRyeSB7Ci0JCQkJCWludCBzZWwgPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCQlTb3VuZCBzb3VuZCA9IChTb3VuZCkgdGFibGUuZ2V0SXRlbShzZWwpLmdldERhdGEoKTsKLQkJCQkJcmVtb3ZlVXNlclNvdW5kUGF0aChzb3VuZC5nZXRJZCgpKTsKLQkJCQkJdmlld2VyLnJlZnJlc2goc291bmQpOwotCQkJCQkvL3BsYXlCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIHJlc2V0aW5nIHNvdW5kIiwgZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q2hlY2tTdGF0ZShDaGVja2JveFRhYmxlVmlld2VyIHZpZXdlcikgewotCQlBdWRpb0NvcmUgY29yZSA9IEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpOwotCQkKLQkJTWFwPFN0cmluZywgU3RyaW5nPiBjYXRlZ29yaWVzID0gY29yZS5nZXRDYXRlZ29yaWVzKCk7Ci0JCQotCQkvLyBmaXJzdCwgZmluZCBhbGwgdGhlIGNhdGVnb3JpZXMgYW5kIHNvcnQKLQkJTGlzdDxTdHJpbmc+IGNhdHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjYXRlZ29yaWVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0JCQljYXRzLmFkZCgoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKSk7Ci0JCQotCQkvLyBsaXN0IHRoZW0sIGlnbm9yaW5nIGVtcHR5IG9uZXMKLQkJaXRlcmF0b3IgPSBjYXRlZ29yaWVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUxpc3QgbCA9IEF1ZGlvVGFibGVDb250ZW50UHJvdmlkZXIuZ2V0U291bmRzQnlDYXRlZ29yeShpZCk7Ci0JCQlpZiAoIWwuaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKGNvcmUuaXNDYXRlZ29yeUVuYWJsZWQoaWQpKQotCQkJCQl2aWV3ZXIuc2V0Q2hlY2tlZChpZCwgdHJ1ZSk7Ci0JCQkJCi0JCQkJaW50IHNpemUgPSBsLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlTb3VuZCBzID0gKFNvdW5kKSBsLmdldChpKTsKLQkJCQkJaWYgKGNvcmUuaXNTb3VuZEVuYWJsZWQocy5nZXRJZCgpKSkKLQkJCQkJCXZpZXdlci5zZXRDaGVja2VkKHMsIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gZmluYWxseSwgbGlzdCB0aGUgIm1pc2MiIHNvdW5kcwotCQlMaXN0IGwgPSBBdWRpb1RhYmxlQ29udGVudFByb3ZpZGVyLmdldFNvdW5kc0J5Q2F0ZWdvcnkobnVsbCk7Ci0JCWlmICghbC5pc0VtcHR5KCkpIHsKLQkJCWludCBzaXplID0gbC5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVNvdW5kIHMgPSAoU291bmQpIGwuZ2V0KGkpOwotCQkJCWlmIChjb3JlLmlzU291bmRFbmFibGVkKHMuZ2V0SWQoKSkpCi0JCQkJCXZpZXdlci5zZXRDaGVja2VkKHMsIHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBVUkwgZ2V0U291bmRVUkwoU3RyaW5nIGlkKSB7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBwYXRoID0gdXNlclNvdW5kTWFwLmdldChpZCk7Ci0JCQlpZiAocGF0aCAhPSBudWxsKQotCQkJCXJldHVybiBwYXRoLnRvRmlsZSgpLnRvVVJMKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQotCQlyZXR1cm4gQXVkaW9Db3JlLmdldEluc3RhbmNlKCkuZ2V0U291bmQoaWQpLmdldExvY2F0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBJUGF0aCBnZXRVc2VyU291bmRQYXRoKFN0cmluZyBpZCkgewotCQl0cnkgewotCQkJSVBhdGggcGF0aCA9IHVzZXJTb3VuZE1hcC5nZXQoaWQpOwotCQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCQlyZXR1cm4gcGF0aDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgcHJlZmVyZW5jZSBwYWdlIGZvciB0aGUgZ2l2ZW4gd29ya2JlbmNoLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGFzIHRoZSBwcmVmZXJlbmNlIHBhZ2UgaXMgYmVpbmcgY3JlYXRlZAotCSAqIGFuZCBpbml0aWFsaXplZC4gQ2xpZW50cyBtdXN0IG5vdCBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSB3b3JrYmVuY2ggdGhlIHdvcmtiZW5jaAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWRVc2VyTWFwSW5mbygpIHsKLQkJLy8gY3JlYXRlIGEgY29weSBvZiB0aGUgdXNlciBzb3VuZCBtYXAKLQkJTWFwPFN0cmluZywgSVBhdGg+IG1hcCA9IEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpLmdldFVzZXJTb3VuZE1hcCgpOwotCQl1c2VyU291bmRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElQYXRoPihtYXAuc2l6ZSgpKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUlQYXRoIHBhdGggPSBtYXAuZ2V0KGlkKTsKLQkJCXVzZXJTb3VuZE1hcC5wdXQoaWQsIHBhdGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBQcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJQXVkaW9Db3JlIGNvcmUgPSBBdWRpb0NvcmUuZ2V0SW5zdGFuY2UoKTsKLQkJCi0JCWVuYWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oY29yZS5nZXREZWZhdWx0U291bmRzRW5hYmxlZCgpKTsKLQkJdm9sdW1lLnNldFNlbGVjdGlvbihjb3JlLmdldERlZmF1bHRWb2x1bWUoKSk7Ci0JCi0JCXVzZXJTb3VuZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVBhdGg+KCk7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0JCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCS8qKiAKLQkgKiBAc2VlIFByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlBdWRpb0NvcmUgY29yZSA9IEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpOwotCQljb3JlLnNldFNvdW5kc0VuYWJsZWQoZW5hYmxlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJY29yZS5zZXRWb2x1bWUodm9sdW1lLmdldFNlbGVjdGlvbigpKTsKLQkKLQkJY29yZS5zZXRVc2VyU291bmRNYXAodXNlclNvdW5kTWFwKTsKLQkJdmlld2VyLnJlZnJlc2goKTsKLQkKLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1PaygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVVzZXJTb3VuZFBhdGgoU3RyaW5nIGlkKSB7Ci0JCWlmICh1c2VyU291bmRNYXAuY29udGFpbnNLZXkoaWQpKQotCQkJdXNlclNvdW5kTWFwLnJlbW92ZShpZCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVVzZXJNYXBJbmZvKCkgewotCQkvLyBjcmVhdGUgYSBjb3B5IG9mIHRoZSB1c2VyIHNvdW5kIG1hcAotCQlNYXAgbWFwID0gQXVkaW9Db3JlLmdldEluc3RhbmNlKCkuZ2V0VXNlclNvdW5kTWFwKCk7Ci0JCXVzZXJTb3VuZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVBhdGg+KG1hcC5zaXplKCkpOwotCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlJUGF0aCBwYXRoID0gKElQYXRoKSBtYXAuZ2V0KGlkKTsKLQkJCXVzZXJTb3VuZE1hcC5wdXQoaWQsIHBhdGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhdGggb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXNlclNvdW5kUGF0aChTdHJpbmcgaWQsIElQYXRoIHBhdGgpIHsKLQkJdXNlclNvdW5kTWFwLnB1dChpZCwgcGF0aCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vQXVkaW9UYWJsZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vQXVkaW9UYWJsZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWVhMTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvVGFibGVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hdWRpbzsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5CYXNlQ29udGVudFByb3ZpZGVyOwotLyoqCi0gKiBBdWRpbyB0YWJsZSBjb250ZW50IHByb3ZpZGVyLgotICovCi1jbGFzcyBBdWRpb1RhYmxlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQmFzZUNvbnRlbnRQcm92aWRlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTQ19DQVRFR09SWSA9ICJtaXNjQ2F0ZWdvcnkiOwotCi0JLyoqCi0JICogQXVkaW9UYWJsZUNvbnRlbnRQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBdWRpb1RhYmxlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlciAKLQkgKiB3aGVuIGl0cyBpbnB1dCBpcyBzZXQgdG8gdGhlIGdpdmVuIGVsZW1lbnQuIAotCSAqIFRoZXNlIGVsZW1lbnRzIGNhbiBiZSBwcmVzZW50ZWQgYXMgcm93cyBpbiBhIHRhYmxlLCBpdGVtcyBpbiBhIGxpc3QsIGV0Yy4KLQkgKiBUaGUgcmVzdWx0IGlzIG5vdCBtb2RpZmllZCBieSB0aGUgdmlld2VyLgotCSAqCi0JICogQHBhcmFtIGlucHV0RWxlbWVudCB0aGUgaW5wdXQgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlcgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCUF1ZGlvQ29yZSBjb3JlID0gQXVkaW9Db3JlLmdldEluc3RhbmNlKCk7Ci0JCi0JCU1hcDxTdHJpbmcsIFN0cmluZz4gY2F0ZWdvcmllcyA9IGNvcmUuZ2V0Q2F0ZWdvcmllcygpOwotCQlNYXA8U3RyaW5nLCBTb3VuZD4gc291bmRzID0gY29yZS5nZXRTb3VuZHMoKTsKLQkKLQkJTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oc291bmRzLnNpemUoKSk7Ci0JCi0JCS8vIGZpcnN0LCBmaW5kIGFsbCB0aGUgY2F0ZWdvcmllcyBhbmQgc29ydAotCQlMaXN0PFN0cmluZz4gY2F0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGNhdGVnb3JpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLQkJCWNhdHMuYWRkKChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCXNvcnRDYXRlZ29yaWVzKGNhdHMpOwotCQkKLQkJLy8gbGlzdCB0aGVtLCBpZ25vcmluZyBlbXB0eSBvbmVzCi0JCWl0ZXJhdG9yID0gY2F0ZWdvcmllcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlMaXN0PFNvdW5kPiBsID0gZ2V0U291bmRzQnlDYXRlZ29yeShpZCk7Ci0JCQlpZiAoIWwuaXNFbXB0eSgpKSB7Ci0JCQkJbGlzdC5hZGQoaWQpOwotCQkJCXNvcnRTb3VuZHMobCk7Ci0JCi0JCQkJaW50IHNpemUgPSBsLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQkJbGlzdC5hZGQobC5nZXQoaSkpOwotCQkJfQotCQl9Ci0JCi0JCS8vIGZpbmFsbHksIGxpc3QgdGhlICJtaXNjIiBzb3VuZHMKLQkJTGlzdDxTb3VuZD4gbCA9IGdldFNvdW5kc0J5Q2F0ZWdvcnkobnVsbCk7Ci0JCWlmICghbC5pc0VtcHR5KCkpIHsKLQkJCWxpc3QuYWRkKE1JU0NfQ0FURUdPUlkpOwotCQkJc29ydFNvdW5kcyhsKTsKLQkKLQkJCWludCBzaXplID0gbC5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQlsaXN0LmFkZChsLmdldChpKSk7Ci0JCX0KLQkKLQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNvdW5kcyBmcm9tIHRoZSBnaXZlbiBjYXRlZ29yeS4gVXNlIG51bGwKLQkgKiB0byByZXR1cm4gYWxsIG1pc2NlbGxlbmVvdXMgc291bmRzIHdpdGggbm8gY2F0ZWdvcnkgb3IKLQkgKiBhbiBpbnZhbGlkIGNhdGVnb3J5LgotCSAqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqIEBwYXJhbSBjYXRlZ29yeSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0PFNvdW5kPiBnZXRTb3VuZHNCeUNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgewotCQlBdWRpb0NvcmUgY29yZSA9IEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpOwotCQotCQlNYXA8U3RyaW5nLCBTb3VuZD4gc291bmRzID0gY29yZS5nZXRTb3VuZHMoKTsKLQkJTWFwPFN0cmluZywgU3RyaW5nPiBjYXRlZ29yaWVzID0gY29yZS5nZXRDYXRlZ29yaWVzKCk7Ci0JCUxpc3Q8U291bmQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFNvdW5kPigpOwotCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNvdW5kcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlTb3VuZCBzb3VuZCA9IHNvdW5kcy5nZXQoaWQpOwotCQkJaWYgKGNhdGVnb3J5ICE9IG51bGwgJiYgY2F0ZWdvcnkuZXF1YWxzKHNvdW5kLmdldENhdGVnb3J5KCkpKQotCQkJCWxpc3QuYWRkKHNvdW5kKTsKLQkJCWVsc2UgaWYgKGNhdGVnb3J5ID09IG51bGwgJiYgKHNvdW5kLmdldENhdGVnb3J5KCkgPT0gbnVsbCB8fCAhY2F0ZWdvcmllcy5jb250YWluc0tleShzb3VuZC5nZXRDYXRlZ29yeSgpKSkpCi0JCQkJbGlzdC5hZGQoc291bmQpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFNvcnRzIGEgbGlzdCBvZiBjYXRlZ29yaWVzLCBpbiBwbGFjZS4KLQkgKgotCSAqIEBwYXJhbSBsaXN0IGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc29ydENhdGVnb3JpZXMoTGlzdDxTdHJpbmc+IGxpc3QpIHsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJaWYgKHNpemUgPCAyKQotCQkJcmV0dXJuOwotCQkKLQkJTWFwPFN0cmluZywgU3RyaW5nPiBjYXRlZ29yaWVzID0gQXVkaW9Db3JlLmdldEluc3RhbmNlKCkuZ2V0Q2F0ZWdvcmllcygpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKSB7Ci0JCQlmb3IgKGludCBqID0gaSsxOyBqIDwgc2l6ZTsgaisrKSB7Ci0JCQkJU3RyaW5nIGEgPSBsaXN0LmdldChpKTsKLQkJCQlTdHJpbmcgYWEgPSBjYXRlZ29yaWVzLmdldChhKTsKLQkJCQlTdHJpbmcgYiA9IGxpc3QuZ2V0KGopOwotCQkJCVN0cmluZyBiYiA9IGNhdGVnb3JpZXMuZ2V0KGIpOwotCQkJCWlmIChhYS5jb21wYXJlVG8oYmIpID4gMCkgewotCQkJCQlsaXN0LnNldChpLCBiKTsKLQkJCQkJbGlzdC5zZXQoaiwgYSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU29ydHMgYSBsaXN0IG9mIHNvdW5kcywgaW4gcGxhY2UuCi0JICoKLQkgKiBAcGFyYW0gc291bmRzIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc29ydFNvdW5kcyhMaXN0PFNvdW5kPiBzb3VuZHMpIHsKLQkJaW50IHNpemUgPSBzb3VuZHMuc2l6ZSgpOwotCQlpZiAoc2l6ZSA8IDIpCi0JCQlyZXR1cm47Ci0JCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IGkrMTsgaiA8IHNpemU7IGorKykgewotCQkJCVNvdW5kIGEgPSBzb3VuZHMuZ2V0KGkpOwotCQkJCVNvdW5kIGIgPSBzb3VuZHMuZ2V0KGopOwotCQkJCWlmIChhLmdldE5hbWUoKS5jb21wYXJlVG8oYi5nZXROYW1lKCkpID4gMCkgewotCQkJCQlzb3VuZHMuc2V0KGksIGIpOwotCQkJCQlzb3VuZHMuc2V0KGosIGEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvVGFibGVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpb1RhYmxlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmRkOGM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvVGFibGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotLyoqCi0gKiBBdWRpbyB0YWJsZSBsYWJlbCBwcm92aWRlci4KLSAqLwotY2xhc3MgQXVkaW9UYWJsZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgQXVkaW9QcmVmZXJlbmNlUGFnZSBwYWdlOwotCi0JLyoqCi0JICogQXVkaW9UYWJsZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZSB0aGUgcHJlZmVyZW5jZSBwYWdlCi0JICovCi0JcHVibGljIEF1ZGlvVGFibGVMYWJlbFByb3ZpZGVyKEF1ZGlvUHJlZmVyZW5jZVBhZ2UgcGFnZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhZ2UgPSBwYWdlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGlzIGxhYmVsIHByb3ZpZGVyLiAKLQkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICogPHA+Ci0JICogTGFiZWwgcHJvdmlkZXIgbGlzdGVuZXJzIGFyZSBpbmZvcm1lZCBhYm91dCBzdGF0ZSBjaGFuZ2VzIAotCSAqIHRoYXQgYWZmZWN0IHRoZSByZW5kZXJpbmcgb2YgdGhlIHZpZXdlciB0aGF0IHVzZXMgdGhpcyBsYWJlbCBwcm92aWRlci4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBsYWJlbCBwcm92aWRlciBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgbGFiZWwgcHJvdmlkZXIuICBXaGVuIGEgbGFiZWwgcHJvdmlkZXIgaXMKLQkgKiBhdHRhY2hlZCB0byBhIHZpZXdlciwgdGhlIHZpZXdlciB3aWxsIGF1dG9tYXRpY2FsbHkgY2FsbAotCSAqIHRoaXMgbWV0aG9kIHdoZW4gdGhlIHZpZXdlciBpcyBiZWluZyBjbG9zZWQuICBXaGVuIGxhYmVsIHByb3ZpZGVycwotCSAqIGFyZSB1c2VkIG91dHNpZGUgb2YgdGhlIGNvbnRleHQgb2YgYSB2aWV3ZXIsIGl0IGlzIHRoZSBjbGllbnQncwotCSAqIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZQotCSAqIHByb3ZpZGVyIGlzIG5vIGxvbmdlciBuZWVkZWQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJLypBdWRpb0NvcmUgY29yZSA9IEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpOwotCQotCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlpZiAoZWxlbWVudCAhPSBBdWRpb1RhYmxlQ29udGVudFByb3ZpZGVyLk1JU0NfQ0FURUdPUlkpIHsKLQkJCQkJaWYgKGNvcmUuaXNDYXRlZ29yeUVuYWJsZWQoKFN0cmluZykgZWxlbWVudCkpCi0JCQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19BVURJT19FTkFCTEVEKTsKLQkJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfQVVESU9fRElTQUJMRUQpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCVNvdW5kIHNvdW5kID0gKFNvdW5kKSBlbGVtZW50OwotCQkJaWYgKCFjb3JlLmlzQ2F0ZWdvcnlFbmFibGVkKHNvdW5kLmdldENhdGVnb3J5KCkpKQotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0FVRElPX1VOQVZBSUxBQkxFKTsKLQkJCWlmIChjb3JlLmlzU291bmRFbmFibGVkKHNvdW5kLmdldElkKCkpKQotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0FVRElPX0VOQUJMRUQpOwotCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfQVVESU9fRElTQUJMRUQpOwotCQl9IGVsc2UqLwotCQlpZiAoY29sdW1uSW5kZXggPT0gMSkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfQVVESU9fQ0FURUdPUlkpOwotCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfQVVESU9fU09VTkQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoY29sdW1uSW5kZXggPT0gMCkKLQkJCXJldHVybiAiIjsKLQkJCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlTdHJpbmcgY2F0ZWdvcnlJZCA9IChTdHJpbmcpIGVsZW1lbnQ7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMSkgewotCQkJCWlmIChjYXRlZ29yeUlkLmVxdWFscyhBdWRpb1RhYmxlQ29udGVudFByb3ZpZGVyLk1JU0NfQ0FURUdPUlkpKQotCQkJCQlyZXR1cm4gIiI7IC8vKE1pc2NlbGxhbmVvdXMpIjsKLQkJCQlNYXAgY2F0ZWdvcmllcyA9IEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpLmdldENhdGVnb3JpZXMoKTsKLQkJCQlyZXR1cm4gKFN0cmluZykgY2F0ZWdvcmllcy5nZXQoY2F0ZWdvcnlJZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJU291bmQgc291bmQgPSAoU291bmQpIGVsZW1lbnQ7Ci0JCQotCQlpZiAoY29sdW1uSW5kZXggPT0gMSkgewotCQkJU3RyaW5nIHMgPSBzb3VuZC5nZXROYW1lKCk7Ci0JCQlpZiAocyAhPSBudWxsKQotCQkJCXJldHVybiBzOwotCQkJcmV0dXJuIE1lc3NhZ2VzLmF1ZGlvVW5rbm93bjsKLQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAyKSB7Ci0JCQlJUGF0aCBwYXRoID0gcGFnZS5nZXRVc2VyU291bmRQYXRoKHNvdW5kLmdldElkKCkpOwotCQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCQlyZXR1cm4gcGF0aC5sYXN0U2VnbWVudCgpOwotCQkJCi0JCQlVUkwgdXJsID0gcGFnZS5nZXRTb3VuZFVSTChzb3VuZC5nZXRJZCgpKTsKLQkJCWlmICh1cmwgPT0gbnVsbCkKLQkJCQlyZXR1cm4gTWVzc2FnZXMuYXVkaW9Ob25lOwotCQkJcmV0dXJuIE1lc3NhZ2VzLmF1ZGlvRGVmYXVsdDsKLQkJfQotCQlyZXR1cm4gIiI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCAKLQkgKiBieSBhIGNoYW5nZSB0byB0aGUgZ2l2ZW4gcHJvcGVydHkgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogVGhpcyBjYW4gYmUgdXNlZCB0byBvcHRpbWl6ZSBhIG5vbi1zdHJ1Y3R1cmFsIHZpZXdlciB1cGRhdGUuCi0JICogSWYgdGhlIHByb3BlcnR5IG1lbnRpb25lZCBpbiB0aGUgdXBkYXRlIGRvZXMgbm90IGFmZmVjdCB0aGUgbGFiZWwsCi0JICogdGhlbiB0aGUgdmlld2VyIG5lZWQgbm90IHVwZGF0ZSB0aGUgbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCwKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IHdvdWxkIGJlIHVuYWZmZWN0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIHRvIHRoaXMgbGFiZWwgcHJvdmlkZXIuCi0JICogSGFzIG5vIGFmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBsYWJlbCBwcm92aWRlciBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9DYXRlZ29yeVRhYmxlVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9DYXRlZ29yeVRhYmxlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YzdkZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vQ2F0ZWdvcnlUYWJsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmF1ZGlvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeVRhYmxlVmlld2VyIGV4dGVuZHMgQ2hlY2tib3hUYWJsZVZpZXdlciB7Ci0JcHJvdGVjdGVkIENvbG9yIGNvbG9yOwotCi0JcHVibGljIENhdGVnb3J5VGFibGVWaWV3ZXIoVGFibGUgdGFibGUpIHsKLQkJc3VwZXIodGFibGUpOwotCQljcmVhdGVDb2xvcih0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29sb3IoQ29udHJvbCBjKSB7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGMuZ2V0RGlzcGxheSgpLCAyNTUsIDI1NSwgMjI1KTsKLQkJYy5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJY29sb3IuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1VwZGF0ZUl0ZW0oV2lkZ2V0IHdpZGdldCwgT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gZnVsbE1hcCkgewotCQlpZiAoY29sb3IgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRhYmxlSXRlbSkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSB3aWRnZXQ7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCWl0ZW0uc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCQl9IGVsc2UKLQkJCQlpdGVtLnNldEJhY2tncm91bmQobnVsbCk7Ci0JCX0KLQkJc3VwZXIuZG9VcGRhdGVJdGVtKHdpZGdldCwgZWxlbWVudCwgZnVsbE1hcCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0lNZW1lbnRvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9JTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjE0OWY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0lNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hdWRpbzsKLS8qKgotICogSW50ZXJmYWNlIHRvIGEgbWVtZW50byB1c2VkIGZvciBzYXZpbmcgdGhlIGltcG9ydGFudCBzdGF0ZSBvZiBhbiBvYmplY3QKLSAqIGluIGEgZm9ybSB0aGF0IGNhbiBiZSBwZXJzaXN0ZWQgaW4gdGhlIGZpbGUgc3lzdGVtLgotICogPHA+Ci0gKiBNZW1lbnRvcyB3ZXJlIGRlc2lnbmVkIHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgaW4gbWluZDoKLSAqIDxvbD4KLSAqICA8bGk+Q2VydGFpbiBvYmplY3RzIG5lZWQgdG8gYmUgc2F2ZWQgYW5kIHJlc3RvcmVkIGFjcm9zcyBwbGF0Zm9ybSBzZXNzaW9ucy4KLSAqICAgIDwvbGk+Ci0gKiAgPGxpPldoZW4gYW4gb2JqZWN0IGlzIHJlc3RvcmVkLCBhbiBhcHByb3ByaWF0ZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1pZ2h0IG5vdAotICogICAgYmUgYXZhaWxhYmxlLiBJdCBtdXN0IGJlIHBvc3NpYmxlIHRvIHNraXAgYW4gb2JqZWN0IGluIHRoaXMgY2FzZS48L2xpPgotICogIDxsaT5XaGVuIGFuIG9iamVjdCBpcyByZXN0b3JlZCwgdGhlIGFwcHJvcHJpYXRlIGNsYXNzIGZvciB0aGUgb2JqZWN0IG1heSBiZQotICogICAgZGlmZmVyZW50IGZyb20gdGhlIG9uZSB3aGVuIHRoZSBvYmplY3Qgd2FzIG9yaWdpbmFsbHkgc2F2ZWQuIElmIHNvLCB0aGUKLSAqICAgIG5ldyBjbGFzcyBzaG91bGQgc3RpbGwgYmUgYWJsZSB0byByZWFkIHRoZSBvbGQgZm9ybSBvZiB0aGUgZGF0YS48L2xpPgotICogPC9vbD4KLSAqIDwvcD4KLSAqIDxwPgotICogTWVtZW50b3MgbWVldCB0aGVzZSByZXF1aXJlbWVudHMgYnkgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIHN0b3JpbmcgYQotICogbWFwcGluZyBvZiBhcmJpdHJhcnkgc3RyaW5nIGtleXMgdG8gcHJpbWl0aXZlIHZhbHVlcywgYW5kIGJ5IGFsbG93aW5nCi0gKiBtZW1lbnRvcyB0byBoYXZlIG90aGVyIG1lbWVudG9zIGFzIGNoaWxkcmVuIChhcnJhbmdlZCBpbnRvIGEgdHJlZSkuCi0gKiBBIHJvYnVzdCBleHRlcm5hbCBzdG9yYWdlIGZvcm1hdCBiYXNlZCBvbiBYTUwgaXMgdXNlZC4KLSAqIDwvcD48cD4KLSAqIFRoZSBrZXkgZm9yIGFuIGF0dHJpYnV0ZSBtYXkgYmUgYW55IGFscGhhIG51bWVyaWMgdmFsdWUuICBIb3dldmVyLCB0aGUKLSAqIHZhbHVlIG9mIDxjb2RlPlRBR19JRDwvY29kZT4gaXMgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZS4KLSAqIDwvcD48cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZW1lbnRvIHsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNoaWxkIG9mIHRoaXMgbWVtZW50byB3aXRoIHRoZSBnaXZlbiB0eXBlLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5nZXRDaGlsZDwvY29kZT4gYW5kIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiBtZXRob2RzCi0JICogYXJlIHVzZWQgdG8gcmV0cmlldmUgY2hpbGRyZW4gb2YgYSBnaXZlbiB0eXBlLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlCi0JICogQHJldHVybiBhIG5ldyBjaGlsZCBtZW1lbnRvCi0JICogQHNlZSAjZ2V0Q2hpbGQKLQkgKiBAc2VlICNnZXRDaGlsZHJlbgotCSAqLwotCXB1YmxpYyBJTWVtZW50byBjcmVhdGVDaGlsZChTdHJpbmcgdHlwZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCB3aXRoIHRoZSBnaXZlbiB0eXBlIGlkLgotCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgaWQKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBjaGlsZCB3aXRoIHRoZSBnaXZlbiB0eXBlCi0JICovCi0JcHVibGljIElNZW1lbnRvIGdldENoaWxkKFN0cmluZyB0eXBlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBjaGlsZHJlbiB3aXRoIHRoZSBnaXZlbiB0eXBlIGlkLgotCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgaWQKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNoaWxkcmVuIHdpdGggdGhlIGdpdmVuIHR5cGUKLQkgKi8KLQlwdWJsaWMgSU1lbWVudG9bXSBnZXRDaGlsZHJlbihTdHJpbmcgdHlwZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEByZXR1cm4gdGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IHdhcyBub3QgZm91bmQgb3Igd2FzIGZvdW5kCi0JICogIGJ1dCB3YXMgbm90IGFuIGludGVnZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIHN0cmluZy4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9Tb3VuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vU291bmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUyOTQzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9Tb3VuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hdWRpbzsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLS8qKgotICogQSBzaW5nbGUgc291bmQuCi0gKi8KLWNsYXNzIFNvdW5kIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGlkOwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQlwdWJsaWMgVVJMIGxvY2F0aW9uOwotCXByb3RlY3RlZCBTdHJpbmcgY2F0ZWdvcnk7Ci0KLQkvKioKLQkgKiBTb3VuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTb3VuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTb3VuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBpZCBhbiBpZAotCSAqIEBwYXJhbSBjYXRlZ29yeSBhIGNhdGVnb3J5Ci0JICogQHBhcmFtIG5hbWUgYSBuYW1lCi0JICogQHBhcmFtIGxvYyBsb2NhdGlvbgotCSAqLwotCXB1YmxpYyBTb3VuZChTdHJpbmcgaWQsIFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG5hbWUsIFVSTCBsb2MpIHsKLQkJc3VwZXIoKTsKLQkKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2M7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5hdWRpby5DYXRlZ29yeQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLm5ldC5VUkwKLQkgKi8KLQlwdWJsaWMgVVJMIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Q2F0ZWdvcnkgb3JnLmVjbGlwc2UuYXVkaW8uQ2F0ZWdvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeShTdHJpbmcgbmV3Q2F0ZWdvcnkpIHsKLQkJY2F0ZWdvcnkgPSBuZXdDYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SWQgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlpZCA9IG5ld0lkOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdMb2NhdGlvbiBqYXZhLm5ldC5VUkwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihVUkwgbmV3TG9jYXRpb24pIHsKLQkJbG9jYXRpb24gPSBuZXdMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3TmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQluYW1lID0gbmV3TmFtZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vWE1MTWVtZW50by5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vWE1MTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTBjYmFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL1hNTE1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW87Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0vKioKLSAqIEEgTWVtZW50byBpcyBhIGNsYXNzIGluZGVwZW5kZW50IGNvbnRhaW5lciBmb3IgcGVyc2lzdGVuY2UKLSAqIGluZm8uICBJdCBpcyBhIHJlZmxlY3Rpb24gb2YgMyBzdG9yYWdlIHJlcXVpcmVtZW50cy4KLSAqCi0gKiAxKSAgIFdlIG5lZWQgdGhlIGFiaWxpdHkgdG8gcGVyc2lzdCBhbiBvYmplY3QgYW5kIHJlc3RvcmUgaXQuICAKLSAqIDIpICAgVGhlIGNsYXNzIGZvciBhbiBvYmplY3QgbWF5IGJlIGFic2VudC4gIElmIHNvIHdlIHdvdWxkIAotICogICAgICBsaWtlIHRvIHNraXAgdGhlIG9iamVjdCBhbmQga2VlcCByZWFkaW5nLiAKLSAqIDMpICAgVGhlIGNsYXNzIGZvciBhbiBvYmplY3QgbWF5IGNoYW5nZS4gIElmIHNvIHRoZSBuZXcgY2xhc3MgCi0gKiAgICAgIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgdGhlIG9sZCBwZXJzaXN0ZW5jZSBpbmZvLgotICoKLSAqIFdlIGNvdWxkIGFzayB0aGUgb2JqZWN0cyB0byBzZXJpYWxpemUgdGhlbXNlbHZlcyBpbnRvIGFuIAotICogT2JqZWN0T3V0cHV0U3RyZWFtLCBEYXRhT3V0cHV0U3RyZWFtLCBvciBIYXNodGFibGUuICBIb3dldmVyIAotICogYWxsIG9mIHRoZXNlIGFwcHJvYWNoZXMgZmFpbCB0byBtZWV0IHRoZSBzZWNvbmQgcmVxdWlyZW1lbnQuCi0gKgotICogTWVtZW50byBzdXBwb3J0cyBiaW5hcnkgcGVyc2lzdGVuY2Ugd2l0aCBhIHZlcnNpb24gSUQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxNZW1lbnRvIGltcGxlbWVudHMgSU1lbWVudG8gewotCXByaXZhdGUgRG9jdW1lbnQgZmFjdG9yeTsKLQlwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLQotCS8qKgotCSAqIEFuc3dlciBhIG1lbWVudG8gZm9yIHRoZSBkb2N1bWVudCBhbmQgZWxlbWVudC4gIEZvciBzaW1wbGljaXR5Ci0JICogeW91IHNob3VsZCB1c2UgY3JlYXRlUmVhZFJvb3QgYW5kIGNyZWF0ZVdyaXRlUm9vdCB0byBjcmVhdGUgdGhlIGluaXRpYWwKLQkgKiBtZW1lbnRvcyBvbiBhIGRvY3VtZW50LgotCSAqLwotCXByaXZhdGUgWE1MTWVtZW50byhEb2N1bWVudCBkb2MsIEVsZW1lbnQgZWwpIHsKLQkJZmFjdG9yeSA9IGRvYzsKLQkJZWxlbWVudCA9IGVsOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gY3JlYXRlQ2hpbGQoU3RyaW5nIHR5cGUpIHsKLQkJRWxlbWVudCBjaGlsZCA9IGZhY3RvcnkuY3JlYXRlRWxlbWVudCh0eXBlKTsKLQkJZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCXJldHVybiBuZXcgWE1MTWVtZW50byhmYWN0b3J5LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgRG9jdW1lbnQgZnJvbSBhIFJlYWRlciBhbmQgYW5zd2VyIGEgcm9vdCBtZW1lbnRvIGZvciByZWFkaW5nIAotCSAqIGEgZG9jdW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBYTUxNZW1lbnRvIGNyZWF0ZVJlYWRSb290KFJlYWRlciByZWFkZXIpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlkb2N1bWVudCA9IHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UocmVhZGVyKSk7Ci0JCQlOb2RlIG5vZGUgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGRvY3VtZW50LCAoRWxlbWVudCkgbm9kZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSByb290IG1lbWVudG8gZm9yIHdyaXRpbmcgYSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSBhIHR5cGUKLQkgKiBAcmV0dXJuIGEgbWVtZW50bwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgWE1MTWVtZW50byBjcmVhdGVXcml0ZVJvb3QoU3RyaW5nIHR5cGUpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQ7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudCA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotCQkJRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKTsKLQkJCWRvY3VtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpOwotCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGRvY3VtZW50LCBlbGVtZW50KTsgICAgICAgICAgICAKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIElNZW1lbnRvIGdldENoaWxkKFN0cmluZyB0eXBlKSB7Ci0JCQotCQkvLyBHZXQgdGhlIG5vZGVzLgotCQlOb2RlTGlzdCBub2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOwotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCi0JCS8vIEZpbmQgdGhlIGZpcnN0IG5vZGUgd2hpY2ggaXMgYSBjaGlsZCBvZiB0aGlzIG5vZGUuCi0JCWZvciAoaW50IG5YID0gMDsgblggPCBzaXplOyBuWCArKykgewotCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShuWCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlFbGVtZW50IGVsZW1lbnQyID0gKEVsZW1lbnQpbm9kZTsKLQkJCQlpZiAoZWxlbWVudDIuZ2V0Tm9kZU5hbWUoKS5lcXVhbHModHlwZSkpCi0JCQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhmYWN0b3J5LCBlbGVtZW50Mik7Ci0JCQl9Ci0JCX0KLQkKLQkJLy8gQSBjaGlsZCB3YXMgbm90IGZvdW5kLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIElNZW1lbnRvIFtdIGdldENoaWxkcmVuKFN0cmluZyB0eXBlKSB7Ci0JCi0JCS8vIEdldCB0aGUgbm9kZXMuCi0JCU5vZGVMaXN0IG5vZGVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gbmV3IElNZW1lbnRvWzBdOwotCQotCQkvLyBFeHRyYWN0IGVhY2ggbm9kZSB3aXRoIGdpdmVuIHR5cGUuCi0JCUxpc3Q8RWxlbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudD4oc2l6ZSk7Ci0JCWZvciAoaW50IG5YID0gMDsgblggPCBzaXplOyBuWCArKykgewotCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShuWCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlFbGVtZW50IGVsZW1lbnQyID0gKEVsZW1lbnQpbm9kZTsKLQkJCQlpZiAoZWxlbWVudDIuZ2V0Tm9kZU5hbWUoKS5lcXVhbHModHlwZSkpCi0JCQkJCWxpc3QuYWRkKGVsZW1lbnQyKTsKLQkJCX0KLQkJfQotCQotCQkvLyBDcmVhdGUgYSBtZW1lbnRvIGZvciBlYWNoIG5vZGUuCi0JCXNpemUgPSBsaXN0LnNpemUoKTsKLQkJSU1lbWVudG8gW10gcmVzdWx0cyA9IG5ldyBJTWVtZW50b1tzaXplXTsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBzaXplOyB4ICsrKSB7Ci0JCQlyZXN1bHRzW3hdID0gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgbGlzdC5nZXQoeCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGtleSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgCi0JCXJldHVybiBhdHRyLmdldFZhbHVlKCk7Ci0JfQotCQotCS8qKgotCSAqIExvYWRzIGEgbWVtZW50byBmcm9tIHRoZSBnaXZlbiBmaWxlbmFtZS4KLQkgKgotCSAqIEBwYXJhbSBpbiBqYXZhLmlvLklucHV0U3RyZWFtCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS51aS5JTWVtZW50bwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1lbWVudG8gbG9hZE1lbWVudG8oSW5wdXRTdHJlYW0gaW4pIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlkb2N1bWVudCA9IHBhcnNlci5wYXJzZShpbik7Ci0JCQlOb2RlIG5vZGUgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGRvY3VtZW50LCAoRWxlbWVudCkgbm9kZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIHZvaWQgcHV0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGlzIE1lbWVudG8gdG8gYSBXcml0ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG9zKTsKLQkJU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZmFjdG9yeSk7Ci0JCXRyeSB7Ci0JCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOyAvLyROT04tTkxTLTEkCi0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsgICAgICAgICAgICAKLQkJfQotCQljYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IChJT0V4Y2VwdGlvbikgKG5ldyBJT0V4Y2VwdGlvbigpLmluaXRDYXVzZShlKSk7Ci0JCX0KLQkJY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IChJT0V4Y2VwdGlvbikgKG5ldyBJT0V4Y2VwdGlvbigpLmluaXRDYXVzZShlKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY25mL0NORk1hbmFnZWRVSURlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY25mL0NORk1hbmFnZWRVSURlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2NlMmZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NuZi9DTkZNYW5hZ2VkVUlEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jbmY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5VSURlY29yYXRvcjsKLQotcHVibGljIGNsYXNzIENORk1hbmFnZWRVSURlY29yYXRvciBleHRlbmRzIFVJRGVjb3JhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzZXJ2ZXJTdGF0ZVVubWFuYWdlZCA9IG5ldyBTdHJpbmdbXSB7Ci0JCSIiLAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRpbmc0LAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRlZDIsCi0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGluZzQsCi0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGVkMn07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VbXSBzdGFydGluZ0ltYWdlczsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3JbXSBzdGFydGluZ0ltYWdlc0Rlc2NyaXB0b3I7CQotCXByaXZhdGUgc3RhdGljIEltYWdlW10gc3RvcHBpbmdJbWFnZXM7Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yW10gc3RvcHBpbmdJbWFnZXNEZXNjcmlwdG9yOwotCQotCXByaXZhdGUgc3RhdGljIEltYWdlW10gc3RhcnRpbmdJbWFnZXNPdmVybGF5OwkKLQlwcml2YXRlIHN0YXRpYyBJbWFnZVtdIHN0b3BwaW5nSW1hZ2VzT3ZlcmxheTsKLQotCQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIHZhcmlhYmxlcyBmb3IgdGhpcyBjbGFzcwotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoKXsKLQkJbG9hZEltYWdlcygpOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkIHRoZSBTZXJ2ZXIgc3RhcnRpbmcgaW1hZ2VzLiAKLQkgKiBOT1RFOiBUaGlzIGlzIGRvbmUgc28gdGhhdCB3ZSBkb24ndCBpbml0aWFsaXplIHRoZSBpbWFnZXMgd2hlbiBhIGxhYmVsIGlzIGJlaW5nIHJlcXVlc3RlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRJbWFnZXMoKXsKLQkJaWYgKHN0YXJ0aW5nSW1hZ2VzID09IG51bGwpewotCQkJc3RhcnRpbmdJbWFnZXMgPSBuZXcgSW1hZ2VbXSB7Ci0JCQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMSksCi0JCQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMiksCi0JCQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMykKLQkJCX07Ci0JCQkKLQkJCXN0YXJ0aW5nSW1hZ2VzRGVzY3JpcHRvciA9IG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7Ci0JCQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzEpLAotCQkJCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18yKSwKLQkJCQlJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMykKLQkJCX07Ci0JCQkKLQkJCXN0b3BwaW5nSW1hZ2VzID0gbmV3IEltYWdlW10gewotCQkJCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzEpLAotCQkJCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzIpLAotCQkJCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzIpCi0JCQl9OwotCQkJCi0JCQlzdG9wcGluZ0ltYWdlc0Rlc2NyaXB0b3IgPSBuZXcgSW1hZ2VEZXNjcmlwdG9yW10gewotCQkJCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18xKSwKLQkJCQlJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMiksCi0JCQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzMpCi0JCQl9OwotCQkJCQkKLQkJCS8vIG92ZXJsYXkgaWNvbnMKLQkJCXN0YXJ0aW5nSW1hZ2VzT3ZlcmxheSA9IG5ldyBJbWFnZVtdIHsKLQkJCQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMV9PVkVSTEFZKSwKLQkJCQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMl9PVkVSTEFZKSwKLQkJCQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfM19PVkVSTEFZKQotCQkJCX07CQkJCi0JCQkJCi0JCQlzdG9wcGluZ0ltYWdlc092ZXJsYXkgPSBuZXcgSW1hZ2VbXSB7Ci0JCQkJCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzFfT1ZFUkxBWSksCi0JCQkJCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzJfT1ZFUkxBWSksCi0JCQkJCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzJfT1ZFUkxBWSkKLQkJCQl9OwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBVSURlY29yYXRvciNnZXRTdGF0ZUxhYmVsKGludCwgU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdGF0ZUxhYmVsKGludCBzdGF0ZSwgU3RyaW5nIG1vZGUsIGludCBjb3VudCkgewotCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKQotCQkJcmV0dXJuICIiOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKQotCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGluZzsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUElORykKLQkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBpbmc7Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewotCQkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQotCQkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRlZERlYnVnOwotCQkJZWxzZSBpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSkKLQkJCQlyZXR1cm4gTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWRQcm9maWxlOwotCQkJZWxzZQotCQkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRlZDsKLQkJfSBlbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm4gTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwZWQ7Ci0JCQotCQlyZXR1cm4gc2VydmVyU3RhdGVVbm1hbmFnZWRbc3RhdGVdOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlVJRGVjb3JhdG9yI2dldFN0YXRlSW1hZ2UoaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIEltYWdlIGdldFN0YXRlSW1hZ2UoaW50IHN0YXRlLCBTdHJpbmcgbW9kZSwgaW50IGNvdW50KSB7Ci0JCS8vIE9ubHkgaW5pdGlhbGl6ZSB0aGUgaW1hZ2VzIHdoZW4gYW4gaW1hZ2UgaXMgcmVxdWlyZWQKLQkJaW5pdCgpOwotCQkKLQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKQotCQkJcmV0dXJuIHN0YXJ0aW5nSW1hZ2VzW2NvdW50XTsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUElORykKLQkJCXJldHVybiBzdG9wcGluZ0ltYWdlc1tjb3VudF07Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVE9QUEVEKTsKLQkJZWxzZSB7IC8vaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewotCQkJLy9TdHJpbmcgbW9kZSA9IHNlcnZlci5nZXRNb2RlKCk7Ci0JCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfREVCVUcpOwotCQkJZWxzZSBpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSkKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRFRF9QUk9GSUxFKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRFRCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5VSURlY29yYXRvciNnZXRTdGF0ZUltYWdlKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRTdGF0ZUltYWdlT3ZlcmxheShpbnQgc3RhdGUsIFN0cmluZyBtb2RlLCBpbnQgY291bnQpIHsKLQkJLy8gT25seSBpbml0aWFsaXplIHRoZSBpbWFnZXMgd2hlbiBhbiBpbWFnZSBpcyByZXF1aXJlZAotCQlpbml0KCk7Ci0JCQotCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkcpCi0JCQlyZXR1cm4gc3RhcnRpbmdJbWFnZXNPdmVybGF5W2NvdW50XTsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUElORykKLQkJCXJldHVybiBzdG9wcGluZ0ltYWdlc092ZXJsYXlbY291bnRdOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RPUFBFRF9PVkVSTEFZKTsKLQkJZWxzZSB7IC8vaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewotCQkJLy9TdHJpbmcgbW9kZSA9IHNlcnZlci5nZXRNb2RlKCk7Ci0JCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfREVCVUdfT1ZFUkxBWSk7Ci0JCQllbHNlIGlmIChJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKG1vZGUpKQotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEX1BST0ZJTEVfT1ZFUkxBWSk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfT1ZFUkxBWSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlVJRGVjb3JhdG9yI2dldFN0YXRlSW1hZ2VEZXNjcmlwdG9yKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0U3RhdGVJbWFnZURlc2NyaXB0b3IoaW50IHN0YXRlLCBTdHJpbmcgbW9kZSwgaW50IGNvdW50KSB7Ci0JCS8vIE9ubHkgaW5pdGlhbGl6ZSB0aGUgaW1hZ2VzIHdoZW4gYW4gaW1hZ2UgaXMgcmVxdWlyZWQKLQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKQotCQkJcmV0dXJuIHN0YXJ0aW5nSW1hZ2VzRGVzY3JpcHRvcltjb3VudF07Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpCi0JCQlyZXR1cm4gc3RvcHBpbmdJbWFnZXNEZXNjcmlwdG9yW2NvdW50XTsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVE9QUEVEKTsKLQkJZWxzZSB7IC8vaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewotCQkJLy9TdHJpbmcgbW9kZSA9IHNlcnZlci5nZXRNb2RlKCk7Ci0JCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEX0RFQlVHKTsKLQkJCWVsc2UgaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEX1BST0ZJTEUpOwotCQkJZWxzZQotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRFRCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNb2R1bGVOYW1lKCkgewotCQlyZXR1cm4gIm1vZHVsZSI7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhblJlc3RhcnQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jbmYvQ29tcG9zaXRlU2VydmVySW1hZ2VEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jbmYvQ29tcG9zaXRlU2VydmVySW1hZ2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YmNmYzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY25mL0NvbXBvc2l0ZVNlcnZlckltYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jbmY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotCi0vKioKLSAqIEEgQ29tcG9zaXRlU2VydmVySW1hZ2VEZXNjcmlwdG9yIGNvbnNpc3RzIG9mIGEgbWFpbiBpY29uIGFuZCBvbmUgb3ZlcmxheS4gVGhlIG92ZXJsYXkgd2lsbCBiZQotICogIGNyZWF0ZWQgYXQgdGhlIGJvdHRvbSByaWdodCBvZiB0aGUgYmFzZSBpbWFnZQotICogCi0gKi8KLQotcHVibGljIGNsYXNzIENvbXBvc2l0ZVNlcnZlckltYWdlRGVzY3JpcHRvciBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciB7Ci0JcHJpdmF0ZSBJbWFnZSBmQmFzZUltYWdlOwotCXByaXZhdGUgUG9pbnQgZlNpemU7Ci0JcHJpdmF0ZSBJbWFnZSBvdmVybGF5OwotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBDb21wb3NpdGVTZXJ2ZXJJbWFnZURlc2NyaXB0b3Igd2l0aCB0aGUgYmFzZSBpY29uIGJlaW5nIHRoZSBTZXJ2ZXJUeXBlIGltYWdlIAotCSAqIHByb3ZpZGVkIGJ5IHRoZSBhZG9wdGVyCi0JICogCi0JICogQHBhcmFtIGJhc2VJbWFnZQotCSAqIEBwYXJhbSBvdmVybGF5Ci0JICovCi0JcHVibGljIENvbXBvc2l0ZVNlcnZlckltYWdlRGVzY3JpcHRvcihmaW5hbCBJU2VydmVyIHNlcnZlciwgSW1hZ2Ugb3ZlcmxheSkgewotCQlzZXRCYXNlSW1hZ2UoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpKTsKLQkJaWYgKG92ZXJsYXkgPT0gbnVsbCl7Ci0JCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIkludmFsaWQgb3ZlcmxheSBpY29uIik7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5vdmVybGF5ID0gb3ZlcmxheTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IENvbXBvc2l0ZVNlcnZlckltYWdlRGVzY3JpcHRvciB3aXRoIHRoZSBiYXNlIGljb24gYmVpbmcgdGhlIFNlcnZlclR5cGUgaW1hZ2UgCi0JICogcHJvdmlkZWQgYnkgdGhlIGFkb3B0ZXIKLQkgKiAKLQkgKiBAcGFyYW0gYmFzZUltYWdlCi0JICogQHBhcmFtIG92ZXJsYXkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlU2VydmVySW1hZ2VEZXNjcmlwdG9yKGZpbmFsIEltYWdlIGJhc2VJbWFnZSwgSW1hZ2Ugb3ZlcmxheSkgewotCQlzZXRCYXNlSW1hZ2UoYmFzZUltYWdlKTsKLQkJaWYgKG92ZXJsYXkgPT0gbnVsbCl7Ci0JCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIkludmFsaWQgb3ZlcmxheSBpY29uIik7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5vdmVybGF5ID0gb3ZlcmxheTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBAc2VlIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciNnZXRTaXplKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpIHsKLQkJaWYgKGZTaXplID09IG51bGwpIHsKLQkJCUltYWdlRGF0YSBkYXRhID0gZ2V0QmFzZUltYWdlKCkuZ2V0SW1hZ2VEYXRhKCk7Ci0JCQlzZXRTaXplKG5ldyBQb2ludChkYXRhLndpZHRoLCBkYXRhLmhlaWdodCkpOwotCQl9Ci0JCXJldHVybiBmU2l6ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgQ29tcG9zaXRlU2VydmVySW1hZ2VEZXNjcmlwdG9yKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlDb21wb3NpdGVTZXJ2ZXJJbWFnZURlc2NyaXB0b3Igb3RoZXIgPSAoQ29tcG9zaXRlU2VydmVySW1hZ2VEZXNjcmlwdG9yKSBvYmplY3Q7Ci0JCXJldHVybiAoZ2V0QmFzZUltYWdlKCkuZXF1YWxzKG90aGVyLmdldEJhc2VJbWFnZSgpKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0QmFzZUltYWdlKCkuaGFzaENvZGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IjZHJhd0NvbXBvc2l0ZUltYWdlKGludCwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJSW1hZ2VEYXRhIGJnID0gZ2V0QmFzZUltYWdlKCkuZ2V0SW1hZ2VEYXRhKCk7Ci0JCWlmIChiZyA9PSBudWxsKQotCQkJYmcgPSBERUZBVUxUX0lNQUdFX0RBVEE7Ci0KLQkJZHJhd0ltYWdlKGJnLCAwLCAwKTsKLQkJZHJhd092ZXJsYXlzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHJhd092ZXJsYXlzKCkgewotCQlpZiAob3ZlcmxheSA9PSBudWxsKXsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSW1hZ2VEYXRhIGRhdGEgPSBvdmVybGF5LmdldEltYWdlRGF0YSgpOwotCQlpbnQgeCA9IGdldFNpemUoKS54IC0gZGF0YS53aWR0aDsKLQkJaW50IHkgPSBnZXRTaXplKCkueSAtIGRhdGEuaGVpZ2h0OwotCQlkcmF3SW1hZ2UoZGF0YSwgeCwgeSk7Ci0JfQotCQotCXByb3RlY3RlZCBJbWFnZSBnZXRCYXNlSW1hZ2UoKSB7Ci0JCXJldHVybiBmQmFzZUltYWdlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEJhc2VJbWFnZShJbWFnZSBiYXNlSW1hZ2UpIHsKLQkJZkJhc2VJbWFnZSA9IGJhc2VJbWFnZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTaXplKFBvaW50IHNpemUpIHsKLQkJZlNpemUgPSBzaXplOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jbmYvU2VydmVyQWN0aW9uUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NuZi9TZXJ2ZXJBY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2I5MjUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NuZi9TZXJ2ZXJBY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gQmFzZSBDb2RlCi0gKiAgICAgUmVkIEhhdCAtIFJlZmFjdG9yIGZvciBDTkYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNuZjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5UcmlnZ2VyU2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmtleXMuSUJpbmRpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnMuTmV3U2VydmVyV2l6YXJkQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLio7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJBY3Rpb25Qcm92aWRlciBleHRlbmRzIENvbW1vbkFjdGlvblByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfTUVOVV9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNuZi5uZXdNZW51SWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfSU5fTUVOVV9JRCA9ICJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0ZS5zaG93SW5RdWlja01lbnUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUF9TRUNUSU9OX1NUQVJUX1NFUEFSQVRPUiA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNuZi50b3BTZWN0aW9uU3RhcnQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUF9TRUNUSU9OX0VORF9TRVBBUkFUT1IgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jbmYudG9wU2VjdGlvbkVuZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9TRUNUSU9OX1NUQVJUX1NFUEFSQVRPUiA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNuZmVkaXRTZWN0aW9uU3RhcnQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfU0VDVElPTl9FTkRfU0VQQVJBVE9SID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY25mLmVkaXRTZWN0aW9uRW5kIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MX1NFUlZFUl9TRUNUSU9OX1NUQVJUX1NFUEFSQVRPUiA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNuZi5jb250cm9sU2VydmVyU2VjdGlvblN0YXJ0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MX1NFUlZFUl9TRUNUSU9OX0VORF9TRVBBUkFUT1IgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jbmYuY29udHJvbFNlcnZlclNlY3Rpb25FbmQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9FVENfU0VDVElPTl9TVEFSVF9TRVBBUkFUT1IgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jbmYuc2VydmVyRXRjU2VjdGlvblN0YXJ0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfRVRDX1NFQ1RJT05fRU5EX1NFUEFSQVRPUiA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNuZi5zZXJ2ZXJFdGNTZWN0aW9uRW5kIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MX01PRFVMRV9TRUNUSU9OX1NUQVJUX1NFUEFSQVRPUiA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNuZi5jb250cm9sTW9kdWxlU2VjdGlvblN0YXJ0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MX01PRFVMRV9TRUNUSU9OX0VORF9TRVBBUkFUT1IgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jbmYuY29udHJvbE1vZHVsZVNlY3Rpb25FbmQiOwotCQotCXByaXZhdGUgSUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGUgYWN0aW9uU2l0ZTsKLQlwcml2YXRlIENsaXBib2FyZCBjbGlwYm9hcmQ7Ci0JcHVibGljIFNlcnZlckFjdGlvblByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KElDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlIGFTaXRlKSB7Ci0JCXN1cGVyLmluaXQoYVNpdGUpOwotCQl0aGlzLmFjdGlvblNpdGUgPSBhU2l0ZTsKLQkJSUNvbW1vblZpZXdlclNpdGUgc2l0ZSA9IGFTaXRlLmdldFZpZXdTaXRlKCk7Ci0JCWlmKCBzaXRlIGluc3RhbmNlb2YgSUNvbW1vblZpZXdlcldvcmtiZW5jaFNpdGUgKSB7Ci0JCQlTdHJ1Y3R1cmVkVmlld2VyIHYgPSBhU2l0ZS5nZXRTdHJ1Y3R1cmVkVmlld2VyKCk7Ci0JCQlpZiggdiBpbnN0YW5jZW9mIENvbW1vblZpZXdlciApIHsKLQkJCQlDb21tb25WaWV3ZXIgY3YgPSAoQ29tbW9uVmlld2VyKXY7Ci0JCQkJSUNvbW1vblZpZXdlcldvcmtiZW5jaFNpdGUgd3NTaXRlID0gKElDb21tb25WaWV3ZXJXb3JrYmVuY2hTaXRlKXNpdGU7Ci0JCQkJYWRkTGlzdGVuZXJzKGN2KTsKLQkJCQltYWtlU2VydmVyQWN0aW9ucyhjdiwgd3NTaXRlLmdldFNlbGVjdGlvblByb3ZpZGVyKCkpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyBhY3Rpb25zIG9uIGEgc2VydmVyCi0JcHJvdGVjdGVkIEFjdGlvbltdIGFjdGlvbnM7Ci0JcHJvdGVjdGVkIEFjdGlvbiBhY3Rpb25Nb2RpZnlNb2R1bGVzOwotCXByb3RlY3RlZCBBY3Rpb24gb3BlbkFjdGlvbiwgc2hvd0luQ29uc29sZUFjdGlvbiwgc2hvd0luRGVidWdBY3Rpb24sIHByb3BlcnRpZXNBY3Rpb24sIG1vbml0b3JQcm9wZXJ0aWVzQWN0aW9uOwotCXByb3RlY3RlZCBBY3Rpb24gY29weUFjdGlvbiwgcGFzdGVBY3Rpb24sIGdsb2JhbERlbGV0ZUFjdGlvbiwgcmVuYW1lQWN0aW9uOwotCXByb3RlY3RlZCBBY3Rpb24gbm9uZUFjdGlvbiA9IG5ldyBBY3Rpb24oTWVzc2FnZXMuZGlhbG9nTW9uaXRvck5vbmUpIHsKLQkJLy8gZHVtbXkgYWN0aW9uCi0JfTsKLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoQ29tbW9uVmlld2VyIHRhYmxlVmlld2VyKSB7Ci0JCXRhYmxlVmlld2VyLmFkZE9wZW5MaXN0ZW5lcihuZXcgSU9wZW5MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG9wZW4oT3BlbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJT2JqZWN0IGRhdGEgPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCWlmICghKGRhdGEgaW5zdGFuY2VvZiBJU2VydmVyKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZGF0YTsKLQkJCQkJU2VydmVyVUlQbHVnaW4uZWRpdFNlcnZlcihzZXJ2ZXIpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZCBub3Qgb3BlbiBzZXJ2ZXIiLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBtYWtlU2VydmVyQWN0aW9ucyhDb21tb25WaWV3ZXIgdGFibGVWaWV3ZXIsIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcikgewotCQljbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKHRhYmxlVmlld2VyLmdldFRyZWUoKS5nZXREaXNwbGF5KCkpOwotCQlTaGVsbCBzaGVsbCA9IHRhYmxlVmlld2VyLmdldFRyZWUoKS5nZXRTaGVsbCgpOwotCQkKLQkJYWN0aW9ucyA9IG5ldyBBY3Rpb25bNl07Ci0JCS8vIGNyZWF0ZSB0aGUgc3RhcnQgYWN0aW9ucwotCQlhY3Rpb25zWzBdID0gbmV3IFN0YXJ0QWN0aW9uKHNoZWxsLCBwcm92aWRlciwgSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERSk7Ci0JCWFjdGlvbnNbMV0gPSBuZXcgU3RhcnRBY3Rpb24oc2hlbGwsIHByb3ZpZGVyLCBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7Ci0JCWFjdGlvbnNbMl0gPSBuZXcgU3RhcnRBY3Rpb24oc2hlbGwsIHByb3ZpZGVyLCBJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUpOwotCQkKLQkJLy8gY3JlYXRlIHRoZSBzdG9wIGFjdGlvbgotCQlhY3Rpb25zWzNdID0gbmV3IFN0b3BBY3Rpb24oc2hlbGwsIHByb3ZpZGVyKTsKLQkJCi0JCS8vIGNyZWF0ZSB0aGUgcHVibGlzaCBhY3Rpb25zCi0JCWFjdGlvbnNbNF0gPSBuZXcgUHVibGlzaEFjdGlvbihzaGVsbCwgcHJvdmlkZXIpOwotCQlhY3Rpb25zWzVdID0gbmV3IFB1Ymxpc2hDbGVhbkFjdGlvbihzaGVsbCwgcHJvdmlkZXIpOwotCQkKLQkJLy8gY3JlYXRlIHRoZSBvcGVuIGFjdGlvbgotCQlvcGVuQWN0aW9uID0gbmV3IE9wZW5BY3Rpb24ocHJvdmlkZXIpOwotCi0JCS8vIGNyZWF0ZSBjb3B5LCBwYXN0ZSwgYW5kIGRlbGV0ZSBhY3Rpb25zCi0JCXBhc3RlQWN0aW9uID0gbmV3IFBhc3RlQWN0aW9uKHNoZWxsLCBwcm92aWRlciwgY2xpcGJvYXJkKTsKLQkJY29weUFjdGlvbiA9IG5ldyBDb3B5QWN0aW9uKHByb3ZpZGVyLCBjbGlwYm9hcmQsIHBhc3RlQWN0aW9uKTsKLQkJZ2xvYmFsRGVsZXRlQWN0aW9uID0gbmV3IEdsb2JhbERlbGV0ZUFjdGlvbihzaGVsbCwgcHJvdmlkZXIpOwotCQlyZW5hbWVBY3Rpb24gPSBuZXcgUmVuYW1lQWN0aW9uKHNoZWxsLCB0YWJsZVZpZXdlciwgcHJvdmlkZXIpOwotCQkKLQkJLy8gY3JlYXRlIHRoZSBvdGhlciBhY3Rpb25zCi0JCWFjdGlvbk1vZGlmeU1vZHVsZXMgPSBuZXcgTW9kdWxlU2xvc2hBY3Rpb24oc2hlbGwsIHByb3ZpZGVyKTsKLQkJc2hvd0luQ29uc29sZUFjdGlvbiA9IG5ldyBTaG93SW5Db25zb2xlQWN0aW9uKHByb3ZpZGVyKTsKLQkJc2hvd0luRGVidWdBY3Rpb24gPSBuZXcgU2hvd0luRGVidWdBY3Rpb24ocHJvdmlkZXIpOwotCQkKLQkJLy8gY3JlYXRlIHRoZSBwcm9wZXJ0aWVzIGFjdGlvbgotCQlwcm9wZXJ0aWVzQWN0aW9uID0gbmV3IFByb3BlcnRpZXNBY3Rpb24oc2hlbGwsIHByb3ZpZGVyKTsKLQkJbW9uaXRvclByb3BlcnRpZXNBY3Rpb24gPSBuZXcgUHJvcGVydGllc0FjdGlvbihzaGVsbCwgIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJvcGVydGllcy5tb25pdG9yIiwgcHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmRlYnVnIiwgYWN0aW9uc1swXSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5ydW4iLCBhY3Rpb25zWzFdKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnN0b3AiLCBhY3Rpb25zWzNdKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnB1Ymxpc2giLCBhY3Rpb25zWzRdKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKCJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuT3BlbiIsIG9wZW5BY3Rpb24pOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QUk9QRVJUSUVTLmdldElkKCksIHByb3BlcnRpZXNBY3Rpb24pOwotCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLCBjb3B5QWN0aW9uKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSwgcGFzdGVBY3Rpb24pOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwgZ2xvYmFsRGVsZXRlQWN0aW9uKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVOQU1FLmdldElkKCksIHJlbmFtZUFjdGlvbik7Ci0JCQotCQlJQ29udHJpYnV0aW9uTWFuYWdlciBjbSA9IGFjdGlvbkJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkgICAgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBjaXMgPSBjbS5nZXRJdGVtcygpOwotCSAgICBMaXN0PElBY3Rpb24+IGV4aXN0aW5nQWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsKLQkgICAgZm9yIChJQ29udHJpYnV0aW9uSXRlbSBjaSA6IGNpcykgewotCSAgICAgICAgaWYgKGNpIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgewotCSAgICAgICAgICAgIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYWNpID0gKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGNpOwotCSAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9ucy5hZGQoYWNpLmdldEFjdGlvbigpKTsKLQkgICAgICAgIH0KLQkgICAgfQotCi0JICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGggLSAxOyBpKyspCi0JICAgICAgICBpZiAoIWV4aXN0aW5nQWN0aW9ucy5jb250YWlucyhhY3Rpb25zW2ldKSkKLQkgICAgICAgICAgICBjbS5hZGQoYWN0aW9uc1tpXSk7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCS8vIFRoaXMgaXMgYSB0ZW1wIHdvcmthcm91bmQgdG8gY2xlYW4gdXAgdGhlIGRlZmF1bHQgZ3JvdXAgdGhhdCBhcmUgcHJvdmlkZWQgYnkgQ05GCQkKLQkJbWVudS5yZW1vdmVBbGwoKTsKLQkJCi0JCUlDb21tb25WaWV3ZXJTaXRlIHNpdGUgPSBhY3Rpb25TaXRlLmdldFZpZXdTaXRlKCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0JCVNoZWxsIHNoZWxsID0gYWN0aW9uU2l0ZS5nZXRWaWV3U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCWlmKCBzaXRlIGluc3RhbmNlb2YgSUNvbW1vblZpZXdlcldvcmtiZW5jaFNpdGUgKSB7Ci0JCQlJQ29tbW9uVmlld2VyV29ya2JlbmNoU2l0ZSB3c1NpdGUgPSAoSUNvbW1vblZpZXdlcldvcmtiZW5jaFNpdGUpc2l0ZTsKLQkJCXNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgd3NTaXRlLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCX0KLQotCQlJU2VydmVyIHNlcnZlciA9IG51bGw7Ci0JCUlNb2R1bGVbXSBtb2R1bGUgPSBudWxsOwotCQlBcnJheUxpc3Q8SU1vZHVsZT4gbXVsdGlwbGVNb2R1bGVzT25PbmVTZXJ2ZXIgPSBudWxsOwotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCW11bHRpcGxlTW9kdWxlc09uT25lU2VydmVyID0gZ2V0TXVsdGlwbGVNb2R1bGVzT25PbmVTZXJ2ZXIoc2VsZWN0aW9uKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXIpCi0JCQkJc2VydmVyID0gKElTZXJ2ZXIpIG9iajsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBvYmo7Ci0JCQkJc2VydmVyID0gbXMuc2VydmVyOwotCQkJCW1vZHVsZSA9IG1zLm1vZHVsZTsKLQkJCX0KLQkJCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlzZXJ2ZXIgPSBudWxsOwotCQkJCW1vZHVsZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQltZW51LmFkZChpbnZpc2libGVTZXBhcmF0b3IoVE9QX1NFQ1RJT05fU1RBUlRfU0VQQVJBVE9SKSk7Ci0JCWFkZFRvcFNlY3Rpb24obWVudSwgc2VydmVyLCBtb2R1bGUpOwotCQltZW51LmFkZChpbnZpc2libGVTZXBhcmF0b3IoVE9QX1NFQ1RJT05fRU5EX1NFUEFSQVRPUikpOwotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBtb2R1bGUgPT0gbnVsbCkgewotCQkJbWVudS5hZGQoaW52aXNpYmxlU2VwYXJhdG9yKEVESVRfU0VDVElPTl9TVEFSVF9TRVBBUkFUT1IpKTsKLQkJCW1lbnUuYWRkKGNvcHlBY3Rpb24pOwotCQkJbWVudS5hZGQocGFzdGVBY3Rpb24pOwotCQkJbWVudS5hZGQoZ2xvYmFsRGVsZXRlQWN0aW9uKTsKLQkJCW1lbnUuYWRkKHJlbmFtZUFjdGlvbik7Ci0JCQltZW51LmFkZChpbnZpc2libGVTZXBhcmF0b3IoRURJVF9TRUNUSU9OX0VORF9TRVBBUkFUT1IpKTsKLQotCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCQotCQkJbWVudS5hZGQoaW52aXNpYmxlU2VwYXJhdG9yKENPTlRST0xfU0VSVkVSX1NFQ1RJT05fU1RBUlRfU0VQQVJBVE9SKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspCi0JCQkJbWVudS5hZGQoYWN0aW9uc1tpXSk7Ci0JCQltZW51LmFkZChpbnZpc2libGVTZXBhcmF0b3IoQ09OVFJPTF9TRVJWRVJfU0VDVElPTl9FTkRfU0VQQVJBVE9SKSk7Ci0JCQkKLQkJCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQkKLQkJCW1lbnUuYWRkKGludmlzaWJsZVNlcGFyYXRvcihTRVJWRVJfRVRDX1NFQ1RJT05fU1RBUlRfU0VQQVJBVE9SKSk7Ci0JCQltZW51LmFkZChhY3Rpb25Nb2RpZnlNb2R1bGVzKTsKLQkJCWFkZE1vbml0b3Ioc2VydmVyLCBtZW51LCBzaGVsbCk7Ci0JCQltZW51LmFkZChpbnZpc2libGVTZXBhcmF0b3IoU0VSVkVSX0VUQ19TRUNUSU9OX0VORF9TRVBBUkFUT1IpKTsKLQkJCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQkKLQkJfSBlbHNlIGlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBtb2R1bGUgIT0gbnVsbCkgewotCQkJCi0JCQltZW51LmFkZChpbnZpc2libGVTZXBhcmF0b3IoQ09OVFJPTF9NT0RVTEVfU0VDVElPTl9TVEFSVF9TRVBBUkFUT1IpKTsKLQkJCW1lbnUuYWRkKG5ldyBTdGFydE1vZHVsZUFjdGlvbihzZXJ2ZXIsIG1vZHVsZSkpOwotCQkJbWVudS5hZGQobmV3IFN0b3BNb2R1bGVBY3Rpb24oc2VydmVyLCBtb2R1bGUpKTsJCQkKLQkJCW1lbnUuYWRkKG5ldyBSZXN0YXJ0TW9kdWxlQWN0aW9uKHNlcnZlciwgbW9kdWxlKSk7Ci0JCQlpZihtb2R1bGUubGVuZ3RoID09IDEpIHsKLQkJCQltZW51LmFkZChuZXcgUmVtb3ZlTW9kdWxlQWN0aW9uKHNoZWxsLCBzZXJ2ZXIsIG1vZHVsZVswXSkpOwotCQkJfQotCQkJbWVudS5hZGQoaW52aXNpYmxlU2VwYXJhdG9yKENPTlRST0xfTU9EVUxFX1NFQ1RJT05fRU5EX1NFUEFSQVRPUikpOwotCQl9IGVsc2UgaWYoIHNlcnZlciA9PSBudWxsICYmIG1vZHVsZSA9PSBudWxsICYmIG11bHRpcGxlTW9kdWxlc09uT25lU2VydmVyICE9IG51bGwpIHsKLQkJCXNlcnZlciA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSA9PSBudWxsID8gbnVsbCA6ICgoTW9kdWxlU2VydmVyKXNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkuZ2V0U2VydmVyKCk7Ci0JCQltZW51LmFkZChpbnZpc2libGVTZXBhcmF0b3IoQ09OVFJPTF9NT0RVTEVfU0VDVElPTl9TVEFSVF9TRVBBUkFUT1IpKTsKLQkJCW1lbnUuYWRkKG5ldyBSZW1vdmVNb2R1bGVBY3Rpb24oc2hlbGwsIHNlcnZlciwgbXVsdGlwbGVNb2R1bGVzT25PbmVTZXJ2ZXIudG9BcnJheShuZXcgSU1vZHVsZVttdWx0aXBsZU1vZHVsZXNPbk9uZVNlcnZlci5zaXplKCldKSkpOwotCQkJbWVudS5hZGQoaW52aXNpYmxlU2VwYXJhdG9yKENPTlRST0xfTU9EVUxFX1NFQ1RJT05fRU5EX1NFUEFSQVRPUikpOwotCQl9Ci0JCi0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUysiLWVuZCIpKTsKLQkJbWVudS5hZGQocHJvcGVydGllc0FjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiBJZiB0aGUgc2VsZWN0aW9uIGlzIHNldmVyYWwgbW9kdWxlcyB1bmRlciBvbmUgc2VydmVyLCByZXR1cm4KLQkgKiB0aGUgbGlzdCBvZiBNb2R1bGVTZXJ2ZXJbXSBvYmplY3RzCi0JICovCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxJTW9kdWxlPiBnZXRNdWx0aXBsZU1vZHVsZXNPbk9uZVNlcnZlcihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIEdsb2JhbERlbGV0ZUFjdGlvbi5nZXRSZW1vdmFibGVNb2R1bGVMaXN0KHNlbGVjdGlvbik7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9wU2VjdGlvbihJTWVudU1hbmFnZXIgbWVudSwgSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJTWVudU1hbmFnZXIgbmV3TWVudSA9IG5ldyBNZW51TWFuYWdlcihNZXNzYWdlcy5hY3Rpb25OZXcsIE5FV19NRU5VX0lEKTsKLQkJSUFjdGlvbiBuZXdTZXJ2ZXJBY3Rpb24gPSBuZXcgTmV3U2VydmVyV2l6YXJkQWN0aW9uKCk7Ci0JCW5ld1NlcnZlckFjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmFjdGlvbk5ld1NlcnZlcik7Ci0JCW5ld01lbnUuYWRkKG5ld1NlcnZlckFjdGlvbik7Ci0JCW1lbnUuYWRkKG5ld01lbnUpOwotCQkKLQkJLy8gb3BlbiBhY3Rpb24KLQkJaWYgKHNlcnZlciAhPSBudWxsICYmIG1vZHVsZSA9PSBudWxsKSB7Ci0JCQltZW51LmFkZChvcGVuQWN0aW9uKTsKLQkJCQotCQkJU3RyaW5nIHRleHQgPSBNZXNzYWdlcy5hY3Rpb25TaG93SW47Ci0JCQlmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCQlmaW5hbCBJQmluZGluZ1NlcnZpY2UgYmluZGluZ1NlcnZpY2UgPSAoSUJpbmRpbmdTZXJ2aWNlKSB3b3JrYmVuY2gKLQkJCQkJLmdldEFkYXB0ZXIoSUJpbmRpbmdTZXJ2aWNlLmNsYXNzKTsKLQkJCWZpbmFsIFRyaWdnZXJTZXF1ZW5jZVtdIGFjdGl2ZUJpbmRpbmdzID0gYmluZGluZ1NlcnZpY2UKLQkJCQkJLmdldEFjdGl2ZUJpbmRpbmdzRm9yKFNIT1dfSU5fTUVOVV9JRCk7Ci0JCQlpZiAoYWN0aXZlQmluZGluZ3MubGVuZ3RoID4gMCkgewotCQkJCXRleHQgKz0gIlx0IiArIGFjdGl2ZUJpbmRpbmdzWzBdLmZvcm1hdCgpOwotCQkJfQotCQkJCi0JCQlNZW51TWFuYWdlciBzaG93SW5NZW51ID0gbmV3IE1lbnVNYW5hZ2VyKHRleHQsIFNIT1dfSU5fTUVOVV9JRCk7Ci0JCQlzaG93SW5NZW51LmFkZChzaG93SW5Db25zb2xlQWN0aW9uKTsKLQkJCXNob3dJbk1lbnUuYWRkKHNob3dJbkRlYnVnQWN0aW9uKTsKLQkJCW1lbnUuYWRkKHNob3dJbk1lbnUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE1vbml0b3IoSVNlcnZlciBzZXJ2ZXIsIElNZW51TWFuYWdlciBtZW51LCBTaGVsbCBzaGVsbCkgewotCi0JCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwpIHsKLQkJCWZpbmFsIE1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKE1lc3NhZ2VzLmFjdGlvbk1vbml0b3IpOwotCQkJCi0JCQlmaW5hbCBJU2VydmVyIHNlcnZlcjIgPSBzZXJ2ZXI7Ci0JCQlmaW5hbCBTaGVsbCBzaGVsbDIgPSBzaGVsbDsKLQkJCW1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCQkJbWVudU1hbmFnZXIucmVtb3ZlQWxsKCk7Ci0JCQkJCWlmIChzZXJ2ZXIyLmdldEFkYXB0ZXIoU2VydmVyRGVsZWdhdGUuY2xhc3MpICE9IG51bGwpIHsKLQkJCQkJCVNlcnZlclBvcnRbXSBwb3J0cyA9IHNlcnZlcjIuZ2V0U2VydmVyUG9ydHMobnVsbCk7Ci0JCQkJCQlpZiAocG9ydHMgIT0gbnVsbCkgewotCQkJCQkJCWludCBzaXplID0gcG9ydHMubGVuZ3RoOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQkJCWlmICghcG9ydHNbaV0uaXNBZHZhbmNlZCgpKQotCQkJCQkJCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBNb25pdG9yU2VydmVyUG9ydEFjdGlvbihzaGVsbDIsIHNlcnZlcjIsIHBvcnRzW2ldKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAobWVudU1hbmFnZXIuaXNFbXB0eSgpKQotCQkJCQkJbWVudU1hbmFnZXIuYWRkKG5vbmVBY3Rpb24pOwotCQkJCQkKLQkJCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQkJCW1lbnVNYW5hZ2VyLmFkZChtb25pdG9yUHJvcGVydGllc0FjdGlvbik7Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCS8vIGFkZCBhbiBpbml0aWFsIG1lbnUgaXRlbSBzbyB0aGF0IHRoZSBtZW51IGFwcGVhcnMgY29ycmVjdGx5Ci0JCQlub25lQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJbWVudU1hbmFnZXIuYWRkKG5vbmVBY3Rpb24pOwotCQkJbWVudS5hZGQobWVudU1hbmFnZXIpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgU2VwYXJhdG9yIGludmlzaWJsZVNlcGFyYXRvcihTdHJpbmcgcykgewotCQlTZXBhcmF0b3Igc2VwID0gbmV3IFNlcGFyYXRvcihzKTsKLQkJc2VwLnNldFZpc2libGUoZmFsc2UpOwotCQlyZXR1cm4gc2VwOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NuZi9TZXJ2ZXJDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NuZi9TZXJ2ZXJDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU3M2M4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jbmYvU2VydmVyQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jbmY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVycy5Nb2R1bGVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLkJhc2VDb250ZW50UHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBCYXNlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXJ7Ci0JLy8gVE9ETyBBbmdlbCBTYXlzOiBOZWVkIHRvIHJldmlldyBpZiB0aGlzIGlzIG5lZWRlZAotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IElOSVRJQUxJWklORyA9IG5ldyBPYmplY3QoKTsKLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQlMaXN0PElTZXJ2ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXI+KCk7Ci0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmICghKChTZXJ2ZXIpc2VydmVyc1tpXSkuaXNQcml2YXRlKCkpCi0JCQkJCWxpc3QuYWRkKHNlcnZlcnNbaV0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCQl0cnkgewotCQkJCUlNb2R1bGVbXSBjaGlsZHJlbiA9IG1zLnNlcnZlci5nZXRDaGlsZE1vZHVsZXMobXMubW9kdWxlLCBudWxsKTsKLQkJCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCQlNb2R1bGVTZXJ2ZXJbXSBtczIgPSBuZXcgTW9kdWxlU2VydmVyW3NpemVdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCWludCBzaXplMiA9IG1zLm1vZHVsZS5sZW5ndGg7Ci0JCQkJCUlNb2R1bGVbXSBtb2R1bGUgPSBuZXcgSU1vZHVsZVtzaXplMiArIDFdOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG1zLm1vZHVsZSwgMCwgbW9kdWxlLCAwLCBzaXplMik7Ci0JCQkJCW1vZHVsZVtzaXplMl0gPSBjaGlsZHJlbltpXTsKLQkJCQkJbXMyW2ldID0gbmV3IE1vZHVsZVNlcnZlcihtcy5zZXJ2ZXIsIG1vZHVsZSk7Ci0JCQkJfQotCQkJCXJldHVybiBtczI7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBlbGVtZW50OwotCQlJTW9kdWxlW10gbW9kdWxlcyA9IHNlcnZlci5nZXRNb2R1bGVzKCk7IAotCQlpbnQgc2l6ZSA9IG1vZHVsZXMubGVuZ3RoOwotCQlNb2R1bGVTZXJ2ZXJbXSBtcyA9IG5ldyBNb2R1bGVTZXJ2ZXJbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQltc1tpXSA9IG5ldyBNb2R1bGVTZXJ2ZXIoc2VydmVyLCBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlc1tpXSB9KTsKLQkJfQotCQlyZXR1cm4gbXM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gbXMuc2VydmVyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQkvLyBDaGVjayBpZiB0aGUgbW9kdWxlIHNlcnZlciBoYXMgY2hpbGQgbW9kdWxlcy4KLQkJCU1vZHVsZVNlcnZlciBjdXJNb2R1bGVTZXJ2ZXIgPSAoTW9kdWxlU2VydmVyKWVsZW1lbnQ7Ci0JCQlJU2VydmVyIGN1clNlcnZlciA9IGN1ck1vZHVsZVNlcnZlci5zZXJ2ZXI7Ci0JCQlJTW9kdWxlW10gY3VyTW9kdWxlID0gY3VyTW9kdWxlU2VydmVyLm1vZHVsZTsKLQkJCWlmIChjdXJTZXJ2ZXIgIT0gbnVsbCAmJiAgY3VyTW9kdWxlICE9IG51bGwpIHsKLQkJCQlJTW9kdWxlW10gY3VyQ2hpbGRNb2R1bGUgPSBjdXJTZXJ2ZXIuZ2V0Q2hpbGRNb2R1bGVzKGN1ck1vZHVsZSwgbnVsbCk7Ci0JCQkJaWYgKGN1ckNoaWxkTW9kdWxlICE9IG51bGwgJiYgY3VyQ2hpbGRNb2R1bGUubGVuZ3RoID4gMCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmKCBlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlciApIHsKLQkJCXJldHVybiAoKElTZXJ2ZXIpIGVsZW1lbnQpLmdldE1vZHVsZXMoKS5sZW5ndGggPiAwOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jbmYvU2VydmVyRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jbmYvU2VydmVyRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZWRhYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY25mL1NlcnZlckRlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIHBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jbmY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdFNlcnZlckxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5VSURlY29yYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyOwotCi1wdWJsaWMgY2xhc3MgU2VydmVyRGVjb3JhdG9yIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3luY1N0YXRlID0gbmV3IFN0cmluZ1tdIHsKLQkJTWVzc2FnZXMudmlld1N5bmNPa2F5LAotCQlNZXNzYWdlcy52aWV3U3luY1Jlc3RhcnQsCi0JCU1lc3NhZ2VzLnZpZXdTeW5jUHVibGlzaCwKLQkJTWVzc2FnZXMudmlld1N5bmNSZXN0YXJ0UHVibGlzaCwKLQkJTWVzc2FnZXMudmlld1N5bmNQdWJsaXNoaW5nfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3luY1N0YXRlVW5tYW5hZ2VkID0gbmV3IFN0cmluZ1tdIHsKLQkJTWVzc2FnZXMudmlld1N5bmNPa2F5MiwKLQkJTWVzc2FnZXMudmlld1N5bmNSZXN0YXJ0MiwKLQkJTWVzc2FnZXMudmlld1N5bmNQdWJsaXNoMiwKLQkJTWVzc2FnZXMudmlld1N5bmNSZXN0YXJ0UHVibGlzaDIsCi0JCU1lc3NhZ2VzLnZpZXdTeW5jUHVibGlzaGluZzJ9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtb2R1bGVQdWJsaXNoU3RhdGUgPSBuZXcgU3RyaW5nW10gewotCQkiIiwKLQkJTWVzc2FnZXMudmlld1N5bmNPa2F5LAotCQlNZXNzYWdlcy52aWV3U3luY1B1Ymxpc2gsCi0JCU1lc3NhZ2VzLnZpZXdTeW5jUHVibGlzaH07Ci0KLQlwcml2YXRlIHN0YXRpYyBTZXJ2ZXJEZWNvcmF0b3IgaW5zdGFuY2U7Ci0JCi0JcHVibGljIHN0YXRpYyBTZXJ2ZXJEZWNvcmF0b3IgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBjb3VudCA9IDA7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFuaW1hdGUoKSB7Ci0JCWNvdW50ID0gKGNvdW50ICsgMSklMzsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Q291bnQoKSB7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0JCi0JcHVibGljIFNlcnZlckRlY29yYXRvcigpIHsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlY29yYXRlKE9iamVjdCBlbGVtZW50LCBJRGVjb3JhdGlvbiBkZWNvcmF0aW9uKSB7Ci0JCWlmKCBlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlciApIHsKLQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpZWxlbWVudDsKLQkJCVN0cmluZyBzdGF0ZSA9IGdldFNlcnZlclN0YXRlTGFiZWwoc2VydmVyICk7Ci0JCQlTdHJpbmcgc3RhdHVzID0gZ2V0U2VydmVyU3RhdHVzTGFiZWwoc2VydmVyICk7Ci0JCQkKLQkJCWRlY29yYXRpb24uYWRkU3VmZml4KGNvbWJpbmUoc3RhdGUsIHN0YXR1cykpOwotCQl9IGVsc2UgaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIgKSB7Ci0JCQlNb2R1bGVTZXJ2ZXIgbW9kdWxlID0gKE1vZHVsZVNlcnZlcillbGVtZW50OwotCQkJU3RyaW5nIHN0YXRlID0gZ2V0TW9kdWxlU3RhdGVUZXh0KG1vZHVsZSk7Ci0JCQlTdHJpbmcgc3RhdHVzID0gZ2V0TW9kdWxlU3RhdHVzVGV4dChtb2R1bGUpOwotCQkJCi0JCQlkZWNvcmF0aW9uLmFkZFN1ZmZpeChjb21iaW5lKHN0YXRlLCBzdGF0dXMpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWRlY29yYXRlKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZChuZXcgTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCh0aGlzKSk7Ci0JfQotCQotCS8qCi0JICogVXRpbGl0eSBtZXRob2RzCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRTZXJ2ZXJJbWFnZShJU2VydmVyIHNlcnZlcikgewotCQlyZXR1cm4gc2VydmVyID09IG51bGwgPyBudWxsIDogCi0JCQlzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpID09IG51bGwgPyBudWxsIDogCi0JCQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotCX0KLQkKLQkvKioKLQkgKiBGaW5kIHRoZSBTZXJ2ZXJMYWJlbFByb3ZpZGVyIGZvciB0aGlzIHNlcnZlciB0eXBlIGFuZCBwcm92aWRlIGEgbGFiZWwuIElmIG5vbmUgYXJlIGZvdW5kCi0JICogYSBkZWZhdWx0IHNlcnZlciBsYWJlbCBwcm92aWRlciB3aWxsIGJlIHByb3ZpZGVkCi0JICogCi0JICogQHBhcmFtIHNlcnZlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2ZXJTdGF0ZUxhYmVsKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCB8fCBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQkKLQkJU3RyaW5nIHN0YXRlTGFiZWw7Ci0JCQotCQlBYnN0cmFjdFNlcnZlckxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcj0gU2VydmVyVUlQbHVnaW4uZ2V0U2VydmVyTGFiZWxQcm92aWRlcihzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotCQlzdGF0ZUxhYmVsID0gIGxhYmVsUHJvdmlkZXIuZ2V0U2VydmVyU3RhdGVMYWJlbChzZXJ2ZXIpOwotCQkKLQkJcmV0dXJuIHN0YXRlTGFiZWw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RhdGVMYWJlbChJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlLCBpbnQgc3RhdGUsIFN0cmluZyBtb2RlKSB7Ci0JCXJldHVybiBzZXJ2ZXJUeXBlID09IG51bGwgPyBudWxsIDogCi0JCQlVSURlY29yYXRvck1hbmFnZXIuZ2V0Q05GVUlEZWNvcmF0b3IoKS5nZXRTdGF0ZUxhYmVsKHN0YXRlLCBtb2RlLCBjb3VudCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZlclN0YXR1c0xhYmVsKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gKChTZXJ2ZXIpIHNlcnZlcikuZ2V0U2VydmVyU3RhdHVzKCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCkKLQkJCXJldHVybiBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkKLQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsKLQotCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKQotCQkJcmV0dXJuICIiOwotCQkKLQkJU3RyaW5nIHNlcnZlcklkID0gc2VydmVyLmdldElkKCk7Ci0JCWlmIChTZXJ2ZXJzVmlldzIucHVibGlzaGluZy5jb250YWlucyhzZXJ2ZXJJZCkpCi0JCQlyZXR1cm4gU2VydmVyRGVjb3JhdG9yLnN5bmNTdGF0ZVs0XTsKLQkJCi0JCS8vIHJlcHVibGlzaAotCQlpbnQgaSA9IDA7Ci0JCWlmIChzZXJ2ZXIuc2hvdWxkUHVibGlzaCgpKSB7Ci0JCQlpZiAoKChTZXJ2ZXIpc2VydmVyKS5pc1B1Ymxpc2hVbmtub3duKCkpCi0JCQkJcmV0dXJuICIiOwotCQkJaSArPSAyOwotCQl9Ci0JCQotCQlpZiAoc2VydmVyLnNob3VsZFJlc3RhcnQoKSkKLQkJCWkgPSAxOwotCQkKLQkJcmV0dXJuIHN5bmNTdGF0ZVtpXTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldFNlcnZlclN0YXRlSW1hZ2UoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJcmV0dXJuIHNlcnZlciA9PSBudWxsID8gbnVsbCA6IAotCQkJZ2V0U3RhdGVJbWFnZShzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLCBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSwgc2VydmVyLmdldE1vZGUoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0U3RhdGVJbWFnZShJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlLCBpbnQgc3RhdGUsIFN0cmluZyBtb2RlKSB7Ci0JCXJldHVybiBzZXJ2ZXJUeXBlID09IG51bGwgPyBudWxsIDogCi0JCQlVSURlY29yYXRvck1hbmFnZXIuZ2V0Q05GVUlEZWNvcmF0b3IoKS5nZXRTdGF0ZUltYWdlKHN0YXRlLCBtb2RlLCBnZXRDb3VudCgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRTZXJ2ZXJTdGF0ZUltYWdlT3ZlcmxheShJU2VydmVyIHNlcnZlcikgewotCQlyZXR1cm4gc2VydmVyID09IG51bGwgPyBudWxsIDogCi0JCQlnZXRTdGF0ZUltYWdlT3ZlcmxheShzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLCBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSwgc2VydmVyLmdldE1vZGUoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0U3RhdGVJbWFnZU92ZXJsYXkoSVNlcnZlclR5cGUgc2VydmVyVHlwZSwgaW50IHN0YXRlLCBTdHJpbmcgbW9kZSkgewotCQlyZXR1cm4gc2VydmVyVHlwZSA9PSBudWxsID8gbnVsbCA6IAotCQkJVUlEZWNvcmF0b3JNYW5hZ2VyLmdldENORlVJRGVjb3JhdG9yKCkuZ2V0U3RhdGVJbWFnZU92ZXJsYXkoc3RhdGUsIG1vZGUsIGdldENvdW50KCkpOwotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1vZHVsZVRleHQoTW9kdWxlU2VydmVyIG1zICkgeyAKLQkJaWYgKG1zID09IG51bGwgfHwgbXMubW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ci0JCWludCBzaXplID0gbXMubW9kdWxlLmxlbmd0aDsKLQkJcmV0dXJuIG1zLm1vZHVsZVtzaXplIC0gMV0uZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldE1vZHVsZUltYWdlKE1vZHVsZVNlcnZlciBtcykgewotCQlpZiggbXMgIT0gbnVsbCApIHsKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJSW1hZ2UgaW1hZ2UgPSBsYWJlbFByb3ZpZGVyLmdldEltYWdlKG1zLm1vZHVsZVttcy5tb2R1bGUubGVuZ3RoIC0gMV0pOwotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQlyZXR1cm4gaW1hZ2U7Ci0JCX0gCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2R1bGVTdGF0ZVRleHQoTW9kdWxlU2VydmVyIG1zKSB7Ci0JCWlmIChtcyA9PSBudWxsIHx8IG1zLm1vZHVsZSA9PSBudWxsKSAKLQkJCXJldHVybiBudWxsOwotCQkKLQkJU2VydmVyIGN1clNlcnZlciA9IChTZXJ2ZXIpIG1zLmdldFNlcnZlcigpOwotCQlpZiAoY3VyU2VydmVyID09IG51bGwgfHwgY3VyU2VydmVyLmdldFNlcnZlclR5cGUoKSA9PSBudWxsKSAKLQkJCXJldHVybiBudWxsOwotCQkKLQkJLy8gRm9yIG1vZHVsZSBzdGF0ZSwgd2UgYWx3YXlzIHVzZSBydW4gbW9kZSBzaW5jZSB0aGUgc3RhdGUgb2YgdGhlIG1vZHVsZSB3aWxsIG9ubHkgYmUgc2hvd2luZwotCQkvLyBTdGFydGVkIHN0YXRlIGV2ZW4gZm9yIGRlYnVnIGFuZCBwcm9maWxlIG1vZGUuCi0JCXJldHVybiBnZXRTdGF0ZUxhYmVsKGN1clNlcnZlci5nZXRTZXJ2ZXJUeXBlKCksIGN1clNlcnZlci5nZXRNb2R1bGVTdGF0ZShtcy5tb2R1bGUpLCBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1vZHVsZVN0YXR1c1RleHQoTW9kdWxlU2VydmVyIG1zKSB7Ci0JCWlmKCBtcyAhPSBudWxsICYmIG1zLnNlcnZlciAhPSBudWxsICYmIG1zLm1vZHVsZSAhPSBudWxsICkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSAoKFNlcnZlcikgbXMuc2VydmVyKS5nZXRNb2R1bGVTdGF0dXMobXMubW9kdWxlKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCkKLQkJCQlyZXR1cm4gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCQotCQkJcmV0dXJuIG1vZHVsZVB1Ymxpc2hTdGF0ZVttcy5zZXJ2ZXIuZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1zLm1vZHVsZSldOwotCQl9Ci0JCXJldHVybiAiIjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRNb2R1bGVTdGF0dXNJbWFnZShNb2R1bGVTZXJ2ZXIgbXMpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSAoKFNlcnZlcikgbXMuc2VydmVyKS5nZXRNb2R1bGVTdGF0dXMobXMubW9kdWxlKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCQlyZXR1cm4gc2hhcmVkSW1hZ2VzLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLKTsKLQkJCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykKLQkJCQlyZXR1cm4gc2hhcmVkSW1hZ2VzLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfV0FSTl9UU0spOwotCQkJZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5JTkZPKQotCQkJCXJldHVybiBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19JTkZPX1RTSyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgY29tYmluZShTdHJpbmcgc3RhdGUsIFN0cmluZyBzdGF0dXMpIHsKLQkJaWYoaXNFbXB0eShzdGF0ZSkgJiYgaXNFbXB0eShzdGF0dXMpKQotCQkJcmV0dXJuICIiOwotCQlpZiggaXNFbXB0eShzdGF0ZSkpCi0JCQlyZXR1cm4gIiAgWyIgKyBzdGF0dXMgKyAiXSI7Ci0JCWlmKCBpc0VtcHR5KHN0YXR1cykpCi0JCQlyZXR1cm4gIiAgWyIgKyBzdGF0ZSArICJdIjsKLQkJcmV0dXJuICIgIFsiICsgc3RhdGUgKyAiLCAiICsgc3RhdHVzICsgIl0iOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VtcHR5KFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyA9PSBudWxsIHx8ICIiLmVxdWFscyhzKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY25mL1NlcnZlckRlY29yYXRvcnNIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jbmYvU2VydmVyRGVjb3JhdG9yc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ4Mzc0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jbmYvU2VydmVyRGVjb3JhdG9yc0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jbmY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRGVjb3JhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25WaWV3ZXI7Ci0KLS8qKgotICogCi0gKiBUaGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHByb3BvcnRpb25hdGUgYSB3YXkgdG8gcmVnaXN0ZXIgdGhvc2UgVUkgRGVjb3JhdG9ycyB0aGF0IAotICogbmVlZHMgdG8gYmUgdXBkYXRlZCBhZnRlciBhIFNlcnZlciBoYXMgYmVlbiBtb2RpZmllZC4gQmFzaWNhbGx5IHRoaXMgaGFuZGxlciBpcyBhIGxpc3QKLSAqIG9mIElEcyBvZiBVSSBEZWNvcmF0b3JzLiAKLSAqIAotICogQGF1dGhvciBpc3JhZWxnZEBteDEuaWJtLmNvbQotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyRGVjb3JhdG9yc0hhbmRsZXIgewotCQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTkFWSUdBVE9SX0RFQ09SQVRPUl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLm5hdmlnYXRvckRlY29yYXRvciI7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBBcnJheUxpc3QgPFN0cmluZz4gVUlEZWNvcmF0b3JzSURzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCi0Jc3RhdGljIHsKLQkJVUlEZWNvcmF0b3JzSURzLmFkZChOQVZJR0FUT1JfREVDT1JBVE9SX0lEKTsKLQl9Ci0JcHJvdGVjdGVkIHN0YXRpYyBJRGVjb3JhdG9yTWFuYWdlciBkZWNvcmF0b3JNYW5hZ2VyID0gbnVsbDsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIElEZWNvcmF0b3JNYW5hZ2VyIGdldERlY29yYXRvck1hbmFnZXIoKXsKLQkJaWYgKGRlY29yYXRvck1hbmFnZXIgPT0gbnVsbCl7Ci0JCQlkZWNvcmF0b3JNYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGRlY29yYXRvck1hbmFnZXI7Ci0JfQotCS8qKgotCSAqIFVzZWQgdG8gcmVmcmVzaCB0aGUgU2VydmVyIERlY29yYXRvcnMgcHJldmlvdXNseSBhZGRlZCBhbmQgc2V0IHNlbGVjdGlvbiBhZnRlciB0aGF0LiAKLQkgKiBUcmlnZ2VycyB0aGUgZGVjb3JhdGlvbiBldmVudCBvZiBlYWNoIERlY29yYXRvci4KLQkgKiAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoKGZpbmFsIENvbW1vblZpZXdlciB0YWJsZVZpZXdlcikgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewkJCi0JCQkJSURlY29yYXRvck1hbmFnZXIgZG0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKTsKLQkJCQlBcnJheUxpc3Q8U3RyaW5nPiBVSURlY29yYXRvcnNJRHNDbG9uZSA9IChBcnJheUxpc3Q8U3RyaW5nPilVSURlY29yYXRvcnNJRHMuY2xvbmUoKTsKLQkJCQlmb3IgKFN0cmluZyBkZWNvcmF0b3JJZDogVUlEZWNvcmF0b3JzSURzQ2xvbmUpIHsKLQkJCQkJZG0udXBkYXRlKGRlY29yYXRvcklkKTsKLQkJCQl9Ci0JCQkJaWYgKHRhYmxlVmlld2VyICE9IG51bGwpewotCQkJCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBVc2VkIHRvIHJlZnJlc2ggdGhlIFNlcnZlciBEZWNvcmF0b3JzIHByZXZpb3VzbHkgYWRkZWQuCi0JICogQHBhcmFtIHNlcnZlcgotCSAqICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXJlZnJlc2gobnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhIFVJIERlY29yYXRvciBmcm9tIHRoZSBEZWNvcmF0b3IgSGFuZGxlci4KLQkgKiBAcGFyYW0gZGVjb3JhdG9ySUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlVUlEZWNvcmF0b3JzSUQoU3RyaW5nIGRlY29yYXRvcklEKSB7Ci0JCXN5bmNocm9uaXplZCAoVUlEZWNvcmF0b3JzSURzKSB7Ci0JCQlVSURlY29yYXRvcnNJRHMucmVtb3ZlKGRlY29yYXRvcklEKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgVUkgRGVjb3JhdG9yIGZyb20gdGhlIERlY29yYXRvciBIYW5kbGVyLgotCSAqIEBwYXJhbSBkZWNvcmF0b3JJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRVSURlY29yYXRvcnNJRHMoU3RyaW5nIGRlY29yYXRvcklEKSB7Ci0JCXN5bmNocm9uaXplZCAoVUlEZWNvcmF0b3JzSURzKSB7Ci0JCQlpZighVUlEZWNvcmF0b3JzSURzLmNvbnRhaW5zKGRlY29yYXRvcklEKSl7Ci0JCQkJVUlEZWNvcmF0b3JzSURzLmFkZChkZWNvcmF0b3JJRCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jbmYvU2VydmVyTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY25mL1NlcnZlckxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzNTVjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jbmYvU2VydmVyTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNuZjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyVUlDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuTW9kdWxlU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5CYXNlQ2VsbExhYmVsUHJvdmlkZXI7Ci0vKioKLSAqIFNlcnZlciB0YWJsZSBsYWJlbCBwcm92aWRlci4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNlQ2VsbExhYmVsUHJvdmlkZXJ7Ci0JCi0JLyoqCi0JICogU2VydmVyVGFibGVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlcnZlckxhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHJvdmlkZXJJbWFnZUNhY2hlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbWFnZT4oKTsKLQkJLy9UT0RPOiBBbmdlbCBzYXlzOiBMb29rIGF0IGJ1ZyMgMjU4MTg0Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBlbGVtZW50OwotCQkJaWYgKG1zLm1vZHVsZSA9PSBudWxsKQotCQkJCXJldHVybiAiIjsKLQkJCWludCBzaXplID0gbXMubW9kdWxlLmxlbmd0aDsKLQkJCVN0cmluZyBuYW1lID0gbXMubW9kdWxlW3NpemUgLSAxXS5nZXROYW1lKCk7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCQkKLQkJaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyICkgewotCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZWxlbWVudDsKLQkJCXJldHVybiBub3ROdWxsKHNlcnZlci5nZXROYW1lKCkpOwotCQl9IAotCQkKLQkJaWYoIGVsZW1lbnQgPT0gU2VydmVyQ29udGVudFByb3ZpZGVyLklOSVRJQUxJWklORykKLQkJCXJldHVybiBNZXNzYWdlcy52aWV3SW5pdGlhbGl6aW5nOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVdvcmtzcGFjZVJvb3QpewotCQkJcmV0dXJuIFBsYXRmb3JtLmdldFJlc291cmNlU3RyaW5nKFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCksICIldmlld1NlcnZlcnMiKTsKLQkJfQotCQkKLQkJcmV0dXJuICIiOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAodGhpcy5wcm92aWRlckltYWdlQ2FjaGUgIT0gbnVsbCkgewotCQkJZmluYWwgSXRlcmF0b3I8SW1hZ2U+IHByb3ZpZGVySW1hZ2VDYWNoZUl0ZXJhdG9yID0gdGhpcy5wcm92aWRlckltYWdlQ2FjaGUudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChwcm92aWRlckltYWdlQ2FjaGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlwcm92aWRlckltYWdlQ2FjaGVJdGVyYXRvci5uZXh0KCkuZGlzcG9zZSgpOwotCQkJfQotCQkJdGhpcy5wcm92aWRlckltYWdlQ2FjaGUuY2xlYXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQkKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCWltYWdlID0gbGFiZWxQcm92aWRlci5nZXRJbWFnZShtcy5tb2R1bGVbbXMubW9kdWxlLmxlbmd0aCAtIDFdKTsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9IGVsc2UgaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyICkgewotCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZWxlbWVudDsKLQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwpIHsJCQkJCi0JCQkJLy8gSWRlYWxseSB3ZSB3b24ndCBiZSBkb2luZyB0aGUgb3ZlcmxheSBvZiB0aGUgc3RhdGUgaGVyZSwgYnV0IHJhdGhlciBpbiBhIGRlY29yYXRvciBzbyB0aGF0IAotCQkJCS8vIHVzZXJzIGNhbiB0dXJuIGl0IG9mZiBhbmQgb24uIFRoaXMgd29ya3MgZm9yIG5vdyB1bnRpbCB3ZSBoYXZlIG1vcmUgdGltZSB0byB3b3JrIGFuZCByZW9yZ2FuaXplCi0JCQkJLy8gdGhlIGNvZGUKLQkJCQlJbWFnZSBzZXJ2ZXJUeXBlSW1nID0gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotCQkJCUltYWdlIHNlcnZlclN0YXR1c0ltZyA9IFNlcnZlckRlY29yYXRvci5nZXRTZXJ2ZXJTdGF0ZUltYWdlT3ZlcmxheShzZXJ2ZXIpOwotCi0JCQkJLy8gSW1hZ2VzIHJldHVybmVkIHZpYSB0aGUgQ29tcG9zaXRlU2VydmVySW1hZ2VEZXNjcmlwdG9yI2NyZWF0ZUltYWdlKCkgbmVlZCB0byBiZSBjYWNoZWQgc2luY2UgdGhpcyBBUEkKLQkJCQkvLyB3aWxsIGFsd2F5cyBjcmVhdGUgYSBuZXcgSW1hZ2UgYW5kIGl0IGlzIGltcG9zc2libGUgdG8ga25vdyB3aGVuIHRvIGRpc3Bvc2UgdGhlbSBleGNlcHQgd2hlbiB0aGUKLQkJCQkvLyBsYWJlbCBwcm92aWRlciBpcyBkaXNwb3NlZC4KLQkJCQlmaW5hbCBTdHJpbmcga2V5ID0gdGhpcy5nZXRDYWNoZUtleShzZXJ2ZXIsIHNlcnZlclR5cGVJbWcsIHNlcnZlclN0YXR1c0ltZyk7Ci0JCQkJaW1hZ2UgPSB0aGlzLnByb3ZpZGVySW1hZ2VDYWNoZS5nZXQoa2V5KTsKLQkJCQlpZihpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCUNvbXBvc2l0ZVNlcnZlckltYWdlRGVzY3JpcHRvciBkc2lkID0gbmV3IENvbXBvc2l0ZVNlcnZlckltYWdlRGVzY3JpcHRvcihzZXJ2ZXJUeXBlSW1nLHNlcnZlclN0YXR1c0ltZyk7Ci0JCQkJCWltYWdlID0gZHNpZC5jcmVhdGVJbWFnZSgpOwotCQkJCQl0aGlzLnByb3ZpZGVySW1hZ2VDYWNoZS5wdXQoa2V5LCBpbWFnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBnZXRDYWNoZUtleShmaW5hbCBJU2VydmVyIHNlcnZlciwgZmluYWwgSW1hZ2Ugc2VydmVyVHlwZUltZywgZmluYWwgSW1hZ2Ugc2VydmVyU3RhdHVzSW1nKSB7Ci0KLQkJU3RyaW5nQnVmZmVyIGtleSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYoc2VydmVyICE9IG51bGwpIHsKLQkJCWtleS5hcHBlbmQoc2VydmVyLmdldE5hbWUoKSk7Ci0JCX0KLQkJaWYoc2VydmVyVHlwZUltZyAhPSBudWxsKSB7Ci0JCQlrZXkuYXBwZW5kKHNlcnZlclR5cGVJbWcudG9TdHJpbmcoKSk7Ci0JCX0KLQkJaWYoc2VydmVyU3RhdHVzSW1nICE9IG51bGwpIHsKLQkJCWtleS5hcHBlbmQoc2VydmVyU3RhdHVzSW1nLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBrZXkudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5vdE51bGwoU3RyaW5nIHMpIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsKLQkJcmV0dXJuIHM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyKXsKLQkJCWlmIChwcm9wZXJ0eS5lcXVhbHNJZ25vcmVDYXNlKCJJQ09OIikpewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCS8vIFRPRE8gTGVmdCBibGFuayBzaW5jZSB0aGUgQ05GIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCkgewotCQkvLyBUT0RPIExlZnQgYmxhbmsgc2luY2UgdGhlIENORiBkb2Vzbid0IHN1cHBvcnQgdGhpcwotCQlyZXR1cm4gbnVsbDsKLQl9CQotCi0JcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBJbWFnZT4gcHJvdmlkZXJJbWFnZUNhY2hlOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NuZi9TZXJ2ZXJzVmlldzIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NuZi9TZXJ2ZXJzVmlldzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmNTMzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jbmYvU2VydmVyc1ZpZXcyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwyMDEyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY25mOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2JDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLklDb250ZXh0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlVwZGF0ZVNlcnZlckpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5QdWJsaXNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVG9vbFRpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLk5ld1NlcnZlcldpemFyZDsKLS8qKgotICogQSB2aWV3IG9mIHNlcnZlcnMsIHRoZWlyIG1vZHVsZXMsIGFuZCBzdGF0dXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJzVmlldzIgZXh0ZW5kcyBDb21tb25OYXZpZ2F0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJTX1ZJRVdfQ09OVEVYVCA9ICJvcmcuZWNsaXBzZS51aS5zZXJ2ZXJWaWV3U2NvcGUiOwotCQotCXByb3RlY3RlZCBDb21tb25WaWV3ZXIgdGFibGVWaWV3ZXI7Ci0JcHJpdmF0ZSBDb250cm9sIG1haW5QYWdlOwotCXByaXZhdGUgQ29udHJvbCBub1NlcnZlcnNQYWdlOwotCVBhZ2VCb29rIGJvb2s7Ci0JCi0JcHJvdGVjdGVkIElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciBzZXJ2ZXJSZXNvdXJjZUxpc3RlbmVyOwotCXByb3RlY3RlZCBJUHVibGlzaExpc3RlbmVyIHB1Ymxpc2hMaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgSVNlcnZlckxpc3RlbmVyIHNlcnZlckxpc3RlbmVyOwotCQkKLQkvLyBzZXJ2ZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBwdWJsaXNoaW5nIGFuZCBzdGFydGluZwotCXByb3RlY3RlZCBzdGF0aWMgU2V0PFN0cmluZz4gcHVibGlzaGluZyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oNCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTZXQ8U3RyaW5nPiBzdGFydGluZyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oNCk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYW5pbWF0aW9uQWN0aXZlID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc3RvcEFuaW1hdGlvbiA9IGZhbHNlOwotCi0JLyoqCi0JICogU2VydmVyc1ZpZXcgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2VydmVyc1ZpZXcyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQWRkIFBhZ2VCb29rIGFzIHBhcmVudCBjb21wb3NpdGUKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG5ldyBGb3JtVG9vbGtpdChwYXJlbnQuZ2V0RGlzcGxheSgpKTsKLQkJYm9vayA9IG5ldyBQYWdlQm9vayhwYXJlbnQsIFNXVC5OT05FKTsKLQkJc3VwZXIuY3JlYXRlUGFydENvbnRyb2woYm9vayk7Ci0JCS8vIE1haW4gcGFnZSBmb3IgdGhlIFNlcnZlcnMgdGFibGVWaWV3ZXIKLQkJbWFpblBhZ2UgPSBnZXRDb21tb25WaWV3ZXIoKS5nZXRDb250cm9sKCk7Ci0JCS8vIFBhZ2UgcHJvbXB0aW5nIHRvIGRlZmluZSBhIG5ldyBzZXJ2ZXIKLQkJbm9TZXJ2ZXJzUGFnZSA9IGNyZWF0ZURlZmF1bHRQYWdlKHRvb2xraXQpOyAKLQkJYm9vay5zaG93UGFnZShtYWluUGFnZSk7Ci0KLQkJSUNvbnRleHRTZXJ2aWNlIGNvbnRleHRTdXBwb3J0ID0gKElDb250ZXh0U2VydmljZSlnZXRTaXRlKCkuZ2V0U2VydmljZShJQ29udGV4dFNlcnZpY2UuY2xhc3MpOwotCQljb250ZXh0U3VwcG9ydC5hY3RpdmF0ZUNvbnRleHQoU0VSVkVSU19WSUVXX0NPTlRFWFQpOwotCQlkZWZlckluaXRpYWxpemF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHBhZ2UgZGlzcGxheWVkIHdoZW4gdGhlcmUgYXJlIG5vIHNlcnZlcnMgZGVmaW5lZC4KLQkgKiAKLQkgKiBAcGFyYW0ga2l0Ci0JICogQHJldHVybiBDb250cm9sCi0JICovCi0JcHJpdmF0ZSBDb250cm9sIGNyZWF0ZURlZmF1bHRQYWdlKEZvcm1Ub29sa2l0IGtpdCl7Ci0JCUZvcm0gZm9ybSA9IGtpdC5jcmVhdGVGb3JtKGJvb2spOwotCQlDb21wb3NpdGUgYm9keSA9IGZvcm0uZ2V0Qm9keSgpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgIGJvZHkuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgCi0JCUxpbmsgaGxpbmsgPSBuZXcgTGluayhib2R5LCBTV1QuTk9ORSk7Ci0JCWhsaW5rLnNldFRleHQoTWVzc2FnZXMuU2VydmVyc1ZpZXcyX25vU2VydmVycyk7IAotCQlobGluay5zZXRCYWNrZ3JvdW5kKGJvb2suZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWhsaW5rLnNldExheW91dERhdGEoZ2QpOwotCQlobGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlOZXdTZXJ2ZXJXaXphcmQgd2l6YXJkID0gbmV3IE5ld1NlcnZlcldpemFyZCgpOwotCQkJCVdpemFyZERpYWxvZyB3ZCA9IG5ldyBXaXphcmREaWFsb2coYm9vay5nZXRTaGVsbCgpLCB3aXphcmQpOwotCQkJCWlmKCB3ZC5vcGVuKCkgPT0gV2luZG93Lk9LKXsKLQkJCQkJdG9nZ2xlRGVmdWx0UGFnZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCi0JCS8vIENyZWF0ZSB0aGUgY29udGV4dCBtZW51IGZvciB0aGUgZGVmYXVsdCBwYWdlCi0JCWZpbmFsIENvbW1vblZpZXdlciBjb21tb25WaWV3ZXIgPSB0aGlzLmdldENvbW1vblZpZXdlcigpOwotCQlpZiAoY29tbW9uVmlld2VyICE9IG51bGwpewotCQkJSUNvbW1vblZpZXdlclNpdGUgY29tbW9uVmlld2VyU2l0ZSA9IENvbW1vblZpZXdlclNpdGVGYWN0b3J5Ci0JCQkJCS5jcmVhdGVDb21tb25WaWV3ZXJTaXRlKHRoaXMuZ2V0Vmlld1NpdGUoKSk7Ci0JCQkKLQkJCWlmIChjb21tb25WaWV3ZXJTaXRlICE9IG51bGwpewotCQkJCS8vIE5vdGU6IGFjdGlvblNlcnZpY2UgY2Fubm90IGJlIG51bGwKLQkJCQlmaW5hbCBOYXZpZ2F0b3JBY3Rpb25TZXJ2aWNlIGFjdGlvblNlcnZpY2UgPSBuZXcgTmF2aWdhdG9yQWN0aW9uU2VydmljZShjb21tb25WaWV3ZXJTaXRlLAotCQkJCQkJY29tbW9uVmlld2VyLCBjb21tb25WaWV3ZXIuZ2V0TmF2aWdhdG9yQ29udGVudFNlcnZpY2UoKSk7Ci0JCQkJCi0JCQkJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3B1cE1lbnUiKTsKLQkJCQltZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWdyKSB7Ci0JCQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGNvbW1vblZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWFjdGlvblNlcnZpY2Uuc2V0Q29udGV4dChuZXcgQWN0aW9uQ29udGV4dChzZWxlY3Rpb24pKTsKLQkJCQkJCWFjdGlvblNlcnZpY2UuZmlsbENvbnRleHRNZW51KG1ncik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlNZW51IG1lbnUgPSBtZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShib2R5KTsKLQotCQkJCS8vIEl0IGlzIG5lY2Vzc2FyeSB0byBzZXQgdGhlIG1lbnUgaW4gdHdvIHBsYWNlczoKLQkJCQkvLyAxLiBUaGUgd2hpdGUgc3BhY2UgaW4gdGhlIHNlcnZlciB2aWV3Ci0JCQkJLy8gMi4gVGhlIHRleHQgYW5kIGxpbmsgaW4gdGhlIHNlcnZlciB2aWV3LiBJZiB0aGlzIG1lbnUgaXMgbm90IHNldCwgaWYgdGhlCi0JCQkJLy8gdXNlciByaWdodCBjbGlja3Mgb24gdGhlIHRleHQgb3IgdXNlcyBzaG9ydGN1dCBrZXlzIHRvIG9wZW4gdGhlIGNvbnRleHQgbWVudSwKLQkJCQkvLyB0aGUgY29udGV4dCBtZW51IHdpbGwgbm90IGNvbWUgdXAKLQkJCQlib2R5LnNldE1lbnUobWVudSk7CQotCQkJCWhsaW5rLnNldE1lbnUobWVudSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJUaGUgY29tbW9uVmlld2VyU2l0ZSBpcyBudWxsIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJUaGUgY29tbW9uVmlld2VyIGlzIG51bGwiKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZvcm07Ci0JfQotCQotCS8qKgotCSAqIFN3aXRjaCBiZXR3ZWVuIHRoZSBzZXJ2ZXJzIGFuZCBkZWZhdWx0L2VtcHR5IHBhZ2UuIAotCSAqIAotCSAqLwotCXZvaWQgdG9nZ2xlRGVmdWx0UGFnZSgpewotCQlpZih0YWJsZVZpZXdlci5nZXRUcmVlKCkuZ2V0SXRlbUNvdW50KCkgPCAxKXsKLQkJCWJvb2suc2hvd1BhZ2Uobm9TZXJ2ZXJzUGFnZSk7Ci0JCX0gZWxzZXsKLQkJCWJvb2suc2hvd1BhZ2UobWFpblBhZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlZmVySW5pdGlhbGl6YXRpb24oKSB7Ci0JCS8vIFRPRE8gQW5nZWwgU2F5czogTmVlZCB0byBkbyBhIGZpbmFsIGNoZWNrIG9uIHRoaXMgbGluZSBiZWxvdy4gSSBkb24ndCB0aGluayB0aGVyZSBpcyBhbnl0aGluZyBlbHNlCi0JCS8vIHRoYXQgd2UgbmVlZCBmcm9tIHRvIHBvcnQgZnJvbSB0aGUgb2xkIFNlcnZlcnMgVmlldwotCQkvL2luaXRpYWxpemVBY3Rpb25zKGdldENvbW1vblZpZXdlcigpKTsKLQkJCi0JCUpvYiBqb2IgPSBuZXcgSm9iKE1lc3NhZ2VzLmpvYkluaXRpYWxpemluZ1NlcnZlcnNWaWV3KSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCSgoU2VydmVyKXNlcnZlcnNbaV0pLmdldEFsbE1vZHVsZXMoKS5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlkZWZlcnJlZEluaXRpYWxpemUoKTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJCi0JCWpvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCWpvYi5zZXRQcmlvcml0eShKb2IuU0hPUlQpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGVmZXJyZWRJbml0aWFsaXplKCkgewotCQlhZGRMaXN0ZW5lcigpOwotCQkKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQl0YWJsZVZpZXdlciA9IGdldENvbW1vblZpZXdlcigpOwotCQkJCQlnZXRTaXRlKCkuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGFibGVWaWV3ZXIpOwotCQkJCQkKLQkJCQkJLy8gaW5pdCB0aGUgdG9vbHRpcAotCQkJCQlTZXJ2ZXJUb29sVGlwIHRvb2xUaXAgPSBuZXcgU2VydmVyVG9vbFRpcCh0YWJsZVZpZXdlci5nZXRUcmVlKCkpOwotCQkJCQl0b29sVGlwLnNldFNoaWZ0KG5ldyBQb2ludCgxMCwgMykpOwotCQkJCQl0b29sVGlwLnNldFBvcHVwRGVsYXkoNDAwKTsgLy8gaW4gbXMKLQkJCQkJdG9vbFRpcC5zZXRIaWRlT25Nb3VzZURvd24odHJ1ZSk7Ci0JCQkJCXRvb2xUaXAuYWN0aXZhdGUoKTsKLQkJCQkJCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlIC0gdmlldyBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZAotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlVcGRhdGVTZXJ2ZXJKb2Igam9iID0gbmV3IFVwZGF0ZVNlcnZlckpvYihTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKSk7Ci0JCWpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmICh0YWJsZVZpZXdlci5nZXRUcmVlKCkuZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0JCQkJCQkJCU9iamVjdCBvYmogPSB0YWJsZVZpZXdlci5nZXRUcmVlKCkuZ2V0SXRlbSgwKS5nZXREYXRhKCk7Ci0JCQkJCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmopKTsKLQkJCQkJCQl9IGVsc2V7Ci0JCQkJCQkJCXRvZ2dsZURlZnVsdFBhZ2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJCQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiRmFpbGVkIHRvIHVwZGF0ZSB0aGUgc2VydmVyIHZpZXcuIiwgZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0pOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHVibGlzaENoYW5nZShJU2VydmVyIHNlcnZlciwgYm9vbGVhbiBpc1B1Ymxpc2hpbmcpIHsKLQkJU3RyaW5nIHNlcnZlcklkID0gc2VydmVyLmdldElkKCk7Ci0JCWlmIChpc1B1Ymxpc2hpbmcpCi0JCQlwdWJsaXNoaW5nLmFkZChzZXJ2ZXJJZCk7Ci0JCWVsc2UKLQkJCXB1Ymxpc2hpbmcucmVtb3ZlKHNlcnZlcklkKTsKLQkKLQkJcmVmcmVzaFNlcnZlclN0YXRlKHNlcnZlcik7Ci0JfQotCQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogQHBhcmFtIHNlcnZlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZXJ2ZXIoZmluYWwgSVNlcnZlciBzZXJ2ZXIpewotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiUmVmcmVzaGluZyBVSSBmb3Igc2VydmVyPSIgKyBzZXJ2ZXIpOwotCQl9Ci0JCVNlcnZlckRlY29yYXRvcnNIYW5kbGVyLnJlZnJlc2godGFibGVWaWV3ZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VydmVyQ29udGVudChmaW5hbCBJU2VydmVyIHNlcnZlcil7Ci0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJSZWZyZXNoaW5nIENvbnRlbnQgZm9yIHNlcnZlcj0iICsgc2VydmVyKTsKLQkJfQotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmKCF0YWJsZVZpZXdlci5nZXRUcmVlKCkuaXNEaXNwb3NlZCgpKQotCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKHNlcnZlciwgdHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VydmVyU3RhdGUoZmluYWwgSVNlcnZlciBzZXJ2ZXIpewotCQlpZiAoVHJhY2UuRklORVNUKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiUmVmcmVzaGluZyBVSSBmb3Igc2VydmVyPSIgKyBzZXJ2ZXIpOwotCQl9Ci0JCVNlcnZlckRlY29yYXRvcnNIYW5kbGVyLnJlZnJlc2godGFibGVWaWV3ZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcigpewotCQkvLyBUbyBlbmFibGUgdGhlIFVJIHVwZGF0aW5nIG9mIHNlcnZlcnMgYW5kIGl0cyBjaGlsZHJlbnMgIAotCQlzZXJ2ZXJSZXNvdXJjZUxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlcnZlckFkZGVkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCQkJYWRkU2VydmVyKHNlcnZlcik7Ci0JCQkJc2VydmVyLmFkZFNlcnZlckxpc3RlbmVyKHNlcnZlckxpc3RlbmVyKTsKLQkJCQkoKFNlcnZlcikgc2VydmVyKS5hZGRQdWJsaXNoTGlzdGVuZXIocHVibGlzaExpc3RlbmVyKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJCQlyZWZyZXNoU2VydmVyQ29udGVudChzZXJ2ZXIpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2VydmVyUmVtb3ZlZChJU2VydmVyIHNlcnZlcikgewotCQkJCXJlbW92ZVNlcnZlcihzZXJ2ZXIpOwotCQkJCXNlcnZlci5yZW1vdmVTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7Ci0JCQkJKChTZXJ2ZXIpIHNlcnZlcikucmVtb3ZlUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7Ci0JCQl9Ci0JCX07Ci0JCVNlcnZlckNvcmUuYWRkU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoc2VydmVyUmVzb3VyY2VMaXN0ZW5lcik7Ci0JCQotCQkvLyBUbyBlbmFibGUgdGhlIHJlZnJlc2ggb2YgdGhlIFN0YXRlIGRlY29yYXRvcgotCQlwdWJsaXNoTGlzdGVuZXIgPSBuZXcgUHVibGlzaEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwdWJsaXNoU3RhcnRlZChJU2VydmVyIHNlcnZlcikgewotCQkJCWhhbmRsZVB1Ymxpc2hDaGFuZ2Uoc2VydmVyLCB0cnVlKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgcHVibGlzaEZpbmlzaGVkKElTZXJ2ZXIgc2VydmVyLCBJU3RhdHVzIHN0YXR1cykgewotCQkJCWhhbmRsZVB1Ymxpc2hDaGFuZ2Uoc2VydmVyLCBmYWxzZSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlzZXJ2ZXJMaXN0ZW5lciA9IG5ldyBJU2VydmVyTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKFNlcnZlckV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQkJCQkJCi0JCQkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKLQkJCQlJU2VydmVyIHNlcnZlciA9IGV2ZW50LmdldFNlcnZlcigpOwotCQkJCWlmICgoZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSkgIT0gMCkgewotCQkJCQkvLyBzZXJ2ZXIgY2hhbmdlIGV2ZW50Ci0JCQkJCWlmICgoZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSAhPSAwKSB7Ci0JCQkJCQlpbnQgc3RhdGUgPSBldmVudC5nZXRTdGF0ZSgpOwotCQkJCQkJU3RyaW5nIGlkID0gc2VydmVyLmdldElkKCk7Ci0JCQkJCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORyB8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HKSB7Ci0JCQkJCQkJYm9vbGVhbiBzdGFydFRocmVhZCA9IGZhbHNlOwotCQkJCQkJCXN5bmNocm9uaXplZCAoc3RhcnRpbmcpIHsKLQkJCQkJCQkJaWYgKCFzdGFydGluZy5jb250YWlucyhpZCkpIHsKLQkJCQkJCQkJCWlmIChzdGFydGluZy5pc0VtcHR5KCkpCi0JCQkJCQkJCQkJc3RhcnRUaHJlYWQgPSB0cnVlOwotCQkJCQkJCQkJc3RhcnRpbmcuYWRkKGlkKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoc3RhcnRUaHJlYWQpCi0JCQkJCQkJCXN0YXJ0VGhyZWFkKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWJvb2xlYW4gc3RvcFRocmVhZCA9IGZhbHNlOwotCQkJCQkJCXN5bmNocm9uaXplZCAoc3RhcnRpbmcpIHsKLQkJCQkJCQkJaWYgKHN0YXJ0aW5nLmNvbnRhaW5zKGlkKSkgewotCQkJCQkJCQkJc3RhcnRpbmcucmVtb3ZlKGlkKTsKLQkJCQkJCQkJCWlmIChzdGFydGluZy5pc0VtcHR5KCkpCi0JCQkJCQkJCQkJc3RvcFRocmVhZCA9IHRydWU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHN0b3BUaHJlYWQpCi0JCQkJCQkJCXN0b3BUaHJlYWQoKTsKLQkJCQkJCX0KLQkJCQkJCXJlZnJlc2hTZXJ2ZXJTdGF0ZShzZXJ2ZXIpOwotCQkJCQkJcmVmcmVzaFNlcnZlckNvbnRlbnQoc2VydmVyKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICgoZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuUFVCTElTSF9TVEFURV9DSEFOR0UpICE9IDAgfHwgKGV2ZW50S2luZCAmIFNlcnZlckV2ZW50LlNUQVRVU19DSEFOR0UpICE9IDApIHsKLQkJCQkJCXJlZnJlc2hTZXJ2ZXJTdGF0ZShzZXJ2ZXIpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICgoZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuTU9EVUxFX0NIQU5HRSkgIT0gMCkgewotCQkJCQkvLyBtb2R1bGUgY2hhbmdlIGV2ZW50Ci0JCQkJCWlmICgoZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSAhPSAwIHx8IChldmVudEtpbmQgJiBTZXJ2ZXJFdmVudC5QVUJMSVNIX1NUQVRFX0NIQU5HRSkgIT0gMCB8fAotCQkJCQkJCShldmVudEtpbmQgJiBTZXJ2ZXJFdmVudC5TVEFUVVNfQ0hBTkdFKSAhPSAwKSB7Ci0JCQkJCQlyZWZyZXNoU2VydmVyQ29udGVudChzZXJ2ZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIFRPRE8gQW5nZWwgU2F5czogSSBkb24ndCB0aGluayB3ZSBuZWVkIHRoaXMKLQkJCQkvL3JlZnJlc2hTZXJ2ZXIoc2VydmVyKTsKLQkJCX0KLQkJfTsKLQkJCi0JCS8vIGFkZCBsaXN0ZW5lcnMgdG8gc2VydmVycwotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlzZXJ2ZXJzW2ldLmFkZFNlcnZlckxpc3RlbmVyKHNlcnZlckxpc3RlbmVyKTsKLQkJCQkoKFNlcnZlcikgc2VydmVyc1tpXSkuYWRkUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VydmVyKGZpbmFsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdGFibGVWaWV3ZXIuYWRkKHRhYmxlVmlld2VyLmdldElucHV0KCksIHNlcnZlcik7Ci0JCQkJdG9nZ2xlRGVmdWx0UGFnZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZXJ2ZXIoZmluYWwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0YWJsZVZpZXdlci5yZW1vdmUoc2VydmVyKTsKLQkJCQl0b2dnbGVEZWZ1bHRQYWdlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlTZXJ2ZXJDb3JlLnJlbW92ZVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKHNlcnZlclJlc291cmNlTGlzdGVuZXIpOwotCi0JCS8vIHJlbW92ZSBsaXN0ZW5lcnMgZnJvbSBzZXJ2ZXJzCi0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXNlcnZlcnNbaV0ucmVtb3ZlU2VydmVyTGlzdGVuZXIoc2VydmVyTGlzdGVuZXIpOwotCQkJCSgoU2VydmVyKSBzZXJ2ZXJzW2ldKS5yZW1vdmVQdWJsaXNoTGlzdGVuZXIocHVibGlzaExpc3RlbmVyKTsKLQkJCX0KLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIFN0YXJ0IHRoZSBhbmltYXRpb24gdGhyZWFkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RhcnRUaHJlYWQoKSB7Ci0JCWlmIChhbmltYXRpb25BY3RpdmUpCi0JCQlyZXR1cm47Ci0JCQotCQlzdG9wQW5pbWF0aW9uID0gZmFsc2U7Ci0JCQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSB0YWJsZVZpZXdlciA9PSBudWxsID8gRGlzcGxheS5nZXREZWZhdWx0KCkgOiB0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpOwotCQlmaW5hbCBpbnQgU0xFRVAgPSAyMDA7Ci0JCWZpbmFsIFJ1bm5hYmxlW10gYW5pbWF0b3IgPSBuZXcgUnVubmFibGVbMV07Ci0JCWFuaW1hdG9yWzBdID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghc3RvcEFuaW1hdGlvbikgewotCQkJCQl0cnkgewotCQkJCQkJaW50IHNpemUgPSAwOwotCQkJCQkJU3RyaW5nW10gc2VydmVyczsKLQkJCQkJCXN5bmNocm9uaXplZCAoc3RhcnRpbmcpIHsKLQkJCQkJCQlzaXplID0gc3RhcnRpbmcuc2l6ZSgpOwotCQkJCQkJCXNlcnZlcnMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQkJCQkJCXN0YXJ0aW5nLnRvQXJyYXkoc2VydmVycyk7Ci0JCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2VydmVyc1tpXSk7Ci0JCQkJCQkJaWYgKHNlcnZlciAhPSBudWxsICkgewotCQkJCQkJCQlTZXJ2ZXJEZWNvcmF0b3IuYW5pbWF0ZSgpOwotCQkJCQkJCQl0YWJsZVZpZXdlci51cGRhdGUoc2VydmVyLCBuZXcgU3RyaW5nW117IklDT04ifSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJFcnJvciBpbiBTZXJ2ZXJzIHZpZXcgYW5pbWF0aW9uIiwgZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZGlzcGxheS50aW1lckV4ZWMoU0xFRVAsIGFuaW1hdG9yWzBdKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZGlzcGxheS50aW1lckV4ZWMoU0xFRVAsIGFuaW1hdG9yWzBdKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcFRocmVhZCgpIHsKLQkJc3RvcEFuaW1hdGlvbiA9IHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY25mL1NlcnZlcnNWaWV3RHJvcEFkYXB0ZXJBc3Npc3RhbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NuZi9TZXJ2ZXJzVmlld0Ryb3BBZGFwdGVyQXNzaXN0YW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOGQ1NWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY25mL1NlcnZlcnNWaWV3RHJvcEFkYXB0ZXJBc3Npc3RhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEJhc2UgQ29kZQotICogICAgIFJlZCBIYXQgLSBSZWZhY3RvciBmb3IgQ05GCi0gKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNuZjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTG9jYWxTZWxlY3Rpb25UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkRyb3BBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25Ecm9wQWRhcHRlckFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuRWNsaXBzZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnMuUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVycy5QdWJsaXNoQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2VydmVyc1ZpZXdEcm9wQWRhcHRlckFzc2lzdGFudCBleHRlbmRzIENvbW1vbkRyb3BBZGFwdGVyQXNzaXN0YW50IHsKLQotCXByaXZhdGUgTGlzdCBkbmRFbGVtZW50TGlzdDsKLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlUGx1Z2luVHJhbnNmZXJEcm9wKAotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gYURyYWdTZWxlY3Rpb24sIE9iamVjdCBhRHJvcFRhcmdldCkgewotCQlpbml0aWFsaXplU2VsZWN0aW9uKGFEcmFnU2VsZWN0aW9uKTsKLQkJcmV0dXJuIGludGVybmFsVmFsaWRhdGUoYURyb3BUYXJnZXQsIGRuZEVsZW1lbnRMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZURyb3AoT2JqZWN0IHRhcmdldCwgaW50IG9wZXJhdGlvbiwKLQkJCVRyYW5zZmVyRGF0YSB0cmFuc2ZlclR5cGUpIHsKLQkJaWYgKExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkgewotCQkJSVNlbGVjdGlvbiBzID0gTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmdldFNlbGVjdGlvbigpOwotCQkJaW5pdGlhbGl6ZVNlbGVjdGlvbihzKTsKLQkJCXJldHVybiBpbnRlcm5hbFZhbGlkYXRlKHRhcmdldCwgZG5kRWxlbWVudExpc3QpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU2VsZWN0aW9uKElTZWxlY3Rpb24gcykgewotCQlpZiAoZG5kRWxlbWVudExpc3QgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCEocyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkgewotCQkJZG5kRWxlbWVudExpc3QgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJcmV0dXJuOwotCQl9Ci0JCWRuZEVsZW1lbnRMaXN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgcykudG9MaXN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgaW50ZXJuYWxWYWxpZGF0ZShPYmplY3QgdGFyZ2V0LCBMaXN0IGVsZW1lbnRzKSB7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSB0YXJnZXQ7Ci0JCQlPYmplY3QgbmV4dDsKLQkJCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgaSA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJCW5leHQgPSBpLm5leHQoKTsKLQkJCQkJSU1vZHVsZUFydGlmYWN0W10gbW9kdWxlQXJ0aWZhY3RzID0gU2VydmVyUGx1Z2luCi0JCQkJCQkJLmdldE1vZHVsZUFydGlmYWN0cyhuZXh0KTsKLQkJCQkJaWYgKG1vZHVsZUFydGlmYWN0cyAhPSBudWxsICYmIG1vZHVsZUFydGlmYWN0cy5sZW5ndGggPiAwKSB7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1vZHVsZUFydGlmYWN0cy5sZW5ndGg7IGorKykgewotCQkJCQkJCWlmIChtb2R1bGVBcnRpZmFjdHNbal0gIT0gbnVsbAotCQkJCQkJCQkJJiYgbW9kdWxlQXJ0aWZhY3RzW2pdLmdldE1vZHVsZSgpICE9IG51bGwpIHsKLQkJCQkJCQkJSU1vZHVsZVR5cGVbXSBtb2R1bGVUeXBlcyA9IHNlcnZlcgotCQkJCQkJCQkJCS5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKQotCQkJCQkJCQkJCS5nZXRNb2R1bGVUeXBlcygpOwotCQkJCQkJCQlpZiAoU2VydmVyVXRpbC5pc1N1cHBvcnRlZE1vZHVsZShtb2R1bGVUeXBlcywKLQkJCQkJCQkJCQltb2R1bGVBcnRpZmFjdHNbal0uZ2V0TW9kdWxlKCkKLQkJCQkJCQkJCQkJCS5nZXRNb2R1bGVUeXBlKCkpKSB7Ci0JCQkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljbGVhcigpOwotCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgaGFuZGxlRHJvcChDb21tb25Ecm9wQWRhcHRlciBkcm9wQWRhcHRlciwgRHJvcFRhcmdldEV2ZW50IGRyb3BUYXJnZXRFdmVudCwgT2JqZWN0IHRhcmdldCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IGludGVybmFsSGFuZGxlRHJvcCh0YXJnZXQsIGRuZEVsZW1lbnRMaXN0KTsKLQkJaWYgKHN0YXR1cy5pc09LKCkpCi0JCQlkcm9wVGFyZ2V0RXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBoYW5kbGVQbHVnaW5UcmFuc2ZlckRyb3AoSVN0cnVjdHVyZWRTZWxlY3Rpb24gYURyYWdTZWxlY3Rpb24sIE9iamVjdCBhRHJvcFRhcmdldCkgewotCQlyZXR1cm4gaW50ZXJuYWxIYW5kbGVEcm9wKGFEcm9wVGFyZ2V0LCBkbmRFbGVtZW50TGlzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgaW50ZXJuYWxIYW5kbGVEcm9wKE9iamVjdCB0YXJnZXQsIExpc3QgZWxlbWVudHMpIHsKLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQlzdWNjZXNzID0gdHJ1ZTsKLQkJCWlmIChkbmRFbGVtZW50TGlzdCAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50cy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IGRhdGEyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoIWRvUnVuT25TZXJ2ZXJBY3Rpb24oKElTZXJ2ZXIpIHRhcmdldCwgZGF0YTIpKQotCQkJCQkJc3VjY2VzcyA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQljbGVhcigpOwotCQlyZXR1cm4gc3VjY2VzcyA/IFN0YXR1cy5PS19TVEFUVVMgOiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXIoKSB7Ci0JCWRuZEVsZW1lbnRMaXN0ID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkb1J1bk9uU2VydmVyQWN0aW9uKElTZXJ2ZXIgc2VydmVyLCBPYmplY3QgZGF0YSkgewotCQkvLyBjaGVjayBpZiB0aGUgc2VsZWN0aW9uIGlzIGEgcHJvamVjdCAobW9kdWxlKSB0aGF0IHdlIGNhbiBhZGQgdG8gdGhlIHNlcnZlcgotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIoCi0JCQkJZGF0YSwgSVByb2plY3QuY2xhc3MpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJTW9kdWxlW10gbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhwcm9qZWN0KTsKLQkJCWlmIChtb2R1bGVzICE9IG51bGwgJiYgbW9kdWxlcy5sZW5ndGggPT0gMSkgewotCQkJCXRyeSB7Ci0JCQkJCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IHNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOwotCQkJCQlJTW9kdWxlW10gcGFyZW50cyA9IHdjLmdldFJvb3RNb2R1bGVzKG1vZHVsZXNbMF0sIG51bGwpOwotCQkJCQlpZiAocGFyZW50cyA9PSBudWxsIHx8IHBhcmVudHMubGVuZ3RoID09IDApCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCQkJaWYgKFNlcnZlclV0aWwuY29udGFpbnNNb2R1bGUoc2VydmVyLCBwYXJlbnRzWzBdLCBudWxsKSl7Ci0JCQkJCQlQdWJsaXNoQWN0aW9uLnB1Ymxpc2goc2VydmVyLCBnZXRTaGVsbCgpKTsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCi0JCQkJCUlNb2R1bGVbXSBhZGQgPSBuZXcgSU1vZHVsZVtdIHsgcGFyZW50c1swXSB9OwotCQkJCQlpZiAod2MuY2FuTW9kaWZ5TW9kdWxlcyhhZGQsIG51bGwsIG51bGwpLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUikgewotCQkJCQkJd2MubW9kaWZ5TW9kdWxlcyhtb2R1bGVzLCBudWxsLCBudWxsKTsKLQkJCQkJCXdjLnNhdmUoZmFsc2UsIG51bGwpOwotCQkJCQkJUHVibGlzaEFjdGlvbi5wdWJsaXNoKHNlcnZlciwgZ2V0U2hlbGwoKSk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKGZpbmFsIENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJZmluYWwgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCQkJCQlzaGVsbC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3Ioc2hlbGwsIGNlCi0JCQkJCQkJCQkuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIG90aGVyd2lzZSwgdHJ5IFJ1biBvbiBTZXJ2ZXIKLQkJZmluYWwgSVNlcnZlciBmaW5hbFNlcnZlciA9IHNlcnZlcjsKLQkJUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSByb3MgPSBuZXcgUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSgpIHsKLQkJCXB1YmxpYyBJU2VydmVyIGdldFNlcnZlcihJTW9kdWxlIG1vZHVsZSwKLQkJCQkJSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlpZiAoIVNlcnZlclVJUGx1Z2luLmlzQ29tcGF0aWJsZVdpdGhMYXVuY2hNb2RlKGZpbmFsU2VydmVyLAotCQkJCQkJbGF1bmNoTW9kZSkpCi0JCQkJCXJldHVybiBudWxsOwotCi0JCQkJaWYgKCFTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKGZpbmFsU2VydmVyLCBtb2R1bGUsIG1vbml0b3IpKSB7Ci0JCQkJCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IGZpbmFsU2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTZXJ2ZXJVdGlsLm1vZGlmeU1vZHVsZXMod2MsIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwKLQkJCQkJCQkJbmV3IElNb2R1bGVbMF0sIG1vbml0b3IpOwotCQkJCQkJd2Muc2F2ZShmYWxzZSwgbW9uaXRvcik7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJCXRocm93IGNlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIGZpbmFsU2VydmVyOwotCQkJfQotCQl9OwotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCS8vIGR1bW15IGFjdGlvbgotCQl9OwotCQlyb3Muc2VsZWN0aW9uQ2hhbmdlZChhY3Rpb24sIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRhdGEpKTsKLQotCQlyb3MucnVuKGFjdGlvbik7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2VydmVyQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXJ2ZXJDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNzM5MzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXJ2ZXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5BYnN0cmFjdE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci0vKioKLSAqIEEgY29tbWFuZCBvbiBhIHNlcnZlci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlckNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdGlvbiB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXI7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJDb21tYW5kIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbmFtZSBhIGxhYmVsCi0JICovCi0JcHVibGljIFNlcnZlckNvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoKTsKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0KSB7Ci0JCWV4ZWN1dGUoKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgdW5kbygpOwotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHQpIHsKLQkJdW5kbygpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdCkgewotCQlyZXR1cm4gZXhlY3V0ZShtb25pdG9yLCBhZGFwdCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0UHVibGlzaGVyRW5hYmxlbWVudENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0UHVibGlzaGVyRW5hYmxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2NTYwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFB1Ymxpc2hlckVuYWJsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUHVibGlzaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgc2VydmVyJ3MgcHVibGlzaGVyIHNldHRpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRQdWJsaXNoZXJFbmFibGVtZW50Q29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBQdWJsaXNoZXIgcHViOwotCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZWQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gb2xkRW5hYmxlZDsKLQotCS8qKgotCSAqIFNldFB1Ymxpc2hlckVuYWJsZW1lbnRDb21tYW5kIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gcHViIGEgcHVibGlzaGVyCi0JICogQHBhcmFtIGVuYWJsZWQgd2hldGhlciB0aGUgcHVibGlzaGVyIHNob3VsZCBiZSBlbmFibGVkIG9yIGRpc2FibGVkCi0JICovCi0JcHVibGljIFNldFB1Ymxpc2hlckVuYWJsZW1lbnRDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIFB1Ymxpc2hlciBwdWIsIGJvb2xlYW4gZW5hYmxlZCkgewotCQlzdXBlcihzZXJ2ZXIsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaENvbW1hbmQpOwotCQl0aGlzLnB1YiA9IHB1YjsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOwotCQlvbGRFbmFibGVkID0gc3djLmlzUHVibGlzaGVyRW5hYmxlZChwdWIpOwotCQlzd2Muc2V0UHVibGlzaGVyRW5hYmxlZChwdWIsIGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7Ci0JCXN3Yy5zZXRQdWJsaXNoZXJFbmFibGVkKHB1Yiwgb2xkRW5hYmxlZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyQXV0b1B1Ymxpc2hEZWZhdWx0Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJBdXRvUHVibGlzaERlZmF1bHRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YTc0NGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJBdXRvUHVibGlzaERlZmF1bHRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQ29tbWFuZCB0byBjaGFuZ2UgdGhlIHNlcnZlcidzIGF1dG8tcHVibGlzaCBzZXR0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgU2V0U2VydmVyQXV0b1B1Ymxpc2hEZWZhdWx0Q29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBpbnQgc2V0dGluZzsKLQlwcm90ZWN0ZWQgaW50IG9sZFNldHRpbmc7Ci0KLQkvKioKLQkgKiBTZXRTZXJ2ZXJBdXRvUHVibGlzaERlZmF1bHRDb21tYW5kIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gc2V0dGluZyB0aGUgYXV0by1wdWJsaXNoIHNldHRpbmcKLQkgKi8KLQlwdWJsaWMgU2V0U2VydmVyQXV0b1B1Ymxpc2hEZWZhdWx0Q29tbWFuZChJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBpbnQgc2V0dGluZykgewotCQlzdXBlcihzZXJ2ZXIsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaENvbW1hbmQpOwotCQl0aGlzLnNldHRpbmcgPSBzZXR0aW5nOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7Ci0JCW9sZFNldHRpbmcgPSBzd2MuZ2V0QXV0b1B1Ymxpc2hTZXR0aW5nKCk7Ci0JCXN3Yy5zZXRBdXRvUHVibGlzaFNldHRpbmcoc2V0dGluZyk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlTZXJ2ZXJXb3JraW5nQ29weSBzd2MgPSAoU2VydmVyV29ya2luZ0NvcHkpIHNlcnZlcjsKLQkJc3djLnNldEF1dG9QdWJsaXNoU2V0dGluZyhvbGRTZXR0aW5nKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJBdXRvUHVibGlzaFRpbWVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlckF1dG9QdWJsaXNoVGltZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI1ODZhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlckF1dG9QdWJsaXNoVGltZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgc2VydmVyJ3MgYXV0by1wdWJsaXNoIHNldHRpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRTZXJ2ZXJBdXRvUHVibGlzaFRpbWVDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIGludCB0aW1lOwotCXByb3RlY3RlZCBpbnQgb2xkVGltZTsKLQotCS8qKgotCSAqIFNldFNlcnZlckF1dG9QdWJsaXNoRGVmYXVsdENvbW1hbmQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSB0aW1lIGEgcHVibGlzaCB0aW1lCi0JICovCi0JcHVibGljIFNldFNlcnZlckF1dG9QdWJsaXNoVGltZUNvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgaW50IHRpbWUpIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1B1Ymxpc2hDb21tYW5kKTsKLQkJdGhpcy50aW1lID0gdGltZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOwotCQlvbGRUaW1lID0gc3djLmdldEF1dG9QdWJsaXNoVGltZSgpOwotCQlzd2Muc2V0QXV0b1B1Ymxpc2hUaW1lKHRpbWUpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7Ci0JCXN3Yy5zZXRBdXRvUHVibGlzaFRpbWUob2xkVGltZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyQ29uZmlndXJhdGlvbkZvbGRlckNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyQ29uZmlndXJhdGlvbkZvbGRlckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxYmI2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlckNvbmZpZ3VyYXRpb25Gb2xkZXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZm9sZGVyLgotICovCi1wdWJsaWMgY2xhc3MgU2V0U2VydmVyQ29uZmlndXJhdGlvbkZvbGRlckNvbW1hbmQgZXh0ZW5kcyBTZXJ2ZXJDb21tYW5kIHsKLQlwcm90ZWN0ZWQgSUZvbGRlciBmb2xkZXI7Ci0JcHJvdGVjdGVkIElGb2xkZXIgb2xkRm9sZGVyOwotCi0JLyoqCi0JICogU2V0U2VydmVyQ29uZmlndXJhdGlvbkZvbGRlckNvbW1hbmQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBmb2xkZXIgYSBuZXcgc2VydmVyIGNvbmZpZ3VyYXRpb24gbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgU2V0U2VydmVyQ29uZmlndXJhdGlvbkZvbGRlckNvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgSUZvbGRlciBmb2xkZXIpIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckhvc3RuYW1lQ29tbWFuZCk7Ci0JCXRoaXMuZm9sZGVyID0gZm9sZGVyOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkRm9sZGVyID0gc2VydmVyLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKLQkJc2VydmVyLnNldFNlcnZlckNvbmZpZ3VyYXRpb24oZm9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXNlcnZlci5zZXRTZXJ2ZXJDb25maWd1cmF0aW9uKG9sZEZvbGRlcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVySG9zdG5hbWVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlckhvc3RuYW1lQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNThiZDg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVySG9zdG5hbWVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQ29tbWFuZCB0byBjaGFuZ2UgdGhlIHNlcnZlciBob3N0bmFtZS4KLSAqLwotcHVibGljIGNsYXNzIFNldFNlcnZlckhvc3RuYW1lQ29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG9sZE5hbWU7Ci0KLQkvKioKLQkgKiBTZXRTZXJ2ZXJIb3N0bmFtZUNvbW1hbmQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBuYW1lIGEgaG9zdG5hbWUgb3IgSVAgYWRkcmVzcwotCSAqLwotCXB1YmxpYyBTZXRTZXJ2ZXJIb3N0bmFtZUNvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckhvc3RuYW1lQ29tbWFuZCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGROYW1lID0gc2VydmVyLmdldEhvc3QoKTsKLQkJc2VydmVyLnNldEhvc3QobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlzZXJ2ZXIuc2V0SG9zdChvbGROYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJOYW1lQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJOYW1lQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmE0MTZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyTmFtZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgc2VydmVyIG5hbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRTZXJ2ZXJOYW1lQ29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG9sZE5hbWU7Ci0KLQkvKioKLQkgKiBTZXRTZXJ2ZXJOYW1lQ29tbWFuZCBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHBhcmFtIG5hbWUgYSBuYW1lIGZvciB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIFNldFNlcnZlck5hbWVDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHNlcnZlciwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJOYW1lQ29tbWFuZCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGROYW1lID0gc2VydmVyLmdldE5hbWUoKTsKLQkJc2VydmVyLnNldE5hbWUobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlzZXJ2ZXIuc2V0TmFtZShvbGROYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJSdW50aW1lQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJSdW50aW1lQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGM5YTA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyUnVudGltZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQ29tbWFuZCB0byBjaGFuZ2UgdGhlIHNlcnZlciBydW50aW1lLgotICovCi1wdWJsaWMgY2xhc3MgU2V0U2VydmVyUnVudGltZUNvbW1hbmQgZXh0ZW5kcyBTZXJ2ZXJDb21tYW5kIHsKLQlwcm90ZWN0ZWQgSVJ1bnRpbWUgcnVudGltZTsKLQlwcm90ZWN0ZWQgSVJ1bnRpbWUgb2xkUnVudGltZTsKLQotCS8qKgotCSAqIFNldFNlcnZlclJ1bnRpbWVDb21tYW5kIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gcnVudGltZSBhIHNlcnZlciBydW50aW1lCi0JICovCi0JcHVibGljIFNldFNlcnZlclJ1bnRpbWVDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1J1bnRpbWVDb21tYW5kKTsKLQkJdGhpcy5ydW50aW1lID0gcnVudGltZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZFJ1bnRpbWUgPSBzZXJ2ZXIuZ2V0UnVudGltZSgpOwotCQlzZXJ2ZXIuc2V0UnVudGltZShydW50aW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXNlcnZlci5zZXRSdW50aW1lKG9sZFJ1bnRpbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlclN0YXJ0VGltZW91dENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyU3RhcnRUaW1lb3V0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2Y2ZDZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyU3RhcnRUaW1lb3V0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIENvbW1hbmQgdG8gY2hhbmdlIHRoZSBzZXJ2ZXIncyBzdGFydCB0aW1lb3V0IHNldHRpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRTZXJ2ZXJTdGFydFRpbWVvdXRDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIGludCB0aW1lOwotCXByb3RlY3RlZCBpbnQgb2xkVGltZTsKLQotCS8qKgotCSAqIFNldFNlcnZlclN0YXJ0VGltZW91dENvbW1hbmQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSB0aW1lIGEgcHVibGlzaCB0aW1lCi0JICovCi0JcHVibGljIFNldFNlcnZlclN0YXJ0VGltZW91dENvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgaW50IHRpbWUpIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1RpbWVvdXRDb21tYW5kKTsKLQkJdGhpcy50aW1lID0gdGltZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOwotCQlvbGRUaW1lID0gc3djLmdldFN0YXJ0VGltZW91dCgpOwotCQlzd2Muc2V0U3RhcnRUaW1lb3V0KHRpbWUpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7Ci0JCXN3Yy5zZXRTdGFydFRpbWVvdXQob2xkVGltZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJTdG9wVGltZW91dENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyU3RvcFRpbWVvdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYzE4NTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJTdG9wVGltZW91dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgc2VydmVyJ3Mgc3RvcCB0aW1lb3V0IHNldHRpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRTZXJ2ZXJTdG9wVGltZW91dENvbW1hbmQgZXh0ZW5kcyBTZXJ2ZXJDb21tYW5kIHsKLQlwcm90ZWN0ZWQgaW50IHRpbWU7Ci0JcHJvdGVjdGVkIGludCBvbGRUaW1lOwotCi0JLyoqCi0JICogU2V0U2VydmVyU3RvcFRpbWVvdXRDb21tYW5kIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gdGltZSBhIHB1Ymxpc2ggdGltZQotCSAqLwotCXB1YmxpYyBTZXRTZXJ2ZXJTdG9wVGltZW91dENvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgaW50IHRpbWUpIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1RpbWVvdXRDb21tYW5kKTsKLQkJdGhpcy50aW1lID0gdGltZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOwotCQlvbGRUaW1lID0gc3djLmdldFN0b3BUaW1lb3V0KCk7Ci0JCXN3Yy5zZXRTdG9wVGltZW91dCh0aW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOwotCQlzd2Muc2V0U3RvcFRpbWVvdXQob2xkVGltZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0dsb2JhbENvbW1hbmRNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvR2xvYmFsQ29tbWFuZE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI3MDkyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvR2xvYmFsQ29tbWFuZE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5JU2VydmVyRWRpdG9yUGFydElucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEdsb2JhbENvbW1hbmRNYW5hZ2VyIHsKLQkvLyBtYXhpbXVtIG51bWJlciBvZiBjb21tYW5kcyBpbiB0aGUgaGlzdG9yeQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfSElTVE9SWSA9IDIwMDsKLQotCWNsYXNzIFNlcnZlclJlc291cmNlQ29tbWFuZCB7Ci0JCUlVbmRvYWJsZU9wZXJhdGlvbiBjb21tYW5kOwotCQlTdHJpbmcgaWQ7Ci0JfQotCi0JLy8gY29tbWFuZHMgaW4gdGhlIHVuZG8gaGlzdG9yeQotCXByb3RlY3RlZCBMaXN0PFNlcnZlclJlc291cmNlQ29tbWFuZD4gdW5kb0xpc3QgPSBuZXcgQXJyYXlMaXN0PFNlcnZlclJlc291cmNlQ29tbWFuZD4oKTsKLQotCS8vIHNpemUgb2YgdGhlIHVuZG8gc3RhY2sgb24gbGFzdCBzYXZlCi0JcHJvdGVjdGVkIGludCB1bmRvU2F2ZUluZGV4ID0gMDsKLQotCS8vIGNvbW1hbmRzIGluIHRoZSByZWRvIGhpc3RvcnkKLQlwcm90ZWN0ZWQgTGlzdDxTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQ+IHJlZG9MaXN0ID0gbmV3IEFycmF5TGlzdDxTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQ+KCk7Ci0KLQljbGFzcyBDb21tYW5kTWFuYWdlckluZm8gewotCQkvLyBudW1iZXIgb2Ygb3BlbiBlZGl0b3JzIG9uIHRoaXMgcmVzb3VyY2UKLQkJaW50IGNvdW50OwotCQkKLQkJLy8gdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgaGFzIG5vdCBiZWVuIHNhdmVkIHNpbmNlCi0JCS8vIHRoZSBsYXN0IGNoYW5nZQotCQlib29sZWFuIGlzRGlydHk7Ci0JCQotCQkvLyB0cnVlIGlmIHRoZSByZXNvdXJjZSBpcyByZWFkLW9ubHkKLQkJYm9vbGVhbiBpc1JlYWRPbmx5OwotCQkKLQkJLy8gdGhlIGVsZW1lbnQgaWQKLQkJU3RyaW5nIGlkOwotCQkKLQkJLy8gdGhlIHdvcmtpbmcgY29weQotCQlJU2VydmVyV29ya2luZ0NvcHkgd2M7Ci0JCQotCQkvLyBmaWxlcyBhbmQgdGltZXN0YW1wcwotCQlNYXA8SUZpbGUsIExvbmc+IGZpbGVNYXA7Ci0JCQotCQlpbnQgdGltZXN0YW1wOwotCX0KLQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBDb21tYW5kTWFuYWdlckluZm8+IGNvbW1hbmRNYW5hZ2VycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ29tbWFuZE1hbmFnZXJJbmZvPigpOwotCi0JLy8gcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycwotCXByb3RlY3RlZCBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IHByb3BlcnR5TGlzdGVuZXJzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRElSVFkgPSAiZGlydHlTdGF0ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9VTkRPID0gInVuZG9BY3Rpb24iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUkVETyA9ICJyZWRvQWN0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1JFTE9BRCA9ICJyZWxvYWQiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBHbG9iYWxDb21tYW5kTWFuYWdlciBpbnN0YW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgR2xvYmFsQ29tbWFuZE1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgR2xvYmFsQ29tbWFuZE1hbmFnZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIGluc3RhbmNlLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocHJvcGVydHlMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXByb3BlcnR5TGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPigpOwotCQlwcm9wZXJ0eUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoaXMgaW5zdGFuY2UuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChwcm9wZXJ0eUxpc3RlbmVycyAhPSBudWxsKQotCQkJcHJvcGVydHlMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmIChwcm9wZXJ0eUxpc3RlbmVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLCBwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCS8vVHJhY2UudHJhY2UoIkZpcmluZzogIiArIGV2ZW50ICsgIiAiICsgb2xkVmFsdWUpOwotCQl0cnkgewotCQkJaW50IHNpemUgPSBwcm9wZXJ0eUxpc3RlbmVycy5zaXplKCk7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gcGNsID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbc2l6ZV07Ci0JCQlwcm9wZXJ0eUxpc3RlbmVycy50b0FycmF5KHBjbCk7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCXRyeSB7Ci0JCQkJCXBjbFtpXS5wcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNvbW1hbmQgbWFuYWdlciBmb3IgYSBnaXZlbiBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYW4gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRDb21tYW5kTWFuYWdlcihTdHJpbmcgaWQpIHsKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIkdldHRpbmcgY29tbWFuZCBtYW5hZ2VyIGZvciAiICsgaWQpOwotCQl9Ci0JCXRyeSB7Ci0JCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IGNvbW1hbmRNYW5hZ2Vycy5nZXQoaWQpOwotCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCWluZm8uY291bnQgKys7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkNvdWxkIG5vdCBmaW5kIGV4aXN0aW5nIGNvbW1hbmQgbWFuYWdlciIsIGUpOwotCQkJfQotCQl9Ci0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJDcmVhdGluZyBuZXcgY29tbWFuZCBtYW5hZ2VyIGZvciAiICsgaWQpOwotCQl9Ci0JCXRyeSB7Ci0JCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IG5ldyBDb21tYW5kTWFuYWdlckluZm8oKTsKLQkJCWluZm8uY291bnQgPSAxOwotCQkJaW5mby5pZCA9IGlkOwotCQkJSVNlcnZlciBzZXJ2ZXIgPSBudWxsOwotCQkJaWYgKGlkICE9IG51bGwpCi0JCQkJc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKGlkKTsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQlpbmZvLndjID0gc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCQlpbmZvLmlzRGlydHkgPSBmYWxzZTsKLQkJCWluZm8uaXNSZWFkT25seSA9IGZhbHNlOwotCQkJY29tbWFuZE1hbmFnZXJzLnB1dChpZCwgaW5mbyk7Ci0JCQl1cGRhdGVUaW1lc3RhbXBzKGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IG9idGFpbiBjb21tYW5kIG1hbmFnZXIiLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogUmVsZWFzZSB0aGUgY29tbWFuZCBtYW5hZ2VyIGZvciBhIGdpdmVuIGlkLgotCSAqIAotCSAqIEBwYXJhbSBpZCBhbiBpZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VDb21tYW5kTWFuYWdlcihTdHJpbmcgaWQpIHsKLQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIlJlbGVhc2luZyBjb21tYW5kIG1hbmFnZXIgZm9yICIgKyBpZCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gY29tbWFuZE1hbmFnZXJzLmdldChpZCk7Ci0JCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJaW5mby5jb3VudCAtLTsKLQkJCQlpZiAoaW5mby5jb3VudCA9PSAwKSB7Ci0JCQkJCWNvbW1hbmRNYW5hZ2Vycy5yZW1vdmUoaWQpOwotCQkJCQljbGVhclVuZG9MaXN0KGlkKTsKLQkJCQkJY2xlYXJSZWRvTGlzdChpZCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZCBub3QgcmVsZWFzZSBjb21tYW5kIG1hbmFnZXIiLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbG9hZCB0aGUgY29tbWFuZCBtYW5hZ2VyIGZvciBhIGdpdmVuIGlkLgotCSAqIAotCSAqIEBwYXJhbSBpZCBhbiBpZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbG9hZChTdHJpbmcgaWQpIHsKLQkJdHJ5IHsKLQkJCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oaWQpOwotCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCUlTZXJ2ZXIgc2VydmVyID0gbnVsbDsKLQkJCQlpZiAoaWQgIT0gbnVsbCkKLQkJCQkJc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKGlkKTsKLQkJCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJCWluZm8ud2MgPSBzZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQUk9QX1JFTE9BRCwgaWQsIG51bGwpOwotCQkJfQotCQkJY2xlYXJVbmRvTGlzdChpZCk7Ci0JCQljbGVhclJlZG9MaXN0KGlkKTsKLQkJCXVuZG9TYXZlSW5kZXggPSB1bmRvTGlzdC5zaXplKCk7Ci0JCQlzZXREaXJ0eVN0YXRlKGlkLCBmYWxzZSk7Ci0JCQl1cGRhdGVUaW1lc3RhbXBzKGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IHJlbGVhc2UgY29tbWFuZCBtYW5hZ2VyIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZE1hbmFnZXJJbmZvIGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKFN0cmluZyBpZCkgewotCQl0cnkgewotCQkJcmV0dXJuIGNvbW1hbmRNYW5hZ2Vycy5nZXQoaWQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZCBub3QgZmluZCBleGlzdGluZyBjb21tYW5kIG1hbmFnZXIgaW5mbyIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBvbmx5IG9uZSBjb21tYW5kIG1hbmFnZXIuCi0JICogCi0JICogQHBhcmFtIGlkIGFuIGlkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb25seSBjb21tYW5kIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09ubHlDb21tYW5kTWFuYWdlcihTdHJpbmcgaWQpIHsKLQkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhpZCk7Ci0JCXJldHVybiAoaW5mbyAhPSBudWxsICYmIGluZm8uY291bnQgPT0gMSk7Ci0JfQotCQotCXByb3RlY3RlZCBJU2VydmVyRWRpdG9yUGFydElucHV0IGdldFBhcnRJbnB1dChTdHJpbmcgc2VydmVySWQsIFNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIgc2VydmVyQ29tbWFuZE1hbmFnZXIpIHsKLQkJQ29tbWFuZE1hbmFnZXJJbmZvIHNlcnZlckluZm8gPSBudWxsOwotCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gbnVsbDsKLQkJYm9vbGVhbiBzZXJ2ZXJSZWFkT25seSA9IGZhbHNlOwotCQlpZiAoc2VydmVySWQgIT0gbnVsbCkgewotCQkJc2VydmVySW5mbyA9IGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKHNlcnZlcklkKTsKLQkJCWlmIChzZXJ2ZXJJbmZvID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJCXNlcnZlciA9IHNlcnZlckluZm8ud2M7Ci0JCQlzZXJ2ZXJSZWFkT25seSA9IHNlcnZlckluZm8uaXNSZWFkT25seTsKLQkJfQotCi0JCXJldHVybiBuZXcgU2VydmVyRWRpdG9yUGFydElucHV0KHNlcnZlckNvbW1hbmRNYW5hZ2VyLCBzZXJ2ZXIsIHNlcnZlclJlYWRPbmx5KTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRTZXJ2ZXJSZXNvdXJjZShTdHJpbmcgaWQpIHsKLQkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhpZCk7Ci0JCWlmIChpbmZvID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQotCQlyZXR1cm4gaW5mby53YzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnRseSBhY3RpdmUgc2hlbGwuCi0JICogCi0JICogQHJldHVybiBhIHNoZWxsCi0JICovCi0JcHJpdmF0ZSBTaGVsbCBnZXRTaGVsbCgpIHsKLQkJdHJ5IHsKLQkJCURpc3BsYXkgZCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQkJaWYgKGQgPT0gbnVsbCkKLQkJCQlkID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQkKLQkJCXJldHVybiBkLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkNvdWxkIG5vdCBnZXQgc2hlbGwiLCBlKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgZ2l2ZW4gY29tbWFuZCBhbmQgcGxhY2UgaXQgaW4gdGhlIHVuZG8gc3RhY2suCi0JICogSWYgdGhlIGNvbW1hbmQgY2Fubm90IGJlIHVuZG9uZSwgdGhlIHVzZXIgd2lsbCBiZSBub3RpZmllZAotCSAqIGJlZm9yZSBpdCBpcyBleGVjdXRlZC4KLQkgKgotCSAqIEBwYXJhbSBpZCBhbiBpZAotCSAqIEBwYXJhbSBjb21tYW5kIGEgdGFzawotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGVDb21tYW5kKFN0cmluZyBpZCwgSVVuZG9hYmxlT3BlcmF0aW9uIGNvbW1hbmQpIHsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCQkKLQkJaWYgKCFjb21tYW5kLmNhblVuZG8oKSAmJiAhdW5kb0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQl0cnkgewotCQkJCWlmICghTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShzaGVsbCwgTWVzc2FnZXMuZWRpdG9yU2VydmVyRWRpdG9yLCBNZXNzYWdlcy5lZGl0b3JQcm9tcHRJcnJldmVyc2libGUpKQotCQkJCQlyZXR1cm47Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JCQotCQlTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQgc3JjID0gbmV3IFNlcnZlclJlc291cmNlQ29tbWFuZCgpOwotCQlzcmMuaWQgPSBpZDsKLQkJc3JjLmNvbW1hbmQgPSBjb21tYW5kOwotCQkKLQkJdHJ5IHsKLQkJCUlBZGFwdGFibGUgYWRhcHRhYmxlID0gbmV3IElBZGFwdGFibGUoKSB7Ci0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKFNoZWxsLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkKLQkJCQkJCXJldHVybiBzaGVsbDsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gY29tbWFuZC5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIGFkYXB0YWJsZSk7Ci0JCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpCi0JCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIE1lc3NhZ2VzLmVkaXRvclNlcnZlckVkaXRvciwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBjZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBleGVjdXRpbmcgY29tbWFuZCIsIGNlKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhpZCk7Ci0JCWlmIChpbmZvID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoY29tbWFuZC5jYW5VbmRvKCkpCi0JCQlhZGRUb1VuZG9MaXN0KHNyYyk7Ci0JCWVsc2UgewotCQkJdW5kb1NhdmVJbmRleCA9IC0xOwotCQkJY2xlYXJVbmRvTGlzdChpZCk7Ci0JCX0KLQkJCi0JCS8vIGNsZWFyIHJlZG8gbGlzdCBzaW5jZSBhIG5ldyBjb21tYW5kIGhhcyBiZWVuIGV4ZWN1dGVkLgotCQljbGVhclJlZG9MaXN0KGlkKTsKLQkJCi0JCXNldERpcnR5U3RhdGUoaWQsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIGNvbW1hbmQgdG8gdGhlIGhpc3RvcnkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRvVW5kb0xpc3QoU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYykgewotCQl1bmRvTGlzdC5hZGQoc3JjKTsKLQotCQkvLyBsaW1pdCBoaXN0b3J5IGdyb3d0aAotCQlpZiAodW5kb0xpc3Quc2l6ZSgpID4gTUFYX0hJU1RPUlkpCi0JCQl1bmRvTGlzdC5yZW1vdmUoMCk7Ci0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUFJPUF9VTkRPLCBzcmMuaWQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENsZWFycyB0aGUgdW5kbyBvZiBhIHBhcnRpY3VsYXIgcmVzb3VyY2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFyVW5kb0xpc3QoU3RyaW5nIGlkKSB7Ci0JCWludCBpID0gMDsKLQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQl3aGlsZSAoaSA8IHVuZG9MaXN0LnNpemUoKSkgewotCQkJU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYyA9IHVuZG9MaXN0LmdldChpKTsKLQkJCWlmIChzcmMuaWQuZXF1YWxzKGlkKSkgewotCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQl1bmRvTGlzdC5yZW1vdmUoaSk7Ci0JCQl9IGVsc2UKLQkJCQlpKys7Ci0JCX0KLQkJaWYgKG1vZGlmaWVkKQotCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUFJPUF9VTkRPLCBpZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSByZWRvIG9mIGEgcGFydGljdWxhciByZXNvdXJjZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJSZWRvTGlzdChTdHJpbmcgaWQpIHsKLQkJaW50IGkgPSAwOwotCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCXdoaWxlIChpIDwgcmVkb0xpc3Quc2l6ZSgpKSB7Ci0JCQlTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQgc3JjID0gcmVkb0xpc3QuZ2V0KGkpOwotCQkJaWYgKHNyYy5pZC5lcXVhbHMoaWQpKSB7Ci0JCQkJcmVkb0xpc3QucmVtb3ZlKGkpOwotCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0gZWxzZQotCQkJCWkrKzsKLQkJfQotCQlpZiAobW9kaWZpZWQpCi0JCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQUk9QX1JFRE8sIGlkLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSBjb21tYW5kIHRoYXQgY2FuIGJlIHVuZG9uZS4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5VbmRvKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IHVuZG9MaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlclJlc291cmNlQ29tbWFuZCBzcmMgPSAoU2VydmVyUmVzb3VyY2VDb21tYW5kKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoc3JjLmlkID09IGEgfHwgc3JjLmlkID09IGIpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSBjb21tYW5kIHRoYXQgY2FuIGJlIHJlZG9uZS4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZWRvKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IHJlZG9MaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlclJlc291cmNlQ29tbWFuZCBzcmMgPSAoU2VydmVyUmVzb3VyY2VDb21tYW5kKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoc3JjLmlkID09IGEgfHwgc3JjLmlkID09IGIpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21tYW5kIHRoYXQgd291bGQgYmUgdW5kb25lIG5leHQuCi0JICogCi0JICogQHBhcmFtIGEgYW4gaWQKLQkgKiBAcmV0dXJuIGEgdGFzawotCSAqLwotCXB1YmxpYyBJVW5kb2FibGVPcGVyYXRpb24gZ2V0VW5kb0NvbW1hbmQoU3RyaW5nIGEpIHsKLQkJaW50IHNpemUgPSB1bmRvTGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSBzaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCVNlcnZlclJlc291cmNlQ29tbWFuZCBzcmMgPSB1bmRvTGlzdC5nZXQoaSk7Ci0JCQlpZiAoc3JjLmlkID09IGEpCi0JCQkJcmV0dXJuIHNyYy5jb21tYW5kOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1hbmQgdGhhdCB3b3VsZCBiZSByZWRvbmUgbmV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gYSBhbiBpZAotCSAqIEByZXR1cm4gYSB0YXNrCi0JICovCi0JcHVibGljIElVbmRvYWJsZU9wZXJhdGlvbiBnZXRSZWRvQ29tbWFuZChTdHJpbmcgYSkgewotCQlpbnQgc2l6ZSA9IHJlZG9MaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IHNpemUgLSAxOyBpID49IDA7IGktLSkgewotCQkJU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYyA9IHJlZG9MaXN0LmdldChpKTsKLQkJCWlmIChzcmMuaWQgPT0gYSkKLQkJCQlyZXR1cm4gc3JjLmNvbW1hbmQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgcmVzb3VyY2UgaXMgImRpcnR5Ii4KLQkgKgotCSAqIEBwYXJhbSBpZCBhbiBpZAotCSAqIEByZXR1cm4gYSB0YXNrCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eShTdHJpbmcgaWQpIHsKLQkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhpZCk7Ci0JCWlmIChpbmZvID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlyZXR1cm4gaW5mby5pc0RpcnR5OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciByZXNvdXJjZSBpcyByZWFkLW9ubHkuCi0JICoKLQkgKiBAcGFyYW0gaWQgYW4gaWQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KFN0cmluZyBpZCkgewotCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKGlkKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGluZm8uaXNSZWFkT25seTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc2VydmVyIHJlc291cmNlIHJlYWQtb25seSBmbGFnLgotCSAqIAotCSAqIEBwYXJhbSBpZCBhbiBpZAotCSAqIEBwYXJhbSByZWFkT25seSA8Y29kZT50cnVlPC9jb2RlPiB0byBzZXQgcmVhZC1vbmx5LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoU3RyaW5nIGlkLCBib29sZWFuIHJlYWRPbmx5KSB7Ci0JCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oaWQpOwotCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKGluZm8uaXNSZWFkT25seSA9PSByZWFkT25seSkKLQkJCXJldHVybjsKLQkJaW5mby5pc1JlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFBST1BfUkVMT0FELCBpZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgcmVzb3VyY2UgZmlsZXMgYXJlIHJlYWQtb25seS4KLQkgKgotCSAqIEBwYXJhbSBpZCBhbiBpZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGVzIGFyZSByZWFkLW9ubHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhcmVGaWxlc1JlYWRPbmx5KFN0cmluZyBpZCkgewotCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKGlkKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChnZXRSZWFkT25seUZpbGVzKGlkKS5sZW5ndGggPiAwKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZGlydHkgc3RhdGUgYW5kIGZpcmVzIGFuIGV2ZW50IGlmIG5lZWRlZC4KLQkgKiBAcGFyYW0gZGlydHkgYm9vbGVhbgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXREaXJ0eVN0YXRlKFN0cmluZyBpZCwgYm9vbGVhbiBkaXJ0eSkgewotCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKGlkKTsKLQkJaWYgKGluZm8uaXNEaXJ0eSA9PSBkaXJ0eSkKLQkJCXJldHVybjsKLQkJCi0JCWluZm8uaXNEaXJ0eSA9IGRpcnR5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQUk9QX0RJUlRZLCBpZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgbGFzdCBjb21tYW5kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVuZG8oU3RyaW5nIGEpIHsKLQkJU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYyA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdW5kb0xpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYzIgPSAoU2VydmVyUmVzb3VyY2VDb21tYW5kKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoc3JjMi5pZCA9PSBhKQotCQkJCXNyYyA9IHNyYzI7Ci0JCX0KLQkJaWYgKHNyYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJdHJ5IHsKLQkJCXNyYy5jb21tYW5kLnVuZG8obnVsbCwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlZSkgewotCQkJLy8gZG8gc29tZXRoaW5nCi0JCX0KLQkJCi0JCXVuZG9MaXN0LnJlbW92ZShzcmMpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQUk9QX1VORE8sIHNyYy5pZCwgbnVsbCk7Ci0JCXJlZG9MaXN0LmFkZChzcmMpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQUk9QX1JFRE8sIHNyYy5pZCwgbnVsbCk7Ci0JCQotCQlpZiAodW5kb1NhdmVJbmRleCA9PSB1bmRvTGlzdC5zaXplKCkpCi0JCQlzZXREaXJ0eVN0YXRlKHNyYy5pZCwgZmFsc2UpOwotCQllbHNlCi0JCQlzZXREaXJ0eVN0YXRlKHNyYy5pZCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmVkbyB0aGUgbGFzdCBjb21tYW5kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZG8oU3RyaW5nIGEpIHsKLQkJU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYyA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVkb0xpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYzIgPSAoU2VydmVyUmVzb3VyY2VDb21tYW5kKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoc3JjMi5pZCA9PSBhKQotCQkJCXNyYyA9IHNyYzI7Ci0JCX0KLQkJaWYgKHNyYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0JCQlJQWRhcHRhYmxlIGFkYXB0YWJsZSA9IG5ldyBJQWRhcHRhYmxlKCkgewotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChTaGVsbC5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCi0JCQkJCQlyZXR1cm4gc2hlbGw7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX07Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHNyYy5jb21tYW5kLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgYWRhcHRhYmxlKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZWRpdG9yU2VydmVyRWRpdG9yLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGNlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGV4ZWN1dGluZyBjb21tYW5kIiwgY2UpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCXJlZG9MaXN0LnJlbW92ZShzcmMpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQUk9QX1JFRE8sIHNyYy5pZCwgbnVsbCk7Ci0JCXVuZG9MaXN0LmFkZChzcmMpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQUk9QX1VORE8sIHNyYy5pZCwgbnVsbCk7Ci0JCQotCQlpZiAodW5kb1NhdmVJbmRleCA9PSB1bmRvTGlzdC5zaXplKCkpCi0JCQlzZXREaXJ0eVN0YXRlKHNyYy5pZCwgZmFsc2UpOwotCQllbHNlCi0JCQlzZXREaXJ0eVN0YXRlKHNyYy5pZCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBoaXN0b3J5IGxpc3QuCi0JICogCi0JICogQHBhcmFtIGlkIGFuIGlkCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VTYXZlZChTdHJpbmcgaWQpIHsKLQkJdW5kb1NhdmVJbmRleCA9IHVuZG9MaXN0LnNpemUoKTsKLQkJc2V0RGlydHlTdGF0ZShpZCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiByZWFkLW9ubHkgZmlsZXMuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbGVbXSBnZXRSZWFkT25seUZpbGVzKElTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlcikgewotCQl0cnkgewotCQkJTGlzdDxJRmlsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0JCQlJRmlsZSBmaWxlID0gKChTZXJ2ZXIpc2VydmVyKS5nZXRGaWxlKCk7Ci0JCQkKLQkJCWlmIChmaWxlICE9IG51bGwpCi0JCQkJbGlzdC5hZGQoZmlsZSk7Ci0JCQkKLQkJCUlGaWxlW10gZmlsZXMgPSBuZXcgSUZpbGVbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KGZpbGVzKTsKLQkJCXJldHVybiBmaWxlczsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiZ2V0UmVhZE9ubHlGaWxlcyIsIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBJRmlsZVtdIGdldFNlcnZlclJlc291cmNlRmlsZXMoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJRmlsZVswXTsKLQkJCi0JCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oaWQpOwotCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJRmlsZVswXTsKLQkJCi0JCXJldHVybiBnZXRSZWFkT25seUZpbGVzKGluZm8ud2MpOwotCX0KLQotCXByb3RlY3RlZCBJRmlsZVtdIGdldFJlYWRPbmx5RmlsZXMoU3RyaW5nIGlkKSB7Ci0JCUxpc3Q8SUZpbGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElGaWxlPigpOwotCQlJRmlsZVtdIGZpbGVzID0gZ2V0U2VydmVyUmVzb3VyY2VGaWxlcyhpZCk7Ci0JCWludCBzaXplID0gZmlsZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGZpbGVzW2ldLmlzUmVhZE9ubHkoKSkKLQkJCQlsaXN0LmFkZChmaWxlc1tpXSk7Ci0JCX0KLQkJCi0JCUlGaWxlW10gZmlsZUxpc3QgPSBuZXcgSUZpbGVbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkoZmlsZUxpc3QpOwotCQlyZXR1cm4gZmlsZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSB0aW1lc3RhbXBzLgotCSAqIAotCSAqIEBwYXJhbSBpZCBhbiBpZAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRpbWVzdGFtcHMoU3RyaW5nIGlkKSB7Ci0JCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oaWQpOwotCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaW5mby5maWxlTWFwID0gbmV3IEhhc2hNYXA8SUZpbGUsIExvbmc+KCk7Ci0JCUlGaWxlW10gZmlsZXMgPSBnZXRTZXJ2ZXJSZXNvdXJjZUZpbGVzKGlkKTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gZmlsZXMubGVuZ3RoOwotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXSAhPSBudWxsKSB7Ci0JCQkJCUZpbGUgZiA9IGZpbGVzW2ldLmdldExvY2F0aW9uKCkudG9GaWxlKCk7Ci0JCQkJCWlmIChmICE9IG51bGwpIHsKLQkJCQkJCWxvbmcgdGltZSA9IGYubGFzdE1vZGlmaWVkKCk7Ci0JCQkJCQlpbmZvLmZpbGVNYXAucHV0KGZpbGVzW2ldLCBuZXcgTG9uZyh0aW1lKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW5mby50aW1lc3RhbXAgPSBnZXRUaW1lc3RhbXAoaW5mbyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0VGltZXN0YW1wKENvbW1hbmRNYW5hZ2VySW5mbyBpbmZvKSB7Ci0JCUlTZXJ2ZXIgc2VydmVyID0gaW5mby53Yy5nZXRPcmlnaW5hbCgpOwotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuICgoU2VydmVyKXNlcnZlcikuZ2V0VGltZXN0YW1wKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNDaGFuZ2VkKFN0cmluZyBpZCkgewotCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKGlkKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSUZpbGVbXSBmaWxlcyA9IGdldFNlcnZlclJlc291cmNlRmlsZXMoaWQpOwotCQlpZiAoZmlsZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IHNpemUgPSBmaWxlcy5sZW5ndGg7Ci0JCQotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJY291bnQrKzsKLQkJCUZpbGUgZiA9IGZpbGVzW2ldLmdldExvY2F0aW9uKCkudG9GaWxlKCk7Ci0JCQl0cnkgewotCQkJCUxvbmcgdGltZSA9IGluZm8uZmlsZU1hcC5nZXQoZmlsZXNbaV0pOwotCQkJCWlmICh0aW1lLmxvbmdWYWx1ZSgpICE9IGYubGFzdE1vZGlmaWVkKCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJaW50IHRpbWVzdGFtcCA9IGdldFRpbWVzdGFtcChpbmZvKTsKLQkJaWYgKGluZm8udGltZXN0YW1wICE9IHRpbWVzdGFtcCkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJaWYgKGNvdW50ICE9IGluZm8uZmlsZU1hcC5zaXplKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvSU9yZGVyZWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JT3JkZXJlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODcyZjhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JT3JkZXJlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKLS8qKgotICogQW4gb2JqZWN0IHRoYXQgaGFzIGFuIGFic29sdXRlIG9yZGVyaW5nLCBhbmQgY2FuIGJlIG9yZGVyZWQgYWdhaW5zdCBvdGhlciBvYmplY3RzLgotICogCi0gKiA8cD4KLSAqIFtpc3N1ZTogSXQgaXMgbm90b3Jpb3VzbHkgZGlmZmljdWx0IHRvIHBsYWNlIGFueSBraW5kIG9mCi0gKiB1c2VmdWwgb3JkZXIgb24gb2JqZWN0cyB0aGF0IGFyZSBjb250cmlidXRlZCBpbmRlcGVuZGVudGx5IGJ5Ci0gKiBub24tY29sbGFib3JhdGluZyBwYXJ0aWVzLiBUaGUgSU9yZGVyZWQgbWVjaGFuaXNtIGlzIHdlYWssIGFuZAotICogY2FuJ3QgcmVhbGx5IHNvbHZlIHRoZSBwcm9ibGVtLiBJc3N1ZXMgb2YgcHJlc2VudGF0aW9uIGFyZSB1c3VhbGx5Ci0gKiBiZXN0IGxlZnQgdG8gdGhlIFVJLCB3aGljaCBjYW4gc29ydCBvYmplY3RzIGJhc2VkIG9uIGFyYml0cmFyeQotICogcHJvcGVydGllcy5dCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLjwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJT3JkZXJlZCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgb3JkZXIgKGluZGV4L3ByaW9yaXR5KS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3JkZXIoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvSVNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTc5MWVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5JU2VydmVyRWRpdG9yUGFydElucHV0OwotLyoqCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5IGV4dGVuZHMgSU9yZGVyZWQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkLgotCSAqIAotCSAqIEByZXR1cm4gYW4gaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gYSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNlcnZlciByZXNvdXJjZSB0eXBlIChnaXZlbiBieSB0aGUKLQkgKiBpZCkgY2FuIGJlIG9wZW5lZCB3aXRoIHRoaXMgZWRpdG9yLiBUaGlzIHJlc3VsdCBpcyBiYXNlZCBvbgotCSAqIHRoZSByZXN1bHQgb2YgdGhlIGdldEZhY3RvcnlJZHMoKSBtZXRob2QuCi0JICoKLQkgKiBAcGFyYW0gaWQgYW4gaWQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NlcnZlckVsZW1lbnRUeXBlKFN0cmluZyBpZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBlZGl0b3IgcGFnZSBzaG91bGQgYmUgdmlzaWJsZSB3aXRoIHRoZSBnaXZlbiBzZXJ2ZXIuCi0JICogVGhpcyBhbGxvd3MgKGZvciBpbnN0YW5jZSkgY29tcGxleCBjb25maWd1cmF0aW9uIHBhZ2VzIHRvIG9ubHkgYmUgc2hvd24gd2hlbiB1c2VkCi0JICogd2l0aCBub24tdW5pdHRlc3Qgc2VydmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYWN0aW9uIHNob3VsZCBkaXNwbGF5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkRGlzcGxheShJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyKTsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzaXRlIGFuIGVkaXRvciBzaXRlCi0JICogQHBhcmFtIGlucHV0IGEgc2VydmVyIGVkaXRvciBpbnB1dAotCSAqIEByZXR1cm4gYW4gYWN0aW9uCi0JICovCi0JcHVibGljIElBY3Rpb24gY3JlYXRlQWN0aW9uKElFZGl0b3JTaXRlIHNpdGUsIElTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQgaW5wdXQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JU2VydmVyRWRpdG9ySW5wdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JU2VydmVyRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlYzhkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvSVNlcnZlckVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci0vKioKLSAqIFRoaXMgaXMgdGhlIGVkaXRvciBpbnB1dCBmb3IgdGhlIHNlcnZlciBhbmQgc2VydmVyCi0gKiBjb25maWd1cmF0aW9uIGVkaXRvci4gVGhlIGlucHV0IGluY2x1ZGVzIGJvdGggYSBzZXJ2ZXIKLSAqIGFuZCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSAqCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlckVkaXRvcklucHV0IGV4dGVuZHMgSUVkaXRvcklucHV0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSUQgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLmVkaXRvciI7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgaWQuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZlcklkKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NDM4NTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLlNlcnZlckVkaXRvclNlY3Rpb247Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeSBleHRlbmRzIElPcmRlcmVkIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VydmVyIHJlc291cmNlIHR5cGUgKGdpdmVuIGJ5IHRoZQotCSAqIGlkKSBjYW4gYmUgb3BlbmVkIHdpdGggdGhpcyBlZGl0b3IuIFRoaXMgcmVzdWx0IGlzIGJhc2VkIG9uCi0JICogdGhlIHJlc3VsdCBvZiB0aGUgdHlwZXMgYXR0cmlidXRlLgotCSAqCi0JICogQHBhcmFtIGlkIHRoZSB0eXBlIGlkCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNUeXBlKFN0cmluZyBpZCk7Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJbnNlcnRpb25JZCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVkaXRvciBwYWdlIHNlY3Rpb24gc2hvdWxkIGJlIHZpc2libGUgd2l0aCB0aGUgZ2l2ZW4gc2VydmVyLgotCSAqIFRoaXMgYWxsb3dzIChmb3IgaW5zdGFuY2UpIGNvbXBsZXggY29uZmlndXJhdGlvbiBwYWdlcyB0byBvbmx5IGJlIHNob3duIHdoZW4gdXNlZAotCSAqIHdpdGggbm9uLXVuaXR0ZXN0IHNlcnZlcnMuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlY3Rpb24gc2hvdWxkIGJlIHNob3duLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZENyZWF0ZVNlY3Rpb24oSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcik7Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGVkaXRvciBwYWdlIHNlY3Rpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgc2VjdGlvbgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJFZGl0b3JTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjAxZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLS8qKgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyRWRpdG9yUGFydEZhY3RvcnkgZXh0ZW5kcyBJT3JkZXJlZCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQuCi0JICogCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkaXNwbGF5YWJsZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VydmVyIHJlc291cmNlIHR5cGUgKGdpdmVuIGJ5IHRoZQotCSAqIGlkKSBjYW4gYmUgb3BlbmVkIHdpdGggdGhpcyBlZGl0b3IuIFRoaXMgcmVzdWx0IGlzIGJhc2VkIG9uCi0JICogdGhlIHJlc3VsdCBvZiB0aGUgdHlwZXMgYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBpZCBhIHNlcnZlciB0eXBlIGlkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdHlwZSBpcyBzdXBwb3J0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1R5cGUoU3RyaW5nIGlkKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBhIGdpdmVuIGluc2VydGlvbiBpZCBpcyBzdXBwb3J0ZWQuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaW5zZXJ0aW9uIGlkIGlzIHN1cHBvcnRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzSW5zZXJ0aW9uSWQoU3RyaW5nIGlkKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBlZGl0b3IgcGFnZSBzaG91bGQgYmUgdmlzaWJsZSB3aXRoIHRoZSBnaXZlbiBzZXJ2ZXIuCi0JICogVGhpcyBhbGxvd3MgKGZvciBpbnN0YW5jZSkgY29tcGxleCBjb25maWd1cmF0aW9uIHBhZ2VzIHRvIG9ubHkgYmUgc2hvd24gd2hlbiB1c2VkCi0JICogd2l0aCBub24tdW5pdHRlc3Qgc2VydmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGFnZSBzaG91bGQgYmUgdmlzaWJsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZENyZWF0ZVBhZ2UoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcik7Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGVkaXRvciBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVkaXRvciBwYWdlCi0JICovCi0JcHVibGljIElFZGl0b3JQYXJ0IGNyZWF0ZVBhZ2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvT3ZlcnZpZXdFZGl0b3JQYXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvT3ZlcnZpZXdFZGl0b3JQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4Y2E1NWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL092ZXJ2aWV3RWRpdG9yUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1VJVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkF1dG9Db21wbGV0ZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkNvbnRyb2xEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkZpZWxkRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5GaWVsZERlY29yYXRpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5UZXh0Q29udGVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Db250YWluZXJTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSUZvcm1Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLk1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUHVibGlzaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Tb2NrZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuQWJzdHJhY3RVSUNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5BYnN0cmFjdFVJQ29udHJvbC5VSUNvbnRyb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLkFic3RyYWN0VUlDb250cm9sLklVSUNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY29tbWFuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5CYXNlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5CYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5UYXNrV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotLyoqCi0gKiBTZXJ2ZXIgZ2VuZXJhbCBlZGl0b3IgcGFnZS4KLSAqLwotcHVibGljIGNsYXNzIE92ZXJ2aWV3RWRpdG9yUGFydCBleHRlbmRzIFNlcnZlckVkaXRvclBhcnQgaW1wbGVtZW50cyBJVUlDb250cm9sTGlzdGVuZXIgewotCXByb3RlY3RlZCBUZXh0IHNlcnZlck5hbWU7Ci0JcHJvdGVjdGVkIFRleHQgc2VydmVyQ29uZmlndXJhdGlvbjsKLQlwcm90ZWN0ZWQgVGV4dCBob3N0bmFtZTsKLQlwcm90ZWN0ZWQgTGFiZWwgaG9zdG5hbWVMYWJlbDsKLQlwcm90ZWN0ZWQgQ29udHJvbERlY29yYXRpb24gaG9zdG5hbWVEZWNvcmF0aW9uOwotCXByb3RlY3RlZCBDb21ibyBydW50aW1lQ29tYm87Ci0JcHJvdGVjdGVkIEJ1dHRvbiBicm93c2U7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBhdXRvUHVibGlzaERpc2FibGU7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBhdXRvUHVibGlzaEVuYWJsZVJlc291cmNlOwotCXByb3RlY3RlZCBCdXR0b24gYXV0b1B1Ymxpc2hFbmFibGVCdWlsZDsKLQlwcm90ZWN0ZWQgU3Bpbm5lciBhdXRvUHVibGlzaFRpbWU7Ci0JcHJvdGVjdGVkIFRhYmxlIHB1Ymxpc2hlcnNUYWJsZTsKLQlwcm90ZWN0ZWQgQ2hlY2tib3hUYWJsZVZpZXdlciBwdWJsaXNoZXJzVmlld2VyOwotCXByb3RlY3RlZCBTcGlubmVyIHN0YXJ0VGltZW91dFNwaW5uZXI7Ci0JcHJvdGVjdGVkIFNwaW5uZXIgc3RvcFRpbWVvdXRTcGlubmVyOwotCXByb3RlY3RlZCBNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybTsKLQotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0aW5nOwotCi0JcHJvdGVjdGVkIElSdW50aW1lW10gcnVudGltZXM7Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyIHJ1bnRpbWVMaXN0ZW5lcjsKLQotCXByaXZhdGUgSVNlcnZlclR5cGUgb2xkU2VydmVyVHlwZTsKLQkKLQljbGFzcyBQdWJsaXNoZXJDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBCYXNlQ29udGVudFByb3ZpZGVyIHsKLQkJcHJvdGVjdGVkIFB1Ymxpc2hlcltdIHB1YnM7Ci0JCXB1YmxpYyBQdWJsaXNoZXJDb250ZW50UHJvdmlkZXIoUHVibGlzaGVyW10gcHVicykgewotCQkJdGhpcy5wdWJzID0gcHViczsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gcHViczsKLQkJfQotCX0KLQotCWNsYXNzIFB1Ymxpc2hMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHVibGlzaGVyKSB7Ci0JCQkJUHVibGlzaGVyIHB1YiA9IChQdWJsaXNoZXIpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIHB1Yi5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPdmVydmlld0VkaXRvclBhcnQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT3ZlcnZpZXdFZGl0b3JQYXJ0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKCkgewotCQlsaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoImNvbmZpZ3VyYXRpb24taWQiKSAmJiBzZXJ2ZXJDb25maWd1cmF0aW9uICE9IG51bGwpCi0JCQkJCXZhbGlkYXRlKCk7Ci0JCQkJCi0JCQkJLy8gZm9sbG93aW5nIGNvZGUgYmVoYXZlcyBwb29ybHkgYmVjYXVzZSB0aGVyZSBpcyBubyBkZWZhdWx0IGxvY2FsIG9yIHJlbW90ZQotCQkJCS8vIHB1Ymxpc2hpbmcgdGltZSBwZXIgc2VydmVyIG9yIHNlcnZlciB0eXBlLiBhcyBhIHJlc3VsdCBpdCBzZXRzIHRoZSB2YWx1ZQotCQkJCS8vIHRvIHRoZSBkZWZhdWx0LCB3aGljaCBzZWVtcyB0byBiZSBtb3JlIGhhcm0gdGhhbiBnb29kIHVudGlsIHdlIHJldmFtcCB0aGUKLQkJCQkvLyBkZWZhdWx0IHB1Ymxpc2hpbmcgdGltZXMKLQkJCQkvKmlmICgiaG9zdG5hbWUiLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJZmluYWwgU3RyaW5nIG9sZEhvc3RuYW1lID0gKFN0cmluZykgZXZlbnQuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJZmluYWwgU3RyaW5nIG5ld0hvc3RuYW1lID0gKFN0cmluZykgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJZmluYWwgYm9vbGVhbiBpc05ld0hvc3RuYW1lTG9jYWxob3N0ID0gU29ja2V0VXRpbC5pc0xvY2FsaG9zdChuZXdIb3N0bmFtZSk7Ci0JCQkJCWlmIChpc05ld0hvc3RuYW1lTG9jYWxob3N0ICE9IFNvY2tldFV0aWwuaXNMb2NhbGhvc3Qob2xkSG9zdG5hbWUpKSB7Ci0JCQkJCQkvLyBydW4gdGhpcyBjb2RlIG9ubHkgaWYgdGhlIGhvc3RuYW1lIGNoYW5nZWQgZnJvbQotCQkJCQkJLy8gJ2xvY2FsaG9zdCcgdG8gYSByZW1vdGUgbmFtZSwgb3IgdmljZS12ZXJzYQotCQkJCQkJaG9zdG5hbWUuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJaWYgKGlzTmV3SG9zdG5hbWVMb2NhbGhvc3QpIHsKLQkJCQkJCQkJCQlpbnQgYXV0b1B1Ymxpc2hUaW1lMiA9IFNlcnZlclByZWZlcmVuY2VzLmdldEluc3RhbmNlKCkuZ2V0QXV0b1B1Ymxpc2hMb2NhbFRpbWUoKTsKLQkJCQkJCQkJCQkoKFNlcnZlcldvcmtpbmdDb3B5KWdldFNlcnZlcigpKS5zZXRBdXRvUHVibGlzaFRpbWUoYXV0b1B1Ymxpc2hUaW1lMik7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCWludCBhdXRvUHVibGlzaFRpbWUyID0gU2VydmVyUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKS5nZXRBdXRvUHVibGlzaFJlbW90ZVRpbWUoKTsKLQkJCQkJCQkJCQkoKFNlcnZlcldvcmtpbmdDb3B5KWdldFNlcnZlcigpKS5zZXRBdXRvUHVibGlzaFRpbWUoYXV0b1B1Ymxpc2hUaW1lMik7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IHVwZGF0ZSBwdWJsaXNoIHRpbWUgdG8gbmV3IGhvc3QiKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfSovCi0JCQkJCi0JCQkJaWYgKHVwZGF0aW5nKQotCQkJCQlyZXR1cm47Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoIm5hbWUiKSkKLQkJCQkJdXBkYXRlTmFtZXMoKTsKLQkJCQllbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoImhvc3RuYW1lIikgJiYgaG9zdG5hbWUgIT0gbnVsbCkgewotCQkJCQlob3N0bmFtZS5zZXRUZXh0KChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKCJydW50aW1lLWlkIikpIHsKLQkJCQkJU3RyaW5nIHJ1bnRpbWVJZCA9IChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBudWxsOwotCQkJCQlpZiAocnVudGltZUlkICE9IG51bGwpCi0JCQkJCQlydW50aW1lID0gU2VydmVyQ29yZS5maW5kUnVudGltZShydW50aW1lSWQpOwotCQkJCQlpZiAocnVudGltZUNvbWJvICE9IG51bGwpIHsKLQkJCQkJCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCQlpZiAocnVudGltZXNbaV0uZXF1YWxzKHJ1bnRpbWUpKQotCQkJCQkJCQlydW50aW1lQ29tYm8uc2VsZWN0KGkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoImNvbmZpZ3VyYXRpb24taWQiKSAmJiBzZXJ2ZXJDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlzZXJ2ZXJDb25maWd1cmF0aW9uLnNldFRleHQocGF0aCk7Ci0JCQkJfSBlbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoU2VydmVyLlBST1BfQVVUT19QVUJMSVNIX1RJTUUpKSB7Ci0JCQkJCUludGVnZXIgY3VyQXV0b1B1Ymxpc2hUaW1lID0gKEludGVnZXIpZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJYXV0b1B1Ymxpc2hUaW1lLnNldFNlbGVjdGlvbihjdXJBdXRvUHVibGlzaFRpbWUuaW50VmFsdWUoKSk7Ci0JCQkJCVNXVFV0aWwuc2V0U3Bpbm5lclRvb2x0aXAoYXV0b1B1Ymxpc2hUaW1lKTsKLQkJCQkJdmFsaWRhdGUoKTsKLQkJCQl9IGVsc2UgaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhTZXJ2ZXIuUFJPUF9BVVRPX1BVQkxJU0hfU0VUVElORykpIHsKLQkJCQkJSW50ZWdlciBhdXRvUHVibGlzaFNldHRpbmcgPSAoSW50ZWdlcilldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlpbnQgc2V0dGluZyA9IGF1dG9QdWJsaXNoU2V0dGluZy5pbnRWYWx1ZSgpOwotCQkJCQlhdXRvUHVibGlzaEVuYWJsZVJlc291cmNlLnNldFNlbGVjdGlvbihzZXR0aW5nID09IFNlcnZlci5BVVRPX1BVQkxJU0hfUkVTT1VSQ0UpOwotCQkJCQlhdXRvUHVibGlzaEVuYWJsZUJ1aWxkLnNldFNlbGVjdGlvbihzZXR0aW5nID09IFNlcnZlci5BVVRPX1BVQkxJU0hfQlVJTEQpOwotCQkJCQlhdXRvUHVibGlzaERpc2FibGUuc2V0U2VsZWN0aW9uKHNldHRpbmcgPT0gU2VydmVyLkFVVE9fUFVCTElTSF9ESVNBQkxFKTsKLQkJCQkJYXV0b1B1Ymxpc2hUaW1lLnNldEVuYWJsZWQoc2V0dGluZyAhPSBTZXJ2ZXIuQVVUT19QVUJMSVNIX0RJU0FCTEUpOwotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKFNlcnZlci5QUk9QX1NUQVJUX1RJTUVPVVQpKSB7Ci0JCQkJCUludGVnZXIgdGltZSA9IChJbnRlZ2VyKWV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJCXN0YXJ0VGltZW91dFNwaW5uZXIuc2V0U2VsZWN0aW9uKHRpbWUuaW50VmFsdWUoKSk7Ci0JCQkJCVNXVFV0aWwuc2V0U3Bpbm5lclRvb2x0aXAoc3RhcnRUaW1lb3V0U3Bpbm5lcik7Ci0JCQkJfSBlbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoU2VydmVyLlBST1BfU1RPUF9USU1FT1VUKSkgewotCQkJCQlJbnRlZ2VyIHRpbWUgPSAoSW50ZWdlcilldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlzdG9wVGltZW91dFNwaW5uZXIuc2V0U2VsZWN0aW9uKHRpbWUuaW50VmFsdWUoKSk7Ci0JCQkJCVNXVFV0aWwuc2V0U3Bpbm5lclRvb2x0aXAoc3RvcFRpbWVvdXRTcGlubmVyKTsKLQkJCQl9IGVsc2UgaWYgKFNlcnZlci5QUk9QX1BVQkxJU0hFUlMuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlpZiAocHVibGlzaGVyc1ZpZXdlciA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCQkKLQkJCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSAoTGlzdDxTdHJpbmc+KSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJU3RyaW5nIGlkID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpbnQgaW5kID0gaWQuaW5kZXhPZigiOiIpOwotCQkJCQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCQkJCQlpZiAoInRydWUiLmVxdWFscyhpZC5zdWJzdHJpbmcoaW5kKzEpKSkKLQkJCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCQkJCWlkID0gaWQuc3Vic3RyaW5nKDAsIGluZCk7Ci0JCQkJCQlQdWJsaXNoZXIgcHViID0gU2VydmVyUGx1Z2luLmZpbmRQdWJsaXNoZXIoaWQpOwotCQkJCQkJaWYgKHB1YiAhPSBudWxsKQotCQkJCQkJCXB1Ymxpc2hlcnNWaWV3ZXIuc2V0Q2hlY2tlZChwdWIsIGVuYWJsZWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVOYW1lcygpIHsKLQkJaWYgKHNlcnZlck5hbWUgIT0gbnVsbCkKLQkJCXNlcnZlck5hbWUuc2V0VGV4dChzZXJ2ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBTV1QgY29udHJvbHMgZm9yIHRoaXMgd29ya2JlbmNoIHBhcnQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbWFuYWdlZEZvcm0gPSBuZXcgTWFuYWdlZEZvcm0ocGFyZW50KTsKLQkJc2V0TWFuYWdlZEZvcm0obWFuYWdlZEZvcm0pOwotCQlTY3JvbGxlZEZvcm0gZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJdG9vbGtpdC5kZWNvcmF0ZUZvcm1IZWFkaW5nKGZvcm0uZ2V0Rm9ybSgpKTsKLQkJZm9ybS5zZXRUZXh0KE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZVRpdGxlKTsKLQkJZm9ybS5zZXRJbWFnZShJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUikpOwotCQlmb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQotCQlDb21wb3NpdGUgY29sdW1uQ29tcCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGZvcm0uZ2V0Qm9keSgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCS8vbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQkvL2xheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTA7Ci0JCWNvbHVtbkNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbHVtbkNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQkKLQkJLy8gbGVmdCBjb2x1bW4KLQkJQ29tcG9zaXRlIGxlZnRDb2x1bW5Db21wID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoY29sdW1uQ29tcCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCWxlZnRDb2x1bW5Db21wLnNldExheW91dChsYXlvdXQpOwotCQlsZWZ0Q29sdW1uQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCQotCQljcmVhdGVHZW5lcmFsU2VjdGlvbihsZWZ0Q29sdW1uQ29tcCwgdG9vbGtpdCk7Ci0JCQotCQlpbnNlcnRTZWN0aW9ucyhsZWZ0Q29sdW1uQ29tcCwgIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZWRpdG9yLm92ZXJ2aWV3LmxlZnQiKTsKLQkJCi0JCS8vIHJpZ2h0IGNvbHVtbgotCQlDb21wb3NpdGUgcmlnaHRDb2x1bW5Db21wID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoY29sdW1uQ29tcCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCXJpZ2h0Q29sdW1uQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcmlnaHRDb2x1bW5Db21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJCi0JCWNyZWF0ZVB1Ymxpc2hTZWN0aW9uKHJpZ2h0Q29sdW1uQ29tcCwgdG9vbGtpdCk7Ci0JCWNyZWF0ZVRpbWVvdXRTZWN0aW9uKHJpZ2h0Q29sdW1uQ29tcCwgdG9vbGtpdCk7Ci0JCQotCQlpbnNlcnRTZWN0aW9ucyhyaWdodENvbHVtbkNvbXAsICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmVkaXRvci5vdmVydmlldy5yaWdodCIpOwotCQkKLQkJZm9ybS5yZWZsb3codHJ1ZSk7Ci0JCQotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGxlZnRDb2x1bW5Db21wLCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihsZWZ0Q29sdW1uQ29tcCwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIgfCBTZWN0aW9uLkRFU0NSSVBUSU9OKTsKLQkJc2VjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3R2VuZXJhbFNlY3Rpb24pOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3R2VuZXJhbERlc2NyaXB0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA1OwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSA1OwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuRURJVE9SX09WRVJWSUVXX1BBR0UpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb21wb3NpdGUpOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCQkKLQkJaW50IGRlY29yYXRpb25XaWR0aCA9IEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRNYXhpbXVtRGVjb3JhdGlvbldpZHRoKCk7IAotCQkKLQkJLy8gc2VydmVyIG5hbWUKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQljcmVhdGVMYWJlbCh0b29sa2l0LCBjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyTmFtZSk7Ci0JCQkKLQkJCXNlcnZlck5hbWUgPSB0b29sa2l0LmNyZWF0ZVRleHQoY29tcG9zaXRlLCBzZXJ2ZXIuZ2V0TmFtZSgpKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gZGVjb3JhdGlvbldpZHRoOwotCQkJc2VydmVyTmFtZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJc2VydmVyTmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCWlmICh1cGRhdGluZykKLQkJCQkJCXJldHVybjsKLQkJCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCQlleGVjdXRlKG5ldyBTZXRTZXJ2ZXJOYW1lQ29tbWFuZChnZXRTZXJ2ZXIoKSwgc2VydmVyTmFtZS5nZXRUZXh0KCkpKTsKLQkJCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCQkJdmFsaWRhdGUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXdocy5zZXRIZWxwKHNlcnZlck5hbWUsIENvbnRleHRJZHMuRURJVE9SX1NFUlZFUik7Ci0JCQkKLQkJCS8vIGhvc3RuYW1lCi0JCQlob3N0bmFtZUxhYmVsID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckhvc3RuYW1lKTsKLQkJCQotCQkJaG9zdG5hbWUgPSB0b29sa2l0LmNyZWF0ZVRleHQoY29tcG9zaXRlLCBzZXJ2ZXIuZ2V0SG9zdCgpKTsKLQkJCWhvc3RuYW1lRGVjb3JhdGlvbiA9IG5ldyBDb250cm9sRGVjb3JhdGlvbihob3N0bmFtZSwgU1dULlRPUCB8IFNXVC5MRUFEKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gZGVjb3JhdGlvbldpZHRoOwotCQkJaG9zdG5hbWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWhvc3RuYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJaWYgKHVwZGF0aW5nKQotCQkJCQkJcmV0dXJuOwotCQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJCWV4ZWN1dGUobmV3IFNldFNlcnZlckhvc3RuYW1lQ29tbWFuZChnZXRTZXJ2ZXIoKSwgaG9zdG5hbWUuZ2V0VGV4dCgpKSk7Ci0JCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJfQotCQkJfSk7Ci0JCQl3aHMuc2V0SGVscChob3N0bmFtZSwgQ29udGV4dElkcy5FRElUT1JfSE9TVE5BTUUpOwotCQkJCi0JCQlGaWVsZERlY29yYXRpb25SZWdpc3RyeSByZWdpc3RyeSA9IEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKTsKLQkJCUZpZWxkRGVjb3JhdGlvbiBmZCA9IHJlZ2lzdHJ5LmdldEZpZWxkRGVjb3JhdGlvbihGaWVsZERlY29yYXRpb25SZWdpc3RyeS5ERUNfQ09OVEVOVF9QUk9QT1NBTCk7Ci0JCQlob3N0bmFtZURlY29yYXRpb24uc2V0SW1hZ2UoZmQuZ2V0SW1hZ2UoKSk7Ci0JCQlob3N0bmFtZURlY29yYXRpb24uc2V0RGVzY3JpcHRpb25UZXh0KGZkLmdldERlc2NyaXB0aW9uKCkpOwotCQkJaG9zdG5hbWVEZWNvcmF0aW9uLmhpZGUoKTsKLQkJCQotCQkJaG9zdG5hbWUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJaG9zdG5hbWVEZWNvcmF0aW9uLnNob3coKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCWhvc3RuYW1lRGVjb3JhdGlvbi5oaWRlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCS8vdXBkYXRlRGVjb3JhdGlvbihob3N0bmFtZURlY29yYXRpb24sIG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsICJQcmVzcyBDdHJsLVNwYWNlIikpOwotCQkJCi0JCQlMaXN0PFN0cmluZz4gaG9zdHMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLmdldEhvc3RuYW1lcygpOwotCQkJU3RyaW5nW10gaG9zdHMyID0gaG9zdHMudG9BcnJheShuZXcgU3RyaW5nW2hvc3RzLnNpemUoKV0pOwotCQkJbmV3IEF1dG9Db21wbGV0ZUZpZWxkKGhvc3RuYW1lLCBuZXcgVGV4dENvbnRlbnRBZGFwdGVyKCksIGhvc3RzMik7Ci0JCX0KLQkJCi0JCS8vIHJ1bnRpbWUKLQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmhhc1J1bnRpbWUoKSkgewotCQkJZmluYWwgSHlwZXJsaW5rIGxpbmsgPSB0b29sa2l0LmNyZWF0ZUh5cGVybGluayhjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3UnVudGltZSwgU1dULk5PTkUpOwotCQkJbGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQkJSVJ1bnRpbWUgcnVudGltZSA9IHNlcnZlci5nZXRSdW50aW1lKCk7Ci0JCQkJCWlmIChydW50aW1lICE9IG51bGwgJiYgU2VydmVyVUlQbHVnaW4uaGFzV2l6YXJkRnJhZ21lbnQocnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpKQotCQkJCQkJZWRpdFJ1bnRpbWUocnVudGltZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCWZpbmFsIElSdW50aW1lIHJ1bnRpbWUgPSBzZXJ2ZXIuZ2V0UnVudGltZSgpOwotCQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCB8fCAhU2VydmVyVUlQbHVnaW4uaGFzV2l6YXJkRnJhZ21lbnQocnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpKQotCQkJCWxpbmsuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKTsKLQkJCXJ1bnRpbWVzID0gU2VydmVyVUlQbHVnaW4uZ2V0UnVudGltZXMocnVudGltZVR5cGUpOwotCQkJCi0JCQlydW50aW1lQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IGRlY29yYXRpb25XaWR0aDsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJcnVudGltZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQl1cGRhdGVSdW50aW1lQ29tYm8oKTsKLQkJCQotCQkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChydW50aW1lc1tpXS5lcXVhbHMocnVudGltZSkpCi0JCQkJCXJ1bnRpbWVDb21iby5zZWxlY3QoaSk7Ci0JCQl9Ci0JCQkKLQkJCXJ1bnRpbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKHVwZGF0aW5nKQotCQkJCQkJCXJldHVybjsKLQkJCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQkJCUlSdW50aW1lIG5ld1J1bnRpbWUgPSBydW50aW1lc1tydW50aW1lQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV07Ci0JCQkJCQlleGVjdXRlKG5ldyBTZXRTZXJ2ZXJSdW50aW1lQ29tbWFuZChnZXRTZXJ2ZXIoKSwgbmV3UnVudGltZSkpOwotCQkJCQkJbGluay5zZXRFbmFibGVkKG5ld1J1bnRpbWUgIT0gbnVsbCAmJiAhU2VydmVyVUlQbHVnaW4uaGFzV2l6YXJkRnJhZ21lbnQobmV3UnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpKTsKLQkJCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQl3aHMuc2V0SGVscChydW50aW1lQ29tYm8sIENvbnRleHRJZHMuRURJVE9SX1JVTlRJTUUpOwotCQkJCi0JCQkvLyBhZGQgcnVudGltZSBsaXN0ZW5lcgotCQkJcnVudGltZUxpc3RlbmVyID0gbmV3IElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVudGltZUNoYW5nZWQoZmluYWwgSVJ1bnRpbWUgcnVudGltZTIpIHsKLQkJCQkJLy8gbWF5IGJlIG5hbWUgY2hhbmdlIG9mIGN1cnJlbnQgcnVudGltZQotCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKHJ1bnRpbWUyLmVxdWFscyhnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkpKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCQkJCQkJZXhlY3V0ZShuZXcgU2V0U2VydmVyUnVudGltZUNvbW1hbmQoZ2V0U2VydmVyKCksIHJ1bnRpbWUyKSk7Ci0JCQkJCQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCWlmIChydW50aW1lQ29tYm8gIT0gbnVsbCAmJiAhcnVudGltZUNvbWJvLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQl1cGRhdGVSdW50aW1lQ29tYm8oKTsKLQkJCQkJCQkJCi0JCQkJCQkJCWludCBzaXplMiA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKSB7Ci0JCQkJCQkJCQlpZiAocnVudGltZXNbaV0uZXF1YWxzKHJ1bnRpbWUpKQotCQkJCQkJCQkJCXJ1bnRpbWVDb21iby5zZWxlY3QoaSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJ1bnRpbWVBZGRlZChmaW5hbCBJUnVudGltZSBydW50aW1lMikgewotCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKHJ1bnRpbWVDb21ibyAhPSBudWxsICYmICFydW50aW1lQ29tYm8uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJCXVwZGF0ZVJ1bnRpbWVDb21ibygpOwotCQkJCQkJCQkKLQkJCQkJCQkJaW50IHNpemUyID0gcnVudGltZXMubGVuZ3RoOwotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUyOyBpKyspIHsKLQkJCQkJCQkJCWlmIChydW50aW1lc1tpXS5lcXVhbHMocnVudGltZSkpCi0JCQkJCQkJCQkJcnVudGltZUNvbWJvLnNlbGVjdChpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcnVudGltZVJlbW92ZWQoSVJ1bnRpbWUgcnVudGltZTIpIHsKLQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmIChydW50aW1lQ29tYm8gIT0gbnVsbCAmJiAhcnVudGltZUNvbWJvLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQl1cGRhdGVSdW50aW1lQ29tYm8oKTsKLQkJCQkJCQkJCi0JCQkJCQkJCWludCBzaXplMiA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKSB7Ci0JCQkJCQkJCQlpZiAocnVudGltZXNbaV0uZXF1YWxzKHJ1bnRpbWUpKQotCQkJCQkJCQkJCXJ1bnRpbWVDb21iby5zZWxlY3QoaSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX07Ci0JCQkKLQkJCVNlcnZlckNvcmUuYWRkUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKHJ1bnRpbWVMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCS8vIHNlcnZlciBjb25maWd1cmF0aW9uIHBhdGgKLQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSkgewotCQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckNvbmZpZ3VyYXRpb25QYXRoKTsKLQkJCQotCQkJSUZvbGRlciBmb2xkZXIgPSBzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCQkJaWYgKGZvbGRlciA9PSBudWxsKQotCQkJCXNlcnZlckNvbmZpZ3VyYXRpb24gPSB0b29sa2l0LmNyZWF0ZVRleHQoY29tcG9zaXRlLCBNZXNzYWdlcy5lbGVtZW50VW5rbm93bk5hbWUpOwotCQkJZWxzZQotCQkJCXNlcnZlckNvbmZpZ3VyYXRpb24gPSB0b29sa2l0LmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiArIHNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkKLQkJCXNlcnZlckNvbmZpZ3VyYXRpb24uc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gZGVjb3JhdGlvbldpZHRoOwotCQkJZGF0YS53aWR0aEhpbnQgPSA3NTsKLQkJCXNlcnZlckNvbmZpZ3VyYXRpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJd2hzLnNldEhlbHAoc2VydmVyQ29uZmlndXJhdGlvbiwgQ29udGV4dElkcy5FRElUT1JfQ09ORklHVVJBVElPTik7Ci0JCQkKLQkJCWZpbmFsIElGb2xkZXIgY3VycmVudEZvbGRlciA9IHNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQlicm93c2UgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyQ29uZmlndXJhdGlvbkJyb3dzZSwgU1dULlBVU0gpOwotCQkJYnJvd3NlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBDb250YWluZXJTZWxlY3Rpb25EaWFsb2coc2VydmVyQ29uZmlndXJhdGlvbi5nZXRTaGVsbCgpLAotCQkJCQkJY3VycmVudEZvbGRlciwgdHJ1ZSwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJDb25maWd1cmF0aW9uQnJvd3NlTWVzc2FnZSk7Ci0JCQkJCWRpYWxvZy5zaG93Q2xvc2VkUHJvamVjdHMoZmFsc2UpOwotCQkJCQkKLQkJCQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93LkNBTkNFTCkgewotCQkJCQkJT2JqZWN0W10gcmVzdWx0ID0gZGlhbG9nLmdldFJlc3VsdCgpOwotCQkJCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGggPT0gMSkgewotCQkJCQkJCUlQYXRoIHBhdGggPSAoSVBhdGgpIHJlc3VsdFswXTsKLQkJCQkJCQkKLQkJCQkJCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290LmZpbmRNZW1iZXIocGF0aCk7Ci0JCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJCQkJCUlGb2xkZXIgZm9sZGVyMiA9IChJRm9sZGVyKSByZXNvdXJjZTsKLQkJCQkJCQkKLQkJCQkJCQkJaWYgKHVwZGF0aW5nKQotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJCQkJCWV4ZWN1dGUobmV3IFNldFNlcnZlckNvbmZpZ3VyYXRpb25Gb2xkZXJDb21tYW5kKGdldFNlcnZlcigpLCBmb2xkZXIyKSk7Ci0JCQkJCQkJCXNlcnZlckNvbmZpZ3VyYXRpb24uc2V0VGV4dChmb2xkZXIyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQlicm93c2Uuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJfQotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCkgewotCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCk7Ci0JCQlpZiAoc2VydmVyVHlwZS5zdXBwb3J0c0xhdW5jaE1vZGUoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpIHx8IHNlcnZlclR5cGUuc3VwcG9ydHNMYXVuY2hNb2RlKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUpCi0JCQkJCXx8IHNlcnZlclR5cGUuc3VwcG9ydHNMYXVuY2hNb2RlKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERSkpIHsKLQkJCQlJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgbGF1bmNoVHlwZSA9ICgoU2VydmVyVHlwZSkgc2VydmVyVHlwZSkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvblR5cGUoKTsKLQkJCQlpZiAobGF1bmNoVHlwZSAhPSBudWxsICYmIGxhdW5jaFR5cGUuaXNQdWJsaWMoKSkgewotCQkJCQlmaW5hbCBIeXBlcmxpbmsgbGluayA9IHRvb2xraXQuY3JlYXRlSHlwZXJsaW5rKGNvbXBvc2l0ZSwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdPcGVuTGF1bmNoQ29uZmlndXJhdGlvbiwgU1dULk5PTkUpOwotCQkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCQlsaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkJCWxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWcgPSAoKFNlcnZlcikgZ2V0U2VydmVyKCkpLmdldExhdW5jaENvbmZpZ3VyYXRpb24odHJ1ZSwgbnVsbCk7Ci0JCQkJCQkJCS8vIFRPRE86IHVzZSBjb3JyZWN0IGxhdW5jaCBncm91cAotCQkJCQkJCQlEZWJ1Z1VJVG9vbHMub3BlbkxhdW5jaENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzRGlhbG9nKGxpbmsuZ2V0U2hlbGwoKSwgbGF1bmNoQ29uZmlnLCAib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoR3JvdXAucnVuIik7Ci0JCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBsYXVuY2ggY29uZmlndXJhdGlvbiIsIGNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBJbnNlcnRpb24gb2YgZXh0ZW5zaW9uIHdpZGdldHMuIElmIHRoZSBwYWdlIG1vZGlmaWVyIGNyZWF0ZUNvbnRyb2wgaXMgbm90IGltcGxlbWVudGVkIHN0aWxsIAotCQkvLyBhZGQgdGhlIG1vZGlmaWVyIHRvIHRoZSBsaXN0ZW5lcnMgbGlzdC4KLQkJTGlzdDxTZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2VNb2RpZmllcj4gcGFnZU1vZGlmaWVyc0xzdCA9IFNlcnZlclVJUGx1Z2luLmdldFNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZU1vZGlmaWVycygpOwotCQlmb3IgKFNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZU1vZGlmaWVyIGN1clBhZ2VNb2RpZmllciA6IHBhZ2VNb2RpZmllcnNMc3QpIHsKLQkJCWlmKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCl7Ci0JCQkJY3VyUGFnZU1vZGlmaWVyLmNyZWF0ZUNvbnRyb2woU2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlTW9kaWZpZXIuVUlfTE9DQVRJT04uT1ZFUlZJRVcsIGNvbXBvc2l0ZSk7Ci0JCQkJY3VyUGFnZU1vZGlmaWVyLnNldFVJQ29udHJvbExpc3RlbmVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHVibGlzaFNlY3Rpb24oQ29tcG9zaXRlIHJpZ2h0Q29sdW1uQ29tcCwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocmlnaHRDb2x1bW5Db21wLCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKLQkJc2VjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaFNlY3Rpb24pOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3UHVibGlzaERlc2NyaXB0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTU7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCXdocy5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5FRElUT1JfT1ZFUlZJRVdfUEFHRSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCQotCQkvLwkgYXV0by1wdWJsaXNoCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJZmluYWwgU2VydmVyIHN2ciA9IChTZXJ2ZXIpIHNlcnZlcjsKLQkJCWludCBwdWJsaXNoU2V0dGluZyA9IHN2ci5nZXRBdXRvUHVibGlzaFNldHRpbmcoKTsKLQkJCQotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwkJCQkJCQkJCQkJCQkJCQotCQkJYXV0b1B1Ymxpc2hEaXNhYmxlID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld0F1dG9QdWJsaXNoRGlzYWJsZSwgU1dULlJBRElPKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJYXV0b1B1Ymxpc2hEaXNhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlhdXRvUHVibGlzaERpc2FibGUuc2V0U2VsZWN0aW9uKHB1Ymxpc2hTZXR0aW5nID09IFNlcnZlci5BVVRPX1BVQkxJU0hfRElTQUJMRSk7Ci0JCQl3aHMuc2V0SGVscChhdXRvUHVibGlzaERpc2FibGUsIENvbnRleHRJZHMuRURJVE9SX0FVVE9QVUJMSVNIX0RJU0FCTEUpOwotCQkJCi0JCQlhdXRvUHVibGlzaEVuYWJsZVJlc291cmNlID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld0F1dG9QdWJsaXNoRW5hYmxlZFJlc291cmNlLCBTV1QuUkFESU8pOwotCQkJYXV0b1B1Ymxpc2hFbmFibGVSZXNvdXJjZS5zZXRTZWxlY3Rpb24ocHVibGlzaFNldHRpbmcgPT0gU2VydmVyLkFVVE9fUFVCTElTSF9SRVNPVVJDRSk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWF1dG9QdWJsaXNoRW5hYmxlUmVzb3VyY2Uuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCXdocy5zZXRIZWxwKGF1dG9QdWJsaXNoRW5hYmxlUmVzb3VyY2UsIENvbnRleHRJZHMuRURJVE9SX0FVVE9QVUJMSVNIX0VOQUJMRSk7Ci0JCQkKLQkJCWF1dG9QdWJsaXNoRW5hYmxlQnVpbGQgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3QXV0b1B1Ymxpc2hFbmFibGVkQnVpbGQsIFNXVC5SQURJTyk7Ci0JCQlhdXRvUHVibGlzaEVuYWJsZUJ1aWxkLnNldFNlbGVjdGlvbihwdWJsaXNoU2V0dGluZyA9PSBTZXJ2ZXIuQVVUT19QVUJMSVNIX0JVSUxEKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJYXV0b1B1Ymxpc2hFbmFibGVCdWlsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJd2hzLnNldEhlbHAoYXV0b1B1Ymxpc2hFbmFibGVCdWlsZCwgQ29udGV4dElkcy5FRElUT1JfQVVUT1BVQkxJU0hfQlVJTEQpOwotCQkJCi0JCQlmaW5hbCBMYWJlbCBhdXRvUHVibGlzaFRpbWVMYWJlbCA9IGNyZWF0ZUxhYmVsKHRvb2xraXQsY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld0F1dG9QdWJsaXNoRW5hYmxlZEludGVydmFsKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQkJYXV0b1B1Ymxpc2hUaW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWF1dG9QdWJsaXNoVGltZUxhYmVsLnNldEVuYWJsZWQoIWF1dG9QdWJsaXNoRGlzYWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkKLQkJCWF1dG9QdWJsaXNoVGltZSA9IG5ldyBTcGlubmVyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQlhdXRvUHVibGlzaFRpbWUuc2V0TWluaW11bSgwKTsKLQkJCWF1dG9QdWJsaXNoVGltZS5zZXRJbmNyZW1lbnQoNSk7Ci0JCQlhdXRvUHVibGlzaFRpbWUuc2V0TWF4aW11bSgxMjApOwotCQkJYXV0b1B1Ymxpc2hUaW1lLnNldFNlbGVjdGlvbihzdnIuZ2V0QXV0b1B1Ymxpc2hUaW1lKCkpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCQlkYXRhLndpZHRoSGludCA9IDMwOwotCQkJYXV0b1B1Ymxpc2hUaW1lLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlhdXRvUHVibGlzaFRpbWUuc2V0RW5hYmxlZCghYXV0b1B1Ymxpc2hEaXNhYmxlLmdldFNlbGVjdGlvbigpKTsKLQkJCVNXVFV0aWwuc2V0U3Bpbm5lclRvb2x0aXAoYXV0b1B1Ymxpc2hUaW1lKTsKLQkJCXdocy5zZXRIZWxwKGF1dG9QdWJsaXNoVGltZSwgQ29udGV4dElkcy5FRElUT1JfQVVUT1BVQkxJU0hfSU5URVJWQUwpOwotCQkJCi0JCQlhdXRvUHVibGlzaEVuYWJsZVJlc291cmNlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaWYgKHVwZGF0aW5nIHx8ICFhdXRvUHVibGlzaEVuYWJsZVJlc291cmNlLmdldFNlbGVjdGlvbigpKQotCQkJCQkJcmV0dXJuOwotCQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJCWV4ZWN1dGUobmV3IFNldFNlcnZlckF1dG9QdWJsaXNoRGVmYXVsdENvbW1hbmQoZ2V0U2VydmVyKCksIFNlcnZlci5BVVRPX1BVQkxJU0hfUkVTT1VSQ0UpKTsKLQkJCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCQkJYXV0b1B1Ymxpc2hUaW1lTGFiZWwuc2V0RW5hYmxlZCghYXV0b1B1Ymxpc2hEaXNhYmxlLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJYXV0b1B1Ymxpc2hUaW1lLnNldEVuYWJsZWQoIWF1dG9QdWJsaXNoRGlzYWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCXZhbGlkYXRlKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWF1dG9QdWJsaXNoRW5hYmxlQnVpbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlpZiAodXBkYXRpbmcgfHwgIWF1dG9QdWJsaXNoRW5hYmxlQnVpbGQuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQkJZXhlY3V0ZShuZXcgU2V0U2VydmVyQXV0b1B1Ymxpc2hEZWZhdWx0Q29tbWFuZChnZXRTZXJ2ZXIoKSwgU2VydmVyLkFVVE9fUFVCTElTSF9CVUlMRCkpOwotCQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJCQlhdXRvUHVibGlzaFRpbWVMYWJlbC5zZXRFbmFibGVkKCFhdXRvUHVibGlzaERpc2FibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlhdXRvUHVibGlzaFRpbWUuc2V0RW5hYmxlZCghYXV0b1B1Ymxpc2hEaXNhYmxlLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJdmFsaWRhdGUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJYXV0b1B1Ymxpc2hEaXNhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaWYgKHVwZGF0aW5nIHx8ICFhdXRvUHVibGlzaERpc2FibGUuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQkJZXhlY3V0ZShuZXcgU2V0U2VydmVyQXV0b1B1Ymxpc2hEZWZhdWx0Q29tbWFuZChnZXRTZXJ2ZXIoKSwgU2VydmVyLkFVVE9fUFVCTElTSF9ESVNBQkxFKSk7Ci0JCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJCWF1dG9QdWJsaXNoVGltZUxhYmVsLnNldEVuYWJsZWQoIWF1dG9QdWJsaXNoRGlzYWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWF1dG9QdWJsaXNoVGltZS5zZXRFbmFibGVkKCFhdXRvUHVibGlzaERpc2FibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlhdXRvUHVibGlzaFRpbWUuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQkJZXhlY3V0ZShuZXcgU2V0U2VydmVyQXV0b1B1Ymxpc2hUaW1lQ29tbWFuZChnZXRTZXJ2ZXIoKSwgYXV0b1B1Ymxpc2hUaW1lLmdldFNlbGVjdGlvbigpKSk7Ci0JCQkJCVNXVFV0aWwuc2V0U3Bpbm5lclRvb2x0aXAoYXV0b1B1Ymxpc2hUaW1lKTsKLQkJCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCQkJdmFsaWRhdGUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJLy8gcHVibGlzaGVycwotCQkJUHVibGlzaGVyW10gcHVicyA9ICgoU2VydmVyKXNlcnZlcikuZ2V0QWxsUHVibGlzaGVycygpOwotCQkJaWYgKHB1YnMgIT0gbnVsbCAmJiBwdWJzLmxlbmd0aCA+IDApIHsKLQkJCQlMYWJlbCBsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1B1Ymxpc2hlcnMpOwotCQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCQotCQkJCXB1Ymxpc2hlcnNUYWJsZSA9IHRvb2xraXQuY3JlYXRlVGFibGUoY29tcG9zaXRlLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQ0hFQ0spOwotCQkJCXB1Ymxpc2hlcnNUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQkJCQlwdWJsaXNoZXJzVGFibGUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQkJCQl3aHMuc2V0SGVscChwdWJsaXNoZXJzVGFibGUsIENvbnRleHRJZHMuRURJVE9SX1BVQkxJU0hUQVNLU19DT05GSUdVUkFUSU9OKTsKLQkJCQkKLQkJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCWRhdGEuaGVpZ2h0SGludCA9IDgwOwotCQkJCXB1Ymxpc2hlcnNUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCQotCQkJCXB1Ymxpc2hlcnNWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcihwdWJsaXNoZXJzVGFibGUpOwotCQkJCXB1Ymxpc2hlcnNWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nW10geyJuYW1lIn0pOwotCQkJCXB1Ymxpc2hlcnNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBQdWJsaXNoZXJDb250ZW50UHJvdmlkZXIocHVicykpOwotCQkJCXB1Ymxpc2hlcnNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgUHVibGlzaExhYmVsUHJvdmlkZXIoKSk7Ci0JCQkJcHVibGlzaGVyc1ZpZXdlci5zZXRJbnB1dCgicm9vdCIpOwotCQkJCQotCQkJCVB1Ymxpc2hlcltdIHB1YnMyID0gKChTZXJ2ZXIpc2VydmVyKS5nZXRFbmFibGVkUHVibGlzaGVycygpOwotCQkJCWZvciAoUHVibGlzaGVyIHAgOiBwdWJzMikKLQkJCQkJcHVibGlzaGVyc1ZpZXdlci5zZXRDaGVja2VkKHAsIHRydWUpOwotCQkJCQotCQkJCXB1Ymxpc2hlcnNWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQkJCQkJCWlmIChlbGVtZW50ID09IG51bGwgfHwgIShlbGVtZW50IGluc3RhbmNlb2YgUHVibGlzaGVyKSkKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCQkJZXhlY3V0ZShuZXcgU2V0UHVibGlzaGVyRW5hYmxlbWVudENvbW1hbmQoZ2V0U2VydmVyKCksIChQdWJsaXNoZXIpIGVsZW1lbnQsIGV2ZW50LmdldENoZWNrZWQoKSkpOwotCQkJCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGltZW91dFNlY3Rpb24oQ29tcG9zaXRlIHJpZ2h0Q29sdW1uQ29tcCwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocmlnaHRDb2x1bW5Db21wLCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKLQkJc2VjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3VGltZW91dFNlY3Rpb24pOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3VGltZW91dERlc2NyaXB0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA1OwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAxNTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJd2hzLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLkVESVRPUl9PVkVSVklFV19QQUdFKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQkJCi0JCS8vCXRpbWVvdXRzCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJZmluYWwgU2VydmVyIHN2ciA9IChTZXJ2ZXIpIHNlcnZlcjsKLQkJCQotCQkJLy8gc3RhcnQgdGltZW91dCBsYWJlbAotCQkJZmluYWwgTGFiZWwgc3RhcnRUaW1lb3V0TGFiZWwgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3U3RhcnRUaW1lb3V0KTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQkJc3RhcnRUaW1lb3V0TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsJCQkKLQkJCQotCQkJc3RhcnRUaW1lb3V0U3Bpbm5lciA9IG5ldyBTcGlubmVyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQlzdGFydFRpbWVvdXRTcGlubmVyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlzdGFydFRpbWVvdXRTcGlubmVyLnNldE1pbmltdW0oMSk7Ci0JCQlzdGFydFRpbWVvdXRTcGlubmVyLnNldE1heGltdW0oNjAqNjAqMjQpOyAvLyAyNCBob3VycwotCQkJc3RhcnRUaW1lb3V0U3Bpbm5lci5zZXRJbmNyZW1lbnQoNSk7Ci0JCQlzdGFydFRpbWVvdXRTcGlubmVyLnNldFNlbGVjdGlvbihzdnIuZ2V0U3RhcnRUaW1lb3V0KCkpOwotCQkJU1dUVXRpbC5zZXRTcGlubmVyVG9vbHRpcChzdGFydFRpbWVvdXRTcGlubmVyKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJZGF0YS53aWR0aEhpbnQgPSAzMDsKLQkJCXN0YXJ0VGltZW91dFNwaW5uZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCXdocy5zZXRIZWxwKHN0YXJ0VGltZW91dFNwaW5uZXIsIENvbnRleHRJZHMuRURJVE9SX1RJTUVPVVRfU1RBUlQpOwotCQkJCi0JCQkvLyBzdG9wIHRpbWVvdXQgbGFiZWwKLQkJCWZpbmFsIExhYmVsIHN0b3BUaW1lb3V0TGFiZWwgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3U3RvcFRpbWVvdXQpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCQlzdG9wVGltZW91dExhYmVsLnNldExheW91dERhdGEoZGF0YSk7CQkJCi0JCQkKLQkJCXN0b3BUaW1lb3V0U3Bpbm5lciA9IG5ldyBTcGlubmVyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQlzdG9wVGltZW91dFNwaW5uZXIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXN0b3BUaW1lb3V0U3Bpbm5lci5zZXRNaW5pbXVtKDEpOwotCQkJc3RvcFRpbWVvdXRTcGlubmVyLnNldE1heGltdW0oNjAqNjAqMjQpOyAvLyAyNCBob3VycwotCQkJc3RvcFRpbWVvdXRTcGlubmVyLnNldEluY3JlbWVudCg1KTsKLQkJCXN0b3BUaW1lb3V0U3Bpbm5lci5zZXRTZWxlY3Rpb24oc3ZyLmdldFN0b3BUaW1lb3V0KCkpOwotCQkJU1dUVXRpbC5zZXRTcGlubmVyVG9vbHRpcChzdG9wVGltZW91dFNwaW5uZXIpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCQlkYXRhLndpZHRoSGludCA9IDMwOwotCQkJc3RvcFRpbWVvdXRTcGlubmVyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQl3aHMuc2V0SGVscChzdG9wVGltZW91dFNwaW5uZXIsIENvbnRleHRJZHMuRURJVE9SX1RJTUVPVVRfU1RPUCk7Ci0JCQkKLQkJCXN0YXJ0VGltZW91dFNwaW5uZXIuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQkJZXhlY3V0ZShuZXcgU2V0U2VydmVyU3RhcnRUaW1lb3V0Q29tbWFuZChnZXRTZXJ2ZXIoKSwgc3RhcnRUaW1lb3V0U3Bpbm5lci5nZXRTZWxlY3Rpb24oKSkpOwotCQkJCQlTV1RVdGlsLnNldFNwaW5uZXJUb29sdGlwKHN0YXJ0VGltZW91dFNwaW5uZXIpOwotCQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJc3RvcFRpbWVvdXRTcGlubmVyLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQkJZXhlY3V0ZShuZXcgU2V0U2VydmVyU3RvcFRpbWVvdXRDb21tYW5kKGdldFNlcnZlcigpLCBzdG9wVGltZW91dFNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJCQkJU1dUVXRpbC5zZXRTcGlubmVyVG9vbHRpcChzdG9wVGltZW91dFNwaW5uZXIpOwotCQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJCQl2YWxpZGF0ZSgpOwkJCQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWRpdFJ1bnRpbWUoSVJ1bnRpbWUgcnVudGltZSkgewotCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWVXb3JraW5nQ29weSA9IHJ1bnRpbWUuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJaWYgKHNob3dXaXphcmQocnVudGltZVdvcmtpbmdDb3B5KSAhPSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQl0cnkgewotCQkJCXJ1bnRpbWVXb3JraW5nQ29weS5zYXZlKGZhbHNlLCBudWxsKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGludCBzaG93V2l6YXJkKGZpbmFsIElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZVdvcmtpbmdDb3B5KSB7Ci0JCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VzLndpekVkaXRSdW50aW1lV2l6YXJkVGl0bGU7Ci0JCWZpbmFsIFdpemFyZEZyYWdtZW50IGZyYWdtZW50MiA9IFNlcnZlclVJUGx1Z2luLmdldFdpemFyZEZyYWdtZW50KHJ1bnRpbWVXb3JraW5nQ29weS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwotCQlpZiAoZnJhZ21lbnQyID09IG51bGwpCi0JCQlyZXR1cm4gV2luZG93LkNBTkNFTDsKLQkJCi0JCVRhc2tNb2RlbCB0YXNrTW9kZWwgPSBuZXcgVGFza01vZGVsKCk7Ci0JCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSwgcnVudGltZVdvcmtpbmdDb3B5KTsKLQotCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKLQkJCQlsaXN0LmFkZChmcmFnbWVudDIpOwotCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVSdW50aW1lRnJhZ21lbnQpOwotCQkJfQotCQl9OwotCQkKLQkJVGFza1dpemFyZCB3aXphcmQgPSBuZXcgVGFza1dpemFyZCh0aXRsZSwgZnJhZ21lbnQsIHRhc2tNb2RlbCk7Ci0JCXdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCB3aXphcmQpOwotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSdW50aW1lQ29tYm8oKSB7Ci0JCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKTsKLQkJcnVudGltZXMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRSdW50aW1lcyhydW50aW1lVHlwZSk7Ci0JCQotCQlpZiAoU29ja2V0VXRpbC5pc0xvY2FsaG9zdChzZXJ2ZXIuZ2V0SG9zdCgpKSAmJiBydW50aW1lcyAhPSBudWxsKSB7Ci0JCQlMaXN0PElSdW50aW1lPiBydW50aW1lczIgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lPigpOwotCQkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlSdW50aW1lIHJ1bnRpbWUyID0gcnVudGltZXNbaV07Ci0JCQkJaWYgKCFydW50aW1lMi5pc1N0dWIoKSkKLQkJCQkJcnVudGltZXMyLmFkZChydW50aW1lMik7Ci0JCQl9Ci0JCQlydW50aW1lcyA9IG5ldyBJUnVudGltZVtydW50aW1lczIuc2l6ZSgpXTsKLQkJCXJ1bnRpbWVzMi50b0FycmF5KHJ1bnRpbWVzKTsKLQkJfQotCQkKLQkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7Ci0JCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1tzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQlpdGVtc1tpXSA9IHJ1bnRpbWVzW2ldLmdldE5hbWUoKTsKLQkJCi0JCXJ1bnRpbWVDb21iby5zZXRJdGVtcyhpdGVtcyk7Ci0JfQotCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQpOwotCQlsYWJlbC5zZXRGb3JlZ3JvdW5kKHRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoSUZvcm1Db2xvcnMuVElUTEUpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCi0JCWlmIChydW50aW1lTGlzdGVuZXIgIT0gbnVsbCkKLQkJCVNlcnZlckNvcmUucmVtb3ZlUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKHJ1bnRpbWVMaXN0ZW5lcik7Ci0JCQotCQlpZiAobWFuYWdlZEZvcm0gIT0gbnVsbCkgewotCQkJbWFuYWdlZEZvcm0uZGlzcG9zZSgpOwotCQkJbWFuYWdlZEZvcm0gPSBudWxsOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEluaXRpYWxpemVzIHRoZSBlZGl0b3IgcGFydCB3aXRoIGEgc2l0ZSBhbmQgaW5wdXQuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCQotCQlhZGRDaGFuZ2VMaXN0ZW5lcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgZmllbGRzIGluIHRoaXMgZWRpdG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWlmIChzZXJ2ZXJOYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJc2VydmVyTmFtZS5zZXRUZXh0KHNlcnZlci5nZXROYW1lKCkpOwotCQkJaWYgKHJlYWRPbmx5KQotCQkJCXNlcnZlck5hbWUuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJZWxzZQotCQkJCXNlcnZlck5hbWUuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQkKLQkJCWhvc3RuYW1lLnNldFRleHQoc2VydmVyLmdldEhvc3QoKSk7Ci0JCQlpZiAocmVhZE9ubHkpCi0JCQkJaG9zdG5hbWUuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJZWxzZQotCQkJCWhvc3RuYW1lLnNldEVkaXRhYmxlKHRydWUpOwotCQkJCi0JCQlpZiAocnVudGltZUNvbWJvICE9IG51bGwpIHsKLQkJCQl1cGRhdGVSdW50aW1lQ29tYm8oKTsKLQkJCQlJUnVudGltZSBydW50aW1lID0gc2VydmVyLmdldFJ1bnRpbWUoKTsKLQkJCQlpbnQgc2l6ZTIgPSBydW50aW1lcy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKSB7Ci0JCQkJCWlmIChydW50aW1lc1tpXS5lcXVhbHMocnVudGltZSkpCi0JCQkJCQlydW50aW1lQ29tYm8uc2VsZWN0KGkpOwotCQkJCX0KLQkJCQlpZiAocmVhZE9ubHkpCi0JCQkJCXJ1bnRpbWVDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQllbHNlCi0JCQkJCXJ1bnRpbWVDb21iby5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQkJCi0JCQlpZiAoc2VydmVyQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJSUZvbGRlciBmb2xkZXIgPSBzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCQkJCWlmIChmb2xkZXIgPT0gbnVsbCkKLQkJCQkJc2VydmVyQ29uZmlndXJhdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmVsZW1lbnRVbmtub3duTmFtZSk7Ci0JCQkJZWxzZQotCQkJCQlzZXJ2ZXJDb25maWd1cmF0aW9uLnNldFRleHQoIiIgKyBzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpLmdldEZ1bGxQYXRoKCkpOwotCQkJCWlmIChyZWFkT25seSkgewotCQkJCQlzZXJ2ZXJDb25maWd1cmF0aW9uLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCQkJYnJvd3NlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNlcnZlckNvbmZpZ3VyYXRpb24uc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQkJCWJyb3dzZS5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJU2VydmVyIHN2ciA9IChTZXJ2ZXIpIHNlcnZlcjsKLQkJCWludCBwdWJsaXNoU2V0dGluZyA9IHN2ci5nZXRBdXRvUHVibGlzaFNldHRpbmcoKTsKLQkJCWF1dG9QdWJsaXNoRGlzYWJsZS5zZXRTZWxlY3Rpb24ocHVibGlzaFNldHRpbmcgPT0gU2VydmVyLkFVVE9fUFVCTElTSF9ESVNBQkxFKTsKLQkJCWF1dG9QdWJsaXNoRW5hYmxlUmVzb3VyY2Uuc2V0U2VsZWN0aW9uKHB1Ymxpc2hTZXR0aW5nID09IFNlcnZlci5BVVRPX1BVQkxJU0hfUkVTT1VSQ0UpOwotCQkJYXV0b1B1Ymxpc2hFbmFibGVCdWlsZC5zZXRTZWxlY3Rpb24ocHVibGlzaFNldHRpbmcgPT0gU2VydmVyLkFVVE9fUFVCTElTSF9CVUlMRCk7Ci0JCQlhdXRvUHVibGlzaFRpbWUuc2V0U2VsZWN0aW9uKHN2ci5nZXRBdXRvUHVibGlzaFRpbWUoKSk7Ci0JCQkKLQkJCWlmIChyZWFkT25seSkgewotCQkJCWF1dG9QdWJsaXNoRGlzYWJsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlhdXRvUHVibGlzaEVuYWJsZVJlc291cmNlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWF1dG9QdWJsaXNoRW5hYmxlQnVpbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJYXV0b1B1Ymxpc2hUaW1lLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQlhdXRvUHVibGlzaERpc2FibGUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlhdXRvUHVibGlzaEVuYWJsZVJlc291cmNlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJYXV0b1B1Ymxpc2hFbmFibGVCdWlsZC5zZXRFbmFibGVkKHRydWUpOwotCQkJCWF1dG9QdWJsaXNoVGltZS5zZXRFbmFibGVkKHB1Ymxpc2hTZXR0aW5nICE9IFNlcnZlci5BVVRPX1BVQkxJU0hfRElTQUJMRSk7Ci0JCQl9Ci0JCQkKLQkJCUxpc3Q8U2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlTW9kaWZpZXI+IHBhZ2VNb2RpZmllcnNMc3QgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRTZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2VNb2RpZmllcnMoKTsKLQkJCWZvciAoU2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlTW9kaWZpZXIgY3VyUGFnZU1vZGlmaWVyIDogcGFnZU1vZGlmaWVyc0xzdCkgewotCQkJCWlmKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCkKLQkJCQkJY3VyUGFnZU1vZGlmaWVyLnNldFNlcnZlcldvcmtpbmdDb3B5KHNlcnZlcik7Ci0JCQkJCWN1clBhZ2VNb2RpZmllci5oYW5kbGVQcm9wZXJ0eUNoYW5nZWQobmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgQWJzdHJhY3RVSUNvbnRyb2wuUFJPUF9TRVJWRVJfVFlQRSwgb2xkU2VydmVyVHlwZSwgc2VydmVyLmdldFNlcnZlclR5cGUoKSkpOwotCQkJfQotCQl9Ci0JCQotCQl1cGRhdGluZyA9IGZhbHNlOwotCQl2YWxpZGF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotCQlJTWFuYWdlZEZvcm0gbUZvcm0gPSBnZXRNYW5hZ2VkRm9ybSgpOwotCQlpZiAobUZvcm0gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCW1Gb3JtLmdldE1lc3NhZ2VNYW5hZ2VyKCkucmVtb3ZlTWVzc2FnZSgibmFtZSIsIHNlcnZlck5hbWUpOwotCQlpZiAoc2VydmVyICE9IG51bGwgJiYgc2VydmVyTmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoU2VydmVyUGx1Z2luLmlzTmFtZUluVXNlKHNlcnZlciwgc2VydmVyTmFtZS5nZXRUZXh0KCkudHJpbSgpKSkKLQkJCQltRm9ybS5nZXRNZXNzYWdlTWFuYWdlcigpLmFkZE1lc3NhZ2UoIm5hbWUiLCBNZXNzYWdlcy5lcnJvckR1cGxpY2F0ZU5hbWUsIG51bGwsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IsIHNlcnZlck5hbWUpOwotCQl9Ci0JCQotCQlpZiAoc2VydmVyQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQltRm9ybS5nZXRNZXNzYWdlTWFuYWdlcigpLnJlbW92ZU1lc3NhZ2UoImNvbmZpZyIsIHNlcnZlckNvbmZpZ3VyYXRpb24pOwotCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSkgewotCQkJCUlGb2xkZXIgZm9sZGVyID0gZ2V0U2VydmVyKCkuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCQkJCQotCSAJCQlpZiAoZm9sZGVyID09IG51bGwgfHwgIWZvbGRlci5leGlzdHMoKSkgewotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJCQkJaWYgKGZvbGRlciAhPSBudWxsKQotCQkJCQkJcHJvamVjdCA9IGZvbGRlci5nZXRQcm9qZWN0KCk7Ci0JCQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSAmJiAhcHJvamVjdC5pc09wZW4oKSkKLQkJCQkJCW1Gb3JtLmdldE1lc3NhZ2VNYW5hZ2VyKCkuYWRkTWVzc2FnZSgiY29uZmlnIiwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb25maWd1cmF0aW9uTm90QWNjZXNzaWJsZSwgcHJvamVjdC5nZXROYW1lKCkpLCBudWxsLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SLCBzZXJ2ZXJDb25maWd1cmF0aW9uKTsKLQkJCQkJZWxzZQotCQkJCQkJbUZvcm0uZ2V0TWVzc2FnZU1hbmFnZXIoKS5hZGRNZXNzYWdlKCJjb25maWciLCBNZXNzYWdlcy5lcnJvck1pc3NpbmdDb25maWd1cmF0aW9uLCBudWxsLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SLCBzZXJ2ZXJDb25maWd1cmF0aW9uKTsKLQkgCQkJfQotCQkJfQotCQl9Ci0JCQotCQltRm9ybS5nZXRNZXNzYWdlTWFuYWdlcigpLnVwZGF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlY29yYXRpb24oQ29udHJvbERlY29yYXRpb24gZGVjb3JhdGlvbiwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlJbWFnZSBuZXdJbWFnZSA9IG51bGw7Ci0JCQlGaWVsZERlY29yYXRpb25SZWdpc3RyeSByZWdpc3RyeSA9IEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKTsKLQkJCXN3aXRjaCAoc3RhdHVzLmdldFNldmVyaXR5KCkpIHsKLQkJCQljYXNlIElTdGF0dXMuSU5GTzoKLQkJCQkJLy9uZXdJbWFnZSA9IHJlZ2lzdHJ5LmdldEZpZWxkRGVjb3JhdGlvbihGaWVsZERlY29yYXRpb25SZWdpc3RyeS5ERUNfSU5GT1JNQVRJT04pLmdldEltYWdlKCk7Ci0JCQkJCW5ld0ltYWdlID0gcmVnaXN0cnkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19SRVFVSVJFRCkuZ2V0SW1hZ2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJU3RhdHVzLldBUk5JTkc6Ci0JCQkJCW5ld0ltYWdlID0gcmVnaXN0cnkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19XQVJOSU5HKS5nZXRJbWFnZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElTdGF0dXMuRVJST1I6Ci0JCQkJCW5ld0ltYWdlID0gcmVnaXN0cnkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19FUlJPUikuZ2V0SW1hZ2UoKTsKLQkJCX0KLQkJCWRlY29yYXRpb24uc2V0RGVzY3JpcHRpb25UZXh0KHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJZGVjb3JhdGlvbi5zZXRJbWFnZShuZXdJbWFnZSk7Ci0JCQlkZWNvcmF0aW9uLnNob3coKTsKLQkJfSBlbHNlIHsKLQkJCWRlY29yYXRpb24uc2V0RGVzY3JpcHRpb25UZXh0KG51bGwpOwotCQkJZGVjb3JhdGlvbi5oaWRlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVdvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAoc2VydmVyTmFtZSAhPSBudWxsKQotCQkJc2VydmVyTmFtZS5zZXRGb2N1cygpOwotCQllbHNlIGlmIChzZXJ2ZXJDb25maWd1cmF0aW9uICE9IG51bGwpCi0JCQlzZXJ2ZXJDb25maWd1cmF0aW9uLnNldEZvY3VzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250cm9sU3RyaW5nVmFsdWUoU3RyaW5nIGNvbnRyb2xJZCkgewotCQlpZiAoY29udHJvbElkICE9IG51bGwgJiYgQWJzdHJhY3RVSUNvbnRyb2wuUFJPUF9IT1NUTkFNRS5lcXVhbHMoY29udHJvbElkKSkKLQkJCXJldHVybiBob3N0bmFtZS5nZXRUZXh0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGhhbmRsZVVJQ29udHJvbE1hcENoYW5nZWQoTWFwPFN0cmluZywgVUlDb250cm9sRW50cnk+IGNvbnRyb2xNYXApIHsKLQkJaWYgKGNvbnRyb2xNYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWZvciAoU3RyaW5nIGN1ckNvbnRyb2xJZCA6IGNvbnRyb2xNYXAua2V5U2V0KCkpIHsKLQkJCWlmIChBYnN0cmFjdFVJQ29udHJvbC5QUk9QX0hPU1ROQU1FLmVxdWFscyhjdXJDb250cm9sSWQpKSB7Ci0JCQkJVUlDb250cm9sRW50cnkgY3VyQ29udHJvbEVudHJ5ID0gY29udHJvbE1hcC5nZXQoY3VyQ29udHJvbElkKTsKLQkJCQlpZiAoaG9zdG5hbWVMYWJlbCAhPSBudWxsKQotCQkJCQlob3N0bmFtZUxhYmVsLnNldEVuYWJsZWQoY3VyQ29udHJvbEVudHJ5LmlzRW5hYmxlZCgpKTsKLQkJCQkKLQkJCQlpZiAoaG9zdG5hbWUgIT0gbnVsbCl7Ci0JCQkJCWlmIChjdXJDb250cm9sRW50cnkuZ2V0TmV3VGV4dFZhbHVlKCkgIT0gbnVsbCkKLQkJCQkJCWhvc3RuYW1lLnNldFRleHQoY3VyQ29udHJvbEVudHJ5LmdldE5ld1RleHRWYWx1ZSgpKTsKLQkJCQkJCi0JCQkJCWhvc3RuYW1lLnNldEVuYWJsZWQoY3VyQ29udHJvbEVudHJ5LmlzRW5hYmxlZCgpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGhvc3RuYW1lRGVjb3JhdGlvbiAhPSBudWxsKXsKLQkJCQkJaWYoY3VyQ29udHJvbEVudHJ5LmlzRW5hYmxlZCgpKQotCQkJCQkJaG9zdG5hbWVEZWNvcmF0aW9uLnNob3coKTsKLQkJCQkJZWxzZQotCQkJCQkJaG9zdG5hbWVEZWNvcmF0aW9uLmhpZGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjM4ZWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJVSUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7Ci0vKioKLSAqIEEgbXVsdGktcGFnZSBzZXJ2ZXIgcmVzb3VyY2UgZWRpdG9yLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyRWRpdG9yIGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydCB7Ci0JLyoqCi0JICogSW50ZXJuYWwgcGFydCBhbmQgc2hlbGwgYWN0aXZhdGlvbiBsaXN0ZW5lcgotCSAqLwotCWNsYXNzIEFjdGl2YXRpb25MaXN0ZW5lciBleHRlbmRzIFNoZWxsQWRhcHRlciBpbXBsZW1lbnRzIElQYXJ0TGlzdGVuZXIgewotCQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IGZBY3RpdmVQYXJ0OwotCQlwcml2YXRlIGJvb2xlYW4gZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0JCQotCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWZBY3RpdmVQYXJ0ID0gcGFydDsKLQkJCWhhbmRsZUFjdGl2YXRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJZkFjdGl2ZVBhcnQgPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBzaGVsbEFjdGl2YXRlZChTaGVsbEV2ZW50IGUpIHsKLQkJCWhhbmRsZUFjdGl2YXRpb24oKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBoYW5kbGVBY3RpdmF0aW9uKCkgewotCQkJaWYgKGZJc0hhbmRsaW5nQWN0aXZhdGlvbikKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCWlmIChmQWN0aXZlUGFydCA9PSBTZXJ2ZXJFZGl0b3IudGhpcykgewotCQkJCWZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IHRydWU7Ci0JCQkJdHJ5IHsKLQkJCQkJY2hlY2tSZXNvdXJjZVN0YXRlKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgTGlmZWN5Y2xlTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBzZXJ2ZXJBZGRlZChJU2VydmVyIG9sZFNlcnZlcikgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoSVNlcnZlciBvbGRTZXJ2ZXIpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXJ2ZXJSZW1vdmVkKElTZXJ2ZXIgb2xkU2VydmVyKSB7Ci0JCQlpZiAob2xkU2VydmVyLmVxdWFscyhzZXJ2ZXIuZ2V0T3JpZ2luYWwoKSkgJiYgIWlzRGlydHkoKSkKLQkJCQljbG9zZUVkaXRvcigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIFN0cmluZyBzZXJ2ZXJJZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZlck5hbWU7Ci0KLQlwcm90ZWN0ZWQgR2xvYmFsQ29tbWFuZE1hbmFnZXIgY29tbWFuZE1hbmFnZXI7Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBJQWN0aW9uIHVuZG9BY3Rpb247Ci0JcHJvdGVjdGVkIElBY3Rpb24gcmVkb0FjdGlvbjsKLQotCXByb3RlY3RlZCBUZXh0QWN0aW9uIGN1dEFjdGlvbjsKLQlwcm90ZWN0ZWQgVGV4dEFjdGlvbiBjb3B5QWN0aW9uOwotCXByb3RlY3RlZCBUZXh0QWN0aW9uIHBhc3RlQWN0aW9uOwotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0aW5nQWN0aW9uczsKLQotCXByb3RlY3RlZCBJQWN0aW9uW10gZWRpdG9yQWN0aW9uczsKLQotCXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdDxJRWRpdG9yUGFydD4gc2VydmVyUGFnZXM7Ci0KLQkvLyBvbiBmb2N1cyBjaGFuZ2UgZmxhZwotCXByb3RlY3RlZCBib29sZWFuIHJlc291cmNlRGVsZXRlZDsKLQotCS8vIGlucHV0IGdpdmVuIHRvIHRoZSBjb250YWluZWQgcGFnZXMKLQlwcm90ZWN0ZWQgSVNlcnZlckVkaXRvclBhcnRJbnB1dCBlZGl0b3JQYXJ0SW5wdXQ7Ci0KLQkvLyBzdGF0dXMgbGluZSBhbmQgc3RhdHVzCi0JcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXM7Ci0JcHJvdGVjdGVkIFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtIHN0YXR1c0l0ZW07Ci0KLQlwcml2YXRlIEFjdGl2YXRpb25MaXN0ZW5lciBhY3RpdmF0aW9uTGlzdGVuZXIgPSBuZXcgQWN0aXZhdGlvbkxpc3RlbmVyKCk7Ci0JcHJvdGVjdGVkIExpZmVjeWNsZUxpc3RlbmVyIHJlc291cmNlTGlzdGVuZXI7Ci0KLQkvLyB1c2VkIGZvciBkaXNhYmxpbmcgcmVzb3VyY2UgY2hhbmdlIGNoZWNrIHdoZW4gc2F2aW5nIHRocm91Z2ggZWRpdG9yCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTYXZpbmcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBNYXA8SUVkaXRvclBhcnQsIElTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeT4gcGFnZVRvRmFjdG9yeSA9IG5ldyBIYXNoTWFwPElFZGl0b3JQYXJ0LCBJU2VydmVyRWRpdG9yUGFydEZhY3Rvcnk+KCk7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJFZGl0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2VydmVyRWRpdG9yKCkgewotCQlzdXBlcigpOwotCQkKLQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotCQkKLQkJdW5kb0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZ2V0Q29tbWFuZE1hbmFnZXIoKS51bmRvKHNlcnZlcklkKTsKLQkJCX0KLQkJfTsKLQkJdW5kb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdW5kb0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1VORE8pKTsKLQkJLy91bmRvQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9VTkRPX0hPVkVSKSk7Ci0JCS8vdW5kb0FjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfVU5ET19ESVNBQkxFRCkpOwotCQkKLQkJcmVkb0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZ2V0Q29tbWFuZE1hbmFnZXIoKS5yZWRvKHNlcnZlcklkKTsKLQkJCX0KLQkJfTsKLQkJcmVkb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVkb0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1JFRE8pKTsKLQkJLy9yZWRvQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9SRURPX0hPVkVSKSk7Ci0JCS8vcmVkb0FjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfUkVET19ESVNBQkxFRCkpOwotCX0KLQotCS8qKgotCSAqIENsb3NlIHRoZSBlZGl0b3IgY29ycmVjdGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsb3NlRWRpdG9yKCkgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWdldEVkaXRvclNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoU2VydmVyRWRpdG9yLnRoaXMsIGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJTGlzdDxJQWN0aW9uPiBhY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOwotCQkKLQkJLy8gYWRkIHNlcnZlciBhY3Rpb25zCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gU2VydmVyRWRpdG9yQ29yZS5nZXRTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3JpZXMoKS5pdGVyYXRvcigpOwotCQkJU3RyaW5nIGlkID0gc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkgZmFjdG9yeSA9IChTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGZhY3Rvcnkuc3VwcG9ydHNTZXJ2ZXJFbGVtZW50VHlwZShpZCkgJiYgZmFjdG9yeS5zaG91bGREaXNwbGF5KHNlcnZlcikpCi0JCQkJCWFjdGlvbkxpc3QuYWRkKGZhY3RvcnkuY3JlYXRlQWN0aW9uKGdldEVkaXRvclNpdGUoKSwgZWRpdG9yUGFydElucHV0KSk7Ci0JCQl9Ci0JCX0KLQotCQllZGl0b3JBY3Rpb25zID0gbmV3IElBY3Rpb25bYWN0aW9uTGlzdC5zaXplKCldOwotCQlhY3Rpb25MaXN0LnRvQXJyYXkoZWRpdG9yQWN0aW9ucyk7Ci0JfQotCi0JcHVibGljIElTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeSBnZXRQYWdlRmFjdG9yeShTZXJ2ZXJFZGl0b3JQYXJ0IHBhcnQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBwYWdlVG9GYWN0b3J5LmdldChwYXJ0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHBhZ2VzIG9mIHRoaXMgbXVsdGktcGFnZSBlZGl0b3IuCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBvZiA8Y29kZT5NdWx0aVBhZ2VFZGl0b3I8L2NvZGU+IG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpIHsKLQkJdHJ5IHsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlzZXJ2ZXJQYWdlcyA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclBhcnQ+KCk7Ci0JCQkKLQkJCS8vIGFkZCBlZGl0b3IgcGFnZXMKLQkJCWludCBwYWdlQ291bnQgPSAwOwotCQkJCi0JCQlTdHJpbmcgc2VydmVyVHlwZUlkID0gbnVsbDsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwpCi0JCQkJc2VydmVyVHlwZUlkID0gc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotCQkJCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IFNlcnZlckVkaXRvckNvcmUuZ2V0U2VydmVyRWRpdG9yUGFnZUZhY3RvcmllcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5IGZhY3RvcnkgPSAoSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGZhY3Rvcnkuc3VwcG9ydHNUeXBlKHNlcnZlclR5cGVJZCkgJiYgZmFjdG9yeS5zaG91bGRDcmVhdGVQYWdlKHNlcnZlcikpIHsKLQkJCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgIkFkZGluZyBwYWdlOiAiICsgZmFjdG9yeS5nZXRJZCgpICsgIiAiICsgZWRpdG9yUGFydElucHV0KTsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJSUVkaXRvclBhcnQgcGFnZSA9IGZhY3RvcnkuY3JlYXRlUGFnZSgpOwotCQkJCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCQkJCXBhZ2VUb0ZhY3RvcnkucHV0KHBhZ2UsIGZhY3RvcnkpOwotCQkJCQkJCWluZGV4ID0gYWRkUGFnZShwYWdlLCBlZGl0b3JQYXJ0SW5wdXQpOwotCQkJCQkJCXNldFBhZ2VUZXh0KGluZGV4LCBmYWN0b3J5LmdldE5hbWUoKSk7Ci0JCQkJCQkJCi0JCQkJCQkJc2VydmVyUGFnZXMuYWRkKHBhZ2UpOwotCQkJCQkKLQkJCQkJCQlwYWdlQ291bnQgKys7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkNvdWxkIG5vdCBkaXNwbGF5IGVkaXRvciBwYWdlICIgKyBmYWN0b3J5LmdldElkKCksIGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAocGFnZUNvdW50ID4gMCkKLQkJCQlzZXRBY3RpdmVQYWdlKDApOwotCQkJCi0JCQkvLyByZWdpc3RlciBmb3IgZXZlbnRzIHRoYXQgbWlnaHQgY2hhbmdlIHRoZSBjdXQvY29weS9wYXN0ZSBhY3Rpb25zCi0JCQlpbnQgY291bnQgPSBnZXRQYWdlQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUNvbnRyb2wgY29udHJvbCA9IGdldENvbnRyb2woaSk7Ci0JCQkJcmVnaXN0ZXJFdmVudHMoY29udHJvbCk7Ci0JCQl9Ci0JCQl1cGRhdGVBY3Rpb25zKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGNyZWF0aW5nIHNlcnZlciBlZGl0b3IgcGFnZXMiLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChhY3RpdmF0aW9uTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCk7Ci0JCQl3aW5kb3cuZ2V0UGFydFNlcnZpY2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIoYWN0aXZhdGlvbkxpc3RlbmVyKTsKLQkJCVNoZWxsIHNoZWxsID0gd2luZG93LmdldFNoZWxsKCk7Ci0JCQlpZiAoc2hlbGwgIT0gbnVsbCAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKQotCQkJCXNoZWxsLnJlbW92ZVNoZWxsTGlzdGVuZXIoYWN0aXZhdGlvbkxpc3RlbmVyKTsKLQkJCWFjdGl2YXRpb25MaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmIChyZXNvdXJjZUxpc3RlbmVyICE9IG51bGwpCi0JCQlTZXJ2ZXJDb3JlLnJlbW92ZVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKHJlc291cmNlTGlzdGVuZXIpOwotCQkKLQkJaWYgKHNlcnZlck5hbWUgIT0gbnVsbCAmJiAhc2VydmVyLmdldE5hbWUoKS5lcXVhbHMoc2VydmVyTmFtZSkpIHsKLQkJCS8vIG9ubHkgcHJvbXB0IGlmIHRoZSBzZXJ2ZXIgaXMgaW4gdGhlIHdvcmtzcGFjZSBvciB0aGVyZSBpcyBhIGNvbmZpZ3VyYXRpb24KLQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpICE9IG51bGwgfHwgKChTZXJ2ZXIpc2VydmVyKS5nZXRGaWxlKCkgIT0gbnVsbCkgewotCQkJCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VzLmVkaXRvclNlcnZlckVkaXRvcjsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmVkaXRvclJlbmFtZUZpbGVzOwotCQkJCWlmIChNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihnZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgdGl0bGUsICBtZXNzYWdlKSkKLQkJCQkJdHJ5IHsKLQkJCQkJCSgoU2VydmVyV29ya2luZ0NvcHkpc2VydmVyKS5yZW5hbWVGaWxlcyhudWxsKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgcmVuYW1pbmcgc2VydmVyIiwgZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAoY29tbWFuZE1hbmFnZXIgIT0gbnVsbCkgewotCQkJY29tbWFuZE1hbmFnZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQkKLQkJCWlmIChzZXJ2ZXJJZCAhPSBudWxsKQotCQkJCWNvbW1hbmRNYW5hZ2VyLnJlbGVhc2VDb21tYW5kTWFuYWdlcihzZXJ2ZXJJZCk7Ci0JCQkKLQkJCWNvbW1hbmRNYW5hZ2VyID0gbnVsbDsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBTYXZlcyB0aGUgY29udGVudHMgb2YgdGhpcyBlZGl0b3IuCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcGxlbWVudCB0aGUgb3Blbi1zYXZlLWNsb3NlIGxpZmVjeWNsZQotCSAqIGZvciBhbiBlZGl0b3IuICBGb3IgZ3JlYXRlciBkZXRhaWxzLCBzZWUgPGNvZGU+SUVkaXRvclBhcnQ8L2NvZGU+Ci0JICogPC9wPgotCSAqCi0JICogQHNlZSBJRWRpdG9yUGFydAotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gc2V0IHRoZSBpc1NhdmluZyBmbGFnIHRvIHRydWUKLQkJaXNTYXZpbmcgPSB0cnVlOwotCQkKLQkJLy8gY2hlY2sgcGFnZXMgZm9yIGVycm9ycyBmaXJzdAotCQlqYXZhLnV0aWwuTGlzdDxTdHJpbmc+IGVycm9ycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZlclBhZ2VzLml0ZXJhdG9yKCk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWludCBtYXhTZXZlcml0eSA9IC0xOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJRWRpdG9yUGFydCBwYXJ0ID0gKElFZGl0b3JQYXJ0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIFNlcnZlckVkaXRvclBhcnQpIHsKLQkJCQlJU3RhdHVzW10gc3RhdHVzMiA9ICgoU2VydmVyRWRpdG9yUGFydCkgcGFydCkuZ2V0U2F2ZVN0YXR1cygpOwotCQkJCWlmIChzdGF0dXMyICE9IG51bGwpIHsKLQkJCQkJaW50IHNpemUgPSBzdGF0dXMyLmxlbmd0aDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCWVycm9ycy5hZGQoIlsiICsgZ2V0UGFnZVRleHQoY291bnQpICsgIl0gIiArIHN0YXR1czJbaV0uZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCW1heFNldmVyaXR5ID0gTWF0aC5tYXgobWF4U2V2ZXJpdHksIHN0YXR1czJbaV0uZ2V0U2V2ZXJpdHkoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljb3VudCArKzsKLQkJfQotCQlpZiAoIWVycm9ycy5pc0VtcHR5KCkgJiYgbWF4U2V2ZXJpdHkgPiBJU3RhdHVzLk9LKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzYi5hcHBlbmQoTWVzc2FnZXMuZXJyb3JFZGl0b3JDYW50U2F2ZSArICJcbiIpOwotCQkJaXRlcmF0b3IgPSBlcnJvcnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0JCQkJc2IuYXBwZW5kKCJcdCIgKyAoKFN0cmluZykgaXRlcmF0b3IubmV4dCgpKSArICJcbiIpOwotCQkJCi0JCQlpZiAobWF4U2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBnZXRQYXJ0TmFtZSgpLCBzYi50b1N0cmluZygpKTsKLQkJCQltb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotCQkJCS8vIHJlc2V0IHRoZSBpc1NhdmluZyBmbGFnCi0JCQkJaXNTYXZpbmcgPSBmYWxzZTsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgaWYgKG1heFNldmVyaXR5ID09IElTdGF0dXMuV0FSTklORykKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBnZXRQYXJ0TmFtZSgpLCBzYi50b1N0cmluZygpKTsKLQkJCWVsc2UgLy8gaWYgKG1heFNldmVyaXR5ID09IElTdGF0dXMuSU5GTykKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihnZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgZ2V0UGFydE5hbWUoKSwgc2IudG9TdHJpbmcoKSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQlpbnQgdGlja3MgPSAyMDAwOwotCQkJaW50IHBhZ2VzID0gc2VydmVyUGFnZXMgPT0gbnVsbCA/IDAgOiBzZXJ2ZXJQYWdlcy5zaXplKCk7IAotCQkJaW50IHBhZ2VzVGlja3MgPSAoIHBhZ2VzICogMTAwKTsKLQkJCVN0cmluZyBuYW1lID0gIiI7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJbmFtZSA9IHNlcnZlci5nZXROYW1lKCk7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhOTFMuYmluZChNZXNzYWdlcy5zYXZpbmdUYXNrLCBuYW1lKSwgdGlja3MgKyBwYWdlc1RpY2tzKTsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQl0aWNrcyAvPSAyOwotCQkJCi0JCQlpZiAoc2VydmVyICE9IG51bGwpICB7Ci0JCQkJaXRlcmF0b3IgPSBzZXJ2ZXJQYWdlcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlJRWRpdG9yUGFydCBwYXJ0ID0gKElFZGl0b3JQYXJ0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCXBhcnQuZG9TYXZlKFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDEwMCkpOwotCQkJCX0KLQotCQkJCXNlcnZlci5zYXZlKGZhbHNlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCB0aWNrcykpOwotCQkJCWdldENvbW1hbmRNYW5hZ2VyKCkucmVzb3VyY2VTYXZlZChzZXJ2ZXJJZCk7Ci0JCQkJY29tbWFuZE1hbmFnZXIudXBkYXRlVGltZXN0YW1wcyhzZXJ2ZXJJZCk7Ci0JCQl9Ci0JCQkKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJCXNldFBhcnROYW1lKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChzZXJ2ZXIpKTsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBzYXZpbmcgc2VydmVyIGVkaXRvciIsIGUpOwotCQkJfQotCQkJCi0JCQltb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotCQkJCi0JCQlTdHJpbmcgdGl0bGUgPSBNZXNzYWdlcy5lZGl0b3JTYXZlRXJyb3JEaWFsb2c7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmVkaXRvclNhdmVFcnJvck1lc3NhZ2UsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCB0aXRsZSwgIG1lc3NhZ2UpOwotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJLy8gcmVzZXQgdGhlIGlzU2F2aW5nIGZsYWcKLQkJaXNTYXZpbmcgPSBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogU2F2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZWRpdG9yIHRvIGFub3RoZXIgb2JqZWN0LgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXBsZW1lbnQgdGhlIG9wZW4tc2F2ZS1jbG9zZSBsaWZlY3ljbGUKLQkgKiBmb3IgYW4gZWRpdG9yLiAgRm9yIGdyZWF0ZXIgZGV0YWlscywgc2VlIDxjb2RlPklFZGl0b3JQYXJ0PC9jb2RlPgotCSAqIDwvcD4KLQkgKgotCSAqIEBzZWUgSUVkaXRvclBhcnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gaSBhIHByb3BlcnR5IGNoYW5nZSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgaSkgewotCQlpZiAoaSA9PSBTZXJ2ZXJFZGl0b3JQYXJ0LlBST1BfRVJST1IpCi0JCQl1cGRhdGVTdGF0dXNFcnJvcigpOwotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UoaSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBnbG9iYWwgY29tbWFuZCBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGdsb2JhbCBjb21tYW5kIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgR2xvYmFsQ29tbWFuZE1hbmFnZXIgZ2V0Q29tbWFuZE1hbmFnZXIoKSB7Ci0JCXJldHVybiBjb21tYW5kTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZG8gYWN0aW9uLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uCi0JICovCi0JcHVibGljIElBY3Rpb24gZ2V0UmVkb0FjdGlvbigpIHsKLQkJcmV0dXJuIHJlZG9BY3Rpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB1bmRvIGFjdGlvbi4KLQkgKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbgotCSAqLwotCXB1YmxpYyBJQWN0aW9uIGdldFVuZG9BY3Rpb24oKSB7Ci0JCXJldHVybiB1bmRvQWN0aW9uOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBTZXRzIHRoZSBjdXJzb3IgYW5kIHNlbGVjdGlvbiBzdGF0ZSBmb3IgdGhpcyBlZGl0b3IgdG8gdGhlIHBhc3NhZ2UgZGVmaW5lZAotCSAqIGJ5IHRoZSBnaXZlbiBtYXJrZXIuCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuICBGb3IgZ3JlYXRlciBkZXRhaWxzLCBzZWUgPGNvZGU+SUVkaXRvclBhcnQ8L2NvZGU+Ci0JICogPC9wPgotCSAqCi0JICogQHNlZSBJRWRpdG9yUGFydAotCSAqLwotCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgY3V0LCBjb3B5LCBhbmQgcGFzdGUgYWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVBY3Rpb25zSW1wbCgpIHsKLQkJaWYgKHVwZGF0aW5nQWN0aW9ucykKLQkJCXJldHVybjsKLQkJCi0JCXVwZGF0aW5nQWN0aW9ucyA9IHRydWU7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdXBkYXRpbmdBY3Rpb25zID0gZmFsc2U7Ci0JCQkJdXBkYXRlQWN0aW9ucygpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGN1dCwgY29weSwgYW5kIHBhc3RlIGFjdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlQWN0aW9ucygpIHsKLQkJY3V0QWN0aW9uLnVwZGF0ZSgpOwotCQljb3B5QWN0aW9uLnVwZGF0ZSgpOwotCQlwYXN0ZUFjdGlvbi51cGRhdGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlIHRoZSBjdXQsIGNvcHksIGFuZCBwYXN0ZSBhY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXR1c0xpbmUoKSB7Ci0JCWlmIChzdGF0dXNJdGVtICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gcmVhZE9ubHkgPSBmYWxzZTsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBjb21tYW5kTWFuYWdlci5pc1JlYWRPbmx5KHNlcnZlcklkKSkKLQkJCQlyZWFkT25seSA9IHRydWU7Ci0JCQkKLQkJCWlmIChyZWFkT25seSkKLQkJCQlzdGF0dXNJdGVtLnNldFRleHQoTWVzc2FnZXMuZWRpdG9yUmVhZE9ubHkpOwotCQkJZWxzZQotCQkJCXN0YXR1c0l0ZW0uc2V0VGV4dChNZXNzYWdlcy5lZGl0b3JXcml0YWJsZSk7Ci0JCX0KLQotCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQkJSUZpbGVbXSBmaWxlcyA9IGNvbW1hbmRNYW5hZ2VyLmdldFJlYWRPbmx5RmlsZXMoc2VydmVySWQpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCFmaXJzdCkKLQkJCQkJCXNiLmFwcGVuZCgiLCAiKTsKLQkJCQkJc2IuYXBwZW5kKGZpbGVzW2ldLmdldE5hbWUoKSk7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJLyppZiAoc2VydmVyQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJSUZpbGVbXSBmaWxlcyA9IGNvbW1hbmRNYW5hZ2VyLmdldFJlYWRPbmx5RmlsZXMoc2VydmVyQ29uZmlndXJhdGlvbklkKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICghZmlyc3QpCi0JCQkJCQlzYi5hcHBlbmQoIiwgIik7Ci0JCQkJCXNiLmFwcGVuZChmaWxlc1tpXS5nZXROYW1lKCkpOwotCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCX0KLQkJCX0qLwotCQkJaWYgKHNiLmxlbmd0aCgpID4gMSkKLQkJCQlzdGF0dXMuc2V0TWVzc2FnZShOTFMuYmluZChNZXNzYWdlcy5lZGl0b3JSZWFkT25seUZpbGVzLCBzYi50b1N0cmluZygpKSk7Ci0JCQllbHNlCi0JCQkJc3RhdHVzLnNldE1lc3NhZ2UoIiIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlU3RhdHVzRXJyb3IoKSB7Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCVN0cmluZyBlcnJvciA9IG51bGw7Ci0JCUlFZGl0b3JQYXJ0IHBhcnQgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBTZXJ2ZXJFZGl0b3JQYXJ0KQotCQkJZXJyb3IgPSAoKFNlcnZlckVkaXRvclBhcnQpIHBhcnQpLmdldEVycm9yTWVzc2FnZSgpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2ZXJQYWdlcy5pdGVyYXRvcigpOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAoZXJyb3IgPT0gbnVsbCAmJiBpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXBhcnQgPSAoSUVkaXRvclBhcnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgU2VydmVyRWRpdG9yUGFydCkgewotCQkJCWVycm9yID0gKChTZXJ2ZXJFZGl0b3JQYXJ0KSBwYXJ0KS5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJCQlpZiAoZXJyb3IgIT0gbnVsbCkKLQkJCQkJZXJyb3IgPSAiWyIgKyBnZXRQYWdlVGV4dChjb3VudCkgKyAiXSAiICsgZXJyb3I7Ci0JCQl9Ci0JCQljb3VudCArKzsKLQkJfQotCQlzdGF0dXMuc2V0RXJyb3JNZXNzYWdlKGVycm9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBuZXdQYWdlSW5kZXgpIHsKLQkJc3VwZXIucGFnZUNoYW5nZShuZXdQYWdlSW5kZXgpOwotCQl1cGRhdGVTdGF0dXNFcnJvcigpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIHN0YXR1cy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdHVzIGEgc3RhdHVzIGxpbmUgbWFuYWdlcgotCSAqIEBwYXJhbSBpdGVtIGEgc3RhdHVzIGNvbnRyaWJ1dGlvbiBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzKElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXMsIFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtIGl0ZW0pIHsKLQkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0JCXRoaXMuc3RhdHVzSXRlbSA9IGl0ZW07Ci0JCXVwZGF0ZVN0YXR1c0Vycm9yKCk7Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIGZvciBrZXkgYW5kIHRyYXZlcnNhbCBldmVudHMgdG8gZW5hYmxlL2Rpc2FibGUgdGhlIGN1dC9jb3B5L3Bhc3RlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJFdmVudHMoQ29udHJvbCBjb250cm9sKSB7Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHQgfHwgY29udHJvbCBpbnN0YW5jZW9mIENvbWJvKSB7Ci0JCQkvLyByZWdpc3RlciB0aGUgd29ybGQuLi4gYW55IG9mIHRoZXNlIGFjdGlvbnMgY291bGQgY2F1c2UgdGhlIHN0YXRlIHRvIGNoYW5nZQotCQkJY29udHJvbC5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCXVwZGF0ZUFjdGlvbnNJbXBsKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQljb250cm9sLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0JCQkJCXVwZGF0ZUFjdGlvbnNJbXBsKCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0JCQkJCXVwZGF0ZUFjdGlvbnNJbXBsKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQljb250cm9sLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJLy8gZG8gbm90aGluZwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCXVwZGF0ZUFjdGlvbnNJbXBsKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQljb250cm9sLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBldmVudCkgewotCQkJCQl1cGRhdGVBY3Rpb25zSW1wbCgpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBldmVudCkgewotCQkJCQl1cGRhdGVBY3Rpb25zSW1wbCgpOwotCQkJCX0KLQkJCX0pOwotCQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNvbnRyb2w7Ci0JCQkJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQkJCXVwZGF0ZUFjdGlvbnNJbXBsKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQl0ZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJCXVwZGF0ZUFjdGlvbnNJbXBsKCk7Ci0JCQkJCX0KLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCQl1cGRhdGVBY3Rpb25zSW1wbCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9IGVsc2UgewotCQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBjb250cm9sOwotCQkJCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJCXVwZGF0ZUFjdGlvbnNJbXBsKCk7Ci0JCQkJCX0KLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCQl1cGRhdGVBY3Rpb25zSW1wbCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChjb250cm9sIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0JCQlDb250cm9sW10gY2hpbGRyZW4gPSAoKENvbXBvc2l0ZSljb250cm9sKS5nZXRDaGlsZHJlbigpOwotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQkJcmVnaXN0ZXJFdmVudHMoY2hpbGRyZW5baV0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEluaXRpYWxpemVzIHRoZSBlZGl0b3IgcGFydCB3aXRoIGEgc2l0ZSBhbmQgaW5wdXQuCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBvZiA8Y29kZT5FZGl0b3JQYXJ0PC9jb2RlPiBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZC4gIFdpdGhpbgotCSAqIHRoZSBpbXBsZW1lbnRhdGlvbiBzdWJjbGFzc2VzIHNob3VsZCB2ZXJpZnkgdGhhdCB0aGUgaW5wdXQgdHlwZSBpcyBhY2NlcHRhYmxlCi0JICogYW5kIHRoZW4gc2F2ZSB0aGUgc2l0ZSBhbmQgaW5wdXQuICBIZXJlIGlzIHNhbXBsZSBjb2RlOgotCSAqIDwvcD4KLQkgKiA8cHJlPgotCSAqCQlpZiAoIShpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpKQotCSAqCQkJdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKCJJbnZhbGlkIElucHV0OiBNdXN0IGJlIElGaWxlRWRpdG9ySW5wdXQiKTsKLQkgKgkJc2V0U2l0ZShzaXRlKTsKLQkgKgkJc2V0SW5wdXQoZWRpdG9ySW5wdXQpOwotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQljb21tYW5kTWFuYWdlciA9IEdsb2JhbENvbW1hbmRNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCi0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUlGaWxlRWRpdG9ySW5wdXQgZmVpID0gKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0OwotCQkJSUZpbGUgZmlsZSA9IGZlaS5nZXRGaWxlKCk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlJU2VydmVyIHNlcnZlcjIgPSBTZXJ2ZXJVSVBsdWdpbi5maW5kU2VydmVyKGZpbGUpOwotCQkJCWlmIChzZXJ2ZXIyICE9IG51bGwpCi0JCQkJCXNlcnZlcklkID0gc2VydmVyMi5nZXRJZCgpOwotCQkJfQotCQkJaWYgKHNlcnZlcklkID09IG51bGwpIHsKLQkJCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJCQl0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JFZGl0b3IsIE1lc3NhZ2VzLmVsZW1lbnRVbmtub3duTmFtZSkpOwotCQkJCXRocm93IG5ldyBQYXJ0SW5pdEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5lcnJvckVkaXRvciwgZmlsZS5nZXROYW1lKCkpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIElTZXJ2ZXJFZGl0b3JJbnB1dCkgewotCQkJSVNlcnZlckVkaXRvcklucHV0IHNlaSA9IChJU2VydmVyRWRpdG9ySW5wdXQpIGlucHV0OwotCQkJc2VydmVySWQgPSBzZWkuZ2V0U2VydmVySWQoKTsKLQkJfQotCi0JCWlmIChzZXJ2ZXJJZCAhPSBudWxsKSB7Ci0JCQljb21tYW5kTWFuYWdlci5nZXRDb21tYW5kTWFuYWdlcihzZXJ2ZXJJZCk7Ci0JCQlzZXJ2ZXIgPSBjb21tYW5kTWFuYWdlci5nZXRTZXJ2ZXJSZXNvdXJjZShzZXJ2ZXJJZCk7Ci0JCX0KLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlzZXRQYXJ0TmFtZShsYWJlbFByb3ZpZGVyLmdldFRleHQoc2VydmVyKSk7Ci0JCQlzZXRUaXRsZUltYWdlKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uoc2VydmVyKSk7Ci0JCQlzZXRUaXRsZVRvb2xUaXAoc2VydmVySWQpOwotCQkJc2VydmVyTmFtZSA9IHNlcnZlci5nZXROYW1lKCk7Ci0JCX0gZWxzZQotCQkJc2V0UGFydE5hbWUoIi0iKTsKLQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCWxhYmVsUHJvdmlkZXIgPSBudWxsOwotCQkKLQkJY3V0QWN0aW9uID0gbmV3IFRleHRBY3Rpb24oc2l0ZS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgVGV4dEFjdGlvbi5DVVRfQUNUSU9OKTsKLQkJY29weUFjdGlvbiA9IG5ldyBUZXh0QWN0aW9uKHNpdGUuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIFRleHRBY3Rpb24uQ09QWV9BQ1RJT04pOwotCQlwYXN0ZUFjdGlvbiA9IG5ldyBUZXh0QWN0aW9uKHNpdGUuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIFRleHRBY3Rpb24uUEFTVEVfQUNUSU9OKTsKLQkJCi0JCWxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKEdsb2JhbENvbW1hbmRNYW5hZ2VyLlBST1BfRElSVFkuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYgKG9iaiA9PSBzZXJ2ZXJJZCkKLQkJCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQkJCQl9IGVsc2UgaWYgKEdsb2JhbENvbW1hbmRNYW5hZ2VyLlBST1BfVU5ETy5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCU9iamVjdCBvYmogPSBldmVudC5nZXRPbGRWYWx1ZSgpOwotCQkJCQlpZiAob2JqID09IHNlcnZlcklkKQotCQkJCQkJdXBkYXRlVW5kb0FjdGlvbigpOwotCQkJCX0gZWxzZSBpZiAoR2xvYmFsQ29tbWFuZE1hbmFnZXIuUFJPUF9SRURPLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGV2ZW50LmdldE9sZFZhbHVlKCk7Ci0JCQkJCWlmIChvYmogPT0gc2VydmVySWQpCi0JCQkJCQl1cGRhdGVSZWRvQWN0aW9uKCk7Ci0JCQkJfSBlbHNlIGlmIChHbG9iYWxDb21tYW5kTWFuYWdlci5QUk9QX1JFTE9BRC5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCU9iamVjdCBvYmogPSBldmVudC5nZXRPbGRWYWx1ZSgpOwotCQkJCQlpZiAob2JqID09IHNlcnZlcklkKSB7Ci0JCQkJCQlzZXJ2ZXIgPSBjb21tYW5kTWFuYWdlci5nZXRTZXJ2ZXJSZXNvdXJjZShzZXJ2ZXJJZCk7Ci0JCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBjb21tYW5kTWFuYWdlci5pc0RpcnR5KHNlcnZlcklkKSkKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQkJCi0JCWNvbW1hbmRNYW5hZ2VyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQkKLQkJLy8gY3JlYXRlIGVkaXRvciBpbnB1dAotCQlTZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyIHNlcnZlckNvbW1hbmRNYW5hZ2VyID0gbnVsbDsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyQ29tbWFuZE1hbmFnZXIgPSBuZXcgU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlcih0aGlzLCBzZXJ2ZXJJZCwgY29tbWFuZE1hbmFnZXIpOwotCQllZGl0b3JQYXJ0SW5wdXQgPSBjb21tYW5kTWFuYWdlci5nZXRQYXJ0SW5wdXQoc2VydmVySWQsIHNlcnZlckNvbW1hbmRNYW5hZ2VyKTsKLQkJCi0JCWNyZWF0ZUFjdGlvbnMoKTsKLQkJCi0JCS8vIGFkZCByZXNvdXJjZSBsaXN0ZW5lcgotCQlyZXNvdXJjZUxpc3RlbmVyID0gbmV3IExpZmVjeWNsZUxpc3RlbmVyKCk7Ci0JCVNlcnZlckNvcmUuYWRkU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIocmVzb3VyY2VMaXN0ZW5lcik7Ci0JCQotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKTsKLQkJd2luZG93LmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKGFjdGl2YXRpb25MaXN0ZW5lcik7Ci0JCXdpbmRvdy5nZXRTaGVsbCgpLmFkZFNoZWxsTGlzdGVuZXIoYWN0aXZhdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb250ZW50cyBvZiB0aGlzIGVkaXRvciBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3Qgc2F2ZQotCSAqIG9wZXJhdGlvbi4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW1wbGVtZW50IHRoZSBvcGVuLXNhdmUtY2xvc2UgbGlmZWN5Y2xlCi0JICogZm9yIGFuIGVkaXRvci4gIEZvciBncmVhdGVyIGRldGFpbHMsIHNlZSA8Y29kZT5JRWRpdG9yUGFydDwvY29kZT4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAc2VlIElFZGl0b3JQYXJ0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJaWYgKGNvbW1hbmRNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBjb21tYW5kTWFuYWdlci5pc0RpcnR5KHNlcnZlcklkKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIFJldHVybnMgd2hldGhlciB0aGUgInNhdmUgYXMiIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBlZGl0b3IuCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcGxlbWVudCB0aGUgb3Blbi1zYXZlLWNsb3NlIGxpZmVjeWNsZQotCSAqIGZvciBhbiBlZGl0b3IuICBGb3IgZ3JlYXRlciBkZXRhaWxzLCBzZWUgPGNvZGU+SUVkaXRvclBhcnQ8L2NvZGU+Ci0JICogPC9wPgotCSAqCi0JICogQHNlZSBJRWRpdG9yUGFydAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgdW5kbyBhY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVW5kb0FjdGlvbigpIHsKLQkJSVVuZG9hYmxlT3BlcmF0aW9uIGNvbW1hbmQgPSBjb21tYW5kTWFuYWdlci5nZXRVbmRvQ29tbWFuZChzZXJ2ZXJJZCk7Ci0JCWlmIChjb21tYW5kID09IG51bGwpIHsKLQkJCXVuZG9BY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5lZGl0b3JVbmRvRGlzYWJsZWQpOwotCQkJdW5kb0FjdGlvbi5zZXRUb29sVGlwVGV4dCgiIik7Ci0JCQl1bmRvQWN0aW9uLnNldERlc2NyaXB0aW9uKCIiKTsKLQkJCXVuZG9BY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgdGV4dCA9IE5MUy5iaW5kKE1lc3NhZ2VzLmVkaXRvclVuZG9FbmFibGVkLCBuZXcgT2JqZWN0W10ge2NvbW1hbmQuZ2V0TGFiZWwoKX0pOwotCQkJdW5kb0FjdGlvbi5zZXRUZXh0KHRleHQpOwotCQkJdW5kb0FjdGlvbi5zZXRUb29sVGlwVGV4dChjb21tYW5kLmdldExhYmVsKCkpOwotCQkJdW5kb0FjdGlvbi5zZXREZXNjcmlwdGlvbihjb21tYW5kLmdldExhYmVsKCkpOwotCQkJdW5kb0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSByZWRvIGFjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZWRvQWN0aW9uKCkgewotCQlJVW5kb2FibGVPcGVyYXRpb24gY29tbWFuZCA9IGNvbW1hbmRNYW5hZ2VyLmdldFJlZG9Db21tYW5kKHNlcnZlcklkKTsKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotCQkJcmVkb0FjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmVkaXRvclJlZG9EaXNhYmxlZCk7Ci0JCQlyZWRvQWN0aW9uLnNldFRvb2xUaXBUZXh0KCIiKTsKLQkJCXJlZG9BY3Rpb24uc2V0RGVzY3JpcHRpb24oIiIpOwotCQkJcmVkb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyB0ZXh0ID0gTkxTLmJpbmQoTWVzc2FnZXMuZWRpdG9yUmVkb0VuYWJsZWQsIG5ldyBPYmplY3RbXSB7Y29tbWFuZC5nZXRMYWJlbCgpfSk7Ci0JCQlyZWRvQWN0aW9uLnNldFRleHQodGV4dCk7Ci0JCQlyZWRvQWN0aW9uLnNldFRvb2xUaXBUZXh0KGNvbW1hbmQuZ2V0TGFiZWwoKSk7Ci0JCQlyZWRvQWN0aW9uLnNldERlc2NyaXB0aW9uKGNvbW1hbmQuZ2V0TGFiZWwoKSk7Ci0JCQlyZWRvQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXQgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24KLQkgKi8KLQlwdWJsaWMgSUFjdGlvbiBnZXRDdXRBY3Rpb24oKSB7Ci0JCXJldHVybiBjdXRBY3Rpb247Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY29weSBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbgotCSAqLwotCXB1YmxpYyBJQWN0aW9uIGdldENvcHlBY3Rpb24oKSB7Ci0JCXJldHVybiBjb3B5QWN0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhc3RlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uCi0JICovCi0JcHVibGljIElBY3Rpb24gZ2V0UGFzdGVBY3Rpb24oKSB7Ci0JCXJldHVybiBwYXN0ZUFjdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdG9yIGFjdGlvbnMuCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbgotCSAqLwotCXB1YmxpYyBJQWN0aW9uW10gZ2V0RWRpdG9yQWN0aW9ucygpIHsKLQkJcmV0dXJuIGVkaXRvckFjdGlvbnM7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgc2VydmVyIHBhZ2VzIHdpdGggbmV3IGlucHV0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goKSB7Ci0JCS8vIGNyZWF0ZSBlZGl0b3IgaW5wdXQKLQkJU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlciBzZXJ2ZXJDb21tYW5kTWFuYWdlciA9IG51bGw7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlckNvbW1hbmRNYW5hZ2VyID0gbmV3IFNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIodGhpcywgc2VydmVySWQsIGNvbW1hbmRNYW5hZ2VyKTsKLQkJZWRpdG9yUGFydElucHV0ID0gY29tbWFuZE1hbmFnZXIuZ2V0UGFydElucHV0KHNlcnZlcklkLCBzZXJ2ZXJDb21tYW5kTWFuYWdlcik7Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZlclBhZ2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlFZGl0b3JQYXJ0IHBhcnQgPSAoSUVkaXRvclBhcnQpIGl0ZXJhdG9yLm5leHQoKTsJCQkJCQkKLQkJCXRyeSB7Ci0JCQkJcGFydC5pbml0KHBhcnQuZ2V0RWRpdG9yU2l0ZSgpLCBlZGl0b3JQYXJ0SW5wdXQpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciByZWZyZXNoKClpbmcgZWRpdG9yIHBhcnQiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb21wdFJlYWRPbmx5U2VydmVyRmlsZShTdHJpbmcgaWQpIHsKLQkJY29tbWFuZE1hbmFnZXIuc2V0UmVhZE9ubHkoaWQsIHRydWUpOwotCQlTdHJpbmcgdGl0bGUgPSBNZXNzYWdlcy5lZGl0b3JSZXNvdXJjZU1vZGlmaWVkVGl0bGU7Ci0JCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuZWRpdG9yUmVhZE9ubHlNZXNzYWdlOwotCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihnZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb21wdFJlbG9hZFNlcnZlckZpbGUoU3RyaW5nIGlkKSB7Ci0JCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VzLmVkaXRvclJlc291cmNlTW9kaWZpZWRUaXRsZTsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlcy5lZGl0b3JTZXJ2ZXJNb2RpZmllZE1lc3NhZ2U7Ci0JCQotCQlpZiAoTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKSkgewotCQkJLyp0cnkgewotCQkJCS8vd2MucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCS8vVE9ETzogcmVmcmVzaCBsb2NhbCBzZXJ2ZXIKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVmcmVzaGluZyBzZXJ2ZXIiLCBlKTsKLQkJCX0qLwotCQkJY29tbWFuZE1hbmFnZXIucmVsb2FkKGlkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlzdXBlci5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoZWNrUmVzb3VyY2VTdGF0ZSgpIHsKLQkJLy8gZG8gbm90IGNoZWNrIHRoZSByZXNvdXJjZSBzdGF0ZSBjaGFuZ2UgaWYgc2F2aW5nIHRocm91Z2ggdGhlIGVkaXRvcgotCQlpZiAoaXNTYXZpbmcpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gY2hlY2sgZm9yIGRlbGV0ZWQgZmlsZXMKLQkJaWYgKHJlc291cmNlRGVsZXRlZCkgewotCQkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZXMuZWRpdG9yUmVzb3VyY2VEZWxldGVUaXRsZTsKLQkJCVN0cmluZyBtZXNzYWdlID0gbnVsbDsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQltZXNzYWdlID0gTkxTLmJpbmQoTWVzc2FnZXMuZWRpdG9yUmVzb3VyY2VEZWxldGVTZXJ2ZXJNZXNzYWdlLCBzZXJ2ZXIuZ2V0TmFtZSgpKTsKLQkJCVN0cmluZ1tdIGxhYmVscyA9IG5ldyBTdHJpbmdbXSB7TWVzc2FnZXMuZWRpdG9yUmVzb3VyY2VEZWxldGVTYXZlLCBJRGlhbG9nQ29uc3RhbnRzLkNMT1NFX0xBQkVMfTsKLQkJCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIHRpdGxlLCBudWxsLCBtZXNzYWdlLCBNZXNzYWdlRGlhbG9nLklORk9STUFUSU9OLCBsYWJlbHMsIDApOwotCQkJCi0JCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSAwKQotCQkJCWRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWVsc2UKLQkJCQljbG9zZUVkaXRvcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXJlc291cmNlRGVsZXRlZCA9IGZhbHNlOwotCQkKLQkJLy8gY2hlY2sgZm9yIHNlcnZlciBjaGFuZ2VzCi0JCWlmIChzZXJ2ZXJJZCAhPSBudWxsKSB7Ci0JCQlpZiAoIWNvbW1hbmRNYW5hZ2VyLmlzRGlydHkoc2VydmVySWQpKSB7Ci0JCQkJaWYgKGNvbW1hbmRNYW5hZ2VyLmhhc0NoYW5nZWQoc2VydmVySWQpKSB7Ci0JCQkJCUlTZXJ2ZXIgbmV3U2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlcklkKTsKLQkJCQkJaWYgKG5ld1NlcnZlciAhPSBudWxsICYmICgoU2VydmVyKW5ld1NlcnZlcikuZ2V0VGltZXN0YW1wKCkgPiAoKFNlcnZlcilzZXJ2ZXIpLmdldFRpbWVzdGFtcCgpKQotCQkJCQkJY29tbWFuZE1hbmFnZXIucmVsb2FkKHNlcnZlcklkKTsKLQkJCQkJZWxzZQotCQkJCQkJcHJvbXB0UmVsb2FkU2VydmVyRmlsZShzZXJ2ZXJJZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoY29tbWFuZE1hbmFnZXIuaGFzQ2hhbmdlZChzZXJ2ZXJJZCkgJiYgIWNvbW1hbmRNYW5hZ2VyLmFyZUZpbGVzUmVhZE9ubHkoc2VydmVySWQpKQotCQkJCQlwcm9tcHRSZWxvYWRTZXJ2ZXJGaWxlKHNlcnZlcklkKTsKLQkJCQllbHNlIGlmIChjb21tYW5kTWFuYWdlci5hcmVGaWxlc1JlYWRPbmx5KHNlcnZlcklkKSAmJiAhY29tbWFuZE1hbmFnZXIuaXNSZWFkT25seShzZXJ2ZXJJZCkpCi0JCQkJCXByb21wdFJlYWRPbmx5U2VydmVyRmlsZShzZXJ2ZXJJZCk7Ci0JCQl9Ci0JCQlpZiAoY29tbWFuZE1hbmFnZXIuaXNSZWFkT25seShzZXJ2ZXJJZCkgJiYgIWNvbW1hbmRNYW5hZ2VyLmFyZUZpbGVzUmVhZE9ubHkoc2VydmVySWQpKQotCQkJCWNvbW1hbmRNYW5hZ2VyLnNldFJlYWRPbmx5KHNlcnZlcklkLCBmYWxzZSk7Ci0JCQljb21tYW5kTWFuYWdlci51cGRhdGVUaW1lc3RhbXBzKHNlcnZlcklkKTsKLQkJfQotCQkKLQkJdXBkYXRlU3RhdHVzTGluZSgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdGl0bGUgdG9vbHRpcC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0aXRsZSB0b29sdGlwCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZVRvb2xUaXAoKSB7Ci0JCVNlcnZlciBzZXJ2ZXIyID0gKFNlcnZlcikgc2VydmVyOwotCQlpZiAoc2VydmVyICE9IG51bGwgJiYgc2VydmVyMi5nZXRGaWxlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBzZXJ2ZXIyLmdldEZpbGUoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCWVsc2UgaWYgKHNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZlci5nZXROYW1lKCk7Ci0JCWVsc2UKLQkJCXJldHVybiAiZXJyb3IiOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0T3JpZW50YXRpb24oKSB7Ci0JCXJldHVybiBXaW5kb3cuZ2V0RGVmYXVsdE9yaWVudGF0aW9uKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MjlhMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0vKioKLSAqIFNlcnZlciBlZGl0b3IgYWN0aW9uIGJhciBjb250cmlidXRvci4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9FRElUT1JfU0VQQVJBVE9SID0gInNlcnZlci1lZGl0b3ItYWRkaXRpb25zIjsKLQotCS8vIGN1cnJlbnQgZWRpdG9yCi0JcHJvdGVjdGVkIFNlcnZlckVkaXRvciBlZGl0b3I7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhY3RpdmUgZWRpdG9yIGZvciB0aGUgY29udHJpYnV0b3IuCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzCi0JICogbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuIFRoaXMgZ2VuZXJhbGx5IGVudGFpbHMgZGlzY29ubmVjdGluZwotCSAqIGZyb20gdGhlIG9sZCBlZGl0b3IsIGNvbm5lY3RpbmcgdG8gdGhlIG5ldyBlZGl0b3IsIGFuZCB1cGRhdGluZyB0aGUgYWN0aW9ucwotCSAqIHRvIHJlZmxlY3QgdGhlIG5ldyBlZGl0b3IuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXRFZGl0b3IgdGhlIG5ldyB0YXJnZXQgZWRpdG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IodGFyZ2V0RWRpdG9yKTsKLQotCQlpZiAodGFyZ2V0RWRpdG9yICE9IG51bGwgJiYgdGFyZ2V0RWRpdG9yLmVxdWFscyhlZGl0b3IpKQotCQkJcmV0dXJuOwotCQkKLQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldEFjdGlvbkJhcnMoKTsKLQkJYm9vbGVhbiBhY3Rpb25CYXJzVXBkYXRlZCA9IGZhbHNlOwotCi0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLnNldFN0YXR1cyhudWxsLCBudWxsKTsKLQkJCQotCQkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1cyA9IGFjdGlvbkJhcnMuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJCXN0YXR1cy5yZW1vdmVBbGwoKTsKLQotCQkJSVRvb2xCYXJNYW5hZ2VyIHRibSA9IGFjdGlvbkJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJCXRibS5yZW1vdmVBbGwoKTsKLQkJCQotCQkJYWN0aW9uQmFyc1VwZGF0ZWQgPSB0cnVlOwotCQl9Ci0KLQkJaWYgKHRhcmdldEVkaXRvciBpbnN0YW5jZW9mIFNlcnZlckVkaXRvcikgewotCQkJZWRpdG9yID0gKFNlcnZlckVkaXRvcikgdGFyZ2V0RWRpdG9yOwotCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJFZGl0b3IgYWN0aW9uIGJhciBjb250cmlidXRvciBmb3I6ICIgKyBlZGl0b3IpOwotCQkJfQotCQkJZWRpdG9yLnVwZGF0ZVVuZG9BY3Rpb24oKTsKLQkJCWVkaXRvci51cGRhdGVSZWRvQWN0aW9uKCk7Ci0JCQkKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSwgZWRpdG9yLmdldFVuZG9BY3Rpb24oKSk7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksIGVkaXRvci5nZXRSZWRvQWN0aW9uKCkpOwotCQkJCi0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksIGVkaXRvci5nZXRDb3B5QWN0aW9uKCkpOwotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksIGVkaXRvci5nZXRDdXRBY3Rpb24oKSk7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLCBlZGl0b3IuZ2V0UGFzdGVBY3Rpb24oKSk7Ci0JCQkKLQkJCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXMgPSBhY3Rpb25CYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0JCQlTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gbmV3IFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtKCJpZCIpOwotCQkJc3RhdHVzLmFkZChpdGVtKTsKLQotCQkJZWRpdG9yLnNldFN0YXR1cyhzdGF0dXMsIGl0ZW0pOwotCQkJZWRpdG9yLnVwZGF0ZVN0YXR1c0xpbmUoKTsKLQotCQkJSUFjdGlvbltdIGFjdGlvbnMgPSBlZGl0b3IuZ2V0RWRpdG9yQWN0aW9ucygpOwotCQkJSVRvb2xCYXJNYW5hZ2VyIHRibSA9IGFjdGlvbkJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJCXRibS5hZGQobmV3IFNlcGFyYXRvcihTRVJWRVJfRURJVE9SX1NFUEFSQVRPUikpOwotCQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gYWN0aW9ucy5sZW5ndGg7Ci0JCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiQXR0ZW1wdGluZyB0byBhZGQgZWRpdG9yIGFjdGlvbnM6ICIgKyBzaXplKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJaWYgKFRyYWNlLkZJTkVTVCkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0ZJTkVTVCwgImFjdGlvbjogIiArIGFjdGlvbnNbaV0pOwotCQkJCQl9Ci0JCQkJCXRibS5hcHBlbmRUb0dyb3VwKFNFUlZFUl9FRElUT1JfU0VQQVJBVE9SLCBhY3Rpb25zW2ldKTsKLQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKG1vZGlmaWVkKQotCQkJCXRibS51cGRhdGUoZmFsc2UpOwotCQkJYWN0aW9uQmFyc1VwZGF0ZWQgPSB0cnVlOwotCQl9IGVsc2UKLQkJCWVkaXRvciA9IG51bGw7Ci0JCQotCQlpZiAoYWN0aW9uQmFyc1VwZGF0ZWQpCi0JCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZDk3NmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuSVNlcnZlckVkaXRvclBhcnRJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotLyoqCi0gKiBBIGRlZmF1bHQgc2VydmVyIHRoYXQgY2FuIGJlIGNyZWF0ZWQgZm9yIGEgc2V0IG9mIGdpdmVuCi0gKiBuYXR1cmVzLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeSBpbXBsZW1lbnRzIElTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5IHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlIGRlbGVnYXRlOwotCi0JLyoqCi0JICogU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeSBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWd1cmF0aW9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBkZWZhdWx0IHNlcnZlci4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBkZWZhdWx0IHNlcnZlci4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9yZGVyLgotCSAqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9yZGVyKCkgewotCQl0cnkgewotCQkJU3RyaW5nIG8gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgib3JkZXIiKTsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KG8pOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpZHMgb2YgdGhlIHNlcnZlciByZXNvdXJjZSBmYWN0b3JpZXMgKHNwZWNpZmllZAotCSAqIHVzaW5nIEphdmEtaW1wb3J0IHN0eWxlKSB0aGF0IHRoaXMgcGFnZSBtYXkgc3VwcG9ydC4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRUeXBlSWRzKCkgewotCQl0cnkgewotCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGVJZHMiKSwgIiwiKTsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA+IDApCi0JCQkJCWxpc3QuYWRkKHN0cik7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkocyk7Ci0JCQlyZXR1cm4gczsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vVHJhY2UudHJhY2UoIkNvdWxkIG5vdCBnZXQgc2VydmVyIHJlc291cmNlIGZyb206ICIgKyBlbGVtZW50LmdldEF0dHJpYnV0ZSgic2VydmVyUmVzb3VyY2VzIikpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeSNzdXBwb3J0c1NlcnZlckVsZW1lbnRUeXBlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NlcnZlckVsZW1lbnRUeXBlKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZ1tdIHMgPSBnZXRUeXBlSWRzKCk7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgc2l6ZSA9IHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHNbaV0uZW5kc1dpdGgoIioiKSkgewotCQkJCWlmIChpZC5sZW5ndGgoKSA+PSBzW2ldLmxlbmd0aCgpICYmIGlkLnN0YXJ0c1dpdGgoc1tpXS5zdWJzdHJpbmcoMCwgc1tpXS5sZW5ndGgoKSAtIDEpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGlkLmVxdWFscyhzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlIGdldERlbGVnYXRlKCkgewotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkZWxlZ2F0ZSA9IChTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5RGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBzZXJ2ZXIgYWN0aW9uIGZhY3RvcnkgZGVsZWdhdGUiLCB0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5I3Nob3VsZERpc3BsYXkoSVNlcnZlcldvcmtpbmdDb3B5KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZERpc3BsYXkoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcikgewotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKCkuc2hvdWxkRGlzcGxheShzZXJ2ZXIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIiwgZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5I2NyZWF0ZUFjdGlvbihJRWRpdG9yU2l0ZSwgSVNlcnZlckVkaXRvclBhcnRJbnB1dCkKLQkgKi8KLQlwdWJsaWMgSUFjdGlvbiBjcmVhdGVBY3Rpb24oSUVkaXRvclNpdGUgc2l0ZSwgSVNlcnZlckVkaXRvclBhcnRJbnB1dCBpbnB1dCkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKCkuY3JlYXRlQWN0aW9uKHNpdGUsIGlucHV0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSIsIGUpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yQ29yZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvckNvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3MmY3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yQ29yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckVkaXRvckNvcmUgewotCS8vIGNhY2hlZCBjb3B5IG9mIGFsbCBlZGl0b3IgZmFjdG9yaWVzIGFuZCBhY3Rpb25zCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeT4gZWRpdG9yUGFnZUZhY3RvcmllczsKLQlwcml2YXRlIHN0YXRpYyBMaXN0PFNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeT4gZWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXM7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBlZGl0b3JBY3Rpb25GYWN0b3JpZXM7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgTGlzdCBvZiBhbGwgZWRpdG9yIHBhZ2UgZmFjdG9yaWVzCi0JICoKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFNlcnZlckVkaXRvclBhcnRGYWN0b3J5PiBnZXRTZXJ2ZXJFZGl0b3JQYWdlRmFjdG9yaWVzKCkgewotCQlpZiAoZWRpdG9yUGFnZUZhY3RvcmllcyA9PSBudWxsKQotCQkJbG9hZEVkaXRvclBhZ2VGYWN0b3JpZXMoKTsKLQkJcmV0dXJuIGVkaXRvclBhZ2VGYWN0b3JpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIExpc3Qgb2YgYWxsIGVkaXRvciBwYWdlIHNlY3Rpb24gZmFjdG9yaWVzCi0JICoKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzKCkgewotCQlpZiAoZWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXMgPT0gbnVsbCkKLQkJCWxvYWRFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcmllcygpOwotCQlyZXR1cm4gZWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXM7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgZWRpdG9yIHBhZ2UgZmFjdG9yeSBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkRWRpdG9yUGFnZUZhY3RvcmllcygpIHsKLQkJaWYgKFRyYWNlLkNPTkZJRykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0NPTkZJRywgIi0+LSBMb2FkaW5nIC5lZGl0b3JQYWdlcyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCX0KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBTZXJ2ZXJVSVBsdWdpbi5FWFRFTlNJT05fRURJVE9SX1BBR0VTKTsKLQkJTGlzdDxTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U2VydmVyRWRpdG9yUGFydEZhY3Rvcnk+KGNmLmxlbmd0aCk7Ci0JCWxvYWRFZGl0b3JQYWdlRmFjdG9yaWVzKGNmLCBsaXN0KTsKLQkJZWRpdG9yUGFnZUZhY3RvcmllcyA9IGxpc3Q7Ci0JCVNlcnZlclVJUGx1Z2luLmFkZFJlZ2lzdHJ5TGlzdGVuZXIoKTsKLQkJaWYgKFRyYWNlLkNPTkZJRykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0NPTkZJRywgIi08LSBEb25lIGxvYWRpbmcgLmVkaXRvclBhZ2VzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGVkaXRvciBwYWdlIGZhY3RvcnkgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZEVkaXRvclBhZ2VGYWN0b3JpZXMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YsIExpc3Q8U2VydmVyRWRpdG9yUGFydEZhY3Rvcnk+IGxpc3QpIHsKLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKG5ldyBTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeShjZltpXSkpOwotCQkJCWlmIChUcmFjZS5DT05GSUcpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0NPTkZJRywgIiAgTG9hZGVkIGVkaXRvclBhZ2U6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBlZGl0b3JQYWdlOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHNvcnQgcGFnZXMKLQkJc29ydE9yZGVyZWRMaXN0KGxpc3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVFZGl0b3JQYWdlRmFjdG9yaWVzRGVsdGEoSUV4dGVuc2lvbkRlbHRhIGRlbHRhKSB7Ci0JCWlmIChlZGl0b3JQYWdlRmFjdG9yaWVzID09IG51bGwpIC8vIG5vdCBsb2FkZWQgeWV0Ci0JCQlyZXR1cm47Ci0JCQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IGRlbHRhLmdldEV4dGVuc2lvbigpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkKLQkJTGlzdDxTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U2VydmVyRWRpdG9yUGFydEZhY3Rvcnk+KGVkaXRvclBhZ2VGYWN0b3JpZXMpOwotCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElFeHRlbnNpb25EZWx0YS5BRERFRCkKLQkJCWxvYWRFZGl0b3JQYWdlRmFjdG9yaWVzKGNmLCBsaXN0KTsKLQkJZWxzZSB7Ci0JCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkJU2VydmVyRWRpdG9yUGFydEZhY3RvcnlbXSBzZXBmID0gbmV3IFNlcnZlckVkaXRvclBhcnRGYWN0b3J5W3NpemVdOwotCQkJbGlzdC50b0FycmF5KHNlcGYpOwotCQkJaW50IHNpemUyID0gY2YubGVuZ3RoOwotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQlpZiAoc2VwZltpXS5nZXRJZCgpLmVxdWFscyhjZltqXS5nZXRBdHRyaWJ1dGUoImlkIikpKSB7Ci0JCQkJCQlsaXN0LnJlbW92ZShzZXBmW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllZGl0b3JQYWdlRmFjdG9yaWVzID0gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBlZGl0b3IgcGFnZSBzZWN0aW9uIGZhY3RvcnkgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZEVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzKCkgewotCQlpZiAoVHJhY2UuQ09ORklHKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfQ09ORklHLCAiLT4tIExvYWRpbmcgLmVkaXRvclBhZ2VTZWN0aW9ucyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCX0KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBTZXJ2ZXJVSVBsdWdpbi5FWFRFTlNJT05fRURJVE9SX1BBR0VfU0VDVElPTlMpOwotCQlMaXN0PFNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5PihjZi5sZW5ndGgpOwotCQlsb2FkRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXMoY2YsIGxpc3QpOwotCQllZGl0b3JQYWdlU2VjdGlvbkZhY3RvcmllcyA9IGxpc3Q7Ci0JCVNlcnZlclVJUGx1Z2luLmFkZFJlZ2lzdHJ5TGlzdGVuZXIoKTsKLQkJaWYgKFRyYWNlLkNPTkZJRykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0NPTkZJRywgIi08LSBEb25lIGxvYWRpbmcgLmVkaXRvclBhZ2VTZWN0aW9ucyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBlZGl0b3IgcGFnZSBzZWN0aW9uIGZhY3RvcnkgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZEVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmLCBMaXN0PFNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeT4gbGlzdCkgewotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJbGlzdC5hZGQobmV3IFNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeShjZltpXSkpOwotCQkJCWlmIChUcmFjZS5DT05GSUcpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0NPTkZJRywgIiAgTG9hZGVkIGVkaXRvclBhZ2VTZWN0aW9uOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgZWRpdG9yUGFnZVNlY3Rpb246ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksCi0JCQkJCQkJdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBzb3J0IHNlY3Rpb25zCi0JCXNvcnRPcmRlcmVkTGlzdChsaXN0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXNEZWx0YShJRXh0ZW5zaW9uRGVsdGEgZGVsdGEpIHsKLQkJaWYgKGVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzID09IG51bGwpIC8vIG5vdCBsb2FkZWQgeWV0Ci0JCQlyZXR1cm47Ci0JCQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IGRlbHRhLmdldEV4dGVuc2lvbigpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkKLQkJTGlzdDxTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3Rvcnk+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeT4oZWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXMpOwotCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElFeHRlbnNpb25EZWx0YS5BRERFRCkKLQkJCWxvYWRFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcmllcyhjZiwgbGlzdCk7Ci0JCWVsc2UgewotCQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJCVNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeVtdIHNlcHMgPSBuZXcgU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5W3NpemVdOwotCQkJbGlzdC50b0FycmF5KHNlcHMpOwotCQkJaW50IHNpemUyID0gY2YubGVuZ3RoOwotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQlpZiAoc2Vwc1tpXS5nZXRJZCgpLmVxdWFscyhjZltqXS5nZXRBdHRyaWJ1dGUoImlkIikpKSB7Ci0JCQkJCQlsaXN0LnJlbW92ZShzZXBzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllZGl0b3JQYWdlU2VjdGlvbkZhY3RvcmllcyA9IGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIExpc3Qgb2YgYWxsIGVkaXRvciBhY3Rpb24gZmFjdG9yaWVzLgotCSAqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3JpZXMoKSB7Ci0JCWlmIChlZGl0b3JBY3Rpb25GYWN0b3JpZXMgPT0gbnVsbCkKLQkJCWxvYWRFZGl0b3JBY3Rpb25GYWN0b3JpZXMoKTsKLQkJcmV0dXJuIGVkaXRvckFjdGlvbkZhY3RvcmllczsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZCB0aGUgZWRpdG9yIGFjdGlvbiBmYWN0b3JpZXMgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZEVkaXRvckFjdGlvbkZhY3RvcmllcygpIHsKLQkJaWYgKFRyYWNlLkNPTkZJRykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0NPTkZJRywgIi0+LSBMb2FkaW5nIC5lZGl0b3JBY3Rpb25zIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJfQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsICJlZGl0b3JBY3Rpb25zIik7Ci0KLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCUxpc3Q8U2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeT4oc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKG5ldyBTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5KGNmW2ldKSk7Ci0JCQkJaWYgKFRyYWNlLkNPTkZJRykgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfQ09ORklHLCAiICBMb2FkZWQgZWRpdG9yQWN0aW9uOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgZWRpdG9yQWN0aW9uOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHNvcnQgcGFnZXMKLQkJc29ydE9yZGVyZWRMaXN0KGxpc3QpOwotCQllZGl0b3JBY3Rpb25GYWN0b3JpZXMgPSBsaXN0OwotCQkKLQkJaWYgKFRyYWNlLkNPTkZJRykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0NPTkZJRywgIi08LSBEb25lIGxvYWRpbmcgLmVkaXRvckFjdGlvbnMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNvcnQgdGhlIGdpdmVuIGxpc3Qgb2YgSU9yZGVyZWQgaXRlbXMgaW50byBpbmRleGVkIG9yZGVyLiBUaGlzIG1ldGhvZAotCSAqIG1vZGlmaWVzIHRoZSBvcmlnaW5hbCBsaXN0LCBidXQgcmV0dXJucyB0aGUgdmFsdWUgZm9yIGNvbnZlbmllbmNlLgotCSAqCi0JICogQHBhcmFtIGxpc3QgamF2YS51dGlsLkxpc3QKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IHNvcnRPcmRlcmVkTGlzdChMaXN0IGxpc3QpIHsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgc2l6ZTsgaisrKSB7Ci0JCQkJSU9yZGVyZWQgYSA9IChJT3JkZXJlZCkgbGlzdC5nZXQoaSk7Ci0JCQkJSU9yZGVyZWQgYiA9IChJT3JkZXJlZCkgbGlzdC5nZXQoaik7Ci0JCQkJaWYgKGEuZ2V0T3JkZXIoKSA+IGIuZ2V0T3JkZXIoKSkgewotCQkJCQlJT3JkZXJlZCB0ZW1wID0gYTsKLQkJCQkJbGlzdC5zZXQoaSwgYik7Ci0JCQkJCWxpc3Quc2V0KGosIHRlbXApOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9ySW5wdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTg2MWFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci0vKioKLSAqIFRoZSBlZGl0b3IgaW5wdXQgZm9yIHNlcnZlciBjb25maWd1cmF0aW9ucyBhbmQgaW5zdGFuY2VzLiBUaGUKLSAqIGlucHV0IHBvaW50cyB0byBhIHJlc291cmNlIHRoYXQgaXMgZWl0aGVyIGFuIGluc3RhbmNlIG9yCi0gKiBjb25maWd1cmF0aW9uLgotICoKLSAqIDxwPkVkaXRvcnMgc3VwcG9ydGluZyB0aGlzIGVkaXRvciBpbnB1dCBzaG91bGQgdXNlIHRoZSBSZXNvdXJjZU1hbmFnZXIKLSAqIHRvIGxvYWQgdGhlaXIgb3duIGNvcHkgb2YgdGhlIHJlc291cmNlLiBFYWNoIGVkaXRvciBpcyByZXNwb25zaWJsZQotICogZm9yIG1hbmFnaW5nIHRoaXMgcmVzb3VyY2UgYW5kIG1ha2luZyBzdXJlIHRoYXQgb25seSBvbmUgY29weSBpcwotICogbG9hZGVkIGZyb20gZGlzayB3aGVuIG11bHRpcGxlIGVkaXRvcnMgYXJlIG9wZW5lZCBvbiB0aGUgc2FtZQotICogcmVzb3VyY2UuPC9wPgotICoKLSAqIDxwPldoZW4gdGhlIGVkaXRvciBzYXZlcyBiYWNrIHRvIHRoZSByZXNvdXJjZSwgdGhlIHNlcnZlciB0b29saW5nCi0gKiB3aWxsIG5vdGljZSB0aGUgY2hhbmdlIGFuZCByZWxvYWQgdGhlIG5ldyBjb25maWd1cmF0aW9uLjwvcD4KLSAqCi0gKiA8cD5FZGl0b3JzIHNob3VsZCBjYWxsIHNldEVkaXRpbmcocmVzb3VyY2UsIHRydWUpIHdoZW4gdGhlIGZpcnN0Ci0gKiBlZGl0b3Igb3BlbnMgb24gYSBwYXJ0aWN1bGFyIHJlc291cmNlLCBhbmQgc2V0RWRpdGluZyhyZXNvdXJjZSwKLSAqIGZhbHNlKSB3aGVuIHRoZSBsYXN0IGVkaXRvciBvbiBhIHJlc291cmNlIGNsb3Nlcy4gVGhpcyB3aWxsCi0gKiBlbnN1cmUgdGhhdCB0aGUgc2VydmVyIHRvb2xpbmcgZG9lcyBub3QgdHJ5IHRvIGVkaXQgdGhlIHJlc291cmNlCi0gKiBhbmQgY2F1c2UgY29uZmxpY3RpbmcgY2hhbmdlcyB3aGlsZSBhbiBlZGl0b3IgaXMgb3Blbi48L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElTZXJ2ZXJFZGl0b3JJbnB1dCwgSVBlcnNpc3RhYmxlRWxlbWVudCB7Ci0JcHJpdmF0ZSBTdHJpbmcgc2VydmVySWQ7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJFZGl0b3JJbnB1dCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXJJZCBhIHNlcnZlciBpZAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJFZGl0b3JJbnB1dChTdHJpbmcgc2VydmVySWQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZXJ2ZXJJZCA9IHNlcnZlcklkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgaWQuCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZlcklkKCkgewotCQlyZXR1cm4gc2VydmVySWQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgU2VydmVyRWRpdG9ySW5wdXQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTZXJ2ZXJFZGl0b3JJbnB1dCBvdGhlciA9IChTZXJ2ZXJFZGl0b3JJbnB1dCkgb2JqOwotCQlpZiAoc2VydmVySWQgPT0gbnVsbCkgewotCQkJaWYgKG90aGVyLnNlcnZlcklkICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwkKLQkJfSBlbHNlIGlmICghc2VydmVySWQuZXF1YWxzKG90aGVyLnNlcnZlcklkKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBlZGl0b3IgaW5wdXQgZXhpc3RzLiAgCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgcHJpbWFyaWx5IHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGVkaXRvciBpbnB1dCBzaG91bGQgCi0JICogYXBwZWFyIGluIHRoZSAiRmlsZSBNb3N0IFJlY2VudGx5IFVzZWQiIG1lbnUuICBBbiBlZGl0b3IgaW5wdXQgd2lsbCBhcHBlYXIgCi0JICogaW4gdGhlIGxpc3QgdW50aWwgdGhlIHJldHVybiB2YWx1ZSBvZiA8Y29kZT5leGlzdHM8L2NvZGU+IGJlY29tZXMgCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG9yIGl0IGRyb3BzIG9mZiB0aGUgYm90dG9tIG9mIHRoZSBsaXN0LgotCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZWRpdG9yIGlucHV0IGV4aXN0czsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICoJCW90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJaWYgKHNlcnZlcklkICE9IG51bGwgJiYgU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlcklkKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogbm8gc3VjaCBvYmplY3QgY2FuIGJlIGZvdW5kLgotCSAqCi0JICogQHBhcmFtIGFkYXB0ZXIgdGhlIGFkYXB0ZXIgY2xhc3MgdG8gbG9vayB1cAotCSAqIEByZXR1cm4gYSBvYmplY3QgY2FzdGFibGUgdG8gdGhlIGdpdmVuIGNsYXNzLCAKLQkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG9iamVjdCBkb2VzIG5vdAotCSAqICAgIGhhdmUgYW4gYWRhcHRlciBmb3IgdGhlIGdpdmVuIGNsYXNzCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJRCBvZiBhbiBlbGVtZW50IGZhY3Rvcnkgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVjcmVhdGUgCi0JICogdGhpcyBvYmplY3QuICBBbiBlbGVtZW50IGZhY3RvcnkgZXh0ZW5zaW9uIHdpdGggdGhpcyBJRCBtdXN0IGV4aXN0Ci0JICogd2l0aGluIHRoZSB3b3JrYmVuY2ggcmVnaXN0cnkuCi0JICogCi0JICogQHJldHVybiB0aGUgZWxlbWVudCBmYWN0b3J5IElECi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGYWN0b3J5SWQoKSB7Ci0JCXJldHVybiBTZXJ2ZXJFZGl0b3JJbnB1dEZhY3RvcnkuRkFDVE9SWV9JRDsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBlZGl0b3IgaW5wdXQgZm9yIGRpc3BsYXkgcHVycG9zZXMuCi0JICogPHA+Ci0JICogRm9yIGluc3RhbmNlLCBpZiB0aGUgZnVsbHkgcXVhbGlmaWVkIGlucHV0IG5hbWUgaXMKLQkgKiA8Y29kZT4iYVxiXE15RmlsZS5naWYiPC9jb2RlPiwgdGhlIHJldHVybiB2YWx1ZSB3b3VsZCBiZSBqdXN0Ci0JICogPGNvZGU+Ik15RmlsZS5naWYiPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGZpbGUgbmFtZSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChzZXJ2ZXJJZCAhPSBudWxsKSB7Ci0JCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2ZXJJZCk7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJcmV0dXJuIHNlcnZlci5nZXROYW1lKCk7Ci0JCQlyZXR1cm4gc2VydmVySWQ7Ci0JCX0KLQkJcmV0dXJuICIiOwotCX0KLQotCS8qCi0JICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzYXZlIHRoZSBzdGF0ZSBvZiB0aGlzIGVkaXRvciBpbnB1dC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHBlcnNpc3RhYmxlIGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZWRpdG9yIGlucHV0Ci0JICogICBjYW5ub3QgYmUgcGVyc2lzdGVkCi0JICovCi0JcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCVN0cmluZyBzID0gbnVsbDsKLQkJaWYgKHNlcnZlcklkICE9IG51bGwpIHsKLQkJCUlTZXJ2ZXIgc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlcklkKTsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJCVNlcnZlciBzZXJ2ZXIyID0gKFNlcnZlcikgc2VydmVyOwotCQkJCWlmIChzZXJ2ZXIyLmdldEZpbGUoKSAhPSBudWxsKSB7Ci0JCQkJCXMgPSBzZXJ2ZXIyLmdldEZpbGUoKS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCWlmIChzLnN0YXJ0c1dpdGgoIi8iKSkKLQkJCQkJCXMgPSBzLnN1YnN0cmluZygxKTsKLQkJCQl9IGVsc2UKLQkJCQkJcyA9IHNlcnZlci5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXMgPSAiIjsKLQkJcmV0dXJuIHM7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIHN0YXRlIG9mIGFuIGVsZW1lbnQgd2l0aGluIGEgbWVtZW50by4KLQkgKgotCSAqIEBwYXJhbSBtZW1lbnRvIHRoZSBzdG9yYWdlIGFyZWEgZm9yIGVsZW1lbnQgc3RhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQlTZXJ2ZXJFZGl0b3JJbnB1dEZhY3Rvcnkuc2F2ZVN0YXRlKG1lbWVudG8sIHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZTA2MmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvcklucHV0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotLyoqCi0gKiBUaGlzIGZhY3RvcnkgaXMgdXNlZCBpbiB0aGUgcGVyc2lzdGVuY2Ugb2YgU2VydmVyUmVzb3VyY2VFZGl0b3JJbnB1dAotICogaW5zdGFuY2VzLiBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBjbG9zZSB0aGUgd29ya2JlbmNoIHdpdGggYW4KLSAqIG9wZW4gZWRpdG9yIGFuZCByZW9wZW4gdG8gdGhlIHNhbWUgZWRpdG9yLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyRWRpdG9ySW5wdXRGYWN0b3J5IGltcGxlbWVudHMgSUVsZW1lbnRGYWN0b3J5IHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBGQUNUT1JZX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLmlucHV0LmZhY3RvcnkiOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZFUl9JRCA9ICJzZXJ2ZXItaWQiOwotCi0JLyoqCi0JICogU2VydmVyRWRpdG9ySW5wdXRGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlcnZlckVkaXRvcklucHV0RmFjdG9yeSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qCi0JICogQ3JlYXRlcyBlZGl0b3IgaW5wdXQgYmFzZWQgb24gdGhlIHN0YXRlIGluIHRoZSBtZW1lbnRvLgotCSAqLwotCXB1YmxpYyBJQWRhcHRhYmxlIGNyZWF0ZUVsZW1lbnQoSU1lbWVudG8gbWVtZW50bykgewotCQkvLyBnZXQgdGhlIHJlc291cmNlIG5hbWVzCi0JCVN0cmluZyBzZXJ2ZXJJZCA9IG1lbWVudG8uZ2V0U3RyaW5nKFNFUlZFUl9JRCk7Ci0JCQotCQlyZXR1cm4gbmV3IFNlcnZlckVkaXRvcklucHV0KHNlcnZlcklkKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgc3RhdGUgb2YgYW4gZWxlbWVudCB3aXRoaW4gYSBtZW1lbnRvLgotCSAqCi0JICogQHBhcmFtIG1lbWVudG8gdGhlIHN0b3JhZ2UgYXJlYSBmb3IgZWxlbWVudCBzdGF0ZQotCSAqIEBwYXJhbSBpbnB1dCBzZXJ2ZXIgZWRpdG9yIGlucHV0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvLCBTZXJ2ZXJFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCQotCQlpZiAoaW5wdXQuZ2V0U2VydmVySWQoKSAhPSBudWxsKQotCQkJbWVtZW50by5wdXRTdHJpbmcoU0VSVkVSX0lELCBpbnB1dC5nZXRTZXJ2ZXJJZCgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWNjYmIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeSBpbXBsZW1lbnRzIElTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBFeHByZXNzaW9uIGZDb250ZXh0dWFsTGF1bmNoRXhwciA9IG51bGw7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWd1cmF0aW9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBmYWN0b3J5LgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvcmRlci4KLQkgKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRPcmRlcigpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBvID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm9yZGVyIik7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChvKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc2VydGlvbiBpZCBvZiB0aGlzIGZhY3RvcnkuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBpbnNlcnRpb24gaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluc2VydGlvbklkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImluc2VydGlvbklkIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpZHMgb2YgdGhlIHNlcnZlciByZXNvdXJjZSBmYWN0b3JpZXMgKHNwZWNpZmllZAotCSAqIHVzaW5nIEphdmEtaW1wb3J0IHN0eWxlKSB0aGF0IHRoaXMgcGFnZSBtYXkgc3VwcG9ydC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHR5cGUgaWRzCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVJZHMoKSB7Ci0JCXRyeSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZUlkcyIpLCAiLCIpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkKLQkJCQkJbGlzdC5hZGQoc3RyLnRyaW0oKSk7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkocyk7Ci0JCQlyZXR1cm4gczsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vVHJhY2UudHJhY2UoIkNvdWxkIG5vdCBnZXQgc2VydmVyIHJlc291cmNlIGZyb206ICIgKyBlbGVtZW50LmdldEF0dHJpYnV0ZSgic2VydmVyUmVzb3VyY2VzIikpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5I3N1cHBvcnRzVHlwZShTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNUeXBlKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZ1tdIHMgPSBnZXRUeXBlSWRzKCk7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgc2l6ZSA9IHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHNbaV0uZW5kc1dpdGgoIioiKSkgewotCQkJCWlmIChpZC5sZW5ndGgoKSA+PSBzW2ldLmxlbmd0aCgpICYmIGlkLnN0YXJ0c1dpdGgoc1tpXS5zdWJzdHJpbmcoMCwgc1tpXS5sZW5ndGgoKSAtIDEpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGlkLmVxdWFscyhzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeSNzaG91bGRDcmVhdGVTZWN0aW9uKElTZXJ2ZXJXb3JraW5nQ29weSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRDcmVhdGVTZWN0aW9uKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBpc0VuYWJsZWQoc2VydmVyKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSIsIGUpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5I2NyZWF0ZVNlY3Rpb24oKQotCSAqLwotCXB1YmxpYyBTZXJ2ZXJFZGl0b3JTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKFNlcnZlckVkaXRvclNlY3Rpb24pIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBzZXJ2ZXIgZWRpdG9yIHNlY3Rpb24iLCB0KTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBleHByZXNzaW9uIHRoYXQgcmVwcmVzZW50cyB0aGUgZW5hYmxlbWVudCBsb2dpYyBmb3IgdGhlCi0JICogY29udGV4dHVhbCBsYXVuY2ggZWxlbWVudCBvZiB0aGlzIGxhdW5jaCBzaG9ydGN1dCBkZXNjcmlwdGlvbiBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICogQHJldHVybiBhbiBldmFsdWF0YWJsZSBleHByZXNzaW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgY2FuJ3QgYmUKLQkgKiAgY29udmVydGVkLiBSZWFzb25zIGluY2x1ZGU6IChhKSBubyBoYW5kbGVyIGlzIGF2YWlsYWJsZSB0bwotCSAqICBjb3BlIHdpdGggYSBjZXJ0YWluIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBvciAoYikgdGhlIFhNTAotCSAqICBleHByZXNzaW9uIHRyZWUgaXMgbWFsZm9ybWVkLgotCSAqLwotCXB1YmxpYyBFeHByZXNzaW9uIGdldENvbnRleHR1YWxMYXVuY2hFbmFibGVtZW50RXhwcmVzc2lvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZDb250ZXh0dWFsTGF1bmNoRXhwciA9PSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oRXhwcmVzc2lvblRhZ05hbWVzLkVOQUJMRU1FTlQpOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVuYWJsZW1lbnQgPSBlbGVtZW50cy5sZW5ndGggPiAwID8gZWxlbWVudHNbMF0gOiBudWxsOyAKLQotCQkJaWYgKGVuYWJsZW1lbnQgIT0gbnVsbCkKLQkJCQlmQ29udGV4dHVhbExhdW5jaEV4cHIgPSBFeHByZXNzaW9uQ29udmVydGVyLmdldERlZmF1bHQoKS5wZXJmb3JtKGVuYWJsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBmQ29udGV4dHVhbExhdW5jaEV4cHI7Ci0JfQotCi0JLyoqCi0JICogRXZhbHVhdGUgdGhlIGdpdmVuIGV4cHJlc3Npb24gd2l0aGluIHRoZSBnaXZlbiBjb250ZXh0IGFuZCByZXR1cm4KLQkgKiB0aGUgcmVzdWx0LiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmZiByZXN1bHQgaXMgZWl0aGVyIFRSVUUgb3IgTk9UX0xPQURFRC4KLQkgKiBUaGlzIGFsbG93cyBvcHRpbWlzdGljIGluY2x1c2lvbiBvZiBzaG9ydGN1dHMgYmVmb3JlIHBsdWdpbnMgYXJlIGxvYWRlZC4KLQkgKiBSZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBleHAgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGV4cCB0aGUgZW5hYmxlbWVudCBleHByZXNzaW9uIHRvIGV2YWx1YXRlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgb2YgdGhlIGV2YWx1YXRpb24uIFVzdWFsbHksIHRoZQotCSAqICB1c2VyJ3Mgc2VsZWN0aW9uLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXZhbEVuYWJsZW1lbnRFeHByZXNzaW9uKElFdmFsdWF0aW9uQ29udGV4dCBjb250ZXh0LCBFeHByZXNzaW9uIGV4cCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gKGV4cCAhPSBudWxsKSA/ICgoZXhwLmV2YWx1YXRlKGNvbnRleHQpKSAhPSBFdmFsdWF0aW9uUmVzdWx0LkZBTFNFKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBlbmFibGVkIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmogYW4gb2JqZWN0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlbmFibGVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoT2JqZWN0IG9iaikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZ2V0Q29udGV4dHVhbExhdW5jaEVuYWJsZW1lbnRFeHByZXNzaW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlJRXZhbHVhdGlvbkNvbnRleHQgY29udGV4dCA9IG5ldyBFdmFsdWF0aW9uQ29udGV4dChudWxsLCBvYmopOwotCQljb250ZXh0LnNldEFsbG93UGx1Z2luQWN0aXZhdGlvbih0cnVlKTsKLQkJY29udGV4dC5hZGRWYXJpYWJsZSgic2VydmVyIiwgb2JqKTsKLQkJcmV0dXJuIGV2YWxFbmFibGVtZW50RXhwcmVzc2lvbihjb250ZXh0LCBnZXRDb250ZXh0dWFsTGF1bmNoRW5hYmxlbWVudEV4cHJlc3Npb24oKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTZXJ2ZXJFZGl0b3JTZWN0aW9uIFsiICsgZ2V0SWQoKSArICIsICIgKyBnZXRJbnNlcnRpb25JZCgpICsgIiwgIiArIGdldE9yZGVyKCkgKyAiXSI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvclBhcnRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yUGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0NTM2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yUGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyRWRpdG9yUGFydEZhY3RvcnkgaW1wbGVtZW50cyBJU2VydmVyRWRpdG9yUGFydEZhY3RvcnkgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBFeHByZXNzaW9uIGZDb250ZXh0dWFsTGF1bmNoRXhwciA9IG51bGw7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeSBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgcGFydCBmYWN0b3J5LgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcGFydCBmYWN0b3J5LiAKLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEluc2VydGlvbklkcygpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBpbnNlcnRpb25JZHMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaW5zZXJ0aW9uSWRzIik7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJaWYgKGluc2VydGlvbklkcyAhPSBudWxsICYmIGluc2VydGlvbklkcy5sZW5ndGgoKSA+IDApIHsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluc2VydGlvbklkcywgIiwiKTsKLQkJCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCVN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA+IDApCi0JCQkJCQlsaXN0LmFkZChzdHIudHJpbSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkocyk7Ci0JCQlyZXR1cm4gczsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vVHJhY2UudHJhY2UoIkNvdWxkIG5vdCBnZXQgc2VydmVyIHJlc291cmNlIGZyb206ICIgKyBlbGVtZW50LmdldEF0dHJpYnV0ZSgic2VydmVyUmVzb3VyY2VzIikpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeSNzdXBwb3J0c0luc2VydGlvbklkKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0luc2VydGlvbklkKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZ1tdIHMgPSBnZXRJbnNlcnRpb25JZHMoKTsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWludCBzaXplID0gcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoc1tpXS5lbmRzV2l0aCgiKiIpKSB7Ci0JCQkJaWYgKGlkLmxlbmd0aCgpID49IHNbaV0ubGVuZ3RoKCkgJiYgaWQuc3RhcnRzV2l0aChzW2ldLnN1YnN0cmluZygwLCBzW2ldLmxlbmd0aCgpIC0gMSkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoaWQuZXF1YWxzKHNbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvcmRlci4KLQkgKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRPcmRlcigpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBvID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm9yZGVyIik7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChvKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGlkcyBvZiB0aGUgc2VydmVyIGFuZCBzZXJ2ZXIgY29uZmlndXJhdGlvbiB0eXBlIGlkcyAoc3BlY2lmaWVkCi0JICogdXNpbmcgSmF2YS1pbXBvcnQgc3R5bGUpIHRoYXQgdGhpcyBwYWdlIG1heSBzdXBwb3J0LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdHlwZSBpZHMKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZUlkcygpIHsKLQkJdHJ5IHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlSWRzIiksICIsIik7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIHN0ciA9IHN0Lm5leHRUb2tlbigpOwotCQkJCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKQotCQkJCQlsaXN0LmFkZChzdHIudHJpbSgpKTsKLQkJCX0KLQkJCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJCWxpc3QudG9BcnJheShzKTsKLQkJCXJldHVybiBzOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy9UcmFjZS50cmFjZSgiQ291bGQgbm90IGdldCBzZXJ2ZXIgcmVzb3VyY2UgZnJvbTogIiArIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJzZXJ2ZXJSZXNvdXJjZXMiKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeSNzdXBwb3J0c1R5cGUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzVHlwZShTdHJpbmcgaWQpIHsKLQkJU3RyaW5nW10gcyA9IGdldFR5cGVJZHMoKTsKLQkJaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCA9PSAwIHx8ICIqIi5lcXVhbHMoc1swXSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgc2l6ZSA9IHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHNbaV0uZW5kc1dpdGgoIioiKSkgewotCQkJCWlmIChpZC5sZW5ndGgoKSA+PSBzW2ldLmxlbmd0aCgpICYmIGlkLnN0YXJ0c1dpdGgoc1tpXS5zdWJzdHJpbmcoMCwgc1tpXS5sZW5ndGgoKSAtIDEpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGlkLmVxdWFscyhzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyRWRpdG9yUGFydEZhY3Rvcnkjc2hvdWxkQ3JlYXRlUGFnZShJU2VydmVyV29ya2luZ0NvcHkpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkQ3JlYXRlUGFnZShJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gaXNFbmFibGVkKHNlcnZlcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUiLCBlKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5I2NyZWF0ZVBhZ2UoKQotCSAqLwotCXB1YmxpYyBJRWRpdG9yUGFydCBjcmVhdGVQYWdlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChJRWRpdG9yUGFydCkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIiwgZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGV4cHJlc3Npb24gdGhhdCByZXByZXNlbnRzIHRoZSBlbmFibGVtZW50IGxvZ2ljIGZvciB0aGUKLQkgKiBjb250ZXh0dWFsIGxhdW5jaCBlbGVtZW50IG9mIHRoaXMgbGF1bmNoIHNob3J0Y3V0IGRlc2NyaXB0aW9uIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKiBAcmV0dXJuIGFuIGV2YWx1YXRhYmxlIGV4cHJlc3Npb24gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBjYW4ndCBiZQotCSAqICBjb252ZXJ0ZWQuIFJlYXNvbnMgaW5jbHVkZTogKGEpIG5vIGhhbmRsZXIgaXMgYXZhaWxhYmxlIHRvCi0JICogIGNvcGUgd2l0aCBhIGNlcnRhaW4gY29uZmlndXJhdGlvbiBlbGVtZW50IG9yIChiKSB0aGUgWE1MCi0JICogIGV4cHJlc3Npb24gdHJlZSBpcyBtYWxmb3JtZWQuCi0JICovCi0JcHVibGljIEV4cHJlc3Npb24gZ2V0Q29udGV4dHVhbExhdW5jaEVuYWJsZW1lbnRFeHByZXNzaW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZkNvbnRleHR1YWxMYXVuY2hFeHByID09IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gZWxlbWVudC5nZXRDaGlsZHJlbihFeHByZXNzaW9uVGFnTmFtZXMuRU5BQkxFTUVOVCk7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZW5hYmxlbWVudCA9IGVsZW1lbnRzLmxlbmd0aCA+IDAgPyBlbGVtZW50c1swXSA6IG51bGw7IAotCi0JCQlpZiAoZW5hYmxlbWVudCAhPSBudWxsKQotCQkJCWZDb250ZXh0dWFsTGF1bmNoRXhwciA9IEV4cHJlc3Npb25Db252ZXJ0ZXIuZ2V0RGVmYXVsdCgpLnBlcmZvcm0oZW5hYmxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGZDb250ZXh0dWFsTGF1bmNoRXhwcjsKLQl9Ci0JCi0JLyoqCi0JICogRXZhbHVhdGUgdGhlIGdpdmVuIGV4cHJlc3Npb24gd2l0aGluIHRoZSBnaXZlbiBjb250ZXh0IGFuZCByZXR1cm4KLQkgKiB0aGUgcmVzdWx0LiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmZiByZXN1bHQgaXMgZWl0aGVyIFRSVUUgb3IgTk9UX0xPQURFRC4KLQkgKiBUaGlzIGFsbG93cyBvcHRpbWlzdGljIGluY2x1c2lvbiBvZiBzaG9ydGN1dHMgYmVmb3JlIHBsdWdpbnMgYXJlIGxvYWRlZC4KLQkgKiBSZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBleHAgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGV4cCB0aGUgZW5hYmxlbWVudCBleHByZXNzaW9uIHRvIGV2YWx1YXRlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgb2YgdGhlIGV2YWx1YXRpb24uIFVzdWFsbHksIHRoZQotCSAqICB1c2VyJ3Mgc2VsZWN0aW9uLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXZhbEVuYWJsZW1lbnRFeHByZXNzaW9uKElFdmFsdWF0aW9uQ29udGV4dCBjb250ZXh0LCBFeHByZXNzaW9uIGV4cCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gKGV4cCAhPSBudWxsKSA/ICgoZXhwLmV2YWx1YXRlKGNvbnRleHQpKSAhPSBFdmFsdWF0aW9uUmVzdWx0LkZBTFNFKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBlbmFibGVkIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmogYW4gb2JqZWN0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlbmFibGVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoT2JqZWN0IG9iaikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZ2V0Q29udGV4dHVhbExhdW5jaEVuYWJsZW1lbnRFeHByZXNzaW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlJRXZhbHVhdGlvbkNvbnRleHQgY29udGV4dCA9IG5ldyBFdmFsdWF0aW9uQ29udGV4dChudWxsLCBvYmopOwotCQljb250ZXh0LnNldEFsbG93UGx1Z2luQWN0aXZhdGlvbih0cnVlKTsKLQkJY29udGV4dC5hZGRWYXJpYWJsZSgic2VydmVyIiwgb2JqKTsKLQkJcmV0dXJuIGV2YWxFbmFibGVtZW50RXhwcmVzc2lvbihjb250ZXh0LCBnZXRDb250ZXh0dWFsTGF1bmNoRW5hYmxlbWVudEV4cHJlc3Npb24oKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwNDViMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yUGFydElucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLklTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyRWRpdG9yUGFydElucHV0IGltcGxlbWVudHMgSVNlcnZlckVkaXRvclBhcnRJbnB1dCB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc2VydmVyUmVhZE9ubHk7Ci0JcHJvdGVjdGVkIFNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIgc2VydmVyQ29tbWFuZE1hbmFnZXI7Ci0JCi0JcHVibGljIFNlcnZlckVkaXRvclBhcnRJbnB1dChTZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyIHNlcnZlckNvbW1hbmRNYW5hZ2VyLAotCQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgIGJvb2xlYW4gc2VydmVyUmVhZE9ubHkpIHsKLQkJCi0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQl0aGlzLnNlcnZlclJlYWRPbmx5ID0gc2VydmVyUmVhZE9ubHk7Ci0JCXRoaXMuc2VydmVyQ29tbWFuZE1hbmFnZXIgPSBzZXJ2ZXJDb21tYW5kTWFuYWdlcjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gIi0iOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiAiLSI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciB0byBiZSBlZGl0ZWQuCi0JICoKLQkgKiBAcmV0dXJuIElTZXJ2ZXJSZXNvdXJjZQotCSAqLwotCXB1YmxpYyBJU2VydmVyV29ya2luZ0NvcHkgZ2V0U2VydmVyKCkgewotCQlyZXR1cm4gc2VydmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VydmVyIGlzIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclJlYWRPbmx5KCkgewotCQlyZXR1cm4gc2VydmVyUmVhZE9ubHk7Ci0JfQotCQotCXB1YmxpYyBTZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyIGdldFNlcnZlckNvbW1hbmRNYW5hZ2VyKCkgewotCQlyZXR1cm4gc2VydmVyQ29tbWFuZE1hbmFnZXI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiU2VydmVyRWRpdG9yUGFydElucHV0IFsiICsgc2VydmVyICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYyZmZmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIEEgY29tbWFuZCBtYW5hZ2VyIGZvciBhIHNpbmdsZSBzZXJ2ZXIgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyIHsKLQlwcm90ZWN0ZWQgU2VydmVyRWRpdG9yIGVkaXRvcjsKLQlwcm90ZWN0ZWQgR2xvYmFsQ29tbWFuZE1hbmFnZXIgY29tbWFuZE1hbmFnZXI7Ci0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQotCXB1YmxpYyBTZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyKFNlcnZlckVkaXRvciBlZGl0b3IsIFN0cmluZyBpZCwgR2xvYmFsQ29tbWFuZE1hbmFnZXIgY29tbWFuZE1hbmFnZXIpIHsKLQkJdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0JCXRoaXMuY29tbWFuZE1hbmFnZXIgPSBjb21tYW5kTWFuYWdlcjsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBjb21tYW5kTWFuYWdlci5pc1JlYWRPbmx5KGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBnaXZlbiBjb21tYW5kIGFuZCBwbGFjZSBpdCBpbiB0aGUgdW5kbyBzdGFjay4KLQkgKiBJZiB0aGUgY29tbWFuZCBjYW5ub3QgYmUgdW5kb25lLCB0aGUgdXNlciB3aWxsIGJlIG5vdGlmZWQKLQkgKiBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuCi0JICoKLQkgKiBAcGFyYW0gb3BlcmF0aW9uIGFuIHVuZG9hYmxlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAoIXZhbGlkYXRlRWRpdCgpKQotCQkJcmV0dXJuOwotCi0JCWlmIChjb21tYW5kTWFuYWdlci5pc1JlYWRPbmx5KGlkKSkgewotCQkJd2FyblJlYWRPbmx5KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY29tbWFuZE1hbmFnZXIuZXhlY3V0ZUNvbW1hbmQoaWQsIG9wZXJhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgd2FyblJlYWRPbmx5KCkgewotCQlTdHJpbmcgdGl0bGUgPSBNZXNzYWdlcy5lZGl0b3JSZXNvdXJjZVdhcm5UaXRsZTsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlcy5lZGl0b3JSZXNvdXJjZVdhcm5NZXNzYWdlOwotCQkKLQkJTWVzc2FnZURpYWxvZy5vcGVuV2FybmluZyhlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUVkaXQoKSB7Ci0JCWlmIChjb21tYW5kTWFuYWdlci5pc0RpcnR5KGlkKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJSUZpbGVbXSBmaWxlcyA9IGNvbW1hbmRNYW5hZ2VyLmdldFJlYWRPbmx5RmlsZXMoaWQpOwotCQlpZiAoZmlsZXMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlcywgZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCi0JCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkvLyBpbmZvcm0gdXNlcgotCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlcy5lZGl0b3JWYWxpZGF0ZUVkaXRGYWlsdXJlTWVzc2FnZTsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIE1lc3NhZ2VzLmVycm9yRGlhbG9nVGl0bGUsIG1lc3NhZ2UsIHN0YXR1cyk7Ci0JCQkKLQkJCS8vIGNoYW5nZSB0byByZWFkLW9ubHkKLQkJCWNvbW1hbmRNYW5hZ2VyLnNldFJlYWRPbmx5KGlkLCB0cnVlKTsKLQkJCQotCQkJLy8gZG8gbm90IGV4ZWN1dGUgY29tbWFuZAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIGNoZWNrIGZpbGUgdGltZXN0YW1wCi0JCUlTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlcmZpbGUgPSBjb21tYW5kTWFuYWdlci5nZXRTZXJ2ZXJSZXNvdXJjZShpZCk7Ci0JCWlmIChjb21tYW5kTWFuYWdlci5oYXNDaGFuZ2VkKGlkKSkgewotCQkJaWYgKHNlcnZlcmZpbGUgaW5zdGFuY2VvZiBJU2VydmVyKQotCQkJCWVkaXRvci5wcm9tcHRSZWxvYWRTZXJ2ZXJGaWxlKGlkKTsKLQkJfQotCQkKLQkJLy8gYWxsb3cgZWRpdAotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU2VydmVyRWRpdG9yIGdldFNlcnZlckVkaXRvcigpIHsKLQkJcmV0dXJuIGVkaXRvcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1N0YXR1c0xpbmVDb250cmlidXRpb25JdGVtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRhNjhlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVN0YXR1c0ZpZWxkOwotLyoqCi0gKiBDb250cmlidXRpb24gaXRlbSBmb3IgdGhlIHN0YXR1cyBsaW5lLgotICovCi1wdWJsaWMgY2xhc3MgU3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0gZXh0ZW5kcyBDb250cmlidXRpb25JdGVtIGltcGxlbWVudHMgSVN0YXR1c0ZpZWxkIHsKLQotCXN0YXRpYyBjbGFzcyBTdGF0dXNMaW5lTGFiZWwgZXh0ZW5kcyBDTGFiZWwgewotCQkKLQkJcHJpdmF0ZSBzdGF0aWMgaW50IElOREVOVD0gMzsgLy8gbGVmdCBhbmQgcmlnaHQgbWFyZ2luIHVzZWQgaW4gQ0xhYmVsCi0JCQotCQlwcml2YXRlIFBvaW50IGZGaXhlZFNpemU7Ci0JCQotCQlwdWJsaWMgU3RhdHVzTGluZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCQkKLQkJCUdDIGdjPSBuZXcgR0MocGFyZW50KTsKLQkJCWdjLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCQlQb2ludCBleHRlbnQ9IGdjLnRleHRFeHRlbnQoIk1NTU1NTU1NTSIpOyAvLyROT04tTkxTLTEkCi0JCQlnYy5kaXNwb3NlKCk7Ci0JCQkKLQkJCWZGaXhlZFNpemU9IG5ldyBQb2ludChleHRlbnQueCArIElOREVOVCAqIDIsIDEwKTsKLQkJfQotCQkKLQkJcHVibGljIFBvaW50IGNvbXB1dGVTaXplKGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsKLQkJCXJldHVybiBmRml4ZWRTaXplOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGZUZXh0OwotCXByaXZhdGUgSW1hZ2UgZkltYWdlOwotCXByaXZhdGUgU3RhdHVzTGluZUxhYmVsIGZMYWJlbDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBpdGVtJ3MgaWQKLQkgKi8KLQlTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbShTdHJpbmcgaWQpIHsKLQkJc3VwZXIoaWQpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVN0YXR1c0ZpZWxkI3NldFRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWZUZXh0PSB0ZXh0OwotCQlpZiAoZkxhYmVsICE9IG51bGwgJiYgIWZMYWJlbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWZMYWJlbC5zZXRUZXh0KGZUZXh0KTsKLQkJfQkJCi0JfQotCQotCS8qCi0JICogQHNlZSBJU3RhdHVzRmllbGQjc2V0SW1hZ2UoSW1hZ2UpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJZkltYWdlPSBpbWFnZTsKLQkJaWYgKGZMYWJlbCAhPSBudWxsICYmICFmTGFiZWwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlmTGFiZWwuc2V0SW1hZ2UoZkltYWdlKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIEBzZWUgSUNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZMYWJlbD0gbmV3IFN0YXR1c0xpbmVMYWJlbChwYXJlbnQsIFNXVC5TSEFET1dfSU4pOwotCQlmTGFiZWwuc2V0RGF0YSh0aGlzKTsKLQkJCi0JCWlmIChmVGV4dCAhPSBudWxsKQotCQkJZkxhYmVsLnNldFRleHQoZlRleHQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvVGV4dEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1RleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFkODY2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvVGV4dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotLyoqCi0gKiBUZXh0IGFjdGlvbnMgKGN1dCwgY29weSwgcGFzdGUpIGZvciB0aGUgV2ViIGJyb3dzZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcm90ZWN0ZWQgRGlzcGxheSBkaXNwbGF5OwotCXByb3RlY3RlZCBDbGlwYm9hcmQgY2xpcGJvYXJkOwotCXByb3RlY3RlZCBieXRlIHR5cGU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQ1VUX0FDVElPTiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENPUFlfQUNUSU9OID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUEFTVEVfQUNUSU9OID0gMjsKLQkKLQkvKioKLQkgKiBUZXh0QWN0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFRleHRBY3Rpb24oRGlzcGxheSBkaXNwbGF5LCBieXRlIHR5cGUpIHsKLQkJc3VwZXIoIlRleHQgYWN0aW9uOiAiICsgdHlwZSk7Ci0JCXRoaXMuZGlzcGxheSA9IGRpc3BsYXk7Ci0JCWNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoZGlzcGxheSk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJQ29udHJvbCBjb250cm9sID0gZGlzcGxheS5nZXRGb2N1c0NvbnRyb2woKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCQotCXByb3RlY3RlZCBQb2ludCBnZXRDb250cm9sU2VsZWN0aW9uKCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBjb250cm9sOwotCQkJcmV0dXJuIHRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0JCX0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbWJvKSB7Ci0JCQlDb21ibyBjb21ibyA9IChDb21ibykgY29udHJvbDsKLQkJCXJldHVybiBjb21iby5nZXRTZWxlY3Rpb24oKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29udHJvbFNlbGVjdGlvbihQb2ludCBzZWwpIHsKLQkJQ29udHJvbCBjb250cm9sID0gZ2V0Q29udHJvbCgpOwotCQlpZiAoY29udHJvbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dCkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNvbnRyb2w7Ci0JCQl0ZXh0LnNldFNlbGVjdGlvbihzZWwpOwotCQl9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb21ibykgewotCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGNvbnRyb2w7Ci0JCQljb21iby5zZXRTZWxlY3Rpb24oc2VsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRyb2xUZXh0KCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBjb250cm9sOwotCQkJcmV0dXJuIHRleHQuZ2V0VGV4dCgpOwotCQl9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb21ibykgewotCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGNvbnRyb2w7Ci0JCQlyZXR1cm4gY29tYm8uZ2V0VGV4dCgpOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb250cm9sVGV4dChTdHJpbmcgdGV4dCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQlUZXh0IHRleHQyID0gKFRleHQpIGNvbnRyb2w7Ci0JCQl0ZXh0Mi5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb21ibykgewotCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGNvbnRyb2w7Ci0JCQljb21iby5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvcGllcyB0aGUgc2VsZWN0ZWQgdGV4dCB0byB0aGUgY2xpcGJvYXJkLiAgVGhlIHRleHQgd2lsbCBiZSBwdXQgaW4gdGhlIAotCSAqIGNsaXBib2FyZCBpbiBwbGFpbiB0ZXh0IGZvcm1hdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5KCkgewotCQlQb2ludCBzZWxlY3Rpb24gPSBnZXRDb250cm9sU2VsZWN0aW9uKCk7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0Q29udHJvbFRleHQoKTsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkKLQkJaW50IGxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCWlmIChsZW5ndGggPiAwKSB7Ci0JCQlUZXh0VHJhbnNmZXIgcGxhaW5UZXh0VHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCXRyeSB7Ci0JCQkJY2xpcGJvYXJkLnNldENvbnRlbnRzKAotCQkJCQluZXcgU3RyaW5nW10geyB0ZXh0LnN1YnN0cmluZyhzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnkpIH0sIAotCQkJCQluZXcgVHJhbnNmZXJbXSB7IHBsYWluVGV4dFRyYW5zZmVyIH0pOwotCQkJfSBjYXRjaCAoU1dURXJyb3IgZXJyb3IpIHsKLQkJCQkvLyBDb3B5IHRvIGNsaXBib2FyZCBmYWlsZWQuIFRoaXMgaGFwcGVucyB3aGVuIGFub3RoZXIgYXBwbGljYXRpb24gCi0JCQkJLy8gaXMgYWNjZXNzaW5nIHRoZSBjbGlwYm9hcmQgd2hpbGUgd2UgY29weS4gSWdub3JlIHRoZSBlcnJvci4KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBNb3ZlcyB0aGUgc2VsZWN0ZWQgdGV4dCB0byB0aGUgY2xpcGJvYXJkLiAgVGhlIHRleHQgd2lsbCBiZSBwdXQgaW4gdGhlIAotCSAqIGNsaXBib2FyZCBpbiBwbGFpbiB0ZXh0IGZvcm1hdCBhbmQgUlRGIGZvcm1hdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjdXQoKXsKLQkJUG9pbnQgc2VsZWN0aW9uID0gZ2V0Q29udHJvbFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHNlbGVjdGlvbi55ID4gc2VsZWN0aW9uLngpIHsKLQkJCWNvcHkoKTsKLQkJCWRlbGV0ZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIGNoYXJhY3RlciB0byB0aGUgcmlnaHQgb2YgdGhlIGNhcmV0LiBEZWxldGUgdGhlIHNlbGVjdGVkIHRleHQgaWYgYW55LgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZSgpIHsKLQkJUG9pbnQgc2VsZWN0aW9uID0gZ2V0Q29udHJvbFNlbGVjdGlvbigpOwotCQlTdHJpbmcgdGV4dCA9IGdldENvbnRyb2xUZXh0KCk7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCB0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCi0JCWlmIChzZWxlY3Rpb24ueCAhPSBzZWxlY3Rpb24ueSkgewotCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHNlbGVjdGlvbi54KSArIHRleHQuc3Vic3RyaW5nKHNlbGVjdGlvbi55KTsKLQkJCXNldENvbnRyb2xUZXh0KHRleHQpOwotCQkJc2V0Q29udHJvbFNlbGVjdGlvbihuZXcgUG9pbnQoc2VsZWN0aW9uLngsIHNlbGVjdGlvbi54KSk7Ci0JCX0KLQl9Ci0JCi0JLyoqIAotCSAqIFJlcGxhY2VzIHRoZSBzZWxlY3Rpb24gd2l0aCB0aGUgY2xpcGJvYXJkIHRleHQgb3IgaW5zZXJ0IHRoZSB0ZXh0IGF0IAotCSAqIHRoZSBjdXJyZW50IGNhcmV0IG9mZnNldCBpZiB0aGVyZSBpcyBubyBzZWxlY3Rpb24uIAotCSAqIElmIHRoZSB3aWRnZXQgaGFzIHRoZSBTV1QuU0lOR0xFIHN0eWxlIGFuZCB0aGUgY2xpcGJvYXJkIHRleHQgY29udGFpbnMKLQkgKiBtb3JlIHRoYW4gb25lIGxpbmUsIG9ubHkgdGhlIGZpcnN0IGxpbmUgd2l0aG91dCBsaW5lIGRlbGltaXRlcnMgaXMgCi0JICogaW5zZXJ0ZWQgaW4gdGhlIHdpZGdldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXN0ZSgpIHsKLQkJVGV4dFRyYW5zZmVyIHRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCVBvaW50IHNlbGVjdGlvbiA9IGdldENvbnRyb2xTZWxlY3Rpb24oKTsKLQkJU3RyaW5nIHRleHQgPSBnZXRDb250cm9sVGV4dCgpOwotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlTdHJpbmcgbmV3VGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JCWlmIChuZXdUZXh0ICE9IG51bGwgJiYgbmV3VGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCWlmICh0ZXh0ID09IG51bGwpCi0JCQkJdGV4dCA9IG5ld1RleHQ7Ci0JCQllbHNlCi0JCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHNlbGVjdGlvbi54KSArIG5ld1RleHQgKyB0ZXh0LnN1YnN0cmluZyhzZWxlY3Rpb24ueSk7Ci0JCQlzZXRDb250cm9sVGV4dCh0ZXh0KTsKLQkKLQkJCS8vIHNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIHBhc3RlCi0JCQlpbnQgeCA9IHNlbGVjdGlvbi54ICsgbmV3VGV4dC5sZW5ndGgoKTsKLQkJCXNldENvbnRyb2xTZWxlY3Rpb24obmV3IFBvaW50KHgsIHgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBhY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZGlzcGxheSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodHlwZSA9PSBDVVRfQUNUSU9OKQotCQkJY3V0KCk7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ09QWV9BQ1RJT04pCi0JCQljb3B5KCk7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gUEFTVEVfQUNUSU9OKQotCQkJcGFzdGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlIHRoZSBhY3Rpb25zIGVuYWJsZWQvZGlzYWJsZWQgc3RhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgewotCQlpZiAoZ2V0Q29udHJvbCgpID09IG51bGwpIHsKLQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVBvaW50IHNlbGVjdGlvbiA9IGdldENvbnRyb2xTZWxlY3Rpb24oKTsKLQkJU3RyaW5nIHRleHQgPSBnZXRDb250cm9sVGV4dCgpOwotCi0JCXRyeSB7Ci0JCQlpZiAodHlwZSA9PSBDVVRfQUNUSU9OKQotCQkJCXNldEVuYWJsZWQodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwICYmIHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi54IDwgc2VsZWN0aW9uLnkpOwotCQkJZWxzZSBpZiAodHlwZSA9PSBDT1BZX0FDVElPTikKLQkJCQlzZXRFbmFibGVkKHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMCAmJiBzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24ueCA8IHNlbGVjdGlvbi55KTsKLQkJCWVsc2UgaWYgKHR5cGUgPT0gUEFTVEVfQUNUSU9OKSB7Ci0JCQkJQ29udHJvbCBjb250cm9sID0gZ2V0Q29udHJvbCgpOwotCQkJCWlmICghY29udHJvbC5pc0VuYWJsZWQoKSkgewotCQkJCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoIShjb250cm9sIGluc3RhbmNlb2YgVGV4dCkpIHsKLQkJCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlUZXh0IHRleHQyID0gKFRleHQpIGNvbnRyb2w7Ci0JCQkJaWYgKCF0ZXh0Mi5nZXRFZGl0YWJsZSgpKSB7Ci0JCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVRleHRUcmFuc2ZlciB0cmFuc2ZlciA9IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCQkJCVN0cmluZyBuZXdUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQkJCQlzZXRFbmFibGVkKG5ld1RleHQgIT0gbnVsbCAmJiBuZXdUZXh0Lmxlbmd0aCgpID4gMCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIHVwZGF0aW5nIHRleHQgYWN0aW9uIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQWJzdHJhY3RTZXJ2ZXJMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9BYnN0cmFjdFNlcnZlckxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZmNzA4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9BYnN0cmFjdFNlcnZlckxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY25mLlNlcnZlckRlY29yYXRvcjsKLQotLyoqCi0gKiBBIGRlZmF1bHQgb3IgcGFyZW50IGNsYXNzIHRoYXQgcHJvdmlkZXMgdGhlIGRlZmF1bHQgbGFiZWxzOiBTdGFydCwgU3RvcCwgU3RhcnRpbmcsIGV0Yy4uCi0gKiAKLSAqIEBhdXRob3IgYXJ2ZXJhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RTZXJ2ZXJMYWJlbFByb3ZpZGVyewotCi0JLyoqCi0JICogQmFzZWQgb24gYSBzZXJ2ZXIgcmV0dXJuIHRoZSBzZXJ2ZXIgc3RhdGUgbGFiZWwgdG8gZGlzcGxheSBpbiB0aGUgVUkKLQkgKiBAcGFyYW0gc2VydmVyCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZlclN0YXRlTGFiZWwoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsIHx8IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIFNlcnZlckRlY29yYXRvci5nZXRTdGF0ZUxhYmVsKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCksIHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpLCBzZXJ2ZXIuZ2V0TW9kZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lTZXJ2ZXJUb29sVGlwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9JU2VydmVyVG9vbFRpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjg1M2QxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lTZXJ2ZXJUb29sVGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBQcm92aWRlcyBleHRyYSBpbmZvcm1hdGlvbiB0byB0aGUgaG92ZXIgb3ZlciBtb3VzZSBhY3Rpb24gb2YgYSBzZXJ2ZXIKLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyVG9vbFRpcCB7Ci0JLyoqCi0JICogQWxsb3dzIGFkb3B0ZXJzIHRvIGFkZCB3aWRnZXRzIHRvIHRoZSB0b29sdGlwLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudAotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCwgSVNlcnZlciBzZXJ2ZXIpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL01hbmFnZWRVSURlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTWFuYWdlZFVJRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYzc3NWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTWFuYWdlZFVJRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBNYW5hZ2VkVUlEZWNvcmF0b3IgZXh0ZW5kcyBVSURlY29yYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc2VydmVyU3RhdGVVbm1hbmFnZWQgPSBuZXcgU3RyaW5nW10gewotCQkiIiwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nNCwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWQyLAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBpbmc0LAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBlZDJ9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3RhcnRpbmdUZXh0ID0gbmV3IFN0cmluZ1tdIHsKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nMSwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nMiwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nM307Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3RvcHBpbmdUZXh0ID0gbmV3IFN0cmluZ1tdIHsKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwaW5nMSwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwaW5nMiwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwaW5nM307Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VbXSBzdGFydGluZ0ltYWdlczsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZVtdIHN0b3BwaW5nSW1hZ2VzOwotCQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIHZhcmlhYmxlcyBmb3IgdGhpcyBjbGFzcwotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoKXsKLQkJbG9hZEltYWdlcygpOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkIHRoZSBTZXJ2ZXIgc3RhcnRpbmcgaW1hZ2VzLiAKLQkgKiBOT1RFOiBUaGlzIGlzIGRvbmUgc28gdGhhdCB3ZSBkb24ndCBpbml0aWFsaXplIHRoZSBpbWFnZXMgd2hlbiBhIGxhYmVsIGlzIGJlaW5nIHJlcXVlc3RlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRJbWFnZXMoKXsKLQkJaWYgKHN0YXJ0aW5nSW1hZ2VzID09IG51bGwpewotCQkJc3RhcnRpbmdJbWFnZXMgPSBuZXcgSW1hZ2VbXSB7Ci0JCQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMSksCi0JCQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMiksCi0JCQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMykKLQkJCX07Ci0JCQlzdG9wcGluZ0ltYWdlcyA9IG5ldyBJbWFnZVtdIHsKLQkJCQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMSksCi0JCQkJCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzIpLAotCQkJCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18yKQotCQkJfTsKLQkJfQotCX0KLQkJCi0JLyoqCi0JICogQHNlZSBVSURlY29yYXRvciNnZXRTdGF0ZUxhYmVsKGludCwgU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdGF0ZUxhYmVsKGludCBzdGF0ZSwgU3RyaW5nIG1vZGUsIGludCBjb3VudCkgewotCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKQotCQkJcmV0dXJuICIiOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKQotCQkJcmV0dXJuIHN0YXJ0aW5nVGV4dFtjb3VudF07Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpCi0JCQlyZXR1cm4gc3RvcHBpbmdUZXh0W2NvdW50XTsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKSB7Ci0JCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGVkRGVidWc7Ci0JCQllbHNlIGlmIChJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKG1vZGUpKQotCQkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRlZFByb2ZpbGU7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGVkOwotCQl9IGVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBlZDsKLQkJCi0JCXJldHVybiBzZXJ2ZXJTdGF0ZVVubWFuYWdlZFtzdGF0ZV07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBVSURlY29yYXRvciNnZXRTdGF0ZUltYWdlKGludCwgU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIEltYWdlIGdldFN0YXRlSW1hZ2UoaW50IHN0YXRlLCBTdHJpbmcgbW9kZSwgaW50IGNvdW50KSB7IAotCQkvLyBPbmx5IGluaXRpYWxpemUgdGhlIGltYWdlcyB3aGVuIGFuIGltYWdlIGlzIHJlcXVpcmVkCi0JCWluaXQoKTsKLQkJCi0JCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORykKLQkJCXJldHVybiBzdGFydGluZ0ltYWdlc1tjb3VudF07Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpCi0JCQlyZXR1cm4gc3RvcHBpbmdJbWFnZXNbY291bnRdOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RPUFBFRCk7Ci0JCWVsc2UgeyAvL2lmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKLQkJCS8vU3RyaW5nIG1vZGUgPSBzZXJ2ZXIuZ2V0TW9kZSgpOwotCQkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEX0RFQlVHKTsKLQkJCWVsc2UgaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfUFJPRklMRSk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJURUQpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNb2R1bGVOYW1lKCkgewotCQlyZXR1cm4gIm1vZHVsZSI7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhblJlc3RhcnQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRTdGF0ZUltYWdlT3ZlcmxheShpbnQgc3RhdGUsIFN0cmluZyBtb2RlLCBpbnQgY291bnQpIHsKLQkJLy8gVE9ETyBJbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL1NlcnZlckVkaXRvckFjdGlvbkZhY3RvcnlEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNDA3NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5JU2VydmVyRWRpdG9yUGFydElucHV0OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnlEZWxlZ2F0ZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZWRpdG9yIGFjdGlvbiBzaG91bGQgYmUgdmlzaWJsZSBvbiB0aGUgZ2l2ZW4KLQkgKiBzZXJ2ZXIuIFRoaXMgYWxsb3dzIGFjdGlvbnMgdG8gYmUgZmlsdGVyZWQgYmFzZWQgb24gdGhlIHNlcnZlciB0eXBlCi0JICogb3Igc2VydmVyIGF0dHJpYnV0ZXMuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIGJlaW5nIGVkaXRlZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFjdGlvbiBzaG91bGQgYmUgZGlzcGxheWVkLCBvcgotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGREaXNwbGF5KElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHNpdGUgdGhlIGVkaXRvciBzaXRlCi0JICogQHBhcmFtIGlucHV0IHRoZSBzZXJ2ZXIgZWRpdG9yIHBvcnQgaW5wdXQKLQkgKiBAcmV0dXJuIGFuIGFjdGlvbiB0aGF0IGNhbiBiZSBydW4gYWdhaW5zdCB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIGFic3RyYWN0IElBY3Rpb24gY3JlYXRlQWN0aW9uKElFZGl0b3JTaXRlIHNpdGUsIElTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQgaW5wdXQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VJRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9VSURlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njk4Mzg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VJRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVSURlY29yYXRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1NUT1AgPSAwOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHN0YXRlLgotCSAqCi0JICogQHBhcmFtIHN0YXRlIGEgc2VydmVyIHN0YXRlCi0JICogQHBhcmFtIG1vZGUgYSBsYXVuY2ggbW9kZQotCSAqIEBwYXJhbSBjb3VudCBhIHRpbWVyIGNvdW50Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdGF0ZUxhYmVsKGludCBzdGF0ZSwgU3RyaW5nIG1vZGUsIGludCBjb3VudCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gc3RhdGUuCi0JICogCi0JICogQHBhcmFtIHN0YXRlIGEgc2VydmVyIHN0YXRlCi0JICogQHBhcmFtIG1vZGUgYSBsYXVuY2ggbW9kZQotCSAqIEBwYXJhbSBjb3VudCBhIHRpbWVyIGNvdW50Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5wYXJ0cy5JSW1hZ2UKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSW1hZ2UgZ2V0U3RhdGVJbWFnZShpbnQgc3RhdGUsIFN0cmluZyBtb2RlLCBpbnQgY291bnQpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBJbWFnZSBnZXRTdGF0ZUltYWdlT3ZlcmxheShpbnQgc3RhdGUsIFN0cmluZyBtb2RlLCBpbnQgY291bnQpOwotCQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0U3RhdGVJbWFnZURlc2NyaXB0b3IoaW50IHN0YXRlLCBTdHJpbmcgbW9kZSwgaW50IGNvdW50KXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNb2R1bGVOYW1lKCkgewotCQlyZXR1cm4gIm1vZHVsZSI7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhblJlc3RhcnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0dXBBY3Rpb24oQWN0aW9uIGFjdGlvbiwgaW50IGFjdGlvbjIpIHsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvblN0b3BUb29sVGlwKTsKLQkJYWN0aW9uLnNldFRleHQoTWVzc2FnZXMuYWN0aW9uU3RvcCk7Ci0JCWFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9TVE9QKSk7Ci0JCWFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX1NUT1ApKTsKLQkJYWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfU1RPUCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9VSURlY29yYXRvck1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VJRGVjb3JhdG9yTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjkyYjM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VJRGVjb3JhdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jbmYuQ05GTWFuYWdlZFVJRGVjb3JhdG9yOwotCi1wdWJsaWMgY2xhc3MgVUlEZWNvcmF0b3JNYW5hZ2VyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIFVJRGVjb3JhdG9yIGRlY29yYXRvciA9IG5ldyBNYW5hZ2VkVUlEZWNvcmF0b3IoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIFVJRGVjb3JhdG9yIGRlY29yYXRvcjIgPSBuZXcgQ05GTWFuYWdlZFVJRGVjb3JhdG9yKCk7Ci0JCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIFVJRGVjb3JhdG9yIGdldFVJRGVjb3JhdG9yKElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUpIHsKLQkJcmV0dXJuIGRlY29yYXRvcjsKLQl9Ci0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIFVJRGVjb3JhdG9yIGdldENORlVJRGVjb3JhdG9yKElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUpIHsKLQkJcmV0dXJuIGRlY29yYXRvcjI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVUlEZWNvcmF0b3IgZ2V0VUlEZWNvcmF0b3IoKXsKLQkJcmV0dXJuIGRlY29yYXRvcjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBVSURlY29yYXRvciBnZXRDTkZVSURlY29yYXRvcigpIHsKLQkJcmV0dXJuIGRlY29yYXRvcjI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9BYnN0cmFjdFNlcnZlckFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL0Fic3RyYWN0U2VydmVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZmQ3MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL0Fic3RyYWN0U2VydmVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogQW4gYWJzdHJhY3QgY2xhc3MgZm9yIGFuIGFjdGlvbiBvbiBhIHNlcnZlci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VydmVyQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uUHJvdmlkZXJBY3Rpb24gewotCXByb3RlY3RlZCBTaGVsbCBzaGVsbDsKLQotCXB1YmxpYyBBYnN0cmFjdFNlcnZlckFjdGlvbihJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIsIFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMobnVsbCwgc2VsZWN0aW9uUHJvdmlkZXIsIHRleHQpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdFNlcnZlckFjdGlvbihTaGVsbCBzaGVsbCwgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyLCBTdHJpbmcgdGV4dCkgewotCQlzdXBlcihzZWxlY3Rpb25Qcm92aWRlciwgdGV4dCk7Ci0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBzZXJ2ZXIgY2FuIGN1cnJlbnRseSBiZSBhY3RlZCBvbi4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSBhY3Rpb24gb24gdGhpcyBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHBlcmZvcm0oSVNlcnZlciBzZXJ2ZXIpOwotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKS5pdGVyYXRvcigpOwotCQkKLQkJaWYgKCFpdGVyYXRvci5oYXNOZXh0KCkpCi0JCQlyZXR1cm47CQkKLQkJCi0JCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBvYmo7Ci0JCQlpZiAoYWNjZXB0KHNlcnZlcikpCi0JCQkJcGVyZm9ybShzZXJ2ZXIpOwotCQkJc2VsZWN0aW9uQ2hhbmdlZChnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBlbmFibGVkIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBzZWwgYSBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCkgewotCQlpZiAoc2VsLmlzRW1wdHkoKSkgewotCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VsLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIG9iajsKLQkJCQlpZiAoYWNjZXB0KHNlcnZlcikpCi0JCQkJCWVuYWJsZWQgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL0NvcHlBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Db3B5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5Y2ZmMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL0NvcHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiAiQ29weSIgbWVudSBhY3Rpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3B5QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBY3Rpb24gewotCXByb3RlY3RlZCBBY3Rpb24gcGFzdGVBY3Rpb247Ci0JcHJpdmF0ZSBDbGlwYm9hcmQgY2xpcGJvYXJkOwotCi0JLyoqCi0JICogQ29weUFjdGlvbiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc3AgYSBzZWxlY3Rpb24gcHJvdmlkZXIKLQkgKiBAcGFyYW0gY2xpcGJvYXJkIHRoZSBjbGlwYm9hcmQKLQkgKiBAcGFyYW0gcGFzdGVBY3Rpb24gdGhlIHBhc3RlIGFjdGlvbgotCSAqLwotCXB1YmxpYyBDb3B5QWN0aW9uKElTZWxlY3Rpb25Qcm92aWRlciBzcCwgQ2xpcGJvYXJkIGNsaXBib2FyZCwgQWN0aW9uIHBhc3RlQWN0aW9uKSB7Ci0JCXN1cGVyKHNwLCBNZXNzYWdlcy5hY3Rpb25Db3B5KTsKLQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotCQlzZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0NPUFkpKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0NPUFlfRElTQUJMRUQpKTsKLQkJc2V0QWN0aW9uRGVmaW5pdGlvbklkKElXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzLkNPUFkpOwotCQkKLQkJdGhpcy5jbGlwYm9hcmQgPSBjbGlwYm9hcmQ7Ci0JCXRoaXMucGFzdGVBY3Rpb24gPSBwYXN0ZUFjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJcmV0dXJuIHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgT2JqZWN0W10geyBuZXcgSVNlcnZlcltdIHsgc2VydmVyIH0sIHNlcnZlci5nZXROYW1lKCkgfSwKLQkJCW5ldyBUcmFuc2ZlcltdIHsgU2VydmVyVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwgVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfSk7Ci0JCXBhc3RlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9EZWxldGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9EZWxldGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI2YTY2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvRGVsZXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkRlbGV0ZVNlcnZlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotLyoqCi0gKiBBY3Rpb24gZm9yIGRlbGV0aW5nIHNlcnZlciByZXNvdXJjZXMuCi0gKiBAZGVwcmVjYXRlZCBJbnN0ZWFkIHVzZSB7QGxpbmsgR2xvYmFsRGVsZXRlQWN0aW9ufQotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBY3Rpb24gewotCXByb3RlY3RlZCBJU2VydmVyW10gc2VydmVyczsKLQlwcm90ZWN0ZWQgSUZvbGRlcltdIGNvbmZpZ3M7Ci0KLQkvKioKLQkgKiBEZWxldGVBY3Rpb24gY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNoZWxsIGEgc2hlbGwKLQkgKiBAcGFyYW0gc3AgYSBzZWxlY3Rpb24gcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgRGVsZXRlQWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VsZWN0aW9uUHJvdmlkZXIgc3ApIHsKLQkJc3VwZXIoc2hlbGwsIHNwLCBNZXNzYWdlcy5hY3Rpb25EZWxldGUpOwotCQlJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEVfRElTQUJMRUQpKTsKLQkJc2V0QWN0aW9uRGVmaW5pdGlvbklkKElXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzLkRFTEVURSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXNlcnZlcnMgPSBuZXcgSVNlcnZlcltdIHsgc2VydmVyIH07Ci0JCUxpc3Q8SUZvbGRlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUZvbGRlcj4oKTsKLQkJCi0JCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoc2VydmVyc1tpXS5pc1JlYWRPbmx5KCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlpZiAoc2VydmVyc1tpXS5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkgIT0gbnVsbCkKLQkJCQlsaXN0LmFkZChzZXJ2ZXJzW2ldLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSk7Ci0JCX0KLQkJCi0JCS8vIHJlbW92ZSBjb25maWd1cmF0aW9ucyB0aGF0IGFyZSBzdGlsbCByZWZlcmVuY2VkIGJ5IG90aGVyIHNlcnZlcnMKLQkJSVNlcnZlcltdIHNlcnZlcnMyID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWlmIChzZXJ2ZXJzMiAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZTIgPSBzZXJ2ZXJzMi5sZW5ndGg7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJaWYgKHNlcnZlcnNbaV0uZXF1YWxzKHNlcnZlcnMyW2pdKSkKLQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKCFmb3VuZCkgewotCQkJCQlJRm9sZGVyIGZvbGRlciA9IHNlcnZlcnMyW2pdLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKLQkJCQkJaWYgKGZvbGRlciAhPSBudWxsICYmIGxpc3QuY29udGFpbnMoZm9sZGVyKSkKLQkJCQkJCWxpc3QucmVtb3ZlKGZvbGRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQljb25maWdzID0gbmV3IElGb2xkZXJbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkoY29uZmlncyk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm0oSVNlcnZlciBzZXJ2ZXIpIHsKLQkJRGVsZXRlU2VydmVyRGlhbG9nIGRzZCA9IG5ldyBEZWxldGVTZXJ2ZXJEaWFsb2coc2hlbGwsIHNlcnZlcnMsIGNvbmZpZ3MpOwotCQlkc2Qub3BlbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvR2xvYmFsRGVsZXRlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvR2xvYmFsRGVsZXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODVjZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL0dsb2JhbERlbGV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvblByb3ZpZGVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5EZWxldGVTZXJ2ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotLyoqCi0gKiBUaGlzIGdsb2JhbCBkZWxldGUgYWN0aW9uIGhhbmRsZXMgYm90aCB0aGUgc2VydmVyIGFuZCBtb2R1bGUgZGVsZXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBHbG9iYWxEZWxldGVBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25Qcm92aWRlckFjdGlvbiB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXJbXSBzZXJ2ZXJzOwotCXByb3RlY3RlZCBJRm9sZGVyW10gY29uZmlnczsKLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCi0JcHVibGljIEdsb2JhbERlbGV0ZUFjdGlvbihTaGVsbCBzaGVsbCwgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyKSB7Ci0JCXN1cGVyKHNlbGVjdGlvblByb3ZpZGVyLCBNZXNzYWdlcy5hY3Rpb25EZWxldGUpOwotCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEUpKTsJCQotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFX0RJU0FCTEVEKSk7Ci0JCXNldEFjdGlvbkRlZmluaXRpb25JZChJV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkcy5ERUxFVEUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCkgewotCQlpZiAoc2VsLmlzRW1wdHkoKSkgewotCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VsLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIG9iajsKLQkJCQlpZiAoYWNjZXB0KHNlcnZlcikpCi0JCQkJCWVuYWJsZWQgPSB0cnVlOwotCQkJfSAKLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcil7Ci0JCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgb2JqOwotCQkJCWlmIChhY2NlcHQobXMpKQotCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChNb2R1bGVTZXJ2ZXIgbXMpewotCQlpZiAobXMuZ2V0U2VydmVyKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJU3RhdHVzIHN0YXR1cyA9IG1zLmdldFNlcnZlcigpLmNhbk1vZGlmeU1vZHVsZXMobnVsbCxtcy5tb2R1bGUsIG51bGwpOyAgCi0JCWlmIChzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChJU2VydmVyIHNlcnZlcikgewotCQlzZXJ2ZXJzID0gbmV3IElTZXJ2ZXJbXSB7IHNlcnZlciB9OwotCQlMaXN0PElGb2xkZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElGb2xkZXI+KCk7Ci0JCQotCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHNlcnZlcnNbaV0uaXNSZWFkT25seSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQkJaWYgKHNlcnZlcnNbaV0uZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpICE9IG51bGwpCi0JCQkJbGlzdC5hZGQoc2VydmVyc1tpXS5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkpOwotCQl9Ci0JCQotCQkvLyByZW1vdmUgY29uZmlndXJhdGlvbnMgdGhhdCBhcmUgc3RpbGwgcmVmZXJlbmNlZCBieSBvdGhlciBzZXJ2ZXJzCi0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzMiA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVyczIgIT0gbnVsbCkgewotCQkJaW50IHNpemUyID0gc2VydmVyczIubGVuZ3RoOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCWlmIChzZXJ2ZXJzW2ldLmVxdWFscyhzZXJ2ZXJzMltqXSkpCi0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJfQotCQkJCWlmICghZm91bmQpIHsKLQkJCQkJSUZvbGRlciBmb2xkZXIgPSBzZXJ2ZXJzMltqXS5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQkJCWlmIChmb2xkZXIgIT0gbnVsbCAmJiBsaXN0LmNvbnRhaW5zKGZvbGRlcikpCi0JCQkJCQlsaXN0LnJlbW92ZShmb2xkZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJY29uZmlncyA9IG5ldyBJRm9sZGVyW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KGNvbmZpZ3MpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oKSB7CQkKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpOwotCQkvLyBmaWx0ZXIgdGhlIHNlbGVjdGlvbgotCQlpZiAoIXNlbC5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBmaXJzdEVsZW1lbnQgPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiggc2VsLnNpemUoKSA9PSAxICYmIGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCQlkZWxldGVTZXJ2ZXIoKElTZXJ2ZXIpZmlyc3RFbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJQXJyYXlMaXN0PElNb2R1bGU+IG1vZHVsZUxpc3QgPSBnZXRSZW1vdmFibGVNb2R1bGVMaXN0KHNlbCk7Ci0JCQkJaWYoIG1vZHVsZUxpc3QgIT0gbnVsbCApIHsKLQkJCQkJSVNlcnZlciBzID0gKChNb2R1bGVTZXJ2ZXIpZmlyc3RFbGVtZW50KS5nZXRTZXJ2ZXIoKTsKLQkJCQkJSU1vZHVsZVtdIGFzQXJyYXkgPSBtb2R1bGVMaXN0LnRvQXJyYXkobmV3IElNb2R1bGVbbW9kdWxlTGlzdC5zaXplKCldKTsKLQkJCQkJbmV3IFJlbW92ZU1vZHVsZUFjdGlvbihzaGVsbCwgcywgYXNBcnJheSkucnVuKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGFuIGFycmF5bGlzdCBvZiBhbGwgSU1vZHVsZXMgZnJvbSB0aGlzIHNlbGVjdGlvbiB0aGF0IAotCSAqIHNob3VsZCBiZSBkZWxldGVkLCBvciBudWxsIGlmIHRoZSBzZWxlY3Rpb24gaXMgaW52YWxpZCBvciByZXF1aXJlcwotCSAqIG5vIGFjdGlvbiBiZSB0YWtlbi4gCi0JICovCi0JcHVibGljIHN0YXRpYyBBcnJheUxpc3Q8SU1vZHVsZT4gZ2V0UmVtb3ZhYmxlTW9kdWxlTGlzdChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwpIHsKLQkJSXRlcmF0b3IgaSA9IHNlbC5pdGVyYXRvcigpOwotCQlJU2VydmVyIHMgPSBudWxsOwotCQlPYmplY3QgbmV4dCA9IG51bGw7Ci0JCUFycmF5TGlzdDxJTW9kdWxlPiBtb2R1bGVMaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQl3aGlsZShpLmhhc05leHQoKSkgewotCQkJbmV4dCA9IGkubmV4dCgpOwotCQkJLy8gSWYgdGhlcmUgaXMgYW55dGhpbmcgKm5vdCogYSBNb2R1bGVTZXJ2ZXIgaW4gdGhlIHNlbGVjdGlvbiwgZG8gbm90aGluZwotCQkJaWYoICEobmV4dCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgfHwgKChNb2R1bGVTZXJ2ZXIpbmV4dCkuZ2V0U2VydmVyKCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJaWYoIHMgPT0gbnVsbCApCi0JCQkJcyA9ICgoTW9kdWxlU2VydmVyKW5leHQpLmdldFNlcnZlcigpOwotCQkJZWxzZSBpZiggIXMuZ2V0SWQoKS5lcXVhbHMoKChNb2R1bGVTZXJ2ZXIpbmV4dCkuZ2V0U2VydmVyKCkuZ2V0SWQoKSkpCi0JCQkJLy8gUmVxdWVzdHMgdG8gcmVtb3ZlIG1vZHVsZXMgdW5kZXIgZGlmZmVyZW50IHNlcnZlcnMgc2hvdWxkIGJlIGlnbm9yZWQKLQkJCQlyZXR1cm4gbnVsbDsgIAotCQkJCi0JCQlJTW9kdWxlW10gbmV4dE1vZCA9ICgoTW9kdWxlU2VydmVyKW5leHQpLmdldE1vZHVsZSgpOwotCQkJaWYoIG5leHRNb2QgPT0gbnVsbCB8fCBuZXh0TW9kLmxlbmd0aCAhPSAxIHx8IG5leHRNb2RbMF0gPT0gbnVsbCkgCi0JCQkJLy8gSWYgdGhlIG1vZHVsZSBpcyBhIGNoaWxkIG1vZHVsZSAoZWpiIC8gd2FyIHVuZGVybmVhdGggYW4gZWFyKSBpZ25vcmUgdGhpcyByZXF1ZXN0Ci0JCQkJcmV0dXJuIG51bGw7IAotCQkJCi0JCQkvLyBBZGQgdGhlIGl0ZW0gdG8gdGhlIGxpc3Qgb2YgcmVtb3ZhYmxlIG1vZHVsZXMKLQkJCW1vZHVsZUxpc3QuYWRkKCgoTW9kdWxlU2VydmVyKW5leHQpLmdldE1vZHVsZSgpWzBdKTsKLQkJfQotCQkvLyBBbGwgbW9kdWxlcyBhcmUgdW5kZXIgdGhlIHNhbWUgc2VydmVyIGFuZCBtYXkgYmUgcmVtb3ZlZC4gCi0JCXJldHVybiBtb2R1bGVMaXN0OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVTZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIpewotCQkvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzZXJ2ZXIgaXMgY3JlYXRlZCBhbmQgYWRkZWQgdG8gdGhlIHNlcnZlciB2aWV3IG9uIHdvcmtiZW5jaAotCQkvLyBzdGFydHVwLiBBcyBhIHJlc3VsdCwgd2hlbiB0aGUgdXNlciBzd2l0Y2hlcyB0byB0aGUgc2VydmVyIHZpZXcsIHRoZSBzZXJ2ZXIgaXMgCi0JCS8vIHNlbGVjdGVkLCBidXQgdGhlIHNlbGVjdGlvbkNoYW5nZWQgZXZlbnQgaXMgbm90IGNhbGxlZCwgd2hpY2ggcmVzdWx0cyBpbiBzZXJ2ZXJzCi0JCS8vIGJlaW5nIG51bGwuIFdoZW4gc2VydmVycyBpcyBudWxsIHRoZSBzZXJ2ZXIgd2lsbCBub3QgYmUgZGVsZXRlZCBhbmQgdGhlIGVycm9yIGxvZwotCQkvLyB3aWxsIGhhdmUgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotCQkvLwotCQkvLyBUbyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgc2VydmVycyBpcyBudWxsLCB0aGUgc2VsZWN0aW9uQ2hhbmdlZCBtZXRob2QgaXMgY2FsbGVkCi0JCS8vIHRvIGVuc3VyZSBzZXJ2ZXJzIHdpbGwgYmUgcG9wdWxhdGVkLgotCQlpZiAoc2VydmVycyA9PSBudWxsKXsKLQkJCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiRGVsZXRlIHNlcnZlciBjYWxsZWQgd2hlbiBzZXJ2ZXJzIGlzIG51bGwiKTsKLQkJCX0JCQkJCi0JCQkJCQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0JCWlmIChzZWwgIT0gbnVsbCl7Ci0JCQlzZWxlY3Rpb25DaGFuZ2VkKHNlbCk7Ci0JCX0KLQkJfQotCQkJCi0JCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19GSU5FU1QsICJPcGVuaW5nIGRlbGV0ZSBzZXJ2ZXIgZGlhbG9nIHdpdGggcGFyYW1ldGVycyBzaGVsbD0iCi0JCQkJCSsgc2hlbGwgKyAiIHNlcnZlcnM9IiArIHNlcnZlcnMgKyAiIGNvbmZpZ3M9IiArIGNvbmZpZ3MpOwotCQl9CQkKLQotCQkvLyBObyBjaGVjayBpcyBtYWRlIGZvciB2YWxpZCBwYXJhbWV0ZXJzIGF0IHRoaXMgcG9pbnQsIHNpbmNlIGlmIHRoZXJlIGlzIGEgZmFpbHVyZSwgaXQKLQkJLy8gc2hvdWxkIGJlIG91dHB1dCB0byB0aGUgZXJyb3IgbG9nIGluc3RlYWQgb2YgZmFpbGluZyBzaWxlbnRseS4JCQotCQkKLQkJRGVsZXRlU2VydmVyRGlhbG9nIGRzZCA9IG5ldyBEZWxldGVTZXJ2ZXJEaWFsb2coc2hlbGwsIHNlcnZlcnMsIGNvbmZpZ3MpOwotCQlkc2Qub3BlbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb2R1bGVTZXJ2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb2R1bGVTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmZmEwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9kdWxlU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5JU2VydmVyTW9kdWxlOwotLyoqCi0gKiBBIHV0aWxpdHkgY2xhc3MgZm9yIHJlZmVyZW5jaW5nIGEgc2VydmVyIGFuZCBhIG1vZHVsZSBhdCB0aGUgc2FtZSB0aW1lLgotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlU2VydmVyIGltcGxlbWVudHMgSVNlcnZlck1vZHVsZSB7Ci0JLyoqCi0JICogVGhlIHNlcnZlcgotCSAqLwotCXB1YmxpYyBJU2VydmVyIHNlcnZlcjsKLQotCS8qKgotCSAqIFRoZSBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIG1vZHVsZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBtb2R1bGUtc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqLwotCXB1YmxpYyBNb2R1bGVTZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXRoaXMubW9kdWxlID0gbW9kdWxlOwotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgbW9kdWxlIGJlbG9uZ3MgdG8uCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCkgewotCQlyZXR1cm4gc2VydmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldE1vZHVsZSgpIHsKLQkJcmV0dXJuIG1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBvYmo7Ci0JCQotCQlpZiAobXMuc2VydmVyID09IG51bGwgJiYgc2VydmVyICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAobXMuc2VydmVyICE9IG51bGwgJiYgIW1zLnNlcnZlci5lcXVhbHMoc2VydmVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChtcy5tb2R1bGUubGVuZ3RoICE9IG1vZHVsZS5sZW5ndGgpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgc2l6ZSA9IG1vZHVsZS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoIW1vZHVsZVtpXS5lcXVhbHMobXMubW9kdWxlW2ldKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2IuYXBwZW5kKCJTZXJ2ZXItTW9kdWxlIFsiICsgc2VydmVyLmdldElkKCkgKyAiLyIgKyBzZXJ2ZXIuZ2V0TmFtZSgpICsgIiwgKCIpOwotCQllbHNlCi0JCQlzYi5hcHBlbmQoIlNlcnZlci1Nb2R1bGUgW251bGwsICgiKTsKLQkJCi0JCWludCBzaXplID0gbW9kdWxlLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChpID4gMCkKLQkJCQlzYi5hcHBlbmQoIiwgIik7Ci0JCQlzYi5hcHBlbmQobW9kdWxlW2ldLmdldE5hbWUoKSk7Ci0JCX0KLQkJc2IuYXBwZW5kKCIpXSIpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL01vZHVsZVNsb3NoQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9kdWxlU2xvc2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThhN2NmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9kdWxlU2xvc2hBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuTW9kaWZ5TW9kdWxlc1dpemFyZDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVTbG9zaEFjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VydmVyQWN0aW9uIHsKLQlwdWJsaWMgTW9kdWxlU2xvc2hBY3Rpb24oU2hlbGwgc2hlbGwsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikgewotCQlzdXBlcihzaGVsbCwgc2VsZWN0aW9uUHJvdmlkZXIsIE1lc3NhZ2VzLmFjdGlvbk1vZGlmeU1vZHVsZXMpOwotCQlzZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25Nb2RpZnlNb2R1bGVzVG9vbFRpcCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FVE9PTF9NT0RJRllfTU9EVUxFUykpOwotCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DVE9PTF9NT0RJRllfTU9EVUxFUykpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19EVE9PTF9NT0RJRllfTU9EVUxFUykpOwotCQl0cnkgewotCQkJc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBzZXJ2ZXIgY2FuIGN1cnJlbnRseSBiZSBhY3RlZCBvbi4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSBhY3Rpb24gb24gdGhpcyBzZXJ2ZXIuCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm0oZmluYWwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJLy8gY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBtb2R1bGVzIGZpcnN0Ci0JCS8vIGdldCBjdXJyZW50bHkgZGVwbG95ZWQgbW9kdWxlcwotCQlMaXN0PElNb2R1bGU+IGRlcGxveWVkID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQlMaXN0PElNb2R1bGU+IG1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7Ci0JCUlNb2R1bGVbXSBjdXJyZW50TW9kdWxlcyA9IHNlcnZlci5nZXRNb2R1bGVzKCk7Ci0JCWlmIChjdXJyZW50TW9kdWxlcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGN1cnJlbnRNb2R1bGVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJZGVwbG95ZWQuYWRkKGN1cnJlbnRNb2R1bGVzW2ldKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gZ2V0IHJlbWFpbmluZyBtb2R1bGVzCi0JCUlNb2R1bGVbXSBtb2R1bGVzMiA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKSk7Ci0JCWlmIChtb2R1bGVzMiAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IG1vZHVsZXMyLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSU1vZHVsZSBtb2R1bGUgPSBtb2R1bGVzMltpXTsKLQkJCQlpZiAoIWRlcGxveWVkLmNvbnRhaW5zKG1vZHVsZSkpIHsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBzZXJ2ZXIuY2FuTW9kaWZ5TW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sIG51bGwsIG51bGwpOwotCQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUikKLQkJCQkJCW1vZHVsZXMuYWRkKG1vZHVsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAoZGVwbG95ZWQuaXNFbXB0eSgpICYmIG1vZHVsZXMuaXNFbXB0eSgpKSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihzaGVsbCwgTWVzc2FnZXMuZGVmYXVsdERpYWxvZ1RpdGxlLCBNZXNzYWdlcy5kaWFsb2dBZGRSZW1vdmVNb2R1bGVzTm9uZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCU1vZGlmeU1vZHVsZXNXaXphcmQgd2l6YXJkID0gbmV3IE1vZGlmeU1vZHVsZXNXaXphcmQoc2VydmVyKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb25pdG9yUHJvcGVydHlQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9uaXRvclByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjljM2YyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb25pdG9yUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5Nb25pdG9yQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIHRoYXQgYWxsb3dzIGEgdXNlciB0byBtb25pdG9yIHBvcnRzIGZyb20gYSBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yUHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIHsKLQlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIE1vbml0b3JDb21wb3NpdGUgbW9uaXRvckNvbXA7Ci0KLQkvKioKLQkgKiBNb25pdG9yUHJvcGVydHlQYWdlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vbml0b3JQcm9wZXJ0eVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBib2R5IG9mIHRoZSBwYWdlLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUlBZGFwdGFibGUgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJc2VydmVyID0gKElTZXJ2ZXIpIGVsZW1lbnQuZ2V0QWRhcHRlcihJU2VydmVyLmNsYXNzKTsKLQkJCi0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IDU1MDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkvL1dvcmtiZW5jaEhlbHAuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuVEVSTUlOQVRFX1NFUlZFUl9ESUFMT0cpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMuZGlhbG9nTW9uaXRvckRlc2NyaXB0aW9uLCBuZXcgU3RyaW5nW10geyBzZXJ2ZXIuZ2V0TmFtZSgpIH0gKSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCW1vbml0b3JDb21wID0gbmV3IE1vbml0b3JDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSwgbnVsbCwgc2VydmVyKTsKLQkJbW9uaXRvckNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL01vbml0b3JTZXJ2ZXJQb3J0QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9uaXRvclNlcnZlclBvcnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNlYjRiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9uaXRvclNlcnZlclBvcnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklNb25pdG9yZWRTZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JU2VydmVyTW9uaXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlck1vbml0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotLyoqCi0gKiBNb25pdG9yIGEgc2VydmVyIHBvcnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yU2VydmVyUG9ydEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJvdGVjdGVkIFNoZWxsIHNoZWxsOwotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgU2VydmVyUG9ydCBwb3J0OwotCXByb3RlY3RlZCBJTW9uaXRvcmVkU2VydmVyUG9ydCBtb25pdG9yZWRQb3J0OwotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrZWQ7Ci0JCi0JcHVibGljIE1vbml0b3JTZXJ2ZXJQb3J0QWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VydmVyIHNlcnZlciwgU2VydmVyUG9ydCBwb3J0KSB7Ci0JCXN1cGVyKE5MUy5iaW5kKE1lc3NhZ2VzLmFjdGlvbk1vbml0b3JQb3J0LCBuZXcgU3RyaW5nW10geyBwb3J0LmdldFBvcnQoKSArICIiLCBwb3J0LmdldE5hbWUoKSB9KSk7Ci0JCQotCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQl0aGlzLnBvcnQgPSBwb3J0OwotCQkKLQkJSU1vbml0b3JlZFNlcnZlclBvcnRbXSBtc3BzID0gU2VydmVyTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb25pdG9yZWRQb3J0cyhzZXJ2ZXIpOwotCQlpZiAobXNwcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IG1zcHMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAocG9ydC5lcXVhbHMobXNwc1tpXS5nZXRTZXJ2ZXJQb3J0KCkpICYmIC8vIG1zcHNbaV0uaXNTdGFydGVkKCkgJiYKLQkJCQkJCShtc3BzW2ldLmdldENvbnRlbnRUeXBlcygpID09IG51bGwgfHwgbXNwc1tpXS5nZXRDb250ZW50VHlwZXMoKS5sZW5ndGggPT0gMCB8fAotCQkJCQkJKHBvcnQuZ2V0Q29udGVudFR5cGVzKCkgIT0gbnVsbCAmJiBtc3BzW2ldLmdldENvbnRlbnRUeXBlcygpLmxlbmd0aCA9PSBwb3J0LmdldENvbnRlbnRUeXBlcygpLmxlbmd0aCkpKQotCQkJCQltb25pdG9yZWRQb3J0ID0gbXNwc1tpXTsKLQkJCX0KLQkJfQotCi0JCWNoZWNrZWQgPSBtb25pdG9yZWRQb3J0ICE9IG51bGw7IC8vICYmIG1vbml0b3JlZFBvcnQuaXNTdGFydGVkKCk7Ci0JCXNldENoZWNrZWQoY2hlY2tlZCk7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlIG9yIGRpc2FibGUgbW9uaXRvcmluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUlTZXJ2ZXJNb25pdG9yTWFuYWdlciBzbW0gPSBTZXJ2ZXJNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCQlpZiAoY2hlY2tlZCkgewotCQkJc21tLnJlbW92ZU1vbml0b3IobW9uaXRvcmVkUG9ydCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobW9uaXRvcmVkUG9ydCA9PSBudWxsKQotCQkJCW1vbml0b3JlZFBvcnQgPSBzbW0uY3JlYXRlTW9uaXRvcihzZXJ2ZXIsIHBvcnQsIC0xLCBudWxsKTsKLQkJCQotCQkJdHJ5IHsKLQkJCQlzbW0uc3RhcnRNb25pdG9yKG1vbml0b3JlZFBvcnQpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZCBub3QgbW9uaXRvciIsIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvT3BlbkFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL09wZW5BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzMTRiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvT3BlbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqICJPcGVuIiBtZW51IGFjdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE9wZW5BY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFjdGlvbiB7Ci0JLyoqCi0JICogT3BlbkFjdGlvbiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc3AgYSBzZWxlY3Rpb24gcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgT3BlbkFjdGlvbihJU2VsZWN0aW9uUHJvdmlkZXIgc3ApIHsKLQkJc3VwZXIoc3AsIE1lc3NhZ2VzLmFjdGlvbk9wZW4pOwotCQkKLQkJLy9zZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5PcGVuIik7Ci0JCXNldEFjdGlvbkRlZmluaXRpb25JZCgib3JnLmVjbGlwc2UuamR0LnVpLmVkaXQudGV4dC5qYXZhLm9wZW4uZWRpdG9yIik7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybShJU2VydmVyIHNlcnZlcikgewotCQl0cnkgewotCQkJU2VydmVyVUlQbHVnaW4uZWRpdFNlcnZlcihzZXJ2ZXIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBlZGl0aW5nIGVsZW1lbnQiLCBlKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUGFzdGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9QYXN0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWZjNjRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9QYXN0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvblByb3ZpZGVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotLyoqCi0gKiAiUGFzdGUiIG1lbnUgYWN0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUGFzdGVBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25Qcm92aWRlckFjdGlvbiB7Ci0JcHJpdmF0ZSBDbGlwYm9hcmQgY2xpcGJvYXJkOwotCi0JLyoqCi0JICogUGFzdGVBY3Rpb24gY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNoZWxsIGEgc2hlbGw7Ci0JICogQHBhcmFtIHNwIGEgc2VsZWN0aW9uIHByb3ZpZGVyCi0JICogQHBhcmFtIGNsaXBib2FyZCB0aGUgY2xpcGJvYXJkCi0JICovCi0JcHVibGljIFBhc3RlQWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VsZWN0aW9uUHJvdmlkZXIgc3AsIENsaXBib2FyZCBjbGlwYm9hcmQpIHsKLQkJc3VwZXIoc3AsIE1lc3NhZ2VzLmFjdGlvblBhc3RlKTsKLQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotCQlzZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1BBU1RFKSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9QQVNURV9ESVNBQkxFRCkpOwotCQlzZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuUEFTVEUpOwotCQkKLQkJdGhpcy5jbGlwYm9hcmQgPSBjbGlwYm9hcmQ7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBlbmFibGVkIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBzZWwgYSBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCkgewotCQlTZXJ2ZXJUcmFuc2ZlciBzZXJ2ZXJUcmFuc2ZlciA9IFNlcnZlclRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gKElTZXJ2ZXJbXSkgY2xpcGJvYXJkLmdldENvbnRlbnRzKHNlcnZlclRyYW5zZmVyKTsKLQkJc2V0RW5hYmxlZChzZXJ2ZXJzICE9IG51bGwgJiYgc2VydmVycy5sZW5ndGggPiAwKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZGVmaW5lZCBvbiA8Y29kZT5JQWN0aW9uPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVNlcnZlclRyYW5zZmVyIHNlcnZlclRyYW5zZmVyID0gU2VydmVyVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJSVNlcnZlcltdIHNlcnZlcnMgPSAoSVNlcnZlcltdKSBjbGlwYm9hcmQuZ2V0Q29udGVudHMoc2VydmVyVHJhbnNmZXIpOwotCQkKLQkJaWYgKHNlcnZlcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IHNlcnZlcnNbaV0uY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCQkoKFNlcnZlcldvcmtpbmdDb3B5KXdjKS5kaXNhc3NvY2lhdGUoKTsKLQkJCQl3Yy5zZXROYW1lKCJUZW1wIik7IC8vIHNldHMgdGhlIG5hbWUgZnJvbSB0aGUgY3VycmVudCBvbmUgc28gdGhhdCB0aGUKLQkJCQkJCS8vIGRlZmF1bHQgbmFtZSBnZW5lcmF0aW9uIHdpbGwgd29yawotCQkJCVNlcnZlclV0aWwuc2V0U2VydmVyRGVmYXVsdE5hbWUod2MpOwotCQkJCXdjLnNhdmUoZmFsc2UsIG51bGwpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkZhaWx1cmUgdG8gY29weSBzZXJ2ZXIiLCBjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Qcm9wZXJ0aWVzQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUHJvcGVydGllc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTBhZDk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Qcm9wZXJ0aWVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQWN0aW9uIHRvIHNob3cgdGhlIHByb3BlcnR5IHBhZ2UgZm9yIGEgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydGllc0FjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VydmVyQWN0aW9uIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIHByb3BlcnR5UGFnZUlkOwotCi0JcHVibGljIFByb3BlcnRpZXNBY3Rpb24oU2hlbGwgc2hlbGwsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikgewotCQl0aGlzKHNoZWxsLCBudWxsLCBzZWxlY3Rpb25Qcm92aWRlcik7Ci0JfQotCi0JcHVibGljIFByb3BlcnRpZXNBY3Rpb24oU2hlbGwgc2hlbGwsIFN0cmluZyBwcm9wZXJ0eVBhZ2VJZCwgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyKSB7Ci0JCXN1cGVyKHNoZWxsLCBzZWxlY3Rpb25Qcm92aWRlciwgTWVzc2FnZXMuYWN0aW9uUHJvcGVydGllcyk7Ci0JCXRoaXMucHJvcGVydHlQYWdlSWQgPSBwcm9wZXJ0eVBhZ2VJZDsKLQkJaWYgKHByb3BlcnR5UGFnZUlkID09IG51bGwpCi0JCQlzZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuUFJPUEVSVElFUyk7Ci0JCQotCQl0cnkgewotCQkJc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybShJU2VydmVyIHNlcnZlcikgewotCQlpZiAocHJvcGVydHlQYWdlSWQgPT0gbnVsbCkKLQkJCXByb3BlcnR5UGFnZUlkID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJvcGVydGllcyI7Ci0JCURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJvcGVydHlEaWFsb2dPbihzaGVsbCwgc2VydmVyLCBwcm9wZXJ0eVBhZ2VJZCwgbnVsbCwgbnVsbCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9QdWJsaXNoQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUHVibGlzaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDUxODZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9QdWJsaXNoQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotLyoqCi0gKiBQdWJsaXNoIHRvIGEgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaEFjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VydmVyQWN0aW9uIHsKLQlwdWJsaWMgUHVibGlzaEFjdGlvbihTaGVsbCBzaGVsbCwgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyKSB7Ci0JCXN1cGVyKHNoZWxsLCBzZWxlY3Rpb25Qcm92aWRlciwgTWVzc2FnZXMuYWN0aW9uUHVibGlzaCk7Ci0JCXNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvblB1Ymxpc2hUb29sVGlwKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfUFVCTElTSCkpOwotCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX1BVQkxJU0gpKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9QVUJMSVNIKSk7Ci0JCXNldEFjdGlvbkRlZmluaXRpb25JZCgib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wdWJsaXNoIik7Ci0JCXRyeSB7Ci0JCQlzZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJcmV0dXJuIHNlcnZlci5jYW5QdWJsaXNoKCkuaXNPSygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm0oSVNlcnZlciBzZXJ2ZXIpIHsKLQkJcHVibGlzaChzZXJ2ZXIsIHNoZWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHVibGlzaChJU2VydmVyIHNlcnZlciwgZmluYWwgU2hlbGwgc2hlbGwpIHsKLQkJaWYgKHNoZWxsICE9IG51bGwgJiYgIVNlcnZlclVJUGx1Z2luLnByb21wdElmRGlydHkoc2hlbGwsIHNlcnZlcikpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoIVNlcnZlclVJUGx1Z2luLnNhdmVFZGl0b3JzKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlJQWRhcHRhYmxlIGluZm8gPSBuZXcgSUFkYXB0YWJsZSgpIHsKLQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJaWYgKFNoZWxsLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkKLQkJCQkJcmV0dXJuIHNoZWxsOwotCQkJCWlmIChTdHJpbmcuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJCQlyZXR1cm4gInVzZXIiOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQkKLQkJc2VydmVyLnB1Ymxpc2goSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCBudWxsLCBpbmZvLCBudWxsKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1B1Ymxpc2hDbGVhbkFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1B1Ymxpc2hDbGVhbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDJlMGUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9QdWJsaXNoQ2xlYW5BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0vKioKLSAqIENsZWFuIHB1Ymxpc2ggdG8gYSBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoQ2xlYW5BY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFjdGlvbiB7Ci0JcHVibGljIFB1Ymxpc2hDbGVhbkFjdGlvbihTaGVsbCBzaGVsbCwgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyKSB7Ci0JCXN1cGVyKHNoZWxsLCBzZWxlY3Rpb25Qcm92aWRlciwgTWVzc2FnZXMuYWN0aW9uUHVibGlzaENsZWFuKTsKLQkJc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uUHVibGlzaENsZWFuVG9vbFRpcCk7Ci0JCXRyeSB7Ci0JCQlzZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHNlcnZlciBjYW4gY3VycmVudGx5IGJlIGFjdGVkIG9uLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJcmV0dXJuIHNlcnZlci5jYW5QdWJsaXNoKCkuaXNPSygpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm0gYWN0aW9uIG9uIHRoaXMgc2VydmVyLgotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmICghU2VydmVyVUlQbHVnaW4ucHJvbXB0SWZEaXJ0eShzaGVsbCwgc2VydmVyKSkKLQkJCXJldHVybjsKLQkJCi0JCWlmICghU2VydmVyVUlQbHVnaW4uc2F2ZUVkaXRvcnMoKSkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKHNoZWxsLCBNZXNzYWdlcy5kZWZhdWx0RGlhbG9nVGl0bGUsIE1lc3NhZ2VzLmRpYWxvZ1B1Ymxpc2hDbGVhbikpIHsKLQkJCUlBZGFwdGFibGUgaW5mbyA9IG5ldyBJQWRhcHRhYmxlKCkgewotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChTaGVsbC5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCi0JCQkJCQlyZXR1cm4gc2hlbGw7Ci0JCQkJCWlmIChTdHJpbmcuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJCQkJcmV0dXJuICJ1c2VyIjsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfTsKLQkJCQotCQkJc2VydmVyLnB1Ymxpc2goSVNlcnZlci5QVUJMSVNIX0NMRUFOLCBudWxsLCBpbmZvLCBudWxsKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUmVtb3ZlTW9kdWxlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUmVtb3ZlTW9kdWxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOTUyYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1JlbW92ZU1vZHVsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIEFjdGlvbiBmb3IgcmVtb3ZpbmcgYSBtb2R1bGUgZnJvbSBhIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZU1vZHVsZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOwotCXByb3RlY3RlZCBJTW9kdWxlW10gbW9kdWxlOwotCXByb3RlY3RlZCBTaGVsbCBzaGVsbDsKLQlDb3JlRXhjZXB0aW9uIHNhdmVTZXJ2ZXJFeGNlcHRpb24gPSBudWxsOwotCi0JLyoqCi0JICogUmVtb3ZlTW9kdWxlQWN0aW9uIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgUmVtb3ZlTW9kdWxlQWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VydmVyIHNlcnZlciwgSU1vZHVsZSBtb2R1bGUpIHsKLQkJdGhpcyhzaGVsbCwgc2VydmVyLCBuZXcgSU1vZHVsZVtdIHttb2R1bGV9KTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlTW9kdWxlQWN0aW9uIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBtb2R1bGUgYSBsaXN0IG9mIG1vZHVsZSBpdGVtcywgdXNlZCBmb3IgcmVtb3ZpbmcgbXVsdGlwbGUgZGlmZmVyZW50IG1vZHVsZXMKLQkgKi8KLQlwdWJsaWMgUmVtb3ZlTW9kdWxlQWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VydmVyIHNlcnZlciwgSU1vZHVsZVtdIG1vZHVsZSkgewotCQlzdXBlcihNZXNzYWdlcy5hY3Rpb25SZW1vdmUpOwotCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEUpKTsJCQotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFX0RJU0FCTEVEKSk7Ci0JCXNldEFjdGlvbkRlZmluaXRpb25JZChJV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkcy5ERUxFVEUpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogSW52b2tlZCB3aGVuIGFuIGFjdGlvbiBvY2N1cnMuIAotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBtb2R1bGUubGVuZ3RoID09IDEgPyBNZXNzYWdlcy5kaWFsb2dSZW1vdmVNb2R1bGVDb25maXJtIDogTWVzc2FnZXMuZGlhbG9nUmVtb3ZlTW9kdWxlc0NvbmZpcm07Ci0JCWlmIChNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKHNoZWxsLCBNZXNzYWdlcy5kZWZhdWx0RGlhbG9nVGl0bGUsIG1lc3NhZ2UpKSB7Ci0JCQlmb3IoIGludCBpID0gMDsgaSA8IG1vZHVsZS5sZW5ndGg7IGkrKyApIAotCQkJCWhhbmRsZVJlbW92ZU9uZU1vZHVsZShtb2R1bGVbaV0pOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJlbW92ZU9uZU1vZHVsZShmaW5hbCBJTW9kdWxlIG1vZCkgewotCQkJdHJ5IHsKLQkJCQlmaW5hbCBQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCk7Ci0JCQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKGZhbHNlKTsKLQkJCQlkaWFsb2cuc2V0Q2FuY2VsYWJsZSh0cnVlKTsKLQkJCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IHNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOwotCQkJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCXdjLm1vZGlmeU1vZHVsZXMobnVsbCwgbmV3IElNb2R1bGVbXSB7IG1vZCB9LCBtb25pdG9yKTsKLQkJCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCQlzZXJ2ZXIgPSB3Yy5zYXZlKHRydWUsIG1vbml0b3IpOwotCQkJCQkJCWlmIChUcmFjZS5JTkZPKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19JTkZPLCAiRG9uZSBzYXZlIHNlcnZlciBjb25maWd1cmF0aW9uIGluIFJlbW92ZU1vZHVsZUFjdGlvbi4iKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywKLQkJCQkJCQkJCQkiRmFpbGVkIHRvIHNhdmUgc2VydmVyIGNvbmZpZ3VyYXRpb24uIENvdWxkIG5vdCByZW1vdmUgbW9kdWxlIiwgZSk7Ci0JCQkJCQkJfQotCQkJCQkJCXNhdmVTZXJ2ZXJFeGNlcHRpb24gPSBlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQkJCQlkaWFsb2cucnVuKHRydWUsIHRydWUsIHJ1bm5hYmxlKTsKLQkJCQkKLQkJCQkvLyBFcnJvciB3aGVuIHNhdmluZyBzZXJ2ZXIgc28gZG8gbm90IHByb2NlZWQgb24gdGhlIHJlbW92ZSBhY3Rpb24uCi0JCQkJaWYgKHNhdmVTZXJ2ZXJFeGNlcHRpb24gIT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQotCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQgJiYKLQkJCQkJCVNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuZ2V0UHVibGlzaE9uQWRkUmVtb3ZlTW9kdWxlKCkpIHsKLQkJCQkJZmluYWwgSUFkYXB0YWJsZSBpbmZvID0gbmV3IElBZGFwdGFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQkJCWlmIChTaGVsbC5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCi0JCQkJCQkJCXJldHVybiBzaGVsbDsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQkJc2VydmVyLnB1Ymxpc2goSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCBudWxsLCBpbmZvLCBudWxsKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiQ291bGQgbm90IHJlbW92ZSBtb2R1bGUiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9SZW5hbWVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9SZW5hbWVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZkOGRlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUmVuYW1lQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVHJlZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlRleHRBY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQWN0aW9uIHRvIHJlbmFtZSBhIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFJlbmFtZUFjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VydmVyQWN0aW9uIHsKLQkvKgotCSAqIFRoZSB0cmVlIGVkaXRpbmcgd2lkZ2V0cy4gSWYgdHJlZUVkaXRvciBpcyBudWxsIHRoZW4gZWRpdCB1c2luZyB0aGUKLQkgKiBkaWFsb2cuIFdlIGtlZXAgdGhlIGVkaXRvclRleHQgYXJvdW5kIHNvIHRoYXQgd2UgY2FuIGNsb3NlIGl0IGlmIGEgbmV3Ci0JICogc2VsZWN0aW9uIGlzIG1hZGUuCi0JICovCi0JcHJvdGVjdGVkIFRyZWVFZGl0b3IgdHJlZUVkaXRvcjsKLQotCXByb3RlY3RlZCBUcmVlIHRyZWU7Ci0KLQlwcm90ZWN0ZWQgVGV4dCB0ZXh0RWRpdG9yOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSB0ZXh0RWRpdG9yUGFyZW50OwotCi0JcHJpdmF0ZSBUZXh0QWN0aW9uSGFuZGxlciB0ZXh0QWN0aW9uSGFuZGxlcjsKLQotCS8vIFRoZSBzZXJ2ZXIgYmVpbmcgZWRpdGVkIGlmIHRoaXMgaXMgYmVpbmcgZG9uZSBpbmxpbmUKLQlwcm90ZWN0ZWQgSVNlcnZlciBlZGl0ZWRTZXJ2ZXI7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzYXZpbmcgPSBmYWxzZTsKLQotCXB1YmxpYyBSZW5hbWVBY3Rpb24oU2hlbGwgc2hlbGwsIFRyZWVWaWV3ZXIgdmlld2VyLCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIpIHsKLQkJc3VwZXIoc2hlbGwsIHNlbGVjdGlvblByb3ZpZGVyLCBNZXNzYWdlcy5hY3Rpb25SZW5hbWUpOwotCQlzZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuUkVOQU1FKTsKLQkJdGhpcy50cmVlID0gdmlld2VyLmdldFRyZWUoKTsKLQkJdGhpcy50cmVlRWRpdG9yID0gbmV3IFRyZWVFZGl0b3IodHJlZSk7Ci0JCXRyeSB7Ci0JCQlzZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJ1bldpdGhJbmxpbmVFZGl0b3Ioc2VydmVyKTsKLQl9Ci0KLQkvKgotCSAqIFJ1biB0aGUgcmVjZWl2ZXIgdXNpbmcgYW4gaW5saW5lIGVkaXRvciBmcm9tIHRoZSBzdXBwbGllZCBuYXZpZ2F0b3IuIFRoZQotCSAqIG5hdmlnYXRvciB3aWxsIHRlbGwgdGhlIGFjdGlvbiB3aGVuIHRoZSBwYXRoIGlzIHJlYWR5IHRvIHJ1bi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcnVuV2l0aElubGluZUVkaXRvcihJU2VydmVyIHNlcnZlcikgewotCQlxdWVyeU5ld1NlcnZlck5hbWVJbmxpbmUoc2VydmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBPbiBNYWMgdGhlIHRleHQgd2lkZ2V0IGFscmVhZHkgcHJvdmlkZXMgYSBib3JkZXIgd2hlbiBpdCBoYXMgZm9jdXMsIHNvCi0JICogdGhlcmUgaXMgbm8gbmVlZCB0byBkcmF3IGFub3RoZXIgb25lLiBUaGUgdmFsdWUgb2YgcmV0dXJuZWQgYnkgdGhpcwotCSAqIG1ldGhvZCBpcyB1c2QgdG8gY29udHJvbCB0aGUgaW5zZXQgd2UgYXBwbHkgdG8gdGhlIHRleHQgZmllbGQgYm91bmQncyBpbgotCSAqIG9yZGVyIHRvIGdldCBzcGFjZSBmb3IgZHJhd2luZyBhIGJvcmRlci4gQSB2YWx1ZSBvZiAxIG1lYW5zIGEgb25lLXBpeGVsCi0JICogd2lkZSBib3JkZXIgYXJvdW5kIHRoZSB0ZXh0IGZpZWxkLiBBIG5lZ2F0aXZlIHZhbHVlIHN1cHJlc3NlcyB0aGUgYm9yZGVyLgotCSAqIEhvd2V2ZXIsIGluIE05IHRoZSBzeXN0ZW0gcHJvcGVydHkKLQkgKiAib3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi5ub0ZvY3VzUmluZyIgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhCi0JICogdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGJ1ZyAjMjg4NDIuIFRoZSBleGlzdGVuY2Ugb2YgdGhlIHByb3BlcnR5IHR1cm5zCi0JICogdGhlIG5hdGl2ZSBmb2N1cyByaW5nIG9mZiBpZiB0aGUgd2lkZ2V0IGlzIGNvbnRhaW5lZCBpbiBhIG1haW4gd2luZG93Ci0JICogKG5vdCBkaWFsb2cpLiBUaGUgY2hlY2sgZm9yIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgcmVtb3ZlZCBhZnRlciBhIGZpbmFsCi0JICogZml4IGZvciAjMjg4NDIgaGFzIGJlZW4gcHJvdmlkZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldENlbGxFZGl0b3JJbnNldChDb250cm9sIGMpIHsKLQkJLy8gc3BlY2lhbCBjYXNlIGZvciBNYWNPUyBYCi0JCWlmICgiY2FyYm9uIi5lcXVhbHMoU1dULmdldFBsYXRmb3JtKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChTeXN0ZW0KLQkJCQkJLmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2FyYm9uLm5vRm9jdXNSaW5nIikgPT0gbnVsbCB8fCBjLmdldFNoZWxsKCkuZ2V0UGFyZW50KCkgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIC0yOyAvLyBuYXRpdmUgYm9yZGVyCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIDE7IC8vIG9uZSBwaXhlbCB3aWRlIGJsYWNrIGJvcmRlcgotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgVHJlZSBiZWluZyBlZGl0ZWQuCi0JICogCi0JICogQHJldHVyblRyZWUKLQkgKi8KLQlwcml2YXRlIFRyZWUgZ2V0VHJlZSgpIHsKLQkJcmV0dXJuIHRyZWU7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlUGFyZW50KCkgewotCQlUcmVlIHRyZWUyID0gZ2V0VHJlZSgpOwotCQlDb21wb3NpdGUgcmVzdWx0ID0gbmV3IENvbXBvc2l0ZSh0cmVlMiwgU1dULk5PTkUpOwotCQlUcmVlSXRlbVtdIHNlbGVjdGVkSXRlbXMgPSB0cmVlMi5nZXRTZWxlY3Rpb24oKTsKLQkJdHJlZUVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCXRyZWVFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQl0cmVlRWRpdG9yLnNldEVkaXRvcihyZXN1bHQsIHNlbGVjdGVkSXRlbXNbMF0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmV3IG5hbWUgdG8gYmUgZ2l2ZW4gdG8gdGhlIHRhcmdldCByZXNvdXJjZSBvcgotCSAqIDxjb2RlPm51bGw8Y29kZT4KLQkgKiBpZiB0aGUgcXVlcnkgd2FzIGNhbmNlbGVkLiBSZW5hbWUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzZXJ2ZXIgdXNpbmcgdGhlIHRhYmxlIGVkaXRvci4gCi0JICogQ29udGludWUgdGhlIGFjdGlvbiB3aGVuIHRoZSB1c2VyIGlzIGRvbmUuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgdG8gcmVuYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIHF1ZXJ5TmV3U2VydmVyTmFtZUlubGluZShmaW5hbCBJU2VydmVyIHNlcnZlcikgewotCQkvLyBNYWtlIHN1cmUgdGV4dCBlZGl0b3IgaXMgY3JlYXRlZCBvbmx5IG9uY2UuIFNpbXBseSByZXNldCB0ZXh0Ci0JCS8vIGVkaXRvciB3aGVuIGFjdGlvbiBpcyBleGVjdXRlZCBtb3JlIHRoYW4gb25jZS4gRml4ZXMgYnVnIDIyMjY5Ci0JCWlmICh0ZXh0RWRpdG9yUGFyZW50ID09IG51bGwpIHsKLQkJCWNyZWF0ZVRleHRFZGl0b3Ioc2VydmVyKTsKLQkJfQotCQl0ZXh0RWRpdG9yLnNldFRleHQoc2VydmVyLmdldE5hbWUoKSk7Ci0KLQkJLy8gT3BlbiB0ZXh0IGVkaXRvciB3aXRoIGluaXRpYWwgc2l6ZQotCQl0ZXh0RWRpdG9yUGFyZW50LnNldFZpc2libGUodHJ1ZSk7Ci0JCVBvaW50IHRleHRTaXplID0gdGV4dEVkaXRvci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQl0ZXh0U2l6ZS54ICs9IHRleHRTaXplLnk7IC8vIEFkZCBleHRyYSBzcGFjZSBmb3IgbmV3IGNoYXJhY3RlcnMKLQkJUG9pbnQgcGFyZW50U2l6ZSA9IHRleHRFZGl0b3JQYXJlbnQuZ2V0U2l6ZSgpOwotCQlpbnQgaW5zZXQgPSBnZXRDZWxsRWRpdG9ySW5zZXQodGV4dEVkaXRvclBhcmVudCk7Ci0JCXRleHRFZGl0b3Iuc2V0Qm91bmRzKDIsIGluc2V0LCBNYXRoLm1pbih0ZXh0U2l6ZS54LCBwYXJlbnRTaXplLnggLSA0KSwKLQkJCQlwYXJlbnRTaXplLnkgLSAyICogaW5zZXQpOwotCQl0ZXh0RWRpdG9yUGFyZW50LnJlZHJhdygpOwotCQl0ZXh0RWRpdG9yLnNlbGVjdEFsbCgpOwotCQl0ZXh0RWRpdG9yLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSB0ZXh0IGVkaXRvciB3aWRnZXQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRvIHJlbmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXh0RWRpdG9yKGZpbmFsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCS8vIENyZWF0ZSB0ZXh0IGVkaXRvciBwYXJlbnQuIFRoaXMgZHJhd3MgYSBuaWNlIGJvdW5kaW5nIHJlY3QKLQkJdGV4dEVkaXRvclBhcmVudCA9IGNyZWF0ZVBhcmVudCgpOwotCQl0ZXh0RWRpdG9yUGFyZW50LnNldFZpc2libGUoZmFsc2UpOwotCQlmaW5hbCBpbnQgaW5zZXQgPSBnZXRDZWxsRWRpdG9ySW5zZXQodGV4dEVkaXRvclBhcmVudCk7Ci0JCWlmIChpbnNldCA+IDApIHsKLQkJCXRleHRFZGl0b3JQYXJlbnQuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlQb2ludCB0ZXh0U2l6ZSA9IHRleHRFZGl0b3IuZ2V0U2l6ZSgpOwotCQkJCQlQb2ludCBwYXJlbnRTaXplID0gdGV4dEVkaXRvclBhcmVudC5nZXRTaXplKCk7Ci0JCQkJCWUuZ2MuZHJhd1JlY3RhbmdsZSgwLCAwLCBNYXRoLm1pbih0ZXh0U2l6ZS54ICsgNCwKLQkJCQkJCQlwYXJlbnRTaXplLnggLSAxKSwgcGFyZW50U2l6ZS55IC0gMSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJLy8gQ3JlYXRlIGlubmVyIHRleHQgZWRpdG9yCi0JCXRleHRFZGl0b3IgPSBuZXcgVGV4dCh0ZXh0RWRpdG9yUGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRleHRFZGl0b3Iuc2V0Rm9udCh0cmVlLmdldEZvbnQoKSk7Ci0JCXRleHRFZGl0b3JQYXJlbnQuc2V0QmFja2dyb3VuZCh0ZXh0RWRpdG9yLmdldEJhY2tncm91bmQoKSk7Ci0JCXRleHRFZGl0b3IuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVBvaW50IHRleHRTaXplID0gdGV4dEVkaXRvci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLQkJCQkJCVNXVC5ERUZBVUxUKTsKLQkJCQl0ZXh0U2l6ZS54ICs9IHRleHRTaXplLnk7IC8vIEFkZCBleHRyYSBzcGFjZSBmb3IgbmV3Ci0JCQkJLy8gY2hhcmFjdGVycy4KLQkJCQlQb2ludCBwYXJlbnRTaXplID0gdGV4dEVkaXRvclBhcmVudC5nZXRTaXplKCk7Ci0JCQkJdGV4dEVkaXRvci5zZXRCb3VuZHMoMiwgaW5zZXQsIE1hdGgubWluKHRleHRTaXplLngsCi0JCQkJCQlwYXJlbnRTaXplLnggLSA0KSwgcGFyZW50U2l6ZS55IC0gMiAqIGluc2V0KTsKLQkJCQl0ZXh0RWRpdG9yUGFyZW50LnJlZHJhdygpOwotCQkJfQotCQl9KTsKLQkJdGV4dEVkaXRvci5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0KLQkJCQkvLyBXb3JrYXJvdW5kIGZvciBCdWcgMjAyMTQgZHVlIHRvIGV4dHJhCi0JCQkJLy8gdHJhdmVyc2UgZXZlbnRzCi0JCQkJc3dpdGNoIChldmVudC5kZXRhaWwpIHsKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCS8vIERvIG5vdGhpbmcgaW4gdGhpcyBjYXNlCi0JCQkJCWRpc3Bvc2VUZXh0V2lkZ2V0KCk7Ci0JCQkJCWV2ZW50LmRvaXQgPSB0cnVlOwotCQkJCQlldmVudC5kZXRhaWwgPSBTV1QuVFJBVkVSU0VfTk9ORTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOgotCQkJCQlzYXZlQ2hhbmdlc0FuZERpc3Bvc2Uoc2VydmVyKTsKLQkJCQkJZXZlbnQuZG9pdCA9IHRydWU7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IFNXVC5UUkFWRVJTRV9OT05FOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQl0ZXh0RWRpdG9yLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGZlKSB7Ci0JCQkJc2F2ZUNoYW5nZXNBbmREaXNwb3NlKHNlcnZlcik7Ci0JCQl9Ci0JCX0pOwotCi0JCWlmICh0ZXh0QWN0aW9uSGFuZGxlciAhPSBudWxsKSB7Ci0JCQl0ZXh0QWN0aW9uSGFuZGxlci5hZGRUZXh0KHRleHRFZGl0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2xvc2UgdGhlIHRleHQgd2lkZ2V0IGFuZCByZXNldCB0aGUgZWRpdG9yVGV4dCBmaWVsZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlVGV4dFdpZGdldCgpIHsKLQkJaWYgKHRleHRBY3Rpb25IYW5kbGVyICE9IG51bGwpCi0JCQl0ZXh0QWN0aW9uSGFuZGxlci5yZW1vdmVUZXh0KHRleHRFZGl0b3IpOwotCi0JCWlmICh0ZXh0RWRpdG9yUGFyZW50ICE9IG51bGwpIHsKLQkJCXRleHRFZGl0b3JQYXJlbnQuZGlzcG9zZSgpOwotCQkJdGV4dEVkaXRvclBhcmVudCA9IG51bGw7Ci0JCQl0ZXh0RWRpdG9yID0gbnVsbDsKLQkJCXRyZWVFZGl0b3Iuc2V0RWRpdG9yKG51bGwsIG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgY2hhbmdlcyBhbmQgZGlzcG9zZSBvZiB0aGUgdGV4dCB3aWRnZXQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRvIHJlbmFtZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVDaGFuZ2VzQW5kRGlzcG9zZShJU2VydmVyIHNlcnZlcikgewotCQlpZiAoc2F2aW5nID09IHRydWUpCi0JCQlyZXR1cm47Ci0JCQotCQlzYXZpbmcgPSB0cnVlOwotCQkvLyBDYWNoZSB0aGUgcmVzb3VyY2UgdG8gYXZvaWQgc2VsZWN0aW9uIGxvc3Mgc2luY2UgYSBzZWxlY3Rpb24gb2YKLQkJLy8gYW5vdGhlciBpdGVtIGNhbiB0cmlnZ2VyIHRoaXMgbWV0aG9kCi0JCWVkaXRlZFNlcnZlciA9IHNlcnZlcjsKLQkJZmluYWwgU3RyaW5nIG5ld05hbWUgPSB0ZXh0RWRpdG9yLmdldFRleHQoKTsKLQkJLy8gUnVuIHRoaXMgaW4gYW4gYXN5bmMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG9wZXJhdGlvbiB0aGF0IHRyaWdnZXJlZAotCQkvLyB0aGlzIGFjdGlvbiBpcyBjb21wbGV0ZWQuIE90aGVyd2lzZSB0aGlzIGxlYWRzIHRvIHByb2JsZW1zIHdoZW4gdGhlCi0JCS8vIGljb24gb2YgdGhlIGl0ZW0gYmVpbmcgcmVuYW1lZCBpcyBjbGlja2VkIChpLmUuLCB3aGljaCBjYXVzZXMgdGhlCi0JCS8vIHJlbmFtZSB0ZXh0IHdpZGdldCB0byBsb3NlIGZvY3VzIGFuZCB0cmlnZ2VyIHRoaXMgbWV0aG9kKQotCQlnZXRUcmVlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoIW5ld05hbWUuZXF1YWxzKGVkaXRlZFNlcnZlci5nZXROYW1lKCkpKSB7Ci0JCQkJCQlpZiAoU2VydmVyUGx1Z2luLmlzTmFtZUluVXNlKGVkaXRlZFNlcnZlciwgbmV3TmFtZSkpIHsKLQkJCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZGVmYXVsdERpYWxvZ1RpdGxlLCBNZXNzYWdlcy5lcnJvckR1cGxpY2F0ZU5hbWUpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBlZGl0ZWRTZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCQkJCQkJd2Muc2V0TmFtZShuZXdOYW1lKTsKLQkJCQkJCQkJd2Muc2F2ZShmYWxzZSwgbnVsbCk7Ci0JCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQkJCQkvLyBpZ25vcmUgZm9yIG5vdwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllZGl0ZWRTZXJ2ZXIgPSBudWxsOwotCQkJCQkvLyBEaXNwb3NlIHRoZSB0ZXh0IHdpZGdldCByZWdhcmRsZXNzCi0JCQkJCWRpc3Bvc2VUZXh0V2lkZ2V0KCk7Ci0JCQkJCS8vIEVuc3VyZSB0aGUgTmF2aWdhdG9yIHRyZWUgaGFzIGZvY3VzLCB3aGljaCBpdCBtYXkgbm90IGlmCi0JCQkJCS8vIHRoZSB0ZXh0IHdpZGdldCBwcmV2aW91c2x5IGhhZCBmb2N1cwotCQkJCQlpZiAodHJlZSAhPSBudWxsICYmICF0cmVlLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJdHJlZS5zZXRGb2N1cygpOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJc2F2aW5nID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1Jlc3RhcnRNb2R1bGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9SZXN0YXJ0TW9kdWxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNGFiZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1Jlc3RhcnRNb2R1bGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIFJlc3RhcnQgYSBtb2R1bGUgb24gYSBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXN0YXJ0TW9kdWxlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIElNb2R1bGVbXSBtb2R1bGU7Ci0KLQlwdWJsaWMgUmVzdGFydE1vZHVsZUFjdGlvbihJU2VydmVyIHNlcnZlciwgSU1vZHVsZVtdIG1vZHVsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JCQotCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblJlc3RhcnRNb2R1bGUpOwotCQkKLQkJc2V0RW5hYmxlZChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQKLQkJCQkmJiBzZXJ2ZXIuZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSAhPSBJU2VydmVyLlNUQVRFX1VOS05PV04KLQkJCQkmJglzZXJ2ZXIuY2FuUmVzdGFydE1vZHVsZShtb2R1bGUsIG51bGwpLmlzT0soKSk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50YXRpb24gb2YgbWV0aG9kIGRlZmluZWQgb24gPGNvZGU+SUFjdGlvbjwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlzZXJ2ZXIucmVzdGFydE1vZHVsZShtb2R1bGUsIG51bGwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyQWN0aW9uSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlckFjdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU2NTUzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyQWN0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9ucy5SdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlOwotLyoqCi0gKiBTZXJ2ZXIgYWN0aW9uIGhhbmRsZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJBY3Rpb25IYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJU2VsZWN0aW9uIHNlbCA9IEhhbmRsZXJVdGlsLmdldEN1cnJlbnRTZWxlY3Rpb25DaGVja2VkKGV2ZW50KTsKLQkJT2JqZWN0IG9iaiA9IG51bGw7Ci0JCWlmIChzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWw7Ci0JCQlvYmogPSBzZWxlY3QuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQkJCi0JCVN0cmluZyBpZCA9IGV2ZW50LmdldENvbW1hbmQoKS5nZXRJZCgpOwotCQlpZiAoaWQuZW5kc1dpdGgoInB1Ymxpc2giKSkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCQlQdWJsaXNoQWN0aW9uLnB1Ymxpc2goKElTZXJ2ZXIpIG9iaiwgSGFuZGxlclV0aWwuZ2V0QWN0aXZlU2hlbGwoZXZlbnQpKTsKLQkJCX0gZWxzZQotCQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIk5vIHNlcnZlciBzZWxlY3RlZCIpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyBtb2RlID0gSUxhdW5jaE1hbmFnZXIuUlVOX01PREU7Ci0JCWlmIChpZC5lbmRzV2l0aCgiZGVidWciKSkKLQkJCW1vZGUgPSBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFOwotCQllbHNlIGlmIChpZC5lbmRzV2l0aCgicHJvZmlsZSIpKQotCQkJbW9kZSA9IElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERTsKLQkJZWxzZSBpZiAoaWQuZW5kc1dpdGgoInN0b3AiKSkKLQkJCW1vZGUgPSBudWxsOwotCQkKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIG9iajsKLQkJCWlmIChtb2RlID09IG51bGwpCi0JCQkJU3RvcEFjdGlvbi5zdG9wKHNlcnZlciwgSGFuZGxlclV0aWwuZ2V0QWN0aXZlU2hlbGwoZXZlbnQpKTsKLQkJCWVsc2UKLQkJCQlTdGFydEFjdGlvbi5zdGFydChzZXJ2ZXIsIG1vZGUsIEhhbmRsZXJVdGlsLmdldEFjdGl2ZVNoZWxsKGV2ZW50KSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSByb3MgPSBuZXcgUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSgpOwotCQlyb3Muc2V0TGF1bmNoTW9kZShtb2RlKTsKLQkJSUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJLy8gZHVtbXkgYWN0aW9uCi0JCX07Ci0JCXJvcy5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgc2VsKTsKLQkJcm9zLnJ1bihhY3Rpb24pOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJUYWJsZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJUYWJsZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwMzY5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyVGFibGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY25mLlNlcnZlckRlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlVJRGVjb3JhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuQmFzZUNlbGxMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5TZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyOwotLyoqCi0gKiBTZXJ2ZXIgdGFibGUgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNlQ2VsbExhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3luY1N0YXRlID0gbmV3IFN0cmluZ1tdIHsKLQkJTWVzc2FnZXMudmlld1N5bmNPa2F5LAotCQlNZXNzYWdlcy52aWV3U3luY1Jlc3RhcnQsCi0JCU1lc3NhZ2VzLnZpZXdTeW5jUHVibGlzaCwKLQkJTWVzc2FnZXMudmlld1N5bmNSZXN0YXJ0UHVibGlzaCwKLQkJTWVzc2FnZXMudmlld1N5bmNQdWJsaXNoaW5nfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3luY1N0YXRlVW5tYW5hZ2VkID0gbmV3IFN0cmluZ1tdIHsKLQkJTWVzc2FnZXMudmlld1N5bmNPa2F5MiwKLQkJTWVzc2FnZXMudmlld1N5bmNSZXN0YXJ0MiwKLQkJTWVzc2FnZXMudmlld1N5bmNQdWJsaXNoMiwKLQkJTWVzc2FnZXMudmlld1N5bmNSZXN0YXJ0UHVibGlzaDIsCi0JCU1lc3NhZ2VzLnZpZXdTeW5jUHVibGlzaGluZzJ9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbW9kdWxlUHVibGlzaFN0YXRlID0gbmV3IFN0cmluZ1tdIHsKLQkJIiIsCi0JCU1lc3NhZ2VzLnZpZXdTeW5jT2theSwKLQkJTWVzc2FnZXMudmlld1N5bmNQdWJsaXNoLAotCQlNZXNzYWdlcy52aWV3U3luY1B1Ymxpc2h9OwotCi0JcHJpdmF0ZSBpbnQgY291bnQgPSAwOwotCi0JcHJvdGVjdGVkIElTZXJ2ZXIgZGVmYXVsdFNlcnZlcjsKLQotCS8qKgotCSAqIFNlcnZlclRhYmxlTGFiZWxQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCS8vIEVuc3VyZSBkZWNvcmF0b3IgaXMgaW5pdGlhbGl6ZWQuCi0JCXN1cGVyKG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRTZXJ2ZXIoSVNlcnZlciBkcykgewotCQlkZWZhdWx0U2VydmVyID0gZHM7Ci0JfQotCi0JcHVibGljIElTZXJ2ZXIgZ2V0RGVmYXVsdFNlcnZlcigpIHsKLQkJcmV0dXJuIGRlZmF1bHRTZXJ2ZXI7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyLlRyZWVFbGVtZW50KSB7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKTsKLQkJCQlyZXR1cm4gc2hhcmVkSW1hZ2VzLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSl9GT0xERVIpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJCS8vcmV0dXJuIFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0SW1hZ2UobXMubW9kdWxlW21zLm1vZHVsZS5sZW5ndGggLSAxXSk7Ci0JCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQkJSW1hZ2UgaW1hZ2UgPSBsYWJlbFByb3ZpZGVyLmdldEltYWdlKG1zLm1vZHVsZVttcy5tb2R1bGUubGVuZ3RoIC0gMV0pOwotCQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJCWlmIChkZWNvcmF0b3IgIT0gbnVsbCkgewotCQkJCQlJbWFnZSBkZWMgPSBkZWNvcmF0b3IuZGVjb3JhdGVJbWFnZShpbWFnZSwgbXMpOwotCQkJCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gZGVjOwotCQkJCX0KLQkJCQlyZXR1cm4gaW1hZ2U7Ci0JCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLQkJCQlpZiAobXMuc2VydmVyID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCQotCQkJCS8qaW50IHN0YXRlID0gbXMuc2VydmVyLmdldE1vZHVsZVN0YXRlKG1zLm1vZHVsZSk7Ci0JCQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkKLQkJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU1RBVEVfU1RBUlRFRCk7Ci0JCQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TVEFURV9TVE9QUEVEKTsKLQkJCQkqLwotCQkJCXJldHVybiBnZXRTdGF0ZUltYWdlKG1zLnNlcnZlci5nZXRTZXJ2ZXJUeXBlKCksIG1zLnNlcnZlci5nZXRNb2R1bGVTdGF0ZShtcy5tb2R1bGUpLCBudWxsKTsKLQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMikgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gKChTZXJ2ZXIpIG1zLnNlcnZlcikuZ2V0TW9kdWxlU3RhdHVzKG1zLm1vZHVsZSk7Ci0JCQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKTsKLQkJCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQkJCQlyZXR1cm4gc2hhcmVkSW1hZ2VzLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLKTsKLQkJCQkJZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKQotCQkJCQkJcmV0dXJuIHNoYXJlZEltYWdlcy5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1dBUk5fVFNLKTsKLQkJCQkJZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5JTkZPKQotCQkJCQkJcmV0dXJuIHNoYXJlZEltYWdlcy5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0lORk9fVFNLKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBlbGVtZW50OwotCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCkgewotCQkJCUltYWdlIGltYWdlID0gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotCQkJCS8qSVN0YXR1cyBzdGF0dXMgPSAoKFNlcnZlcikgc2VydmVyKS5nZXRTZXJ2ZXJTdGF0dXMoKTsKLQkJCQlpZiAoZGVmYXVsdFNlcnZlciAhPSBudWxsICYmIGRlZmF1bHRTZXJ2ZXIuZXF1YWxzKHNlcnZlcikgfHwgc3RhdHVzICE9IG51bGwpIHsKLQkJCQkJSW1hZ2UgZGVjb3JhdGVkID0gZGVjb3JhdG9yLmRlY29yYXRlSW1hZ2UoaW1hZ2UsIGVsZW1lbnQpOwotCQkJCQlpZiAoZGVjb3JhdGVkICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gZGVjb3JhdGVkOwotCQkJCX0qLwotCQkJCS8vcmV0dXJuIGltYWdlOwotCQkJCWlmIChkZWNvcmF0b3IgIT0gbnVsbCkgewotCQkJCQlJbWFnZSBkZWMgPSBkZWNvcmF0b3IuZGVjb3JhdGVJbWFnZShpbWFnZSwgc2VydmVyKTsKLQkJCQkJaWYgKGRlYyAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGRlYzsKLQkJCQl9Ci0JCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMSkgewotCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCk7Ci0JCQlpZiAoc2VydmVyVHlwZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJLy9pZiAoc2VydmVyVHlwZS5nZXRTZXJ2ZXJTdGF0ZVNldCgpID09IElTZXJ2ZXJUeXBlLlNFUlZFUl9TVEFURV9TRVRfUFVCTElTSEVEKQotCQkJLy8JcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gZ2V0U2VydmVyU3RhdGVJbWFnZShzZXJ2ZXIpOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q29sdW1uVGV4dChlbGVtZW50LCAwKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIHsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSAwKQotCQkJCXJldHVybiAoKFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIGVsZW1lbnQpLnRleHQ7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJCWlmIChtcy5tb2R1bGUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuICIiOwotCQkJCWludCBzaXplID0gbXMubW9kdWxlLmxlbmd0aDsKLQkJCQlTdHJpbmcgbmFtZSA9IG1zLm1vZHVsZVtzaXplIC0gMV0uZ2V0TmFtZSgpOwotCQkJCWlmIChkZWNvcmF0b3IgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVjID0gZGVjb3JhdG9yLmRlY29yYXRlVGV4dChuYW1lLCBtcyk7Ci0JCQkJCWlmIChkZWMgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBkZWM7Ci0JCQkJfQotCQkJCXJldHVybiBuYW1lOwotCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7Ci0JCQkJaWYgKG1zLnNlcnZlciA9PSBudWxsKQotCQkJCQlyZXR1cm4gIiI7Ci0JCQkJcmV0dXJuIGdldFN0YXRlTGFiZWwobXMuc2VydmVyLmdldFNlcnZlclR5cGUoKSwgbXMuc2VydmVyLmdldE1vZHVsZVN0YXRlKG1zLm1vZHVsZSksIG51bGwpOwotCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAyKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSAoKFNlcnZlcikgbXMuc2VydmVyKS5nZXRNb2R1bGVTdGF0dXMobXMubW9kdWxlKTsKLQkJCQlpZiAoc3RhdHVzICE9IG51bGwpCi0JCQkJCXJldHVybiBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJCQotCQkJCXJldHVybiBtb2R1bGVQdWJsaXNoU3RhdGVbbXMuc2VydmVyLmdldE1vZHVsZVB1Ymxpc2hTdGF0ZShtcy5tb2R1bGUpXTsKLQkJCX0KLQkJfQotCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBlbGVtZW50OwotCQlpZiAoY29sdW1uSW5kZXggPT0gMCkKLQkJCXJldHVybiBub3ROdWxsKHNlcnZlci5nZXROYW1lKCkpOwotCQllbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7Ci0JCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gc2VydmVyLmdldFNlcnZlclR5cGUoKTsKLQkJCWlmIChzZXJ2ZXJUeXBlICE9IG51bGwpCi0JCQkJcmV0dXJuIGdldFNlcnZlclN0YXRlTGFiZWwoc2VydmVyKTsKLQkJCQotCQkJcmV0dXJuICIiOwotCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDIpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gKChTZXJ2ZXIpIHNlcnZlcikuZ2V0U2VydmVyU3RhdHVzKCk7Ci0JCQlpZiAoc3RhdHVzICE9IG51bGwpCi0JCQkJcmV0dXJuIHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCQkKLQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpID09IG51bGwpCi0JCQkJcmV0dXJuICIiOwotCQkJCi0JCQkvL2lmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSAmJiBzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpID09IG51bGwpCi0JCQkvLwlyZXR1cm4gTWVzc2FnZXMudmlld05vQ29uZmlndXJhdGlvbiIpOwotCQkJCi0JCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKQotCQkJCXJldHVybiAiIjsKLQkJCQotCQkJU3RyaW5nIHNlcnZlcklkID0gc2VydmVyLmdldElkKCk7Ci0JCQlpZiAoU2VydmVyVGFibGVWaWV3ZXIucHVibGlzaGluZy5jb250YWlucyhzZXJ2ZXJJZCkpCi0JCQkJcmV0dXJuIHN5bmNTdGF0ZVs0XTsKLQkJCQotCQkJLy8gcmVwdWJsaXNoCi0JCQlpbnQgaSA9IDA7Ci0JCQlpZiAoc2VydmVyLnNob3VsZFB1Ymxpc2goKSkgewotCQkJCWlmICgoKFNlcnZlcilzZXJ2ZXIpLmlzUHVibGlzaFVua25vd24oKSkKLQkJCQkJcmV0dXJuICIiOwotCQkJCWkgKz0gMjsKLQkJCX0KLQkJCQotCQkJaWYgKHNlcnZlci5zaG91bGRSZXN0YXJ0KCkpCi0JCQkJaSA9IDE7Ci0JCQkKLQkJCS8vSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCk7Ci0JCQkvLyBUT0RPOiBzdGF0ZSBzZXQKLQkJCS8vaWYgKHNlcnZlclR5cGUuZ2V0U2VydmVyU3RhdGVTZXQoKSA9PSBJU2VydmVyVHlwZS5TRVJWRVJfU1RBVEVfU0VUX01BTkFHRUQpCi0JCQkJcmV0dXJuIHN5bmNTdGF0ZVtpXTsKLQkJCS8vcmV0dXJuIHN5bmNTdGF0ZVVubWFuYWdlZFtpXTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gIi0iOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgbm90TnVsbChTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuICIiOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSByZXByZXNlbnRpbmcgdGhlIHNlcnZlcidzIHN0YXRlLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UucGFydHMuSUltYWdlCi0JICogQHBhcmFtIHNlcnZlciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcgotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRTZXJ2ZXJTdGF0ZUltYWdlKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBnZXRTdGF0ZUltYWdlKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCksIHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpLCBzZXJ2ZXIuZ2V0TW9kZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gc3RhdGUuCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5wYXJ0cy5JSW1hZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0U3RhdGVJbWFnZShJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlLCBpbnQgc3RhdGUsIFN0cmluZyBtb2RlKSB7Ci0JCXJldHVybiBVSURlY29yYXRvck1hbmFnZXIuZ2V0VUlEZWNvcmF0b3Ioc2VydmVyVHlwZSkuZ2V0U3RhdGVJbWFnZShzdGF0ZSwgbW9kZSwgY291bnQpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc2VydmVyJ3Mgc3RhdGUuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJ2ZXJTdGF0ZUxhYmVsKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBTZXJ2ZXJEZWNvcmF0b3IuZ2V0U2VydmVyU3RhdGVMYWJlbChzZXJ2ZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBzdGF0ZS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdGF0ZUxhYmVsKElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUsIGludCBzdGF0ZSwgU3RyaW5nIG1vZGUpIHsKLQkJcmV0dXJuIFVJRGVjb3JhdG9yTWFuYWdlci5nZXRVSURlY29yYXRvcihzZXJ2ZXJUeXBlKS5nZXRTdGF0ZUxhYmVsKHN0YXRlLCBtb2RlLCBjb3VudCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFuaW1hdGUoKSB7Ci0JCWNvdW50ICsrOwotCQlpZiAoY291bnQgPiAyKQotCQkJY291bnQgPSAwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyVGFibGVWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJUYWJsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzY3Njg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJUYWJsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5QdWJsaXNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5CYXNlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotLyoqCi0gKiBUcmVlIHZpZXcgc2hvd2luZyBzZXJ2ZXJzIGFuZCB0aGVpciBhc3NvY2lhdGlvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUYWJsZVZpZXdlciBleHRlbmRzIFRyZWVWaWV3ZXIgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSAicm9vdCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBDb2xvciBjb2xvcjsKLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgZm9udDsKLQlwcm90ZWN0ZWQgQ2xpcGJvYXJkIGNsaXBib2FyZDsKLQotCXByb3RlY3RlZCBJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIgc2VydmVyUmVzb3VyY2VMaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgSVB1Ymxpc2hMaXN0ZW5lciBwdWJsaXNoTGlzdGVuZXI7Ci0JcHJvdGVjdGVkIElTZXJ2ZXJMaXN0ZW5lciBzZXJ2ZXJMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGRlbGV0ZWRFbGVtZW50ID0gbnVsbDsKLQotCS8vIHNlcnZlcnMgdGhhdCBhcmUgY3VycmVudGx5IHB1Ymxpc2hpbmcgYW5kIHN0YXJ0aW5nCi0JcHJvdGVjdGVkIHN0YXRpYyBTZXQ8U3RyaW5nPiBwdWJsaXNoaW5nID0gbmV3IEhhc2hTZXQ8U3RyaW5nPig0KTsKLQlwcm90ZWN0ZWQgc3RhdGljIFNldDxTdHJpbmc+IHN0YXJ0aW5nID0gbmV3IEhhc2hTZXQ8U3RyaW5nPig0KTsKLQotCXByb3RlY3RlZCBTZXJ2ZXJUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQkvL3Byb3RlY3RlZCBJU2VsZWN0aW9uTGlzdGVuZXIgZHNMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBTZXJ2ZXJzVmlldyB2aWV3OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYW5pbWF0aW9uQWN0aXZlID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc3RvcEFuaW1hdGlvbiA9IGZhbHNlOwotCi0JcHVibGljIGNsYXNzIFNlcnZlckNvbnRlbnRQcm92aWRlciBleHRlbmRzIEJhc2VDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQkJTGlzdDxJU2VydmVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJU2VydmVyPigpOwotCQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCWlmICghKChTZXJ2ZXIpc2VydmVyc1tpXSkuaXNQcml2YXRlKCkpCi0JCQkJCQlsaXN0LmFkZChzZXJ2ZXJzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgZWxlbWVudDsKLQkJCQl0cnkgewotCQkJCQlJTW9kdWxlW10gY2hpbGRyZW4gPSBtcy5zZXJ2ZXIuZ2V0Q2hpbGRNb2R1bGVzKG1zLm1vZHVsZSwgbnVsbCk7Ci0JCQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCQlNb2R1bGVTZXJ2ZXJbXSBtczIgPSBuZXcgTW9kdWxlU2VydmVyW3NpemVdOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJaW50IHNpemUyID0gbXMubW9kdWxlLmxlbmd0aDsKLQkJCQkJCUlNb2R1bGVbXSBtb2R1bGUgPSBuZXcgSU1vZHVsZVtzaXplMiArIDFdOwotCQkJCQkJU3lzdGVtLmFycmF5Y29weShtcy5tb2R1bGUsIDAsIG1vZHVsZSwgMCwgc2l6ZTIpOwotCQkJCQkJbW9kdWxlW3NpemUyXSA9IGNoaWxkcmVuW2ldOwotCQkJCQkJbXMyW2ldID0gbmV3IE1vZHVsZVNlcnZlcihtcy5zZXJ2ZXIsIG1vZHVsZSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG1zMjsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCQlJTW9kdWxlW10gbW9kdWxlcyA9IHNlcnZlci5nZXRNb2R1bGVzKCk7IAotCQkJaW50IHNpemUgPSBtb2R1bGVzLmxlbmd0aDsKLQkJCU1vZHVsZVNlcnZlcltdIG1zID0gbmV3IE1vZHVsZVNlcnZlcltzaXplXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJbXNbaV0gPSBuZXcgTW9kdWxlU2VydmVyKHNlcnZlciwgbmV3IElNb2R1bGVbXSB7IG1vZHVsZXNbaV0gfSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbXM7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBlbGVtZW50OwotCQkJCXJldHVybiBtcy5zZXJ2ZXI7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJCS8vIENoZWNrIGlmIHRoZSBtb2R1bGUgc2VydmVyIGhhcyBjaGlsZCBtb2R1bGVzLgotCQkJCU1vZHVsZVNlcnZlciBjdXJNb2R1bGVTZXJ2ZXIgPSAoTW9kdWxlU2VydmVyKWVsZW1lbnQ7Ci0JCQkJSVNlcnZlciBjdXJTZXJ2ZXIgPSBjdXJNb2R1bGVTZXJ2ZXIuc2VydmVyOwotCQkJCUlNb2R1bGVbXSBjdXJNb2R1bGUgPSBjdXJNb2R1bGVTZXJ2ZXIubW9kdWxlOwotCQkJCWlmIChjdXJTZXJ2ZXIgIT0gbnVsbCAmJiAgY3VyTW9kdWxlICE9IG51bGwpIHsKLQkJCQkJSU1vZHVsZVtdIGN1ckNoaWxkTW9kdWxlID0gY3VyU2VydmVyLmdldENoaWxkTW9kdWxlcyhjdXJNb2R1bGUsIG51bGwpOwotCQkJCQlpZiAoY3VyQ2hpbGRNb2R1bGUgIT0gbnVsbCAmJiBjdXJDaGlsZE1vZHVsZS5sZW5ndGggPiAwKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZWxlbWVudDsKLQkJCXJldHVybiBzZXJ2ZXIuZ2V0TW9kdWxlcygpLmxlbmd0aCA+IDA7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdGFydFRocmVhZCgpIHsKLQkJaWYgKGFuaW1hdGlvbkFjdGl2ZSkKLQkJCXJldHVybjsKLQkJCi0JCXN0b3BBbmltYXRpb24gPSBmYWxzZTsKLQkJCi0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IGdldFRyZWUoKS5nZXREaXNwbGF5KCk7Ci0JCWZpbmFsIGludCBTTEVFUCA9IDIwMDsKLQkJZmluYWwgUnVubmFibGVbXSBhbmltYXRvciA9IG5ldyBSdW5uYWJsZVsxXTsKLQkJYW5pbWF0b3JbMF0gPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKCFzdG9wQW5pbWF0aW9uKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsYWJlbFByb3ZpZGVyLmFuaW1hdGUoKTsKLQkJCQkJCQotCQkJCQkJaW50IHNpemUgPSAwOwotCQkJCQkJU3RyaW5nW10gc2VydmVyczsKLQkJCQkJCXN5bmNocm9uaXplZCAoc3RhcnRpbmcpIHsKLQkJCQkJCQlzaXplID0gc3RhcnRpbmcuc2l6ZSgpOwotCQkJCQkJCXNlcnZlcnMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQkJCQkJCXN0YXJ0aW5nLnRvQXJyYXkoc2VydmVycyk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2VydmVyc1tpXSk7Ci0JCQkJCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIGdldFRyZWUoKSAhPSBudWxsICYmICFnZXRUcmVlKCkuaXNEaXNwb3NlZCgpKQotCQkJCQkJCQl1cGRhdGVBbmltYXRpb24oc2VydmVyKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWlmIChUcmFjZS5GSU5FU1QpIHsKLQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVNULCAiRXJyb3IgaW4gU2VydmVycyB2aWV3IGFuaW1hdGlvbiIsIGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWRpc3BsYXkudGltZXJFeGVjKFNMRUVQLCBhbmltYXRvclswXSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRpc3BsYXkudGltZXJFeGVjKFNMRUVQLCBhbmltYXRvclswXSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3BUaHJlYWQoKSB7Ci0JCXN0b3BBbmltYXRpb24gPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFNlcnZlclRhYmxlVmlld2VyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHZpZXcgdGhlIHZpZXcgCi0JICogQHBhcmFtIHRyZWUgdGhlIHRyZWUKLQkgKi8KLQlwdWJsaWMgU2VydmVyVGFibGVWaWV3ZXIoZmluYWwgU2VydmVyc1ZpZXcgdmlldywgZmluYWwgVHJlZSB0cmVlKSB7Ci0JCXN1cGVyKHRyZWUpOwotCQl0aGlzLnZpZXcgPSB2aWV3OwotCQljbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKHRyZWUuZ2V0RGlzcGxheSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJQ29sdW1uVmlld2VyVG9vbFRpcFN1cHBvcnQuZW5hYmxlRm9yKHRoaXMpOwotCQlzZXRDb250ZW50UHJvdmlkZXIobmV3IFNlcnZlckNvbnRlbnRQcm92aWRlcigpKTsKLQkJbGFiZWxQcm92aWRlciA9IG5ldyBTZXJ2ZXJUYWJsZUxhYmVsUHJvdmlkZXIoKTsJCQotCQlzZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwkJCi0JCQotCQlzZXRDb21wYXJhdG9yKG5ldyBTZXJ2ZXJWaWV3ZXJDb21wYXJhdG9yKGxhYmVsUHJvdmlkZXIpKTsKLQkJCi0JCXNldElucHV0KFJPT1QpOwotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJCi0JCS8qZHNMaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJaWYgKCEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotCQkJCQlyZXR1cm47Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJZmluYWwgT2JqZWN0IG9iaiA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlJUHJvamVjdCBwcm9qID0gbnVsbDsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJCUlSZXNvdXJjZSByZXMgPSAoSVJlc291cmNlKSBvYmo7Ci0JCQkJCXByb2ogPSByZXMuZ2V0UHJvamVjdCgpOwotCQkJCX0KLQkJCQlpZiAocHJvaiA9PSBudWxsICYmIG9iaiAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUmVzb3VyY2UgcmVzID0gKElSZXNvdXJjZSkgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKG9iaiwgSVJlc291cmNlLmNsYXNzKTsKLQkJCQkJCWlmIChyZXMgIT0gbnVsbCkKLQkJCQkJCQlwcm9qID0gcmVzLmdldFByb2plY3QoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChwcm9qICE9IG51bGwpIHsKLQkJCQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IHByb2o7Ci0JCQkJCWZpbmFsIElNb2R1bGUgbW9kdWxlID0gU2VydmVyVXRpbC5nZXRNb2R1bGUocHJvamVjdCk7Ci0JCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKGdldFRyZWUoKSA9PSBudWxsIHx8IGdldFRyZWUoKS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCXJldHVybjsKLQotCQkJCQkJCUlTZXJ2ZXIgZGVmYXVsdFNlcnZlciA9IG51bGw7Ci0JCQkJCQkJaWYgKG1vZHVsZSAhPSBudWxsKQotCQkJCQkJCQlkZWZhdWx0U2VydmVyID0gU2VydmVyQ29yZS5nZXREZWZhdWx0U2VydmVyKG1vZHVsZSk7Ci0JCQkJCQkJCi0JCQkJCQkJSVNlcnZlciBvbGREZWZhdWx0U2VydmVyID0gbGFiZWxQcm92aWRlci5nZXREZWZhdWx0U2VydmVyKCk7Ci0JCQkJCQkJaWYgKChvbGREZWZhdWx0U2VydmVyID09IG51bGwgJiYgZGVmYXVsdFNlcnZlciA9PSBudWxsKQotCQkJCQkJCQkJfHwgKG9sZERlZmF1bHRTZXJ2ZXIgIT0gbnVsbCAmJiBvbGREZWZhdWx0U2VydmVyLmVxdWFscyhkZWZhdWx0U2VydmVyKSkpCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQlsYWJlbFByb3ZpZGVyLnNldERlZmF1bHRTZXJ2ZXIoZGVmYXVsdFNlcnZlcik7Ci0JCQkJCQkJCi0JCQkJCQkJaWYgKG9sZERlZmF1bHRTZXJ2ZXIgIT0gbnVsbCkKLQkJCQkJCQkJcmVmcmVzaChvbGREZWZhdWx0U2VydmVyKTsKLQkJCQkJCQlpZiAoZGVmYXVsdFNlcnZlciAhPSBudWxsKQotCQkJCQkJCQlyZWZyZXNoKGRlZmF1bHRTZXJ2ZXIpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXZpZXcuZ2V0Vmlld1NpdGUoKS5nZXRQYWdlKCkuYWRkU2VsZWN0aW9uTGlzdGVuZXIoZHNMaXN0ZW5lcik7Ki8KLQkJCi0JCWlmIChjb2xvciA9PSBudWxsKSB7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpOwotCQkJY29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX0dSQVkpOwotCQkJRm9udERhdGFbXSBmZCA9IGdldENvbnRyb2woKS5nZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKLQkJCWludCBzaXplID0gZmQubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJZmRbaV0uc2V0U3R5bGUoU1dULklUQUxJQyk7Ci0JCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZmQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotCQlPYmplY3RbXSBvYmogPSBldmVudC5nZXRFbGVtZW50cygpOwotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZWZyZXNoKHRydWUpOwotCQllbHNlIHsKLQkJCW9iaiA9IGFkYXB0TGFiZWxDaGFuZ2VPYmplY3RzKG9iaik7Ci0JCQlpbnQgc2l6ZSA9IG9iai5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQl1cGRhdGUob2JqW2ldLCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc29ydCB0aGUgdGFibGUgYmFzZWQgb24gZmllbGQuCi0JICogCi0JICogQHBhcmFtIGNvbHVtbiB0aGUgY29sdW1uIGJlaW5nIHVwZGF0ZWQKLQkgKiBAcGFyYW0gY29sCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzb3J0VGFibGUoZmluYWwgVHJlZUNvbHVtbiBjb2x1bW4sIGludCBjb2wpIHsKLQkJU2VydmVyVmlld2VyQ29tcGFyYXRvciBzb3J0ZXIgPSAoU2VydmVyVmlld2VyQ29tcGFyYXRvcikgZ2V0Q29tcGFyYXRvcigpOwotCQkKLQkJaWYgKGNvbCA9PSBzb3J0ZXIuZ2V0VG9wUHJpb3JpdHkoKSkKLQkJCXNvcnRlci5yZXZlcnNlVG9wUHJpb3JpdHkoKTsKLQkJZWxzZQotCQkJc29ydGVyLnNldFRvcFByaW9yaXR5KGNvbCk7Ci0JCQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoCi0JCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCXVwZGF0ZURpcmVjdGlvbkluZGljYXRvcihjb2x1bW4pOwotCQkJCX0KLQkJCX0pOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgZGlyZWN0aW9uIGluZGljYXRvciBhcyBjb2x1bW4gaXMgbm93IHRoZSBwcmltYXJ5IGNvbHVtbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29sdW1uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGlyZWN0aW9uSW5kaWNhdG9yKFRyZWVDb2x1bW4gY29sdW1uKSB7Ci0JCWdldFRyZWUoKS5zZXRTb3J0Q29sdW1uKGNvbHVtbik7Ci0JCWlmICgoKFNlcnZlclZpZXdlckNvbXBhcmF0b3IpIGdldENvbXBhcmF0b3IoKSkuZ2V0VG9wUHJpb3JpdHlEaXJlY3Rpb24oKSA9PSBTZXJ2ZXJWaWV3ZXJDb21wYXJhdG9yLkFTQ0VORElORykKLQkJCWdldFRyZWUoKS5zZXRTb3J0RGlyZWN0aW9uKFNXVC5VUCk7Ci0JCWVsc2UKLQkJCWdldFRyZWUoKS5zZXRTb3J0RGlyZWN0aW9uKFNXVC5ET1dOKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gYWRhcHRMYWJlbENoYW5nZU9iamVjdHMoT2JqZWN0W10gb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBvYmo7Ci0JCQotCQlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlpbnQgc2l6ZSA9IG9iai5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAob2JqW2ldIGluc3RhbmNlb2YgSU1vZHVsZSkgewotCQkJCWxpc3QuYWRkKG9ialtpXSk7Ci0JCQl9IGVsc2UgaWYgKG9ialtpXSBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCQlsaXN0LmFkZChvYmpbaV0pOwotCQkJfSBlbHNlIGlmIChvYmpbaV0gaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCQlsaXN0LmFkZChvYmpbaV0pOwotCQkJfSBlbHNlIGlmIChvYmpbaV0gaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCUlQcm9qZWN0IHByb2ogPSAoSVByb2plY3QpIG9ialtpXTsKLQotCQkJCUxpc3Q8T2JqZWN0PiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCWdldFRyZWVDaGlsZHJlbihsaXN0Miwgdmlldy50cmVlVGFibGUpOwotCQkJCQotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdDIuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBvID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgbzsKLQkJCQkJCWlmIChwcm9qLmVxdWFscyhtcy5tb2R1bGVbbXMubW9kdWxlLmxlbmd0aCAtIDFdLmdldFByb2plY3QoKSkpCi0JCQkJCQkJbGlzdC5hZGQobXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlPYmplY3RbXSBvID0gbmV3IE9iamVjdFtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShvKTsKLQkJcmV0dXJuIG87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFRyZWVDaGlsZHJlbihMaXN0PE9iamVjdD4gbGlzdCwgV2lkZ2V0IHdpZGdldCkgewotCQlJdGVtW10gaXRlbXMgPSBnZXRDaGlsZHJlbih3aWRnZXQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCU9iamVjdCBkYXRhID0gaXRlbS5nZXREYXRhKCk7Ci0JCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJCWxpc3QuYWRkKGRhdGEpOwotCQkJCi0JCQlpZiAoZ2V0RXhwYW5kZWQoaXRlbSkpIHsKLQkJCQkvLyBvbmx5IHJlY3Vyc2UgaWYgaXQgaXMgZXhwYW5kZWQgLSBpZgotCQkJCS8vIG5vdCB0aGVuIHRoZSBjaGlsZHJlbiBhcmVuJ3QgdmlzaWJsZQotCQkJCWdldFRyZWVDaGlsZHJlbihsaXN0LCBpdGVtKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc2VydmVyUmVzb3VyY2VMaXN0ZW5lciA9IG5ldyBJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2ZXJBZGRlZChJU2VydmVyIHNlcnZlcikgewotCQkJCWFkZFNlcnZlcihzZXJ2ZXIpOwotCQkJCXNlcnZlci5hZGRTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7Ci0JCQkJKChTZXJ2ZXIpIHNlcnZlcikuYWRkUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCQkJcmVmcmVzaFNlcnZlcihzZXJ2ZXIpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2VydmVyUmVtb3ZlZChJU2VydmVyIHNlcnZlcikgewotCQkJCXJlbW92ZVNlcnZlcihzZXJ2ZXIpOwotCQkJCXNlcnZlci5yZW1vdmVTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7Ci0JCQkJKChTZXJ2ZXIpIHNlcnZlcikucmVtb3ZlUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7Ci0JCQl9Ci0JCX07Ci0JCVNlcnZlckNvcmUuYWRkU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoc2VydmVyUmVzb3VyY2VMaXN0ZW5lcik7Ci0JCQotCQlwdWJsaXNoTGlzdGVuZXIgPSBuZXcgUHVibGlzaEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwdWJsaXNoU3RhcnRlZChJU2VydmVyIHNlcnZlcikgewotCQkJCWhhbmRsZVB1Ymxpc2hDaGFuZ2Uoc2VydmVyLCB0cnVlKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgcHVibGlzaEZpbmlzaGVkKElTZXJ2ZXIgc2VydmVyLCBJU3RhdHVzIHN0YXR1cykgewotCQkJCWhhbmRsZVB1Ymxpc2hDaGFuZ2Uoc2VydmVyLCBmYWxzZSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlzZXJ2ZXJMaXN0ZW5lciA9IG5ldyBJU2VydmVyTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKFNlcnZlckV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQkKLQkJCQlpbnQgZXZlbnRLaW5kID0gZXZlbnQuZ2V0S2luZCgpOwotCQkJCUlTZXJ2ZXIgc2VydmVyID0gZXZlbnQuZ2V0U2VydmVyKCk7Ci0JCQkJaWYgKChldmVudEtpbmQgJiBTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFKSAhPSAwKSB7Ci0JCQkJCS8vIHNlcnZlciBjaGFuZ2UgZXZlbnQKLQkJCQkJaWYgKChldmVudEtpbmQgJiBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UpICE9IDApIHsKLQkJCQkJCXJlZnJlc2hTZXJ2ZXIoc2VydmVyKTsKLQkJCQkJCWludCBzdGF0ZSA9IGV2ZW50LmdldFN0YXRlKCk7Ci0JCQkJCQlTdHJpbmcgaWQgPSBzZXJ2ZXIuZ2V0SWQoKTsKLQkJCQkJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HIHx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpIHsKLQkJCQkJCQlib29sZWFuIHN0YXJ0VGhyZWFkID0gZmFsc2U7Ci0JCQkJCQkJc3luY2hyb25pemVkIChzdGFydGluZykgewotCQkJCQkJCQlpZiAoIXN0YXJ0aW5nLmNvbnRhaW5zKGlkKSkgewotCQkJCQkJCQkJaWYgKHN0YXJ0aW5nLmlzRW1wdHkoKSkKLQkJCQkJCQkJCQlzdGFydFRocmVhZCA9IHRydWU7Ci0JCQkJCQkJCQlzdGFydGluZy5hZGQoaWQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChzdGFydFRocmVhZCkKLQkJCQkJCQkJc3RhcnRUaHJlYWQoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYm9vbGVhbiBzdG9wVGhyZWFkID0gZmFsc2U7Ci0JCQkJCQkJc3luY2hyb25pemVkIChzdGFydGluZykgewotCQkJCQkJCQlpZiAoc3RhcnRpbmcuY29udGFpbnMoaWQpKSB7Ci0JCQkJCQkJCQlzdGFydGluZy5yZW1vdmUoaWQpOwotCQkJCQkJCQkJaWYgKHN0YXJ0aW5nLmlzRW1wdHkoKSkKLQkJCQkJCQkJCQlzdG9wVGhyZWFkID0gdHJ1ZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoc3RvcFRocmVhZCkKLQkJCQkJCQkJc3RvcFRocmVhZCgpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UKLQkJCQkJCXJlZnJlc2hTZXJ2ZXIoc2VydmVyKTsKLQkJCQl9IGVsc2UgaWYgKChldmVudEtpbmQgJiBTZXJ2ZXJFdmVudC5NT0RVTEVfQ0hBTkdFKSAhPSAwKSB7Ci0JCQkJCS8vIG1vZHVsZSBjaGFuZ2UgZXZlbnQKLQkJCQkJaWYgKChldmVudEtpbmQgJiBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UpICE9IDAgfHwgKGV2ZW50S2luZCAmIFNlcnZlckV2ZW50LlBVQkxJU0hfU1RBVEVfQ0hBTkdFKSAhPSAwKSB7Ci0JCQkJCQlyZWZyZXNoU2VydmVyKHNlcnZlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotCQkvLyBhZGQgbGlzdGVuZXJzIHRvIHNlcnZlcnMKLQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJc2VydmVyc1tpXS5hZGRTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7Ci0JCQkJKChTZXJ2ZXIpIHNlcnZlcnNbaV0pLmFkZFB1Ymxpc2hMaXN0ZW5lcihwdWJsaXNoTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNlcnZlcgotCSAqIEBkZXByZWNhdGVkIFdpdGggdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgQ05GIHRoaXMgbWV0aG9kIHNob3VsZG4ndCBiZSBjYWxsZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VydmVyKGZpbmFsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVmcmVzaChzZXJ2ZXIpOwotCQkJCQlJU2VsZWN0aW9uIHNlbCA9IFNlcnZlclRhYmxlVmlld2VyLnRoaXMuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCVNlcnZlclRhYmxlVmlld2VyLnRoaXMuc2V0U2VsZWN0aW9uKHNlbCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEaXNwb3NlKERpc3Bvc2VFdmVudCBldmVudCkgewotCQlzdG9wVGhyZWFkKCk7Ci0JCS8vaWYgKGRzTGlzdGVuZXIgIT0gbnVsbCkKLQkJLy8Jdmlldy5nZXRWaWV3U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihkc0xpc3RlbmVyKTsKLQkJCi0JCVNlcnZlckNvcmUucmVtb3ZlU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoc2VydmVyUmVzb3VyY2VMaXN0ZW5lcik7Ci0JCQotCQkvLyByZW1vdmUgbGlzdGVuZXJzIGZyb20gc2VydmVyCi0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChzZXJ2ZXJMaXN0ZW5lciAhPSBudWxsKQotCQkJCQlzZXJ2ZXJzW2ldLnJlbW92ZVNlcnZlckxpc3RlbmVyKHNlcnZlckxpc3RlbmVyKTsKLQkJCQlpZiAocHVibGlzaExpc3RlbmVyICE9IG51bGwpCi0JCQkJCSgoU2VydmVyKSBzZXJ2ZXJzW2ldKS5yZW1vdmVQdWJsaXNoTGlzdGVuZXIocHVibGlzaExpc3RlbmVyKTsKLQkJCX0KLQkJfQotCQkKLQkJY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLQkJCi0JCXN1cGVyLmhhbmRsZURpc3Bvc2UoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBwdWJsaXNoIHN0YXRlIGNoYW5nZXMuCi0JICogQHBhcmFtIHNlcnZlciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVB1Ymxpc2hDaGFuZ2UoSVNlcnZlciBzZXJ2ZXIsIGJvb2xlYW4gaXNQdWJsaXNoaW5nKSB7Ci0JCVN0cmluZyBzZXJ2ZXJJZCA9IHNlcnZlci5nZXRJZCgpOwotCQlpZiAoaXNQdWJsaXNoaW5nKQotCQkJcHVibGlzaGluZy5hZGQoc2VydmVySWQpOwotCQllbHNlCi0JCQlwdWJsaXNoaW5nLnJlbW92ZShzZXJ2ZXJJZCk7Ci0JCi0JCXJlZnJlc2hTZXJ2ZXIoc2VydmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VydmVyTW9kdWxlc0NoYW5nZWQoSVNlcnZlciBzZXJ2ZXIyKSB7Ci0JCWlmIChzZXJ2ZXIyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKHNlcnZlcjIuZXF1YWxzKHNlcnZlcnNbaV0pKQotCQkJCQlyZWZyZXNoKHNlcnZlcnNbaV0pOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIGFuIGVsZW1lbnQgaXMgYWRkZWQuCi0JICogQHBhcmFtIHNlcnZlciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlcnZlclJlc291cmNlQWRkZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJYWRkKG51bGwsIHNlcnZlcik7Ci0JfQotCQotCS8qcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VydmVyUmVzb3VyY2VBZGRlZChJU2VydmVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCWNvbmZpZ3VyYXRpb25DaGFuZ2UoY29uZmlndXJhdGlvbiwgdHJ1ZSk7Ci0JfSovCi0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gYW4gZWxlbWVudCBpcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZXJ2ZXJSZXNvdXJjZUNoYW5nZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJcmVmcmVzaChzZXJ2ZXIpOwotCX0KLQkKLQkvKnByb3RlY3RlZCB2b2lkIGhhbmRsZVNlcnZlclJlc291cmNlQ2hhbmdlZChJU2VydmVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlTZXJ2ZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IHNlcnZlcnNbaV0uZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCQkJCWlmIChjb25maWd1cmF0aW9uLmVxdWFscyhjb25maWcpKQotCQkJCQlyZWZyZXNoKHNlcnZlcnNbaV0pOwotCQkJfQotCQl9Ci0JfSovCi0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gYW4gZWxlbWVudCBpcyByZW1vdmVkLgotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZXJ2ZXJSZXNvdXJjZVJlbW92ZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJcmVtb3ZlKHNlcnZlcik7Ci0KLQkJU3RyaW5nIHNlcnZlcklkID0gc2VydmVyLmdldElkKCk7Ci0JCXB1Ymxpc2hpbmcucmVtb3ZlKHNlcnZlcklkKTsKLQotCQl2aWV3LmdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuc2V0TWVzc2FnZShudWxsLCBudWxsKTsKLQl9Ci0KLQkvKnByb3RlY3RlZCB2b2lkIGhhbmRsZVNlcnZlclJlc291cmNlUmVtb3ZlZChJU2VydmVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCWNvbmZpZ3VyYXRpb25DaGFuZ2UoY29uZmlndXJhdGlvbiwgZmFsc2UpOwotCX0qLwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VydmVyKGZpbmFsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJYWRkKFJPT1QsIHNlcnZlcik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlcnZlcihmaW5hbCBJU2VydmVyIHNlcnZlcikgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJlbW92ZShzZXJ2ZXIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1VwZGF0ZUl0ZW0oV2lkZ2V0IHdpZGdldCwgT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gZnVsbE1hcCkgewotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgVHJlZUl0ZW0gJiYgY29sb3IgIT0gbnVsbCkgewotCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgd2lkZ2V0OwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBlbGVtZW50OwotCQkJCUlNb2R1bGUgbSA9IG1zLm1vZHVsZVttcy5tb2R1bGUubGVuZ3RoLTFdOwotCQkJCWlmIChtLmlzRXh0ZXJuYWwoKSkKLQkJCQkJaXRlbS5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJCQllbHNlCi0JCQkJCWl0ZW0uc2V0Rm9yZWdyb3VuZChudWxsKTsKLQkJCQlpZiAobXMuc2VydmVyLmdldE1vZHVsZVB1Ymxpc2hTdGF0ZShtcy5tb2R1bGUpICE9IElTZXJ2ZXIuUFVCTElTSF9TVEFURV9OT05FKQotCQkJCQlpdGVtLnNldEZvbnQoMCwgZm9udCk7Ci0JCQkJZWxzZQotCQkJCQlpdGVtLnNldEZvbnQoMCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuZG9VcGRhdGVJdGVtKHdpZGdldCwgZWxlbWVudCwgZnVsbE1hcCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQW5pbWF0aW9uKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXRyeSB7Ci0JCQlXaWRnZXQgd2lkZ2V0ID0gZG9GaW5kSXRlbShzZXJ2ZXIpOwotCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgd2lkZ2V0OwotCQkJaXRlbS5zZXRUZXh0KDEsIGxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dChzZXJ2ZXIsIDEpKTsKLQkJCWl0ZW0uc2V0SW1hZ2UoMSwgbGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZShzZXJ2ZXIsIDEpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJFcnJvciBpbiBvcHRpbWl6ZWQgYW5pbWF0aW9uIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlclRyYW5zZmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyVHJhbnNmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2ODRhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyVHJhbnNmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5CeXRlQXJyYXlUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuWE1MTWVtZW50bzsKLS8qCi0gKiBUaGUgZWxlbWVudCBzZXJpYWxpemF0aW9uIGZvcm1hdCBpczoKLSAqICAoaW50KSBudW1iZXIgb2Ygc2VydmVycwotICogVGhlbiwgdGhlIGZvbGxvd2luZyBmb3IgZWFjaCBzZXJ2ZXI6Ci0gKiAgKFN0cmluZykgaWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclRyYW5zZmVyIGV4dGVuZHMgQnl0ZUFycmF5VHJhbnNmZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNlcnZlclRyYW5zZmVyIGluc3RhbmNlID0gbmV3IFNlcnZlclRyYW5zZmVyKCk7Ci0KLQkvLyBDcmVhdGUgYSB1bmlxdWUgSUQgdG8gbWFrZSBzdXJlIHRoYXQgZGlmZmVyZW50IEVjbGlwc2UKLQkvLyBhcHBsaWNhdGlvbnMgdXNlIGRpZmZlcmVudCAidHlwZXMiIG9mIDxjb2RlPkphdmFFbGVtZW50VHJhbnNmZXI8L2NvZGU+Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTkFNRSA9ICJzZXJ2ZXItdHJhbnNmZXItZm9ybWF0OiIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICI6IiArIGluc3RhbmNlLmhhc2hDb2RlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRUlEID0gcmVnaXN0ZXJUeXBlKFRZUEVfTkFNRSk7Ci0KLQlwcml2YXRlIFNlcnZlclRyYW5zZmVyKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXJ2ZXJUcmFuc2ZlciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gVHJhbnNmZXIuCi0JICovCi0JcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKSB7Ci0JCXJldHVybiBuZXcgaW50W10geyBUWVBFSUQgfTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIFRyYW5zZmVyLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBUWVBFX05BTUUgfTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyI2phdmFUb05hdGl2ZShqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBqYXZhVG9OYXRpdmUoT2JqZWN0IGRhdGEsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkJaWYgKCEoZGF0YSBpbnN0YW5jZW9mIElTZXJ2ZXJbXSkpCi0JCQlyZXR1cm47Ci0JCQotCQlJU2VydmVyW10gc2VydmVycyA9IChJU2VydmVyW10pIGRhdGE7Ci0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCi0JCQlYTUxNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgic2VydmVycyIpOwotCQkJCi0JCQkvLyB3cml0ZSBlYWNoIGVsZW1lbnQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVycy5sZW5ndGg7IGkrKykgewotCQkJCUlNZW1lbnRvIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZCgic2VydmVyIik7Ci0JCQkJKChTZXJ2ZXIpc2VydmVyc1tpXSkuc2VyaWFsaXplKGNoaWxkKTsKLQkJCX0KLQkJCQotCQkJbWVtZW50by5zYXZlKG91dCk7Ci0JCQkKLQkJCS8vIGNsZWFudXAKLQkJCW91dC5jbG9zZSgpOwotCQkJYnl0ZVtdIGJ5dGVzID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0JCQlzdXBlci5qYXZhVG9OYXRpdmUoYnl0ZXMsIHRyYW5zZmVyRGF0YSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGl0J3MgYmVzdCB0byBzZW5kIG5vdGhpbmcgaWYgdGhlcmUgd2VyZSBwcm9ibGVtcwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlciNuYXRpdmVUb0phdmEob3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGEpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBuYXRpdmVUb0phdmEoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCQlieXRlW10gYnl0ZXMgPSAoYnl0ZVtdKSBzdXBlci5uYXRpdmVUb0phdmEodHJhbnNmZXJEYXRhKTsKLQkJaWYgKGJ5dGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotCQl0cnkgewotCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oaW4pOwotCQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oInNlcnZlciIpOwotCQkJCi0JCQlpbnQgY291bnQgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlJU2VydmVyW10gcmVzdWx0cyA9IG5ldyBJU2VydmVyW2NvdW50XTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCVNlcnZlciBzZXJ2ZXIgPSBuZXcgU2VydmVyKG51bGwpOwotCQkJCXNlcnZlci5kZXNlcmlhbGl6ZShjaGlsZHJlbltpXSk7Ci0JCQkJcmVzdWx0c1tpXSA9IHNlcnZlcjsKLQkJCX0KLQkJCXJldHVybiByZXN1bHRzOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJRE5ELmVycm9yKERORC5FUlJPUl9JTlZBTElEX0RBVEEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyVmlld2VyQ29tcGFyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlclZpZXdlckNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBkYjMwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyVmlld2VyQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLQotcHVibGljIGNsYXNzIFNlcnZlclZpZXdlckNvbXBhcmF0b3IgZXh0ZW5kcyBWaWV3ZXJDb21wYXJhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfREVQVEggPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTQ0VORElORyA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVTQ0VORElORyA9IC0xOwotCi0JcHJvdGVjdGVkIFNlcnZlclRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIGludFtdIHByaW9yaXRpZXMgPSBuZXcgaW50W10geyAwIH07Ci0KLQlwcm90ZWN0ZWQgaW50W10gZGlyZWN0aW9ucyA9IG5ldyBpbnRbXSB7IEFTQ0VORElORyB9OwotCi0JcHVibGljIFNlcnZlclZpZXdlckNvbXBhcmF0b3IoU2VydmVyVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJdGhpcy5sYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUb3BQcmlvcml0eShpbnQgcHJpb3JpdHkpIHsKLQkJaWYgKHByaW9yaXRpZXNbMF0gPT0gcHJpb3JpdHkpCi0JCQlyZXR1cm47Ci0JCQotCQlpbnQgbGVuID0gcHJpb3JpdGllcy5sZW5ndGggKyAxOwotCQlpZiAobGVuID4gTUFYX0RFUFRIKQotCQkJbGVuID0gTUFYX0RFUFRIOwotCQkKLQkJaW50W10gdGVtcCA9IG5ldyBpbnRbbGVuXTsKLQkJU3lzdGVtLmFycmF5Y29weShwcmlvcml0aWVzLCAwLCB0ZW1wLCAxLCBsZW4gLSAxKTsKLQkJdGVtcFswXSA9IHByaW9yaXR5OwotCQlwcmlvcml0aWVzID0gdGVtcDsKLQkJCi0JCXRlbXAgPSBuZXcgaW50W2xlbl07Ci0JCVN5c3RlbS5hcnJheWNvcHkoZGlyZWN0aW9ucywgMCwgdGVtcCwgMSwgbGVuIC0gMSk7Ci0JCXRlbXBbMF0gPSBBU0NFTkRJTkc7Ci0JCWRpcmVjdGlvbnMgPSB0ZW1wOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VG9wUHJpb3JpdHkoKSB7Ci0JCXJldHVybiBwcmlvcml0aWVzWzBdOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRvcFByaW9yaXR5RGlyZWN0aW9uKGludCBkaXJlY3Rpb24pIHsKLQkJaWYgKGRpcmVjdGlvbiA9PSBBU0NFTkRJTkcgfHwgZGlyZWN0aW9uID09IERFU0NFTkRJTkcpIHsKLQkJCWRpcmVjdGlvbnNbMF0gPSBkaXJlY3Rpb247Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRvcFByaW9yaXR5RGlyZWN0aW9uKCkgewotCQlyZXR1cm4gZGlyZWN0aW9uc1swXTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXZlcnNlVG9wUHJpb3JpdHkoKSB7Ci0JCWRpcmVjdGlvbnNbMF0gKj0gLTE7Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyLCBpbnQgYSkgewotCQlpbnQgY29sID0gcHJpb3JpdGllc1thXTsKLQkJCi0JCVN0cmluZyBzMSA9IGxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dChlMSwgY29sKTsKLQkJU3RyaW5nIHMyID0gbGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0KGUyLCBjb2wpOwotCQkKLQkJaW50IHMgPSBzMS5jb21wYXJlVG9JZ25vcmVDYXNlKHMyKSAqIGRpcmVjdGlvbnNbYV07Ci0JCWlmIChzID09IDApIHsKLQkJCWlmIChhID09IHByaW9yaXRpZXMubGVuZ3RoIC0gMSkKLQkJCQlyZXR1cm4gMDsKLQkJCXJldHVybiBjb21wYXJlKHZpZXdlciwgZTEsIGUyLCBhKzEpOwotCQl9Ci0JCXJldHVybiBzOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlyZXR1cm4gY29tcGFyZSh2aWV3ZXIsIGUxLCBlMiwgMCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJzVmlldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlcnNWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZDE2YWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlcnNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuVHJpZ2dlclNlcXVlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRmlsZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLklDb250ZXh0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5rZXlzLklCaW5kaW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlJlc291cmNlVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuTG9jYWxTZWxlY3Rpb25UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zLk5ld1NlcnZlcldpemFyZEFjdGlvbjsKLS8qKgotICogQSB2aWV3IG9mIHNlcnZlcnMsIHRoZWlyIG1vZHVsZXMsIGFuZCBzdGF0dXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJzVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NPTFVNTl9XSURUSCA9ICJjb2x1bW5XaWR0aCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUlNfVklFV19DT05URVhUID0gIm9yZy5lY2xpcHNlLnVpLnNlcnZlclZpZXdTY29wZSI7Ci0KLQlwcm90ZWN0ZWQgQWN0aW9uIG5vbmVBY3Rpb24gPSBuZXcgQWN0aW9uKE1lc3NhZ2VzLmRpYWxvZ01vbml0b3JOb25lKSB7Ci0JCS8vIGR1bW15IGFjdGlvbgotCX07Ci0KLQlwcm90ZWN0ZWQgaW50W10gY29sczsKLQotCXByb3RlY3RlZCBUcmVlIHRyZWVUYWJsZTsKLQlwcm90ZWN0ZWQgU2VydmVyVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0KLQkvLyBhY3Rpb25zIG9uIGEgc2VydmVyCi0JcHJvdGVjdGVkIEFjdGlvbltdIGFjdGlvbnM7Ci0JcHJvdGVjdGVkIEFjdGlvbiBhY3Rpb25Nb2RpZnlNb2R1bGVzOwotCXByb3RlY3RlZCBBY3Rpb24gb3BlbkFjdGlvbiwgc2hvd0luQ29uc29sZUFjdGlvbiwgc2hvd0luRGVidWdBY3Rpb24sIHByb3BlcnRpZXNBY3Rpb24sIG1vbml0b3JQcm9wZXJ0aWVzQWN0aW9uLCBnbG9iYWxEZWxldGVBY3Rpb247Ci0JcHJvdGVjdGVkIEFjdGlvbiBjb3B5QWN0aW9uLCBwYXN0ZUFjdGlvbiwgZGVsZXRlQWN0aW9uLCByZW5hbWVBY3Rpb247Ci0KLQkvKioKLQkgKiBTZXJ2ZXJzVmlldyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJzVmlldygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uTGlzdGVuZXIgZ2V0SGVhZGVyTGlzdGVuZXIoZmluYWwgaW50IGNvbCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkvKioKLQkJCSAqIEhhbmRsZXMgdGhlIGNhc2Ugb2YgdXNlciBzZWxlY3RpbmcgdGhlIGhlYWRlciBhcmVhLgotCQkJICovCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHRhYmxlVmlld2VyID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlUcmVlQ29sdW1uIGNvbHVtbiA9IChUcmVlQ29sdW1uKSBlLndpZGdldDsKLQkJCQl0YWJsZVZpZXdlci5yZXNvcnRUYWJsZShjb2x1bW4sIGNvbCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlUGFydENvbnRyb2wgbWV0aG9kIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBhIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRyZWVUYWJsZSA9IG5ldyBUcmVlKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXRyZWVUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0cmVlVGFibGUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQkJdHJlZVRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl0cmVlVGFibGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0cmVlVGFibGUsIENvbnRleHRJZHMuVklFV19TRVJWRVJTKTsKLQkJCi0JCS8vIGFkZCBjb2x1bW5zCi0JCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZVRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJY29sdW1uLnNldFRleHQoTWVzc2FnZXMudmlld1NlcnZlcik7Ci0JCWNvbHVtbi5zZXRXaWR0aChjb2xzWzBdKTsKLQkJY29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldEhlYWRlckxpc3RlbmVyKDApKTsKLQkJdHJlZVRhYmxlLnNldFNvcnRDb2x1bW4oY29sdW1uKTsKLQkJdHJlZVRhYmxlLnNldFNvcnREaXJlY3Rpb24oU1dULlVQKTsKLQkJCi0JCVRyZWVDb2x1bW4gY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWVUYWJsZSwgU1dULlNJTkdMRSk7Ci0JCWNvbHVtbjIuc2V0VGV4dChNZXNzYWdlcy52aWV3U3RhdGUpOwotCQljb2x1bW4yLnNldFdpZHRoKGNvbHNbMV0pOwotCQljb2x1bW4yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldEhlYWRlckxpc3RlbmVyKDEpKTsKLQkJCi0JCVRyZWVDb2x1bW4gY29sdW1uMyA9IG5ldyBUcmVlQ29sdW1uKHRyZWVUYWJsZSwgU1dULlNJTkdMRSk7Ci0JCWNvbHVtbjMuc2V0VGV4dChNZXNzYWdlcy52aWV3U3RhdHVzKTsKLQkJY29sdW1uMy5zZXRXaWR0aChjb2xzWzJdKTsKLQkJY29sdW1uMy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRIZWFkZXJMaXN0ZW5lcigyKSk7Ci0JCQotCQlJQ29udGV4dFNlcnZpY2UgY29udGV4dFN1cHBvcnQgPSAoSUNvbnRleHRTZXJ2aWNlKWdldFNpdGUoKS5nZXRTZXJ2aWNlKElDb250ZXh0U2VydmljZS5jbGFzcyk7Ci0JCWNvbnRleHRTdXBwb3J0LmFjdGl2YXRlQ29udGV4dChTRVJWRVJTX1ZJRVdfQ09OVEVYVCk7Ci0JCQotCQlkZWZlckluaXRpYWxpemF0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlZmVySW5pdGlhbGl6YXRpb24oKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZVRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChNZXNzYWdlcy52aWV3SW5pdGlhbGl6aW5nKTsKLQkJCi0JCXRhYmxlVmlld2VyID0gbmV3IFNlcnZlclRhYmxlVmlld2VyKHRoaXMsIHRyZWVUYWJsZSk7Ci0JCWluaXRpYWxpemVBY3Rpb25zKHRhYmxlVmlld2VyKTsKLQkJCi0JCUpvYiBqb2IgPSBuZXcgSm9iKE1lc3NhZ2VzLmpvYkluaXRpYWxpemluZ1NlcnZlcnNWaWV3KSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCSgoU2VydmVyKXNlcnZlcnNbaV0pLmdldEFsbE1vZHVsZXMoKS5pdGVyYXRvcigpOwotCQkJCQkvKndoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCU1vZHVsZSBtb2R1bGUgPSAoTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQltb2R1bGUuZwotCQkJCQl9Ki8KLQkJCQl9Ci0JCQkJCi0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlkZWZlcnJlZEluaXRpYWxpemUoKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gaWdub3JlIC0gdmlldyBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX07Ci0JCQotCQlqb2Iuc2V0U3lzdGVtKHRydWUpOwotCQlqb2Iuc2V0UHJpb3JpdHkoSm9iLlNIT1JUKTsKLQkJam9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVmZXJyZWRJbml0aWFsaXplKCkgewotCQl0YWJsZVZpZXdlci5pbml0aWFsaXplKCk7Ci0JCXRhYmxlVmlld2VyLmFkZE9wZW5MaXN0ZW5lcihuZXcgSU9wZW5MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG9wZW4oT3BlbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJT2JqZWN0IGRhdGEgPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCWlmICghKGRhdGEgaW5zdGFuY2VvZiBJU2VydmVyKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZGF0YTsKLQkJCQkJU2VydmVyVUlQbHVnaW4uZWRpdFNlcnZlcihzZXJ2ZXIpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZCBub3Qgb3BlbiBzZXJ2ZXIiLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigiI1BvcHVwTWVudSIpOwotCQltZW51TWFuYWdlci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gdHJlZVRhYmxlLmdldFNoZWxsKCk7Ci0JCW1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWdyKSB7Ci0JCQkJZmlsbENvbnRleHRNZW51KHNoZWxsLCBtZ3IpOwotCQkJfQotCQl9KTsKLQkJTWVudSBtZW51ID0gbWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUodHJlZVRhYmxlKTsKLQkJdHJlZVRhYmxlLnNldE1lbnUobWVudSk7Ci0JCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KG1lbnVNYW5hZ2VyLCB0YWJsZVZpZXdlcik7Ci0JCWdldFNpdGUoKS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0YWJsZVZpZXdlcik7Ci0JCQotCQlpbml0RHJhZ0FuZERyb3AoKTsKLQkJCi0JCS8vIGluaXQgdGhlIHRvb2x0aXAKLQkJU2VydmVyVG9vbFRpcCB0b29sVGlwID0gbmV3IFNlcnZlclRvb2xUaXAodHJlZVRhYmxlKTsKLQkJdG9vbFRpcC5zZXRTaGlmdChuZXcgUG9pbnQoMTAsIDMpKTsKLQkJdG9vbFRpcC5zZXRQb3B1cERlbGF5KDQwMCk7IC8vIGluIG1zCi0JCXRvb2xUaXAuc2V0SGlkZU9uTW91c2VEb3duKHRydWUpOwotCQl0b29sVGlwLmFjdGl2YXRlKCk7Ci0JCQotCQlpZiAodGFibGVWaWV3ZXIuZ2V0VHJlZSgpLmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJT2JqZWN0IG9iaiA9IHRhYmxlVmlld2VyLmdldFRyZWUoKS5nZXRJdGVtKDApLmdldERhdGEoKTsKLQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmopKTsKLQkJfQotCQkKLQkJVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDUwMDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSBzZXJ2ZXJzW2ldOwotCQkJCQlpZiAoc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikgewotLy8JCQkJCQlVcGRhdGVTZXJ2ZXJKb2Igam9iID0gbmV3IFVwZGF0ZVNlcnZlckpvYihzZXJ2ZXIpOwotLy8gCQkJCQkJam9iLnNjaGVkdWxlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCXRocmVhZC5zZXRQcmlvcml0eShUaHJlYWQuTUlOX1BSSU9SSVRZICsgMSk7Ci0JCXRocmVhZC5zdGFydCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdTaXRlIHNpdGUsIElNZW1lbnRvIG1lbWVudG8pIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgbWVtZW50byk7Ci0JCWNvbHMgPSBuZXcgaW50WzNdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJY29sc1tpXSA9IDIwMDsKLQkJCWlmIChtZW1lbnRvICE9IG51bGwpIHsKLQkJCQlJbnRlZ2VyIGluID0gbWVtZW50by5nZXRJbnRlZ2VyKFRBR19DT0xVTU5fV0lEVEggKyBpKTsKLQkJCQlpZiAoaW4gIT0gbnVsbCAmJiBpbi5pbnRWYWx1ZSgpID4gNSkKLQkJCQkJY29sc1tpXSA9IGluLmludFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQlUcmVlQ29sdW1uW10gdGMgPSB0cmVlVGFibGUuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJaW50IHdpZHRoID0gdGNbaV0uZ2V0V2lkdGgoKTsKLQkJCWlmICh3aWR0aCAhPSAwKQotCQkJCW1lbWVudG8ucHV0SW50ZWdlcihUQUdfQ09MVU1OX1dJRFRIICsgaSwgd2lkdGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBhY3Rpb25zCi0JICogCi0JICogQHBhcmFtIHByb3ZpZGVyIGEgc2VsZWN0aW9uIHByb3ZpZGVyCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUFjdGlvbnMoSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCVNoZWxsIHNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJCi0JCWFjdGlvbnMgPSBuZXcgQWN0aW9uWzZdOwotCQkvLyBjcmVhdGUgdGhlIHN0YXJ0IGFjdGlvbnMKLQkJYWN0aW9uc1swXSA9IG5ldyBTdGFydEFjdGlvbihzaGVsbCwgcHJvdmlkZXIsIElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZGVidWciLCBhY3Rpb25zWzBdKTsKLQkJYWN0aW9uc1sxXSA9IG5ldyBTdGFydEFjdGlvbihzaGVsbCwgcHJvdmlkZXIsIElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnJ1biIsIGFjdGlvbnNbMV0pOwotCQlhY3Rpb25zWzJdID0gbmV3IFN0YXJ0QWN0aW9uKHNoZWxsLCBwcm92aWRlciwgSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFKTsKLQkJCi0JCS8vIGNyZWF0ZSB0aGUgc3RvcCBhY3Rpb24KLQkJYWN0aW9uc1szXSA9IG5ldyBTdG9wQWN0aW9uKHNoZWxsLCBwcm92aWRlcik7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zdG9wIiwgYWN0aW9uc1szXSk7Ci0JCQotCQkvLyBjcmVhdGUgdGhlIHB1Ymxpc2ggYWN0aW9ucwotCQlhY3Rpb25zWzRdID0gbmV3IFB1Ymxpc2hBY3Rpb24oc2hlbGwsIHByb3ZpZGVyKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnB1Ymxpc2giLCBhY3Rpb25zWzRdKTsKLQkJYWN0aW9uc1s1XSA9IG5ldyBQdWJsaXNoQ2xlYW5BY3Rpb24oc2hlbGwsIHByb3ZpZGVyKTsKLQkJCi0JCS8vIGNyZWF0ZSB0aGUgb3BlbiBhY3Rpb24KLQkJb3BlbkFjdGlvbiA9IG5ldyBPcGVuQWN0aW9uKHByb3ZpZGVyKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKCJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuT3BlbiIsIG9wZW5BY3Rpb24pOwotCQkKLQkJLy8gY3JlYXRlIGNvcHksIHBhc3RlLCBhbmQgZGVsZXRlIGFjdGlvbnMKLQkJcGFzdGVBY3Rpb24gPSBuZXcgUGFzdGVBY3Rpb24oc2hlbGwsIHByb3ZpZGVyLCB0YWJsZVZpZXdlci5jbGlwYm9hcmQpOwotCQljb3B5QWN0aW9uID0gbmV3IENvcHlBY3Rpb24ocHJvdmlkZXIsIHRhYmxlVmlld2VyLmNsaXBib2FyZCwgcGFzdGVBY3Rpb24pOwotCQlkZWxldGVBY3Rpb24gPSBuZXcgRGVsZXRlQWN0aW9uKHNoZWxsLCBwcm92aWRlcik7Ci0JCS8vIENyZWF0ZSBhIHNlY29uZCBkZWxldGUgYWN0aW9uIHRoYXQgY2FuIGFjdCBpbiBtb2R1bGVzLCB3aGVuIHRoZSBkZWxldGUga2V5IGlzIHByZXNzZWQKLQkJLy8gdGhlIG9sZCBEZWxldGVBY3Rpb24gb25seSB3b3JrcyBmb3Igc2VydmVycyBzZWUgYnVnIyAyODY5NjAKLQkJZ2xvYmFsRGVsZXRlQWN0aW9uID0gbmV3IEdsb2JhbERlbGV0ZUFjdGlvbihzaGVsbCwgcHJvdmlkZXIpOwotCQlyZW5hbWVBY3Rpb24gPSBuZXcgUmVuYW1lQWN0aW9uKHNoZWxsLCB0YWJsZVZpZXdlciwgcHJvdmlkZXIpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksIGNvcHlBY3Rpb24pOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLCBwYXN0ZUFjdGlvbik7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLCBnbG9iYWxEZWxldGVBY3Rpb24pOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRU5BTUUuZ2V0SWQoKSwgcmVuYW1lQWN0aW9uKTsKLQkJCi0JCS8vIGNyZWF0ZSB0aGUgb3RoZXIgYWN0aW9ucwotCQlhY3Rpb25Nb2RpZnlNb2R1bGVzID0gbmV3IE1vZHVsZVNsb3NoQWN0aW9uKHNoZWxsLCBwcm92aWRlcik7Ci0JCXNob3dJbkNvbnNvbGVBY3Rpb24gPSBuZXcgU2hvd0luQ29uc29sZUFjdGlvbihwcm92aWRlcik7Ci0JCXNob3dJbkRlYnVnQWN0aW9uID0gbmV3IFNob3dJbkRlYnVnQWN0aW9uKHByb3ZpZGVyKTsKLQkJCi0JCS8vIGNyZWF0ZSB0aGUgcHJvcGVydGllcyBhY3Rpb24KLQkJcHJvcGVydGllc0FjdGlvbiA9IG5ldyBQcm9wZXJ0aWVzQWN0aW9uKHNoZWxsLCBwcm92aWRlcik7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBST1BFUlRJRVMuZ2V0SWQoKSwgcHJvcGVydGllc0FjdGlvbik7Ci0JCW1vbml0b3JQcm9wZXJ0aWVzQWN0aW9uID0gbmV3IFByb3BlcnRpZXNBY3Rpb24oc2hlbGwsICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByb3BlcnRpZXMubW9uaXRvciIsIHByb3ZpZGVyKTsKLQkJCi0JCS8vIGFkZCB0b29sYmFyIGJ1dHRvbnMKLQkJSUNvbnRyaWJ1dGlvbk1hbmFnZXIgY20gPSBhY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGggLSAxOyBpKyspCi0JCQljbS5hZGQoYWN0aW9uc1tpXSk7Ci0JCQotCQljbS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbE5ld0NvbnRleHRNZW51KFNoZWxsIHNoZWxsLCBJU2VsZWN0aW9uIHNlbGVjdGlvbiwgSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJSUFjdGlvbiBuZXdTZXJ2ZXJBY3Rpb24gPSBuZXcgTmV3U2VydmVyV2l6YXJkQWN0aW9uKCk7Ci0JCW5ld1NlcnZlckFjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmFjdGlvbk5ld1NlcnZlcik7Ci0JCW1lbnUuYWRkKG5ld1NlcnZlckFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KFNoZWxsIHNoZWxsLCBJTWVudU1hbmFnZXIgbWVudSkgewotCQkvLyBnZXQgc2VsZWN0aW9uIGJ1dCBhdm9pZCBubyBzZWxlY3Rpb24gb3IgbXVsdGlwbGUgc2VsZWN0aW9uCi0JCUlTZXJ2ZXIgc2VydmVyID0gbnVsbDsKLQkJSU1vZHVsZVtdIG1vZHVsZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikKLQkJCQlzZXJ2ZXIgPSAoSVNlcnZlcikgb2JqOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIG9iajsKLQkJCQlzZXJ2ZXIgPSBtcy5zZXJ2ZXI7Ci0JCQkJbW9kdWxlID0gbXMubW9kdWxlOwotCQkJfQotCQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCXNlcnZlciA9IG51bGw7Ci0JCQkJbW9kdWxlID0gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJLy8gbmV3IGFjdGlvbgotCQlNZW51TWFuYWdlciBuZXdNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKE1lc3NhZ2VzLmFjdGlvbk5ldyk7Ci0JCWZpbGxOZXdDb250ZXh0TWVudShudWxsLCBzZWxlY3Rpb24sIG5ld01lbnUpOwotCQltZW51LmFkZChuZXdNZW51KTsKLQkJCi0JCS8vIG9wZW4gYWN0aW9uCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBtb2R1bGUgPT0gbnVsbCkgewotCQkJbWVudS5hZGQob3BlbkFjdGlvbik7Ci0JCQkKLQkJCVN0cmluZyB0ZXh0ID0gTWVzc2FnZXMuYWN0aW9uU2hvd0luOwotCQkJZmluYWwgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQkJZmluYWwgSUJpbmRpbmdTZXJ2aWNlIGJpbmRpbmdTZXJ2aWNlID0gKElCaW5kaW5nU2VydmljZSkgd29ya2JlbmNoCi0JCQkJCS5nZXRBZGFwdGVyKElCaW5kaW5nU2VydmljZS5jbGFzcyk7Ci0JCQlmaW5hbCBUcmlnZ2VyU2VxdWVuY2VbXSBhY3RpdmVCaW5kaW5ncyA9IGJpbmRpbmdTZXJ2aWNlCi0JCQkJCS5nZXRBY3RpdmVCaW5kaW5nc0Zvcigib3JnLmVjbGlwc2UudWkubmF2aWdhdGUuc2hvd0luUXVpY2tNZW51Iik7Ci0JCQlpZiAoYWN0aXZlQmluZGluZ3MubGVuZ3RoID4gMCkgewotCQkJCXRleHQgKz0gIlx0IiArIGFjdGl2ZUJpbmRpbmdzWzBdLmZvcm1hdCgpOwotCQkJfQotCQkJCi0JCQlNZW51TWFuYWdlciBzaG93SW5NZW51ID0gbmV3IE1lbnVNYW5hZ2VyKHRleHQpOwotCQkJc2hvd0luTWVudS5hZGQoc2hvd0luQ29uc29sZUFjdGlvbik7Ci0JCQlzaG93SW5NZW51LmFkZChzaG93SW5EZWJ1Z0FjdGlvbik7Ci0JCQkvL0lBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJCS8vYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKCJncm91cC5zaG93Iiwgc2hvd0luTWVudSk7Ci0JCQltZW51LmFkZChzaG93SW5NZW51KTsKLQkJCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCX0gZWxzZQotCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJaWYgKG1vZHVsZSA9PSBudWxsKSB7Ci0JCQkJbWVudS5hZGQoY29weUFjdGlvbik7Ci0JCQkJbWVudS5hZGQocGFzdGVBY3Rpb24pOwotCQkJCW1lbnUuYWRkKGRlbGV0ZUFjdGlvbik7Ci0JCQkJbWVudS5hZGQocmVuYW1lQWN0aW9uKTsKLQkJCX0gZWxzZSBpZiAobW9kdWxlLmxlbmd0aCA9PSAxKQotCQkJCW1lbnUuYWRkKG5ldyBSZW1vdmVNb2R1bGVBY3Rpb24oc2hlbGwsIHNlcnZlciwgbW9kdWxlWzBdKSk7Ci0JCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl9Ci0JCQotCQlpZiAoc2VydmVyICE9IG51bGwgJiYgbW9kdWxlID09IG51bGwpIHsKLQkJCS8vIHNlcnZlciBhY3Rpb25zCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspCi0JCQkJbWVudS5hZGQoYWN0aW9uc1tpXSk7Ci0JCQkKLQkJCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQltZW51LmFkZChhY3Rpb25Nb2RpZnlNb2R1bGVzKTsKLQkJCQotCQkJLy8gbW9uaXRvcgotCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCkgewotCQkJCWZpbmFsIE1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKE1lc3NhZ2VzLmFjdGlvbk1vbml0b3IpOwotCQkJCQotCQkJCWZpbmFsIElTZXJ2ZXIgc2VydmVyMiA9IHNlcnZlcjsKLQkJCQlmaW5hbCBTaGVsbCBzaGVsbDIgPSBzaGVsbDsKLQkJCQltZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQkJCQkJbWVudU1hbmFnZXIucmVtb3ZlQWxsKCk7Ci0JCQkJCQlpZiAoc2VydmVyMi5nZXRBZGFwdGVyKFNlcnZlckRlbGVnYXRlLmNsYXNzKSAhPSBudWxsKSB7Ci0JCQkJCQkJU2VydmVyUG9ydFtdIHBvcnRzID0gc2VydmVyMi5nZXRTZXJ2ZXJQb3J0cyhudWxsKTsKLQkJCQkJCQlpZiAocG9ydHMgIT0gbnVsbCkgewotCQkJCQkJCQlpbnQgc2l6ZSA9IHBvcnRzLmxlbmd0aDsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCQkJCWlmICghcG9ydHNbaV0uaXNBZHZhbmNlZCgpKQotCQkJCQkJCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgTW9uaXRvclNlcnZlclBvcnRBY3Rpb24oc2hlbGwyLCBzZXJ2ZXIyLCBwb3J0c1tpXSkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZiAobWVudU1hbmFnZXIuaXNFbXB0eSgpKQotCQkJCQkJCW1lbnVNYW5hZ2VyLmFkZChub25lQWN0aW9uKTsKLQkJCQkJCQotCQkJCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQkJCQltZW51TWFuYWdlci5hZGQobW9uaXRvclByb3BlcnRpZXNBY3Rpb24pOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJCi0JCQkJLy8gYWRkIGFuIGluaXRpYWwgbWVudSBpdGVtIHNvIHRoYXQgdGhlIG1lbnUgYXBwZWFycyBjb3JyZWN0bHkKLQkJCQlub25lQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW1lbnVNYW5hZ2VyLmFkZChub25lQWN0aW9uKTsKLQkJCQltZW51LmFkZChtZW51TWFuYWdlcik7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBtb2R1bGUgIT0gbnVsbCkgewotCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCW1lbnUuYWRkKG5ldyBTdGFydE1vZHVsZUFjdGlvbihzZXJ2ZXIsIG1vZHVsZSkpOwotCQkJbWVudS5hZGQobmV3IFN0b3BNb2R1bGVBY3Rpb24oc2VydmVyLCBtb2R1bGUpKTsJCQkKLQkJCW1lbnUuYWRkKG5ldyBSZXN0YXJ0TW9kdWxlQWN0aW9uKHNlcnZlciwgbW9kdWxlKSk7Ci0JCX0KLQkJCi0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUysiLWVuZCIpKTsKLQkJCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCW1lbnUuYWRkKHByb3BlcnRpZXNBY3Rpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWlmICh0cmVlVGFibGUgIT0gbnVsbCkKLQkJCXRyZWVUYWJsZS5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotICAgICogQWRkcyBkcmFnIGFuZCBkcm9wIHN1cHBvcnQgdG8gdGhlIFNlcnZlcnMgdmlldy4KLSAgICAqLwotICAgcHJvdGVjdGVkIHZvaWQgaW5pdERyYWdBbmREcm9wKCkgewotCQlpbnQgb3BzID0gRE5ELkRST1BfQ09QWTsKLQkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwKLQkJCVJlc291cmNlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwgRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKLQkJLy90YWJsZVZpZXdlci5hZGREcmFnU3VwcG9ydChvcHMsIHRyYW5zZmVycywgbmV3IFNlcnZlcnNWaWV3RHJhZ0FkYXB0ZXIodmlld2VyKSk7Ci0JCXRhYmxlVmlld2VyLmFkZERyb3BTdXBwb3J0KG9wcyB8IERORC5EUk9QX0RFRkFVTFQsIHRyYW5zZmVycywgbmV3IFNlcnZlcnNWaWV3RHJvcEFkYXB0ZXIodGFibGVWaWV3ZXIpKTsKLSAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyc1ZpZXdEcm9wQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlcnNWaWV3RHJvcEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhhMDRhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyc1ZpZXdEcm9wQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRHJvcEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5GaWxlVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5SZXNvdXJjZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci5Mb2NhbFNlbGVjdGlvblRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkVjbGlwc2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnMuUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZTsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlcnNWaWV3RHJvcEFkYXB0ZXIgZXh0ZW5kcyBWaWV3ZXJEcm9wQWRhcHRlciB7Ci0JcHJvdGVjdGVkIFNlcnZlcnNWaWV3RHJvcEFkYXB0ZXIoVmlld2VyIHZpZXdlcikgewotCQlzdXBlcih2aWV3ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKQotCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQotCQlzdXBlci5kcmFnRW50ZXIoZXZlbnQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1Ecm9wKE9iamVjdCBkYXRhKSB7Ci0JCU9iamVjdCB0YXJnZXQgPSBnZXRDdXJyZW50VGFyZ2V0KCk7Ci0JCUlTZXJ2ZXIgc2VydmVyID0gbnVsbDsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElTZXJ2ZXIpCi0JCQlzZXJ2ZXIgPSAoSVNlcnZlcikgdGFyZ2V0OwotCQkKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBudWxsOwotCQlpZiAoZGF0YSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGRhdGE7Ci0JCQlpdGVyYXRvciA9IHNlbC5pdGVyYXRvcigpOwotCQl9Ci0JCQotCQlpZiAoaXRlcmF0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWJvb2xlYW4gYiA9IHRydWU7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBkYXRhMiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICghZG9TZWwoc2VydmVyLCBkYXRhMikpCi0JCQkJYiA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiBiOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRvU2VsKElTZXJ2ZXIgc2VydmVyLCBPYmplY3QgZGF0YSkgewotCQkvLyBjaGVjayBpZiB0aGUgc2VsZWN0aW9uIGlzIGEgcHJvamVjdCAobW9kdWxlKSB0aGF0IHdlIGNhbiBhZGQgdG8gdGhlIHNlcnZlcgotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIoZGF0YSwgSVByb2plY3QuY2xhc3MpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJTW9kdWxlW10gbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhwcm9qZWN0KTsKLQkJCWlmIChtb2R1bGVzICE9IG51bGwgJiYgbW9kdWxlcy5sZW5ndGggPT0gMSkgewotCQkJCXRyeSB7Ci0JCQkJCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IHNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOwotCQkJCQlJTW9kdWxlW10gcGFyZW50cyA9IHdjLmdldFJvb3RNb2R1bGVzKG1vZHVsZXNbMF0sIG51bGwpOwotCQkJCQlpZiAocGFyZW50cyA9PSBudWxsIHx8IHBhcmVudHMubGVuZ3RoID09IDApCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQotCQkJCQlpZiAoU2VydmVyVXRpbC5jb250YWluc01vZHVsZShzZXJ2ZXIsIHBhcmVudHNbMF0sIG51bGwpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkKLQkJCQkJSU1vZHVsZVtdIGFkZCA9IG5ldyBJTW9kdWxlW10geyBwYXJlbnRzWzBdIH07Ci0JCQkJCWlmICh3Yy5jYW5Nb2RpZnlNb2R1bGVzKGFkZCwgbnVsbCwgbnVsbCkuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJCQl3Yy5tb2RpZnlNb2R1bGVzKG1vZHVsZXMsIG51bGwsIG51bGwpOwotCQkJCQkJd2Muc2F2ZShmYWxzZSwgbnVsbCk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKGZpbmFsIENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJZmluYWwgU2hlbGwgc2hlbGwgPSBnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKTsKLQkJCQkJc2hlbGwuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKHNoZWxsLCBjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBvdGhlcndpc2UsIHRyeSBSdW4gb24gU2VydmVyCi0JCWZpbmFsIElTZXJ2ZXIgZmluYWxTZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCVJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUgcm9zID0gbmV3IFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUoKSB7Ci0JCQlwdWJsaWMgSVNlcnZlciBnZXRTZXJ2ZXIoSU1vZHVsZSBtb2R1bGUsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJaWYgKCFTZXJ2ZXJVSVBsdWdpbi5pc0NvbXBhdGlibGVXaXRoTGF1bmNoTW9kZShmaW5hbFNlcnZlciwgbGF1bmNoTW9kZSkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCQotCQkJCWlmICghU2VydmVyVXRpbC5jb250YWluc01vZHVsZShmaW5hbFNlcnZlciwgbW9kdWxlLCBtb25pdG9yKSkgewotCQkJCQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBmaW5hbFNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOwotCQkJCQl0cnkgewotCQkJCQkJU2VydmVyVXRpbC5tb2RpZnlNb2R1bGVzKHdjLCBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sIG5ldyBJTW9kdWxlWzBdLCBtb25pdG9yKTsKLQkJCQkJCXdjLnNhdmUoZmFsc2UsIG1vbml0b3IpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCQl0aHJvdyBjZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmluYWxTZXJ2ZXI7Ci0JCQl9Ci0JCX07Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJLy8KLQkJfTsKLQkJcm9zLnNlbGVjdGlvbkNoYW5nZWQoYWN0aW9uLCBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihkYXRhKSk7Ci0JCQotCQkvL2lmICghYWN0aW9uLmlzRW5hYmxlZCgpKQotCQkvLwlyZXR1cm4gZmFsc2U7Ci0JCQotCQlyb3MucnVuKGFjdGlvbik7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHJvcChPYmplY3QgdGFyZ2V0LCBpbnQgb3BlcmF0aW9uLCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJUeXBlKSB7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLypJU2VydmVyIHNlcnZlciA9IG51bGw7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJU2VydmVyKQotCQkJc2VydmVyID0gKElTZXJ2ZXIpIHRhcmdldDsqLwotCQkvL2lmICghU2VydmVyVUlQbHVnaW4uaGFzTW9kdWxlQXJ0aWZhY3QodGFyZ2V0KSkKLQkJLy8JcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKFRyYWNlLkZJTkVSKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfRklORVIsICJEcm9wIHRhcmdldDogIiArIHRhcmdldCArICIgIiArIG9wZXJhdGlvbiArICIgIiArIHRyYW5zZmVyVHlwZSk7Ci0JCX0KLQkJCi0JCWlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoUmVzb3VyY2VUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlclR5cGUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLSAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIHNlbGVjdGlvbiBmcm9tIHRoZSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLgotICAgICogCi0gICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBzZWxlY3Rpb24gZnJvbSB0aGUgTG9jYWxTZWxlY3Rpb25UcmFuc2ZlcgotICAgICovCi0gICAvKnByaXZhdGUgSVJlc291cmNlW10gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKSB7Ci0gICAgICAgQXJyYXlMaXN0IHNlbGVjdGVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldEluc3RhbmNlKCkKLSAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzc2VsLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSZXNvdXJjZXMuYWRkKG8pOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICBJQWRhcHRhYmxlIGEgPSAoSUFkYXB0YWJsZSkgbzsKLSAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UgciA9IChJUmVzb3VyY2UpIGEuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgIGlmIChyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSZXNvdXJjZXMuYWRkKHIpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICByZXR1cm4gKElSZXNvdXJjZVtdKSBzZWxlY3RlZFJlc291cmNlcy50b0FycmF5KG5ldyBJUmVzb3VyY2Vbc2VsZWN0ZWRSZXNvdXJjZXMuc2l6ZSgpXSk7Ci0gICB9Ki8KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2hvd0luQ29uc29sZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1Nob3dJbkNvbnNvbGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlM2VhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2hvd0luQ29uc29sZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLklWaWV3RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5JVmlld1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqICJTaG93IGluIENvbnNvbGUiIG1lbnUgYWN0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgU2hvd0luQ29uc29sZUFjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VydmVyQWN0aW9uIHsKLQkvKioKLQkgKiBTaG93SW5Db25zb2xlQWN0aW9uIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzcCBhIHNlbGVjdGlvbiBwcm92aWRlcgotCSAqLwotCXB1YmxpYyBTaG93SW5Db25zb2xlQWN0aW9uKElTZWxlY3Rpb25Qcm92aWRlciBzcCkgewotCQlzdXBlcihzcCwgIkNvbnNvbGUiKTsKLQkJCi0JCUlWaWV3UmVnaXN0cnkgcmVnID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRWaWV3UmVnaXN0cnkoKTsKLQkJSVZpZXdEZXNjcmlwdG9yIGRlc2MgPSByZWcuZmluZChJQ29uc29sZUNvbnN0YW50cy5JRF9DT05TT0xFX1ZJRVcpOwotCQlzZXRUZXh0KGRlc2MuZ2V0TGFiZWwoKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihkZXNjLmdldEltYWdlRGVzY3JpcHRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJcmV0dXJuIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgCi0JCQkJJiYgc2VydmVyLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVECi0JCQkJJiYgc2VydmVyLmdldExhdW5jaCgpICE9IG51bGwgCi0JCQkJJiYgc2VydmVyLmdldExhdW5jaCgpLmdldFByb2Nlc3NlcygpICE9IG51bGwKLQkJCQkmJiBzZXJ2ZXIuZ2V0TGF1bmNoKCkuZ2V0UHJvY2Vzc2VzKCkubGVuZ3RoID49IDEpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm0oSVNlcnZlciBzZXJ2ZXIpIHsKLQkJdHJ5IHsKLQkJCUlMYXVuY2ggbGF1bmNoID0gc2VydmVyLmdldExhdW5jaCgpOwotCQkJc2VsZWN0UHJvY2VzcyhsYXVuY2guZ2V0UHJvY2Vzc2VzKClbMF0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBvcGVuaW5nIGNvbnNvbGUiLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdFByb2Nlc3MoSVByb2Nlc3MgcHJvY2VzcykgewotCQkvLyBzZWUgYnVnIDI1MDk5OSAtIGRlYnVnIFVJIG11c3QgYmUgbG9hZGVkIGJlZm9yZSBsb29raW5nIGZvciBkZWJ1ZyBjb25zb2xlcwotCQlvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlLmNsYXNzLnRvU3RyaW5nKCk7Ci0JCQotCQlJQ29uc29sZU1hbmFnZXIgY29uc29sZU1hbmFnZXIgPSBDb25zb2xlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb25zb2xlTWFuYWdlcigpOwotCQlJQ29uc29sZVtdIGNvbnNvbGVzID0gY29uc29sZU1hbmFnZXIuZ2V0Q29uc29sZXMoKTsKLQkJaW50IHNpemUgPSBjb25zb2xlcy5sZW5ndGg7Ci0JCUlDb25zb2xlIGNvbnNvbGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGNvbnNvbGVzW2ldIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZSkgewotCQkJCW9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGUgY29uID0gKG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGUpIGNvbnNvbGVzW2ldOwotCQkJCWlmIChwcm9jZXNzLmVxdWFscyhjb24uZ2V0UHJvY2VzcygpKSkKLQkJCQkJY29uc29sZSA9IGNvbnNvbGVzW2ldOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoY29uc29sZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpIDsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gcGFnZS5maW5kVmlldyhJQ29uc29sZUNvbnN0YW50cy5JRF9DT05TT0xFX1ZJRVcpOwotCQkJCWlmIChwYXJ0ID09IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBhcnQgPSBwYWdlLnNob3dWaWV3KElDb25zb2xlQ29uc3RhbnRzLklEX0NPTlNPTEVfVklFVyk7Ci0JCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiQ291bGQgbm90IG9wZW4gY29uc29sZSB2aWV3Iik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCQlwYWdlLmFjdGl2YXRlKHBhcnQpOwotCQkJCQlJQ29uc29sZVZpZXcgdmlldyA9IChJQ29uc29sZVZpZXcpIHBhcnQuZ2V0QWRhcHRlcihJQ29uc29sZVZpZXcuY2xhc3MpOwotCQkJCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQkJCQl2aWV3LnNldEZvY3VzKCk7Ci0JCQkJCQl2aWV3LmRpc3BsYXkoY29uc29sZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1Nob3dJbkRlYnVnQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2hvd0luRGVidWdBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE1YmY1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2hvd0luRGVidWdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z1VJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5JVmlld0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuSVZpZXdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotLyoqCi0gKiAiU2hvdyBpbiBDb25zb2xlIiBtZW51IGFjdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFNob3dJbkRlYnVnQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBY3Rpb24gewotCS8qKgotCSAqIFNob3dJbkNvbnNvbGVBY3Rpb24gY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNwIGEgc2VsZWN0aW9uIHByb3ZpZGVyCi0JICovCi0JcHVibGljIFNob3dJbkRlYnVnQWN0aW9uKElTZWxlY3Rpb25Qcm92aWRlciBzcCkgewotCQlzdXBlcihzcCwgIkNvbnNvbGUhIik7Ci0JCQotCQlJVmlld1JlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0Vmlld1JlZ2lzdHJ5KCk7Ci0JCUlWaWV3RGVzY3JpcHRvciBkZXNjID0gcmVnLmZpbmQoSURlYnVnVUlDb25zdGFudHMuSURfREVCVUdfVklFVyk7Ci0JCXNldFRleHQoZGVzYy5nZXRMYWJlbCgpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGRlc2MuZ2V0SW1hZ2VEZXNjcmlwdG9yKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChJU2VydmVyIHNlcnZlcikgewotCQlyZXR1cm4gKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm0oSVNlcnZlciBzZXJ2ZXIpIHsKLQkJdHJ5IHsKLQkJCUlMYXVuY2ggbGF1bmNoID0gc2VydmVyLmdldExhdW5jaCgpOwotCQkJc2VsZWN0UHJvY2VzcyhsYXVuY2guZ2V0UHJvY2Vzc2VzKClbMF0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBzaG93aW5nIGluIGRlYnVnIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RQcm9jZXNzKElQcm9jZXNzIHByb2Nlc3MpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpIDsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gcGFnZS5maW5kVmlldyhJRGVidWdVSUNvbnN0YW50cy5JRF9ERUJVR19WSUVXKTsKLQkJCQlpZiAocGFydCA9PSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwYXJ0ID0gcGFnZS5zaG93VmlldyhJRGVidWdVSUNvbnN0YW50cy5JRF9ERUJVR19WSUVXKTsKLQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJDb3VsZCBub3Qgb3BlbiBkZWJ1ZyB2aWV3Iik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCQlJRGVidWdWaWV3IHZpZXcgPSAoSURlYnVnVmlldylwYXJ0LmdldEFkYXB0ZXIoSURlYnVnVmlldy5jbGFzcyk7Ci0JCQkJCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCQkJCXZpZXcuc2V0Rm9jdXMoKTsKLQkJCQkJCVZpZXdlciB2aWV3ZXIgPSB2aWV3LmdldFZpZXdlcigpOwotCQkJCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihwcm9jZXNzKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1Nob3dJbk1lbnVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TaG93SW5NZW51QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMzNmODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1Nob3dJbk1lbnVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqICJTaG93SW5NZW51QWN0aW9uIiBtZW51IGFjdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFNob3dJbk1lbnVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCS8qKgotCSAqIFNob3dJbk1lbnVBY3Rpb24gY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNwIGEgc2VsZWN0aW9uIHByb3ZpZGVyCi0JICovCi0JcHVibGljIFNob3dJbk1lbnVBY3Rpb24oZmluYWwgSVNlbGVjdGlvblByb3ZpZGVyIHNwKSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLmFjdGlvblNob3dJbik7Ci0JCQotCQlzZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLnNob3dJblF1aWNrTWVudSIpOwotCQlzZXRNZW51Q3JlYXRvcihuZXcgSU1lbnVDcmVhdG9yKCkgewotCQkJcHJpdmF0ZSBNZW51TWFuYWdlciBtZW51TWFuYWdlcjsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJaWYgKG1lbnVNYW5hZ2VyICE9IG51bGwpCi0JCQkJCW1lbnVNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJCX0KLQotCQkJcHVibGljIE1lbnUgZ2V0TWVudShDb250cm9sIHBhcmVudCkgewotCQkJCXJldHVybiBnZXRNZW51TWFuYWdlcigpLmNyZWF0ZUNvbnRleHRNZW51KHBhcmVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBNZW51IGdldE1lbnUoTWVudSBwYXJlbnQpIHsKLQkJCQkvL3JldHVybiBnZXRNZW51TWFuYWdlcigpLmNyZWF0ZUNvbnRleHRNZW51KHBhcmVudC5nZXRTaGVsbCgpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJcHJpdmF0ZSBNZW51TWFuYWdlciBnZXRNZW51TWFuYWdlcigpIHsKLQkJCQlpZiAobWVudU1hbmFnZXIgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIG1lbnVNYW5hZ2VyOwotCQkJCQotCQkJCW1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKE1lc3NhZ2VzLmFjdGlvblNob3dJbik7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTaG93SW5Db25zb2xlQWN0aW9uKHNwKSk7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTaG93SW5EZWJ1Z0FjdGlvbihzcCkpOwotCQkJCXJldHVybiBtZW51TWFuYWdlcjsKLQkJCX0KLQkJfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TdGFydEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1N0YXJ0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYzU0NTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1N0YXJ0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuVUlEZWNvcmF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotLyoqCi0gKiBTdGFydCBhIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFN0YXJ0QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBY3Rpb24gewotCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZSA9IElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFOwotCQotCXB1YmxpYyBTdGFydEFjdGlvbihTaGVsbCBzaGVsbCwgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlzdXBlcihzaGVsbCwgc2VsZWN0aW9uUHJvdmlkZXIsICJzdGFydCIpOwotCQl0aGlzLmxhdW5jaE1vZGUgPSBsYXVuY2hNb2RlOwotCQlpZiAobGF1bmNoTW9kZSA9PSBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSkgewotCQkJc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uU3RhcnRUb29sVGlwKTsKLQkJCXNldFRleHQoTWVzc2FnZXMuYWN0aW9uU3RhcnQpOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfU1RBUlQpKTsKLQkJCXNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfU1RBUlQpKTsKLQkJCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfU1RBUlQpKTsKLQkJCXNldEFjdGlvbkRlZmluaXRpb25JZCgib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5ydW4iKTsKLQkJfSBlbHNlIGlmIChsYXVuY2hNb2RlID09IElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUpIHsKLQkJCXNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvbkRlYnVnVG9vbFRpcCk7Ci0JCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvbkRlYnVnKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX1NUQVJUX0RFQlVHKSk7Ci0JCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX1NUQVJUX0RFQlVHKSk7Ci0JCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX1NUQVJUX0RFQlVHKSk7Ci0JCQlzZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZGVidWciKTsKLQkJfSBlbHNlIGlmIChsYXVuY2hNb2RlID09IElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERSkgewotCQkJc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uUHJvZmlsZVRvb2xUaXApOwotCQkJc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25Qcm9maWxlKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX1NUQVJUX1BST0ZJTEUpKTsKLQkJCXNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfU1RBUlRfUFJPRklMRSkpOwotCQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9TVEFSVF9QUk9GSUxFKSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXNlbGVjdGlvbkNoYW5nZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgbmFtZSBvZiB0aGUgQWN0aW9uIGxhYmVsLCBkZXBlbmRpbmcgb24gdGhlIHN0YXR1cyBvZiB0aGUgc2VydmVyLgotCSAqIEBwYXJhbSBzZWwgdGhlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZyb20gdGhlIHZpZXcKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlVGV4dChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwpewotCQlpZiAodGhpcy5sYXVuY2hNb2RlID09IElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFKSB7Ci0JCQlpZiAoc2VsLmlzRW1wdHkoKSkgewotCQkJCXNldFRleHQoTWVzc2FnZXMuYWN0aW9uU3RhcnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VsLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBvYmo7Ci0JCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQgfHwKLQkJCQkJCSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKSB7Ci0JCQkJCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblJlc3RhcnQpOwotCQkJCQkJc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uUmVzdGFydFRvb2xUaXApOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25TdGFydCk7Ci0JCQkJCQlzZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25TdGFydFRvb2xUaXApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQkKLQkJfSBlbHNlIGlmICh0aGlzLmxhdW5jaE1vZGUgPT0gSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERSkgewotCQkJaWYgKHNlbC5pc0VtcHR5KCkpIHsKLQkJCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvbkRlYnVnKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlbC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgb2JqOwotCQkJCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEIHx8Ci0JCQkJCQkgc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORykgewotCQkJCQkJc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25EZWJ1Z1Jlc3RhcnQpOwotCQkJCQkJc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uRGVidWdSZXN0YXJ0VG9vbFRpcCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvbkRlYnVnKTsKLQkJCQkJCXNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvbkRlYnVnVG9vbFRpcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodGhpcy5sYXVuY2hNb2RlID09IElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERSkgewotCQkJaWYgKHNlbC5pc0VtcHR5KCkpIHsKLQkJCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblByb2ZpbGUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VsLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBvYmo7Ci0JCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQgfHwKLQkJCQkJCSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKSB7Ci0JCQkJCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblByb2ZpbGVSZXN0YXJ0KTsKLQkJCQkJCXNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvblByb2ZpbGVSZXN0YXJ0VG9vbFRpcCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblByb2ZpbGUpOwotCQkJCQkJc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uUHJvZmlsZVRvb2xUaXApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBzZXJ2ZXIgY2FuIGN1cnJlbnRseSBiZSBhY3RlZCBvbi4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsgLy8gc3RhcnQKLQkJCXJldHVybiBzZXJ2ZXIuY2FuU3RhcnQobGF1bmNoTW9kZSkuaXNPSygpOwotCQl9Ci0JCS8vIHJlc3RhcnQKLQkJU3RyaW5nIG1vZGUyID0gbGF1bmNoTW9kZTsKLQkJaWYgKG1vZGUyID09IG51bGwpCi0JCQltb2RlMiA9IHNlcnZlci5nZXRNb2RlKCk7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgVUlEZWNvcmF0b3JNYW5hZ2VyLmdldFVJRGVjb3JhdG9yKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkpLmNhblJlc3RhcnQoKSAmJiBzZXJ2ZXIuY2FuUmVzdGFydChtb2RlMikuaXNPSygpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm0gYWN0aW9uIG9uIHRoaXMgc2VydmVyLgotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXN0YXJ0KHNlcnZlciwgbGF1bmNoTW9kZSwgc2hlbGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydChJU2VydmVyIHNlcnZlciwgU3RyaW5nIGxhdW5jaE1vZGUsIGZpbmFsIFNoZWxsIHNoZWxsKSB7Ci0JCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKLQkJCWlmICghU2VydmVyVUlQbHVnaW4uc2F2ZUVkaXRvcnMoKSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCS8qZmluYWwgSUFkYXB0YWJsZSBpbmZvID0gbmV3IElBZGFwdGFibGUoKSB7Ci0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKFNoZWxsLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkKLQkJCQkJCXJldHVybiBzaGVsbDsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfTsqLwotCQkJc2VydmVyLnN0YXJ0KGxhdW5jaE1vZGUsIChJT3BlcmF0aW9uTGlzdGVuZXIpbnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2hlbGwgIT0gbnVsbCAmJiAhU2VydmVyVUlQbHVnaW4ucHJvbXB0SWZEaXJ0eShzaGVsbCwgc2VydmVyKSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGxhdW5jaE1vZGUyID0gbGF1bmNoTW9kZTsKLQkJCQlpZiAobGF1bmNoTW9kZTIgPT0gbnVsbCkKLQkJCQkJbGF1bmNoTW9kZTIgPSBzZXJ2ZXIuZ2V0TW9kZSgpOwotCQkJCXNlcnZlci5yZXN0YXJ0KGxhdW5jaE1vZGUyLCAoSU9wZXJhdGlvbkxpc3RlbmVyKSBudWxsKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgcmVzdGFydGluZyBzZXJ2ZXIiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCkgewotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHNlbCk7Ci0JCXVwZGF0ZVRleHQoc2VsKTsJCQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU3RhcnRNb2R1bGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TdGFydE1vZHVsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTQ2NDlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TdGFydE1vZHVsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIFN0YXJ0IGEgbW9kdWxlIG9uIGEgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgU3RhcnRNb2R1bGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgSU1vZHVsZVtdIG1vZHVsZTsKLQotCXB1YmxpYyBTdGFydE1vZHVsZUFjdGlvbihJU2VydmVyIHNlcnZlciwgSU1vZHVsZVtdIG1vZHVsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JCQotCQlzZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblN0YXJ0TW9kdWxlKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfU1RBUlQpKTsKLQkJc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9TVEFSVCkpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX1NUQVJUKSk7Ci0JCXNldEVuYWJsZWQoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVECi0JCQkJJiYgKHNlcnZlci5nZXRNb2R1bGVTdGF0ZShtb2R1bGUpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRAotCQkJCQl8fCBzZXJ2ZXIuZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pCi0JCQkJJiYgc2VydmVyLmNhblJlc3RhcnRNb2R1bGUobW9kdWxlLCBudWxsKS5pc09LKCkpOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBkZWZpbmVkIG9uIDxjb2RlPklBY3Rpb248L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJc2VydmVyLnN0YXJ0TW9kdWxlKG1vZHVsZSwgbnVsbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TdG9wQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU3RvcEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWY0OTVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TdG9wQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotLyoqCi0gKiBTdG9wICh0ZXJtaW5hdGUpIGEgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgU3RvcEFjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VydmVyQWN0aW9uIHsKLQlwdWJsaWMgU3RvcEFjdGlvbihTaGVsbCBzaGVsbCwgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyKSB7Ci0JCXN1cGVyKHNoZWxsLCBzZWxlY3Rpb25Qcm92aWRlciwgTWVzc2FnZXMuYWN0aW9uU3RvcCk7Ci0JCXNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvblN0b3BUb29sVGlwKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfU1RPUCkpOwotCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX1NUT1ApKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9TVE9QKSk7Ci0JCXNldEFjdGlvbkRlZmluaXRpb25JZCgib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zdG9wIik7Ci0JCXRyeSB7Ci0JCQlzZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHNlcnZlciBjYW4gY3VycmVudGx5IGJlIGFjdGVkIG9uLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJiBzZXJ2ZXIuY2FuU3RvcCgpLmlzT0soKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtIGFjdGlvbiBvbiB0aGlzIHNlcnZlci4KLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybShJU2VydmVyIHNlcnZlcikgewotCQlzdG9wKHNlcnZlciwgc2hlbGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdG9wKElTZXJ2ZXIgc2VydmVyLCBTaGVsbCBzaGVsbCkgewotCQlTZXJ2ZXJVSVBsdWdpbi5hZGRUZXJtaW5hdGlvbldhdGNoKHNoZWxsLCBzZXJ2ZXIsIFNlcnZlclVJUGx1Z2luLlNUT1ApOyAvLyBUT0RPIC0gc2hvdWxkIHJlZG8KLQkJCi0JCUlKb2JNYW5hZ2VyIGpvYk1hbmFnZXIgPSBKb2IuZ2V0Sm9iTWFuYWdlcigpOwotCQlKb2JbXSBqb2JzID0gam9iTWFuYWdlci5maW5kKFNlcnZlclV0aWwuU0VSVkVSX0pPQl9GQU1JTFkpOwotCQlmb3IgKEpvYiBqOiBqb2JzKSB7Ci0JCQlpZiAoaiBpbnN0YW5jZW9mIFNlcnZlci5TdGFydEpvYikgewotCQkJCVNlcnZlci5TdGFydEpvYiBzdGFydEpvYiA9IChTZXJ2ZXIuU3RhcnRKb2IpIGo7Ci0JCQkJaWYgKHN0YXJ0Sm9iLmdldFNlcnZlcigpLmVxdWFscyhzZXJ2ZXIpKSB7Ci0JCQkJCXN0YXJ0Sm9iLmNhbmNlbCgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlzZXJ2ZXIuc3RvcChmYWxzZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TdG9wTW9kdWxlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU3RvcE1vZHVsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDdiYjhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TdG9wTW9kdWxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogU3RvcCBhIG1vZHVsZSBvbiBhIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFN0b3BNb2R1bGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgSU1vZHVsZVtdIG1vZHVsZTsKLQotCXB1YmxpYyBTdG9wTW9kdWxlQWN0aW9uKElTZXJ2ZXIgc2VydmVyLCBJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJCi0JCXNldFRleHQoTWVzc2FnZXMuYWN0aW9uU3RvcE1vZHVsZSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX1NUT1ApKTsKLQkJc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9TVE9QKSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfU1RPUCkpOwotCQlzZXRFbmFibGVkKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRAotCQkJCSYmIChzZXJ2ZXIuZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQKLQkJCQkJfHwgc2VydmVyLmdldE1vZHVsZVN0YXRlKG1vZHVsZSkgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKQotCQkJCSYmIHNlcnZlci5jYW5SZXN0YXJ0TW9kdWxlKG1vZHVsZSwgbnVsbCkuaXNPSygpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZGVmaW5lZCBvbiA8Y29kZT5JQWN0aW9uPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXNlcnZlci5zdG9wTW9kdWxlKG1vZHVsZSwgbnVsbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUYWJsZUNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9BYnN0cmFjdFRhYmxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMGY0M2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9BYnN0cmFjdFRhYmxlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRhYmxlQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgVGFibGUgdGFibGU7Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCi0JcHVibGljIEFic3RyYWN0VGFibGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQkKLQkJY3JlYXRlV2lkZ2V0cygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVdpZGdldHMoKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQljcmVhdGVUYWJsZSgpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCWNyZWF0ZVRhYmxlVmlld2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGUoKSB7Ci0JCXRhYmxlID0gbmV3IFRhYmxlKHRoaXMsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWJsZVZpZXdlcigpIHsKLQkJdGFibGVWaWV3ZXIgPSBuZXcgTG9ja2VkVGFibGVWaWV3ZXIodGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZVZpZXdlciBnZXRUYWJsZVZpZXdlcigpIHsKLQkJcmV0dXJuIHRhYmxlVmlld2VyOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsMikgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDI7Ci0JCXJldHVybiBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goT2JqZWN0IG9iaikgewotCQl0YWJsZVZpZXdlci5yZWZyZXNoKG9iaik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdCBvYmopIHsKLQkJdGFibGVWaWV3ZXIucmVtb3ZlKG9iaik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZChPYmplY3Qgb2JqKSB7Ci0JCXRhYmxlVmlld2VyLmFkZChvYmopOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Fic3RyYWN0VHJlZUNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9BYnN0cmFjdFRyZWVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU1ZDAyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Fic3RyYWN0VHJlZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRmlsdGVyZWRUcmVlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIEZpbHRlcmVkVHJlZSB0cmVlOwotCXByb3RlY3RlZCBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0JcHJvdGVjdGVkIExhYmVsIGRlc2NyaXB0aW9uOwotCi0JcHVibGljIEFic3RyYWN0VHJlZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQkKLQkJY3JlYXRlV2lkZ2V0cygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVdpZGdldHMoKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMzsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDM7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXNldExheW91dChsYXlvdXQpOwotCQkKLQkJU3RyaW5nIGRlc2NyaXB0aW9uVGV4dCA9IGdldERlc2NyaXB0aW9uTGFiZWwoKTsKLQkJaWYgKGRlc2NyaXB0aW9uVGV4dCAhPSBudWxsKSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuV1JBUCk7Ci0JCQlsYWJlbC5zZXRUZXh0KGRlc2NyaXB0aW9uVGV4dCk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCX0KLQkJCi0JCVN0cmluZyBkZXRhaWxzID0gZ2V0RGV0YWlsc0xhYmVsKCk7Ci0JCWlmIChkZXRhaWxzICE9IG51bGwpIHsKLQkJCUxpbmsgcHJlZkxpbmsgPSBuZXcgTGluayh0aGlzLCBTV1QuTk9ORSk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJcHJlZkxpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCXByZWZMaW5rLnNldFRleHQoIjxhPiIgKyBkZXRhaWxzICsgIjwvYT4iKTsKLQkJCXByZWZMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJZGV0YWlsc1NlbGVjdGVkKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChnZXRUaXRsZUxhYmVsKCkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCWlmIChkZXNjcmlwdGlvblRleHQgIT0gbnVsbCAmJiBkZXRhaWxzID09IG51bGwpCi0JCQlkYXRhLnZlcnRpY2FsSW5kZW50ID0gNzsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQljcmVhdGVUcmVlKCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRyZWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCXRyZWVWaWV3ZXIgPSB0cmVlLmdldFZpZXdlcigpOwotCQl0cmVlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotCQl0cmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpZiAodHJlZVZpZXdlci5pc0V4cGFuZGFibGUoZWxlbWVudCkpCi0JCQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShlbGVtZW50LCAhdHJlZVZpZXdlci5nZXRFeHBhbmRlZFN0YXRlKGVsZW1lbnQpKTsKLQkJICAgIH0KLQkJfSk7Ci0JCQotCQlpZiAoaGFzRGVzY3JpcHRpb24oKSkgewotCQkJZGVzY3JpcHRpb24gPSBuZXcgTGFiZWwodGhpcywgU1dULldSQVApOwotCQkJZGVzY3JpcHRpb24uc2V0VGV4dCgiTXVsdGlcbkxpbmVcbk1lc3NhZ2UiKTsKLQkJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQodGhpcyk7Ci0JCQlQb2ludCBwID0gZGVzY3JpcHRpb24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCWRlc2NyaXB0aW9uLnNldFRleHQoIiIpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlpZiAocC55ID4gMTApCi0JCQkJZGF0YS5oZWlnaHRIaW50ID0gcC55OwotCQkJZWxzZQotCQkJCWRhdGEuaGVpZ2h0SGludCA9IDQyOwotCQkJZGVzY3JpcHRpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJfQotCQkKLQkJdHJlZS5mb3JjZUZvY3VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVHJlZSgpIHsKLQkJdHJlZSA9IG5ldyBGaWx0ZXJlZFRyZWUodGhpcywgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5TSU5HTEUsIG5ldyBTZXJ2ZXJQYXR0ZXJuRmlsdGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVzY3JpcHRpb25MYWJlbCgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRUaXRsZUxhYmVsKCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHRleHQpIHsKLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwgJiYgdGV4dCAhPSBudWxsKQotCQkJZGVzY3JpcHRpb24uc2V0VGV4dCh0ZXh0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJlZVZpZXdlciBnZXRUcmVlVmlld2VyKCkgewotCQlyZXR1cm4gdHJlZVZpZXdlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbDIpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWwyOwotCQlyZXR1cm4gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goT2JqZWN0IG9iaikgewotCQl0cmVlVmlld2VyLnJlZnJlc2gob2JqKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoT2JqZWN0IG9iaikgewotCQl0cmVlVmlld2VyLnJlbW92ZShvYmopOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGV0YWlsc0xhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZXRhaWxzU2VsZWN0ZWQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9BYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMzNkMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9BYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotLyoqCi0gKiBSdW50aW1lIHR5cGUgY29udGVudCBwcm92aWRlci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gInJvb3QiOwotCi0JcHJvdGVjdGVkIE9iamVjdCBpbml0aWFsU2VsZWN0aW9uOwotCi0JcHVibGljIGNsYXNzIFRyZWVFbGVtZW50IHsKLQkJcHVibGljIFN0cmluZyB0ZXh0OwotCQlwdWJsaWMgTGlzdDxPYmplY3Q+IGNvbnRlbnRzOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3RbXSBlbGVtZW50czsKLQlwcm90ZWN0ZWQgTWFwPE9iamVjdCwgVHJlZUVsZW1lbnQ+IGVsZW1lbnRUb1BhcmVudE1hcCA9IG5ldyBIYXNoTWFwPE9iamVjdCwgVHJlZUVsZW1lbnQ+KDIpOwotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBUcmVlRWxlbWVudD4gdGV4dE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVHJlZUVsZW1lbnQ+KDIpOwotCi0JLyoqCi0JICogQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCWZpbGxUcmVlKCk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlcihib29sZWFuIGluaXQpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmaWxsVHJlZSgpOwotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW4oKSB7Ci0JCWVsZW1lbnRzID0gbnVsbDsKLQkJZWxlbWVudFRvUGFyZW50TWFwID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBUcmVlRWxlbWVudD4oMik7Ci0JCXRleHRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFRyZWVFbGVtZW50PigyKTsKLQkJCi0JCWluaXRpYWxTZWxlY3Rpb24gPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBUcmVlRWxlbWVudCBnZXRPckNyZWF0ZShMaXN0PFRyZWVFbGVtZW50PiBsaXN0LCBTdHJpbmcgdGV4dCkgewotCQl0cnkgewotCQkJT2JqZWN0IG9iaiA9IHRleHRNYXAuZ2V0KHRleHQpOwotCQkJaWYgKG9iaiAhPSBudWxsKQotCQkJCXJldHVybiAoVHJlZUVsZW1lbnQpIG9iajsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlUcmVlRWxlbWVudCBlbGVtZW50ID0gbmV3IFRyZWVFbGVtZW50KCk7Ci0JCWVsZW1lbnQudGV4dCA9IHRleHQ7Ci0JCWVsZW1lbnQuY29udGVudHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJdGV4dE1hcC5wdXQodGV4dCwgZWxlbWVudCk7Ci0JCWxpc3QuYWRkKGVsZW1lbnQpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRyZWVFbGVtZW50IGdldE9yQ3JlYXRlKExpc3Q8VHJlZUVsZW1lbnQ+IGxpc3QsIFN0cmluZyBpZCwgU3RyaW5nIHRleHQpIHsKLQkJdHJ5IHsKLQkJCU9iamVjdCBvYmogPSB0ZXh0TWFwLmdldChpZCk7Ci0JCQlpZiAob2JqICE9IG51bGwpCi0JCQkJcmV0dXJuIChUcmVlRWxlbWVudCkgb2JqOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVRyZWVFbGVtZW50IGVsZW1lbnQgPSBuZXcgVHJlZUVsZW1lbnQoKTsKLQkJZWxlbWVudC50ZXh0ID0gdGV4dDsKLQkJZWxlbWVudC5jb250ZW50cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQl0ZXh0TWFwLnB1dChpZCwgZWxlbWVudCk7Ci0JCWxpc3QuYWRkKGVsZW1lbnQpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJlZUVsZW1lbnQgZ2V0QnlUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGV4dE1hcC5nZXQodGV4dCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgVHJlZUVsZW1lbnQgZ2V0UGFyZW50SW1wbChPYmplY3Qgb2JqKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudFRvUGFyZW50TWFwLmdldChvYmopOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBvZiB0aGlzIGNvbnRlbnQgcHJvdmlkZXIuICAKLQkgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgdmlld2VyIHdoZW4gaXQgaXMgZGlzcG9zZWQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlciAKLQkgKiB3aGVuIGl0cyBpbnB1dCBpcyBzZXQgdG8gdGhlIGdpdmVuIGVsZW1lbnQuIAotCSAqIFRoZXNlIGVsZW1lbnRzIGNhbiBiZSBwcmVzZW50ZWQgYXMgcm93cyBpbiBhIHRhYmxlLCBpdGVtcyBpbiBhIGxpc3QsIGV0Yy4KLQkgKiBUaGUgcmVzdWx0IGlzIG5vdCBtb2RpZmllZCBieSB0aGUgdmlld2VyLgotCSAqCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIGlucHV0IGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgVHJlZUVsZW1lbnQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlUcmVlRWxlbWVudCBydGUgPSAoVHJlZUVsZW1lbnQpIGVsZW1lbnQ7Ci0JCXJldHVybiBydGUuY29udGVudHMudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRQYXJlbnRJbXBsKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCXJldHVybiBjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDA7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBjb250ZW50IHByb3ZpZGVyIHRoYXQgdGhlIGdpdmVuIHZpZXdlcidzIGlucHV0Ci0JICogaGFzIGJlZW4gc3dpdGNoZWQgdG8gYSBkaWZmZXJlbnQgZWxlbWVudC4KLQkgKiA8cD4KLQkgKiBBIHR5cGljYWwgdXNlIGZvciB0aGlzIG1ldGhvZCBpcyByZWdpc3RlcmluZyB0aGUgY29udGVudCBwcm92aWRlciBhcyBhIGxpc3RlbmVyCi0JICogdG8gY2hhbmdlcyBvbiB0aGUgbmV3IGlucHV0ICh1c2luZyBtb2RlbC1zcGVjaWZpYyBtZWFucyksIGFuZCBkZXJlZ2lzdGVyaW5nIHRoZSB2aWV3ZXIgCi0JICogZnJvbSB0aGUgb2xkIGlucHV0LiBJbiByZXNwb25zZSB0byB0aGVzZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucywgdGhlIGNvbnRlbnQgcHJvdmlkZXIKLQkgKiBwcm9wYWdhdGVzIHRoZSBjaGFuZ2VzIHRvIHRoZSB2aWV3ZXIuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHZpZXdlciB0aGUgdmlld2VyCi0JICogQHBhcmFtIG9sZElucHV0IHRoZSBvbGQgaW5wdXQgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZpZXdlcgotCSAqICAgZGlkIG5vdCBwcmV2aW91c2x5IGhhdmUgYW4gaW5wdXQKLQkgKiBAcGFyYW0gbmV3SW5wdXQgdGhlIG5ldyBpbnB1dCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdmlld2VyCi0JICogICBkb2VzIG5vdCBoYXZlIGFuIGlucHV0Ci0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGdldEFsbE9iamVjdHMoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCU9iamVjdFtdIG9iaiA9IGdldEVsZW1lbnRzKG51bGwpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gb2JqLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKCEob2JqW2ldIGluc3RhbmNlb2YgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlRyZWVFbGVtZW50KSkKLQkJCQkJbGlzdC5hZGQob2JqW2ldKTsKLQkJCQlnZXRBbGxDaGlsZHJlbihsaXN0LCBvYmpbaV0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0QWxsQ2hpbGRyZW4oTGlzdDxPYmplY3Q+IGxpc3QsIE9iamVjdCBlbGVtZW50KSB7Ci0JCU9iamVjdFtdIG9iaiA9IGdldENoaWxkcmVuKGVsZW1lbnQpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gb2JqLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKCEob2JqW2ldIGluc3RhbmNlb2YgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlRyZWVFbGVtZW50KSkKLQkJCQkJbGlzdC5hZGQob2JqW2ldKTsKLQkJCQlnZXRBbGxDaGlsZHJlbihsaXN0LCBvYmpbaV0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbml0aWFsU2VsZWN0aW9uKCkgewotCQlpZiAoaW5pdGlhbFNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQlJbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIgaXNwID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlpbml0aWFsU2VsZWN0aW9uID0gaXNwLmdldEluaXRpYWxTZWxlY3Rpb24oZ2V0QWxsT2JqZWN0cygpKTsKLQkJfQotCQlyZXR1cm4gaW5pdGlhbFNlbGVjdGlvbjsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRJbml0aWFsU2VsZWN0aW9uKElQcm9qZWN0IHByb2plY3QpewotCQlpZiAoaW5pdGlhbFNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQlJbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIgaXNwID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlpbml0aWFsU2VsZWN0aW9uID0gaXNwLmdldEluaXRpYWxTZWxlY3Rpb24oZ2V0QWxsT2JqZWN0cygpLHByb2plY3QpOwotCQl9Ci0JCXJldHVybiBpbml0aWFsU2VsZWN0aW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Fic3RyYWN0VHJlZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUcmVlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGRiZjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUcmVlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0vKioKLSAqIEFic3RyYWN0IHRyZWUgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRyZWVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIEEgc3RhbmRhcmQgdHJlZSBsYWJlbCBwcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RUcmVlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBIHN0YW5kYXJkIHRyZWUgbGFiZWwgcHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGRlY29yYXRvciBhIGxhYmVsIGRlY29yYXRvciwgb3IgbnVsbCBpZiBubyBkZWNvcmF0b3IgaXMgcmVxdWlyZWQKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RUcmVlTGFiZWxQcm92aWRlcihJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yKSB7Ci0JCXN1cGVyKGRlY29yYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBCYXNlTGFiZWxQcm92aWRlciNnZXRJbWFnZShPYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlci5UcmVlRWxlbWVudCkgewotCQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotCQkJcmV0dXJuIHNoYXJlZEltYWdlcy5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpfRk9MREVSKTsKLQkJfQotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlSW1wbChlbGVtZW50KTsKLQkJaWYgKGRlY29yYXRvciAhPSBudWxsKSB7Ci0JCQlJbWFnZSBkZWMgPSBkZWNvcmF0b3IuZGVjb3JhdGVJbWFnZShpbWFnZSwgZWxlbWVudCk7Ci0JCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJcmV0dXJuIGRlYzsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGltYWdlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAgCi0JICogQHBhcmFtIGVsZW1lbnQgYW4gZWxlbWVudAotCSAqIEByZXR1cm4gYW4gaW1hZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSW1hZ2UgZ2V0SW1hZ2VJbXBsKE9iamVjdCBlbGVtZW50KTsKLQotCS8qKgotCSAqIEBzZWUgQmFzZUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlci5UcmVlRWxlbWVudCkgewotCQkJcmV0dXJuICgoU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlci5UcmVlRWxlbWVudCkgZWxlbWVudCkudGV4dDsKLQkJfQotCQlTdHJpbmcgdGV4dCA9IGdldFRleHRJbXBsKGVsZW1lbnQpOwotCQlpZiAoZGVjb3JhdG9yICE9IG51bGwpIHsKLQkJCVN0cmluZyBkZWMgPSBkZWNvcmF0b3IuZGVjb3JhdGVUZXh0KHRleHQsIGVsZW1lbnQpOwotCQkJaWYgKGRlYyAhPSBudWxsICYmICFkZWMuZXF1YWxzKCIiKSkKLQkJCQlyZXR1cm4gZGVjOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAgCi0JICogQHBhcmFtIGVsZW1lbnQgYW4gZWxlbWVudAotCSAqIEByZXR1cm4gYSBsYWJlbAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VGV4dEltcGwoT2JqZWN0IGVsZW1lbnQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQmFzZUNlbGxMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Jhc2VDZWxsTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmRlYTRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQmFzZUNlbGxMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0vKioKLSAqIEEgYmFzaWMgY2VsbCBsYWJlbCBwcm92aWRlci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VDZWxsTGFiZWxQcm92aWRlciBleHRlbmRzIENvbHVtbkxhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yOwotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlckxpc3RlbmVyIHByb3ZpZGVyTGlzdGVuZXI7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxhYmVsUHJvdmlkZXIjdXBkYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ2VsbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoVmlld2VyQ2VsbCBjZWxsKXsKLQkJc3VwZXIudXBkYXRlKGNlbGwpOwotCQlPYmplY3QgZWxlbWVudCA9IGNlbGwuZ2V0RWxlbWVudCgpOwotCQlpbnQgaW5kZXggPSBjZWxsLmdldENvbHVtbkluZGV4KCk7Ci0JCWNlbGwuc2V0VGV4dChnZXRDb2x1bW5UZXh0KGVsZW1lbnQsaW5kZXgpKTsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRDb2x1bW5JbWFnZShlbGVtZW50LCBpbmRleCk7Ci0JCWNlbGwuc2V0SW1hZ2UoaW1hZ2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIEJhc2VDZWxsTGFiZWxQcm92aWRlcgotCSAqLwotCXB1YmxpYyBCYXNlQ2VsbExhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7CQkKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBCYXNlQ2VsbExhYmVsUHJvdmlkZXIgd2l0aCBhIGRlY29yYXRvciBhdCB0aGUgZnJvbnQgb2YgdGhlIHJvdwotCSAqIEBwYXJhbSBkZWNvcmF0b3IKLQkgKi8KLQlwdWJsaWMgQmFzZUNlbGxMYWJlbFByb3ZpZGVyKElMYWJlbERlY29yYXRvciBkZWNvcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJCQotCQl0aGlzLmRlY29yYXRvciA9IGdldERlY29yYXRvcigpOwotCX0gCi0KLQlwdWJsaWMgUG9pbnQgZ2V0VG9vbFRpcFNoaWZ0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG5ldyBQb2ludCg1LCA1KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRvb2xUaXBEaXNwbGF5RGVsYXlUaW1lKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIDIwMDA7Ci0JfQotCi0JcHVibGljIGludCBnZXRUb29sVGlwVGltZURpc3BsYXllZChPYmplY3Qgb2JqZWN0KSB7CQotCQlyZXR1cm4gNTAwMDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGRlY29yYXRvciAhPSBudWxsICYmIHByb3ZpZGVyTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJZGVjb3JhdG9yLnJlbW92ZUxpc3RlbmVyKHByb3ZpZGVyTGlzdGVuZXIpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JcHVibGljIElMYWJlbERlY29yYXRvciBnZXREZWNvcmF0b3IoKXsKLQkJaWYgKGRlY29yYXRvciA9PSBudWxsKXsKLQkJCWRlY29yYXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCk7Ci0JCQlwcm92aWRlckxpc3RlbmVyID0gbmV3IElMYWJlbFByb3ZpZGVyTGlzdGVuZXIoKSB7Ci0JCQkJQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQotCQkJCXB1YmxpYyB2b2lkIGxhYmVsUHJvdmlkZXJDaGFuZ2VkKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9OwotCQkJZGVjb3JhdG9yLmFkZExpc3RlbmVyKHByb3ZpZGVyTGlzdGVuZXIpOwotCQl9Ci0JCXJldHVybiBkZWNvcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kZXJzIG9mIHRoaXMgY2xhc3Mgd291bGQgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgYW4gaW1hZ2UgdG8gdGhlIGNvbHVtbiBiYXNlZCBvbiB0aGUgZWxlbWVudCAKLQkgKiBiZWluZyBwYXNzZWQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBpbmRleAotCSAqIEByZXR1cm4gYW4gaW1hZ2UKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCk7Ci0KLQkvKioKLSAgICAqIEV4dGVuZGVycyBvZiB0aGlzIGNsYXNzIHdvdWxkIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGEgdGV4dCBsYWJlbCB0byB0aGUgY29sdW1uIGJhc2VkIG9uIHRoZSBlbGVtZW50Ci0gICAgKiBiZWluZyBwYXNzZWQgCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcmV0dXJuIGEgc3RyaW5nCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgaW5kZXgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQmFzZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9CYXNlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NTUyYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9CYXNlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCXB1YmxpYyBCYXNlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Jhc2VMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Jhc2VMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNGMyZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9CYXNlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIEEgYmFzaWMgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcjsKLQlwcml2YXRlIHRyYW5zaWVudCBMaXN0PElMYWJlbFByb3ZpZGVyTGlzdGVuZXI+IGxpc3RlbmVyczsKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgcHJvdmlkZXJMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgYmFzaWMgSUxhYmVsUHJvdmlkZXIgd2l0aCBubyBkZWNvcmF0b3IuCi0JICovCi0JcHVibGljIEJhc2VMYWJlbFByb3ZpZGVyKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQotCS8qKgotCSAqIEEgYmFzaWMgSUxhYmVsUHJvdmlkZXIgd2l0aCBzdXBwb3J0IGZvciBhIGRlY29yYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZGVjb3JhdG9yIGEgbGFiZWwgZGVjb3JhdG9yLCBvciBudWxsIGlmIG5vIGRlY29yYXRvciBpcyByZXF1aXJlZAotCSAqLwotCXB1YmxpYyBCYXNlTGFiZWxQcm92aWRlcihJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChkZWNvcmF0b3IgPT0gbnVsbCkKLQkJCWRlY29yYXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCk7Ci0JCQotCQl0aGlzLmRlY29yYXRvciA9IGRlY29yYXRvcjsKLQkJaWYgKGRlY29yYXRvciAhPSBudWxsKSB7Ci0JCQlwcm92aWRlckxpc3RlbmVyID0gbmV3IElMYWJlbFByb3ZpZGVyTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlmaXJlTGlzdGVuZXIoZXZlbnQpOwotCQkJCX0KLQkJCX07Ci0JCQlkZWNvcmF0b3IuYWRkTGlzdGVuZXIocHJvdmlkZXJMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gYXZvaWQgaGF2aW5nIGEgbGFiZWwgZGVjb3JhdG9yLiBUaGlzIG1ldGhvZCBpcyBOT1QgQVBJLgotCSAqIAotCSAqIEBwYXJhbSBub0RlY29yYXRvcgotCSAqLwotCXB1YmxpYyBCYXNlTGFiZWxQcm92aWRlcihib29sZWFuIG5vRGVjb3JhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyIGNhbm5vdCBiZSBudWxsIik7Ci0JCQotCQlpZiAobGlzdGVuZXJzID09IG51bGwpCi0JCQlsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElMYWJlbFByb3ZpZGVyTGlzdGVuZXI+KCk7Ci0JCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMaXN0ZW5lciBjYW5ub3QgYmUgbnVsbCIpOwotCQkKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKQotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUxpc3RlbmVyKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGxpc3RlbmVycyA9PSBudWxsIHx8IGxpc3RlbmVycy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCQotCQlpbnQgc2l6ZSA9IGxpc3RlbmVycy5zaXplKCk7Ci0JCUlMYWJlbFByb3ZpZGVyTGlzdGVuZXJbXSBzcmwgPSBuZXcgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcltzaXplXTsKLQkJbGlzdGVuZXJzLnRvQXJyYXkoc3JsKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCXNybFtpXS5sYWJlbFByb3ZpZGVyQ2hhbmdlZChldmVudCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiICBFcnJvciBmaXJpbmcgbGFiZWwgY2hhbmdlIGV2ZW50IHRvICIgKyBzcmxbaV0sIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGRlY29yYXRvciAhPSBudWxsKQotCQkJZGVjb3JhdG9yLnJlbW92ZUxpc3RlbmVyKHByb3ZpZGVyTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5vdE51bGwoU3RyaW5nIHMpIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsKLQkJcmV0dXJuIHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9EZWZhdWx0Vmlld2VyU29ydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0RlZmF1bHRWaWV3ZXJTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdmNjE1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0RlZmF1bHRWaWV3ZXJTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci0vKioKLSAqIENsYXNzIHVzZWQgdG8gc29ydCBjYXRlZ29yaWVzLCBydW50aW1lIHR5cGVzLCBhbmQgc2VydmVyIHR5cGVzIGluIHRoZQotICogTmV3IHdpemFyZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Vmlld2VyU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFZlcnNpb24gaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUlMgPSAiLiwiOwotCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nW10gc2VnbWVudHM7Ci0KLQkJcHJpdmF0ZSBWZXJzaW9uKFN0cmluZ1tdIHNlZ21lbnRzKSB7Ci0JCQl0aGlzLnNlZ21lbnRzID0gc2VnbWVudHM7Ci0JCX0KLQotCQlwdWJsaWMgc3RhdGljIFZlcnNpb24gcGFyc2VWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2ZXJzaW9uLCBTRVBBUkFUT1JTLCBmYWxzZSk7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQotCQkJCWxpc3QuYWRkKHN0Lm5leHRUb2tlbigpKTsKLQkJCQotCQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHMpOwotCQkJcmV0dXJuIG5ldyBWZXJzaW9uKHMpOwotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgY29tcGFyZVRvKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCQl0cnkgewotCQkJCWludCBpMSA9IEludGVnZXIucGFyc2VJbnQoczEpOwotCQkJCWludCBpMiA9IEludGVnZXIucGFyc2VJbnQoczIpOwotCQkJCWlmIChpMSA9PSBpMikKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJaWYgKGkxID4gaTIpCi0JCQkJCXJldHVybiAxOwotCQkJCXJldHVybiAtMTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQlyZXR1cm4gczEuY29tcGFyZVRvKHMyKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvYmplY3QpIHsKLQkJCWlmIChvYmplY3QgPT0gdGhpcykKLQkJCQlyZXR1cm4gMDsKLQkJCQotCQkJVmVyc2lvbiBvdGhlciA9IChWZXJzaW9uKSBvYmplY3Q7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IHNlZ21lbnRzLmxlbmd0aCAmJiBpIDwgb3RoZXIuc2VnbWVudHMubGVuZ3RoKSB7Ci0JCQkJU3RyaW5nIHMxID0gc2VnbWVudHNbaV07Ci0JCQkJU3RyaW5nIHMyID0gb3RoZXIuc2VnbWVudHNbaV07Ci0JCQkJaW50IGMgPSBjb21wYXJlVG8oczEsIHMyKTsKLQkJCQlpZiAoYyAhPSAwKQotCQkJCQlyZXR1cm4gYzsKLQkJCQlpKys7Ci0JCQl9Ci0JCQkKLQkJCWlmIChpID09IHNlZ21lbnRzLmxlbmd0aCAmJiBpID09IG90aGVyLnNlZ21lbnRzLmxlbmd0aCkKLQkJCQlyZXR1cm4gMDsKLQkJCQotCQkJaWYgKGkgPT0gc2VnbWVudHMubGVuZ3RoKQotCQkJCXJldHVybiAtMTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBWaWV3ZXJTb3J0ZXIjY29tcGFyZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJaWYgKG8xIGluc3RhbmNlb2YgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlRyZWVFbGVtZW50KQotCQkJbzEgPSAoKEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5UcmVlRWxlbWVudCkgbzEpLnRleHQ7Ci0JCQotCQlpZiAobzIgaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpCi0JCQlvMiA9ICgoQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlRyZWVFbGVtZW50KSBvMikudGV4dDsKLQkJCi0JCS8vIGZpbHRlciBvdXQgc3RyaW5ncwotCQlpZiAobzEgaW5zdGFuY2VvZiBTdHJpbmcgJiYgbzIgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQlyZXR1cm4gY29tcGFyZUNhdGVnb3JpZXMoKFN0cmluZykgbzEsIChTdHJpbmcpIG8yKTsKLQkJaWYgKG8xIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJcmV0dXJuIC0xOwotCQlpZiAobzIgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQlyZXR1cm4gMTsKLQkJCi0JCWlmIChvMSBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSAmJiBvMiBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSkKLQkJCXJldHVybiBjb21wYXJlUnVudGltZVR5cGVzKChJUnVudGltZVR5cGUpIG8xLCAoSVJ1bnRpbWVUeXBlKSBvMik7Ci0JCQotCQlpZiAobzEgaW5zdGFuY2VvZiBJU2VydmVyVHlwZSAmJiBvMiBpbnN0YW5jZW9mIElTZXJ2ZXJUeXBlKQotCQkJcmV0dXJuIGNvbXBhcmVTZXJ2ZXJUeXBlcygoSVNlcnZlclR5cGUpIG8xLCAoSVNlcnZlclR5cGUpIG8yKTsKLQkJCi0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIFNvcnQgdHdvIGNhdGVnb3J5IG5hbWVzLgotCSAqIAotCSAqIEBwYXJhbSBzMSB0aGUgZmlyc3QgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gczIgdGhlIHNlY29uZCBjYXRlZ29yeQotCSAqIEByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgbGVzcyAgdGhhbiB0aGUgCi0JICogICAgc2Vjb25kIGVsZW1lbnQ7IHRoZSB2YWx1ZSA8Y29kZT4wPC9jb2RlPiBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcwotCSAqICAgIGVxdWFsIHRvIHRoZSBzZWNvbmQgZWxlbWVudDsgYW5kIGEgcG9zaXRpdmUgbnVtYmVyIGlmIHRoZSBmaXJzdAotCSAqICAgIGVsZW1lbnQgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQgZWxlbWVudAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgaW50IGNvbXBhcmVDYXRlZ29yaWVzKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCXRyeSB7Ci0JCQlWZXJzaW9uIHYxID0gVmVyc2lvbi5wYXJzZVZlcnNpb24oczEpOwotCQkJVmVyc2lvbiB2MiA9IFZlcnNpb24ucGFyc2VWZXJzaW9uKHMyKTsKLQkJCQotCQkJcmV0dXJuIHYxLmNvbXBhcmVUbyh2Mik7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCQotCQlyZXR1cm4gczEuY29tcGFyZVRvKHMyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0d28gaXRlbXMgYXJlIGluIHRoZSBzYW1lICdmYW1pbHknLCBhbmQKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBwYXJhbSBzMSAtIGZpcnN0IG5hbWUKLQkgKiBAcGFyYW0gdjEgLSBmaXJzdCB2ZXJzaW9uCi0JICogQHBhcmFtIHMyIC0gc2Vjb25kIG5hbWUKLQkgKiBAcGFyYW0gdjIgLSBzZWNvbmQgdmVyc2lvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR3byBpdGVtcyBhcmUgaW4gdGhlIHNhbWUgJ2ZhbWlseScsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNTYW1lRmFtaWx5KFN0cmluZyBzMSwgU3RyaW5nIHYxLCBTdHJpbmcgczIsIFN0cmluZyB2MikgewotCQlpZiAoczEgPT0gbnVsbCB8fCBzMiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKHYxICE9IG51bGwpIHsKLQkJCWludCBpbmQgPSBzMS5pbmRleE9mKHYxKTsKLQkJCWlmIChpbmQgPj0gMCkKLQkJCQlzMSA9IHMxLnN1YnN0cmluZygwLCBpbmQpICsgczEuc3Vic3RyaW5nKGluZCt2MS5sZW5ndGgoKSk7Ci0JCX0KLQkJCi0JCWlmICh2MiAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kID0gczIuaW5kZXhPZih2Mik7Ci0JCQlpZiAoaW5kID49IDApCi0JCQkJczIgPSBzMi5zdWJzdHJpbmcoMCwgaW5kKSArIHMyLnN1YnN0cmluZyhpbmQrdjIubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiAoczEuZXF1YWxzKHMyKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgY29tcGFyZVZlcnNpb25zKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCVZlcnNpb24gdjEgPSBWZXJzaW9uLnBhcnNlVmVyc2lvbihzMSk7Ci0JCVZlcnNpb24gdjIgPSBWZXJzaW9uLnBhcnNlVmVyc2lvbihzMik7Ci0JCQotCQlyZXR1cm4gdjEuY29tcGFyZVRvKHYyKTsKLQl9Ci0KLQkvKioKLQkgKiBTb3J0IHR3byBydW50aW1lIHR5cGVzLgotCSAqIAotCSAqIEBwYXJhbSByMSB0aGUgZmlyc3QgcnVudGltZSB0eXBlCi0JICogQHBhcmFtIHIyIHRoZSBzZWNvbmQgcnVudGltZSB0eXBlCi0JICogQHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBsZXNzICB0aGFuIHRoZSAKLQkgKiAgICBzZWNvbmQgZWxlbWVudDsgdGhlIHZhbHVlIDxjb2RlPjA8L2NvZGU+IGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzCi0JICogICAgZXF1YWwgdG8gdGhlIHNlY29uZCBlbGVtZW50OyBhbmQgYSBwb3NpdGl2ZSBudW1iZXIgaWYgdGhlIGZpcnN0Ci0JICogICAgZWxlbWVudCBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZCBlbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgY29tcGFyZVJ1bnRpbWVUeXBlcyhJUnVudGltZVR5cGUgcjEsIElSdW50aW1lVHlwZSByMikgewotCQlpZiAoaXNTYW1lRmFtaWx5KHIxLmdldE5hbWUoKSwgcjEuZ2V0VmVyc2lvbigpLCByMi5nZXROYW1lKCksIHIyLmdldFZlcnNpb24oKSkpCi0JCQlyZXR1cm4gY29tcGFyZVZlcnNpb25zKHIxLmdldFZlcnNpb24oKSwgcjIuZ2V0VmVyc2lvbigpKTsKLQkJCi0JCXJldHVybiByMS5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyMi5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFNvcnQgdHdvIHNlcnZlciB0eXBlcy4KLQkgKiAKLQkgKiBAcGFyYW0gczEgdGhlIGZpcnN0IHNlcnZlciB0eXBlCi0JICogQHBhcmFtIHMyIHRoZSBzZWNvbmQgc2VydmVyIHR5cGUKLQkgKiBAcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyIGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzIGxlc3MgIHRoYW4gdGhlIAotCSAqICAgIHNlY29uZCBlbGVtZW50OyB0aGUgdmFsdWUgPGNvZGU+MDwvY29kZT4gaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMKLQkgKiAgICBlcXVhbCB0byB0aGUgc2Vjb25kIGVsZW1lbnQ7IGFuZCBhIHBvc2l0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QKLQkgKiAgICBlbGVtZW50IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBjb21wYXJlU2VydmVyVHlwZXMoSVNlcnZlclR5cGUgczEsIElTZXJ2ZXJUeXBlIHMyKSB7Ci0JCUlSdW50aW1lVHlwZSByMSA9IHMxLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCUlSdW50aW1lVHlwZSByMiA9IHMyLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCWlmIChyMSAhPSBudWxsICYmIHIyICE9IG51bGwpIHsKLQkJCWlmIChpc1NhbWVGYW1pbHkoczEuZ2V0TmFtZSgpLCByMS5nZXRWZXJzaW9uKCksIHMyLmdldE5hbWUoKSwgcjIuZ2V0VmVyc2lvbigpKSkKLQkJCQlyZXR1cm4gY29tcGFyZVZlcnNpb25zKHIxLmdldFZlcnNpb24oKSwgcjIuZ2V0VmVyc2lvbigpKTsKLQkJfQotCQkKLQkJcmV0dXJuIHMxLmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHMyLmdldE5hbWUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSUxvY2tlZExhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSUxvY2tlZExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE3MWUwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0lMb2NrZWRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLS8qKgotICogRXh0ZW5kcyA8Y29kZT5JVGFibGVMYWJlbFByb3ZpZGVyPC9jb2RlPiB3aXRoIG1ldGhvZHMgdG8gcHJvdmlkZQotICogbG9jayBpbmZvcm1hdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTG9ja2VkTGFiZWxQcm92aWRlciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jayBpbmZvIGZvciB0aGUgZWxlbWVudC4gVGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQKLQkgKiB0byBjaGFuZ2UgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgdGFibGUgcm93LgotCSAqCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVudGlyZSByb3csIG9yIAotCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgdGhhdCBubyBpbnB1dCBvYmplY3QgaXMgc2V0Ci0JICogICAgaW4gdGhlIHZpZXdlcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGl0ZW0gaXMgbG9ja2VkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMb2NrZWQoT2JqZWN0IGVsZW1lbnQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0luaXRpYWxTZWxlY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGMzZjA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuZmFjZXRzLkZhY2V0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIENsYXNzIHVzZWQgdG8gc29ydCBjYXRlZ29yaWVzLCBydW50aW1lIHR5cGVzLCBhbmQgc2VydmVyIHR5cGVzIGluIHRoZQotICogTmV3IHdpemFyZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCi0JcHVibGljIE9iamVjdCBnZXRJbml0aWFsU2VsZWN0aW9uKE9iamVjdFtdIG9iaikgewotCQlpZiAob2JqID09IG51bGwgfHwgb2JqLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlpZiAob2JqWzBdIGluc3RhbmNlb2YgSVJ1bnRpbWVUeXBlKSB7Ci0JCQlpbnQgc2l6ZSA9IG9iai5sZW5ndGg7Ci0JCQlJUnVudGltZVR5cGVbXSBydCA9IG5ldyBJUnVudGltZVR5cGVbc2l6ZV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQlydFtpXSA9IChJUnVudGltZVR5cGUpIG9ialtpXTsKLQkJCXJldHVybiBnZXRJbml0aWFsU2VsZWN0aW9uKHJ0KTsKLQkJfQotCQkKLQkJaWYgKG9ialswXSBpbnN0YW5jZW9mIElTZXJ2ZXJUeXBlKSB7Ci0JCQlpbnQgc2l6ZSA9IG9iai5sZW5ndGg7Ci0JCQlJU2VydmVyVHlwZVtdIHN0ID0gbmV3IElTZXJ2ZXJUeXBlW3NpemVdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJc3RbaV0gPSAoSVNlcnZlclR5cGUpIG9ialtpXTsKLQkJCXJldHVybiBnZXRJbml0aWFsU2VsZWN0aW9uKHN0KTsKLQkJfQotCQkKLQkJaWYgKG9ialswXSBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCWludCBzaXplID0gb2JqLmxlbmd0aDsKLQkJCUlTZXJ2ZXJbXSBzdCA9IG5ldyBJU2VydmVyW3NpemVdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJc3RbaV0gPSAoSVNlcnZlcikgb2JqW2ldOwotCQkJcmV0dXJuIGdldEluaXRpYWxTZWxlY3Rpb24oc3QpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyVHlwZXMKLQkgKiBAcmV0dXJuIHRoZSBpbml0aWFsIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBJU2VydmVyVHlwZSBnZXRJbml0aWFsU2VsZWN0aW9uKElTZXJ2ZXJUeXBlW10gc2VydmVyVHlwZXMpIHsKLQkJaWYgKHNlcnZlclR5cGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWludCBzaXplID0gc2VydmVyVHlwZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGhhc1J1bnRpbWUoc2VydmVyVHlwZXNbaV0pKQotCQkJCXJldHVybiBzZXJ2ZXJUeXBlc1tpXTsKLQkJfQotCQlyZXR1cm4gZ2V0RGVmYXVsdFNlcnZlclR5cGUoc2VydmVyVHlwZXMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXJzCi0JICogQHJldHVybiB0aGUgaW5pdGlhbCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgSVNlcnZlciBnZXRJbml0aWFsU2VsZWN0aW9uKElTZXJ2ZXJbXSBzZXJ2ZXJzKSB7Ci0JCXJldHVybiBnZXRJbml0aWFsU2VsZWN0aW9uKHNlcnZlcnMsbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEFsbG93cyBhZG9wdGVycyB0byBwcm92aWRlIGFuIGluaXRpYWwgc2VsZWN0aW9uIG91dCBvZiBhIGxpc3Qgb2YgaXRlbXMuCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPklQcm9qZWN0PC9jb2RlPiBjYW4gYmUgbnVsbCwgaW4gY2FzZXMgd2hlcmUgYSBwcm9qZWN0IHNlbGVjdGlvbiB3YXMgbm90IGF2YWlsYWJsZSAoaWU6IE5ldyBTZXJ2ZXIgV2l6YXJkKQotCSAqIDwvcD48cD4KLQkgKiBSZXR1cm5pbmcgPGNvZGU+bnVsbDwvY29kZT4gbWVhbnMgbm8gb2JqZWN0IGlzIGFwcGxpY2FibGUgdG8gYmUgc2VsZWN0ZWQuIAotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVycwotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJU2VydmVyIGdldEluaXRpYWxTZWxlY3Rpb24oSVNlcnZlcltdIHNlcnZlcnMsIElQcm9qZWN0IHByb2plY3QpewotCQlpZiAoc2VydmVycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJU2VydmVyIHJ2YWwgPSBzZXJ2ZXJzWzBdOwotCQkKLQkJaWYgKHByb2plY3QgIT0gbnVsbCl7Ci0JCQl0cnl7Ci0JCQkJLy8gY2hlY2sgZm9yIHRoZSB0YXJnZXRlZCBydW50aW1lIG9mIHRoZSBwcm9qZWN0Ci0JCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJCWlmIChmYWNldGVkUHJvamVjdCAhPSBudWxsKXsKLQkJCQkJb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBmYWNldGVkUnVudGltZSA9IGZhY2V0ZWRQcm9qZWN0LmdldFByaW1hcnlSdW50aW1lKCk7Ci0JCQkJCQlpZiAoZmFjZXRlZFJ1bnRpbWUgIT0gbnVsbCl7Ci0JCQkJCQkJSVJ1bnRpbWUgcnVudGltZSA9IEZhY2V0VXRpbC5nZXRSdW50aW1lKGZhY2V0ZWRSdW50aW1lKTsKLQkJCQkJCQlJU2VydmVyIHNlcnZlciA9IGZpbmRTZXJ2ZXJGcm9tUnVudGltZShydW50aW1lLmdldElkKCkpOwotCQkJCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCl7Ci0JCQkJCQkJCXJ2YWwgPSBzZXJ2ZXI7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKXsKLQkJCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiQ291bGQgbm90IGNyZWF0ZSBhIGZhY2V0ZWQgcHJvamVjdCIsIGNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJcmV0dXJuIHJ2YWw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWVUeXBlcwotCSAqIEByZXR1cm4gdGhlIGluaXRpYWwgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIElSdW50aW1lVHlwZSBnZXRJbml0aWFsU2VsZWN0aW9uKElSdW50aW1lVHlwZVtdIHJ1bnRpbWVUeXBlcykgewotCQlpZiAocnVudGltZVR5cGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWludCBzaXplID0gcnVudGltZVR5cGVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChoYXNSdW50aW1lKHJ1bnRpbWVUeXBlc1tpXSkpCi0JCQkJcmV0dXJuIHJ1bnRpbWVUeXBlc1tpXTsKLQkJfQotCQlyZXR1cm4gZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKHJ1bnRpbWVUeXBlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUnVudGltZShJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlKSB7Ci0JCXJldHVybiBoYXNSdW50aW1lKHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUnVudGltZShJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKLQkJaWYgKHJ1bnRpbWVUeXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRSdW50aW1lcyhydW50aW1lVHlwZSk7Ci0JCXJldHVybiBydW50aW1lcyAhPSBudWxsICYmIHJ1bnRpbWVzLmxlbmd0aCA+IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRlZmF1bHQgc2VydmVyIHR5cGUsIHR5cGljYWxseSB0aGUgJ2ZpcnN0JyBvbmUgc29ydGVkCi0JICogYWxwaGFiZXRpY2FsbHkgYnkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyVHlwZXMKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHNlcnZlciB0eXBlCi0JICovCi0JcHJvdGVjdGVkIElTZXJ2ZXJUeXBlIGdldERlZmF1bHRTZXJ2ZXJUeXBlKElTZXJ2ZXJUeXBlW10gc2VydmVyVHlwZXMpIHsKLQkJaWYgKHNlcnZlclR5cGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWludCBzaXplID0gc2VydmVyVHlwZXMubGVuZ3RoOwotCQlpZiAoc2l6ZSA9PSAxKQotCQkJcmV0dXJuIHNlcnZlclR5cGVzWzBdOwotCQkKLQkJSVNlcnZlclR5cGUgZmlyc3QgPSBzZXJ2ZXJUeXBlc1swXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChEZWZhdWx0Vmlld2VyU29ydGVyLmNvbXBhcmVTZXJ2ZXJUeXBlcyhmaXJzdCwgc2VydmVyVHlwZXNbaV0pID4gMCkKLQkJCQlmaXJzdCA9IHNlcnZlclR5cGVzW2ldOwotCQl9Ci0JCXJldHVybiBmaXJzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVmYXVsdCBydW50aW1lIHR5cGUsIHR5cGljYWxseSB0aGUgJ2ZpcnN0JyBvbmUgc29ydGVkCi0JICogYWxwaGFiZXRpY2FsbHkgYnkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZVR5cGVzCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBydW50aW1lIHR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgSVJ1bnRpbWVUeXBlIGdldERlZmF1bHRSdW50aW1lVHlwZShJUnVudGltZVR5cGVbXSBydW50aW1lVHlwZXMpIHsKLQkJaWYgKHJ1bnRpbWVUeXBlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlpbnQgc2l6ZSA9IHJ1bnRpbWVUeXBlcy5sZW5ndGg7Ci0JCWlmIChzaXplID09IDEpCi0JCQlyZXR1cm4gcnVudGltZVR5cGVzWzBdOwotCQkKLQkJSVJ1bnRpbWVUeXBlIGZpcnN0ID0gcnVudGltZVR5cGVzWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKERlZmF1bHRWaWV3ZXJTb3J0ZXIuY29tcGFyZVJ1bnRpbWVUeXBlcyhmaXJzdCwgcnVudGltZVR5cGVzW2ldKSA+IDApCi0JCQkJZmlyc3QgPSBydW50aW1lVHlwZXNbaV07Ci0JCX0KLQkJcmV0dXJuIGZpcnN0OwotCX0KLQkKLQkvKioKLQkgKiBBbGxvd3MgYWRvcHRlcnMgdG8gcHJvdmlkZSBhbiBpbml0aWFsIHNlbGVjdGlvbiBvdXQgb2YgYSBsaXN0IG9mIGl0ZW1zLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5JUHJvamVjdDwvY29kZT4gY2FuIGJlIG51bGwsIGluIGNhc2VzIHdoZXJlIGEgcHJvamVjdCBzZWxlY3Rpb24gd2FzIG5vdCBhdmFpbGFibGUgKGllOiBOZXcgU2VydmVyIFdpemFyZCkKLQkgKiA8L3A+PHA+Ci0JICogUmV0dXJuaW5nIDxjb2RlPm51bGw8L2NvZGU+IG1lYW5zIG5vIG9iamVjdCBpcyBhcHBsaWNhYmxlIHRvIGJlIHNlbGVjdGVkLiAKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG9iaiBDb250YWlucyBhbiBhcnJheSBvZiBhbGwgdGhlIHBvc3NpYmxlIG9iamVjdCB0byBiZSBzZWxlY3RlZC4gCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIFRoZSBvYmplY3QgdG8gYmUgc2VsZWN0ZWQgZnJvbSB0aGUgPGNvZGU+b2JqW108L2NvZGU+IAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW5pdGlhbFNlbGVjdGlvbihPYmplY3QgW10gb2JqLCBJUHJvamVjdCBwcm9qZWN0KXsKLQkJaWYgKG9iaiA9PSBudWxsIHx8IG9iai5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaWYgKG9ialswXSBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSkgewotCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOwotCQkJSVJ1bnRpbWVUeXBlW10gcnQgPSBuZXcgSVJ1bnRpbWVUeXBlW3NpemVdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJcnRbaV0gPSAoSVJ1bnRpbWVUeXBlKSBvYmpbaV07Ci0JCQlyZXR1cm4gZ2V0SW5pdGlhbFNlbGVjdGlvbihydCk7Ci0JCX0KLQkJCi0JCWlmIChvYmpbMF0gaW5zdGFuY2VvZiBJU2VydmVyVHlwZSkgewotCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOwotCQkJSVNlcnZlclR5cGVbXSBzdCA9IG5ldyBJU2VydmVyVHlwZVtzaXplXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCXN0W2ldID0gKElTZXJ2ZXJUeXBlKSBvYmpbaV07Ci0JCQlyZXR1cm4gZ2V0SW5pdGlhbFNlbGVjdGlvbihzdCk7Ci0JCX0KLQkJCi0JCWlmIChvYmpbMF0gaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQlpbnQgc2l6ZSA9IG9iai5sZW5ndGg7Ci0JCQlJU2VydmVyW10gc3QgPSBuZXcgSVNlcnZlcltzaXplXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCXN0W2ldID0gKElTZXJ2ZXIpIG9ialtpXTsKLQkJCXJldHVybiBnZXRJbml0aWFsU2VsZWN0aW9uKHN0LHByb2plY3QpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsJCQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgZ2l2ZW4gcnVudGltZSBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gCi0JICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBzZXJ2ZXJzCi0JICogZm9yIHRoZSBtYXRjaGluZyBydW50aW1lIGlkLiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSVNlcnZlciBmaW5kU2VydmVyRnJvbVJ1bnRpbWUoU3RyaW5nIHJ1bnRpbWVJZCl7Ci0JCWlmIChydW50aW1lSWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQotCQlJU2VydmVyIFtdIHNlcnZlcnMgPSBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJzKCk7Ci0JCWZvciAoSVNlcnZlciBzZXJ2ZXI6c2VydmVycyl7Ci0JCQlpZiAocnVudGltZUlkID09IHNlcnZlci5nZXRSdW50aW1lKCkuZ2V0SWQoKSl7Ci0JCQkJcmV0dXJuIHNlcnZlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Mb2NrZWRDaGVja2JveFRhYmxlVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0xvY2tlZENoZWNrYm94VGFibGVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwNmI0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0xvY2tlZENoZWNrYm94VGFibGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NrZWRDaGVja2JveFRhYmxlVmlld2VyIGV4dGVuZHMgQ2hlY2tib3hUYWJsZVZpZXdlciB7Ci0JcHJvdGVjdGVkIENvbG9yIGNvbG9yOwotCi0JcHVibGljIExvY2tlZENoZWNrYm94VGFibGVWaWV3ZXIoVGFibGUgdGFibGUpIHsKLQkJc3VwZXIodGFibGUpOwotCQljcmVhdGVDb2xvcih0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29sb3IoQ29udHJvbCBjKSB7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGMuZ2V0RGlzcGxheSgpLCAyNTUsIDI1NSwgMjI1KTsKLQkJYy5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJY29sb3IuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1VwZGF0ZUl0ZW0oV2lkZ2V0IHdpZGdldCwgT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gZnVsbE1hcCkgewotCQlpZiAoY29sb3IgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRhYmxlSXRlbSkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSB3aWRnZXQ7Ci0JCQlpZiAoZ2V0TGFiZWxQcm92aWRlcigpIGluc3RhbmNlb2YgSUxvY2tlZExhYmVsUHJvdmlkZXIpIHsKLQkJCQlJTG9ja2VkTGFiZWxQcm92aWRlciBwcm92aWRlciA9IChJTG9ja2VkTGFiZWxQcm92aWRlcikgZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJCWlmIChwcm92aWRlci5pc0xvY2tlZChlbGVtZW50KSkgewotCQkJCQlpdGVtLnNldEJhY2tncm91bmQoY29sb3IpOwotCQkJCQlpdGVtLnNldEltYWdlKDAsIG51bGwpOwotCQkJCX0gZWxzZQotCQkJCQlpdGVtLnNldEJhY2tncm91bmQobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuZG9VcGRhdGVJdGVtKHdpZGdldCwgZWxlbWVudCwgZnVsbE1hcCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTG9ja2VkVGFibGVWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTG9ja2VkVGFibGVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlNzUyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0xvY2tlZFRhYmxlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIExvY2tlZFRhYmxlVmlld2VyIGV4dGVuZHMgVGFibGVWaWV3ZXIgewotCXByb3RlY3RlZCBDb2xvciBjb2xvcjsKLQotCXB1YmxpYyBMb2NrZWRUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCWNyZWF0ZUNvbG9yKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBMb2NrZWRUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCWNyZWF0ZUNvbG9yKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIExvY2tlZFRhYmxlVmlld2VyKFRhYmxlIHRhYmxlKSB7Ci0JCXN1cGVyKHRhYmxlKTsKLQkJY3JlYXRlQ29sb3IodGFibGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbG9yKENvbnRyb2wgYykgewotCQlpZiAoRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0SGlnaENvbnRyYXN0KCkpCi0JCQljb2xvciA9IG5ldyBDb2xvcihjLmdldERpc3BsYXkoKSwgMCwgMCwgMCk7Ci0JCWVsc2UKLQkJCWNvbG9yID0gbmV3IENvbG9yKGMuZ2V0RGlzcGxheSgpLCAyNTUsIDI1NSwgMjI1KTsKLQkJYy5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJY29sb3IuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1VwZGF0ZUl0ZW0oV2lkZ2V0IHdpZGdldCwgT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gZnVsbE1hcCkgewotCQlpZiAoY29sb3IgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRhYmxlSXRlbSkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSB3aWRnZXQ7Ci0JCQlpZiAoZ2V0TGFiZWxQcm92aWRlcigpIGluc3RhbmNlb2YgSUxvY2tlZExhYmVsUHJvdmlkZXIpIHsKLQkJCQlJTG9ja2VkTGFiZWxQcm92aWRlciBwcm92aWRlciA9IChJTG9ja2VkTGFiZWxQcm92aWRlcikgZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJCWlmIChwcm92aWRlci5pc0xvY2tlZChlbGVtZW50KSkgewotCQkJCQlpdGVtLnNldEJhY2tncm91bmQoY29sb3IpOwotCQkJCQlpdGVtLnNldEltYWdlKDAsIG51bGwpOwotCQkJCX0gZWxzZQotCQkJCQlpdGVtLnNldEJhY2tncm91bmQobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuZG9VcGRhdGVJdGVtKHdpZGdldCwgZWxlbWVudCwgZnVsbE1hcCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTW9kdWxlQXJ0aWZhY3RDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTW9kdWxlQXJ0aWZhY3RDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5Yzc4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vZHVsZUFydGlmYWN0Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgTW9kdWxlQXJ0aWZhY3RDb21wb3NpdGUgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBJTW9kdWxlQXJ0aWZhY3RbXSBtb2R1bGVBcnRpZmFjdHM7Ci0JcHJpdmF0ZSBMaXN0Vmlld2VyIGxpc3RWaWV3ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbGF1bmNoTW9kZTsJCQotCXByaXZhdGUgSU1vZHVsZUFydGlmYWN0IHNlbGVjdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBTZWxlY3Rpb24gZGlhbG9nIHdpdGggdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIElNb2R1bGVBcnRpZmFjdCBmb3IgdGhlIHNlbGVjdGVkIHJlc291cmNlCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBtb2R1bGVBcnRpZmFjdHMKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZQotCSAqLwotCXB1YmxpYyBNb2R1bGVBcnRpZmFjdENvbXBvc2l0ZShTaGVsbCBwYXJlbnQsZmluYWwgSU1vZHVsZUFydGlmYWN0W10gbW9kdWxlQXJ0aWZhY3RzLCBTdHJpbmcgbGF1bmNoTW9kZSl7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXNldFNoZWxsU3R5bGUoU1dULlJFU0laRSB8IGdldFNoZWxsU3R5bGUoKSk7Ci0JCXRoaXMubW9kdWxlQXJ0aWZhY3RzID0gbW9kdWxlQXJ0aWZhY3RzOwotCQl0aGlzLmxhdW5jaE1vZGUgPSBsYXVuY2hNb2RlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KGdldFdpbmRvd1RpdGxlKCkpOwotCX0KLQotCS8qKgotCSAqIEJhc2VkIG9uIHRoZSBsYXVuY2ggbW9kZSwgcmV0dXJuIHRoZSBOTFMgU3RyaW5nIGZvciB0aGUgRGlhbG9nLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHdpbmRvdyB0aXRsZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFdpbmRvd1RpdGxlKCkgewotCQlTdHJpbmcgdGl0bGUgPSBNZXNzYWdlcy53aXpSdW5PblNlcnZlclRpdGxlOwotCQkKLQkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKQotCQkJdGl0bGUgPSBNZXNzYWdlcy53aXpEZWJ1Z09uU2VydmVyVGl0bGU7CQkJCQkKLQkJZWxzZSBpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkKLQkJCXRpdGxlID0gTWVzc2FnZXMud2l6UHJvZmlsZU9uU2VydmVyVGl0bGU7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LFNXVC5OT05FKTsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCQkJCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCi0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkKLQkJVGV4dCBkZXNjcmlwdGlvbiA9IG5ldyBUZXh0KGNvbXBvc2l0ZSxTV1QuTk9ORSk7Ci0JCWRlc2NyaXB0aW9uLnNldFRleHQoTWVzc2FnZXMud2l6TW9kdWxlQXJ0aWZhY3RzRGVzY3JpcHRpb24pOwotCQlkZXNjcmlwdGlvbi5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWRlc2NyaXB0aW9uLnNldEN1cnNvcihjb21wb3NpdGUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUN1cnNvcihTV1QuQ1VSU09SX0FSUk9XKSk7Ci0JCQotCQljcmVhdGVDb250ZW50KGNvbXBvc2l0ZSk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRlbnRDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCxTV1QuTk9ORSB8U1dULlJFU0laRSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA1OwkJCi0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJCQkKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkKLQkJY29udGVudENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29udGVudENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljb250ZW50Q29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCQotCQlMYWJlbCB0YWJsZVRpdGxlID0gbmV3IExhYmVsKGNvbnRlbnRDb21wb3NpdGUsU1dULk5vbmUpOwotCQl0YWJsZVRpdGxlLnNldFRleHQoTWVzc2FnZXMud2l6TW9kdWxlQXJ0aWZhY3RzQXZhaWxhYmxlTGlzdCk7Ci0KLQkJbGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKGNvbnRlbnRDb21wb3NpdGUsU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlsaXN0Vmlld2VyLmdldExpc3QoKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsaXN0Vmlld2VyLmdldExpc3QoKS5zZXRGb2N1cygpOwotCi0JCWxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBCYXNlQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gbW9kdWxlQXJ0aWZhY3RzOwotCQkJfQotCQl9KTsKLQkJCi0JCWxpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQmFzZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsJCQkJCi0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVBcnRpZmFjdERlbGVnYXRlKSB7Ci0JCQkJCS8vIFRyeSB0byBkaXNwbGF5IHRoZSBvYmplY3QgdXNpbmcgaXRzIG5hbWUgCi0JCQkJCU1vZHVsZUFydGlmYWN0RGVsZWdhdGUgbW9kdWxlQXJ0aWZhY3QgPSAoTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSllbGVtZW50OwotCQkJCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gbW9kdWxlQXJ0aWZhY3QuZ2V0TmFtZSgpOwotCQkJCQlpZiAoYXJ0aWZhY3ROYW1lICE9IG51bGwgJiYgYXJ0aWZhY3ROYW1lLmxlbmd0aCgpID49IDApIHsKLQkJCQkJCWludCBjbGFzc05hbWVJbmRleCA9IGFydGlmYWN0TmFtZS5sYXN0SW5kZXhPZigiLiIpOwotCQkJCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gYXJ0aWZhY3ROYW1lLnN1YnN0cmluZygwLCBjbGFzc05hbWVJbmRleCk7Ci0JCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gYXJ0aWZhY3ROYW1lLnN1YnN0cmluZyhjbGFzc05hbWVJbmRleCsxKTsKLQkJCQkJCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsICYmIChwYWNrYWdlTmFtZS5sZW5ndGgoKTw9MCkgPT0gZmFsc2UpewotCQkJCQkJCXJldHVybiBjbGFzc05hbWUgKyAiICgiK21vZHVsZUFydGlmYWN0LmdldE5hbWUoKSsiKSI7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gbW9kdWxlQXJ0aWZhY3QuZ2V0TmFtZSgpOwotCQkJCQl9Ci0KLQkJCQkJLy8gSWYgdGhlIG5hbWUgaXMgZW1wdHkgd2UgY2FuIHRoZW4gdXNlIHRoZSBtb2R1bGUgYXJ0aWZhY3QgY2xhc3MgbmFtZSAgCi0JCQkJCXJldHVybiBtb2R1bGVBcnRpZmFjdC5nZXRDbGFzcygpLmdldE5hbWUoKTsJCQkJCi0JCQkJfQotCQkJCXJldHVybiBNZXNzYWdlcy5lbGVtZW50VW5rbm93bk5hbWU7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbGlzdFZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQlidXR0b25QcmVzc2VkKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotCQkJfQotCQl9KTsKLQkJCQotCQlsaXN0Vmlld2VyLnNldElucHV0KEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5ST09UKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNlbGVjdGlvbiBvZiB0aGUgZGlhbG9nCi0JICogCi0JICogQHJldHVybiB0aGUgc2VsZWN0ZWQgbW9kdWxlIGFydGlmYWN0Ci0JICovCi0JcHVibGljIElNb2R1bGVBcnRpZmFjdCBnZXRTZWxlY3Rpb24oKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjIgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGxpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24yID09IG51bGwgfHwgc2VsZWN0aW9uMi5nZXRGaXJzdEVsZW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIHNlbGVjdGlvbjsKLQkJCi0JCXNlbGVjdGlvbiA9IChJTW9kdWxlQXJ0aWZhY3Qpc2VsZWN0aW9uMi5nZXRGaXJzdEVsZW1lbnQoKTsgCi0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjYnV0dG9uUHJlc3NlZChpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCWlmIChnZXRTZWxlY3Rpb24oKSA9PSBudWxsKXsKLQkJCQlNZXNzYWdlQm94IG1lc3NhZ2VCb3ggPSBuZXcgTWVzc2FnZUJveChnZXRTaGVsbCgpLFNXVC5JQ09OX0VSUk9SIHwgU1dULk9LKTsKLQkJCQltZXNzYWdlQm94LnNldE1lc3NhZ2UoTWVzc2FnZXMud2l6TW9kdWxlQXJ0aWZhY3RzTm9TZWxlY3Rpb25FcnJvcik7Ci0JCQkJbWVzc2FnZUJveC5zZXRUZXh0KGdldFdpbmRvd1RpdGxlKCkpOwotCQkJCW1lc3NhZ2VCb3gub3BlbigpOwotCQkJCS8vIGJ5cGFzcyB0aGUgY2FsbCB0byBzdXBlciwgc28gdGhhdCB0aGlzIERpYWxvZyBkb2Vzbid0IGdldCBkaXNwb3NlZAotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Nb25pdG9yQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vbml0b3JDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwNjRjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vbml0b3JDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JTW9uaXRvcmVkU2VydmVyUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSVNlcnZlck1vbml0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJNb25pdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkVjbGlwc2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TV1RVdGlsOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1vbml0b3JDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCS8vcHJvdGVjdGVkIFNlcnZlclBvcnQgc2VsZWN0aW9uOwotCXByb3RlY3RlZCBQb3J0U2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXI7Ci0JcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOwotCQotCXByb3RlY3RlZCBJU2VydmVyTW9uaXRvck1hbmFnZXIgc21tOwotCQotCXByb3RlY3RlZCBUYWJsZSBtb25pdG9yVGFibGU7Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIG1vbml0b3JUYWJsZVZpZXdlcjsKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIFBvcnRTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHBvcnRTZWxlY3RlZChTZXJ2ZXJQb3J0IHBvcnQpOwotCX0KLQkKLQlwdWJsaWMgTW9uaXRvckNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFBvcnRTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjIsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXIyOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJCi0JCXNtbSA9IFNlcnZlck1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gNTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQltb25pdG9yVGFibGUgPSBuZXcgVGFibGUodGhpcywgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCS8vZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDE1MDsKLQkJLy9kYXRhLndpZHRoSGludCA9IDM0MDsKLQkJbW9uaXRvclRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW1vbml0b3JUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCW1vbml0b3JUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihtb25pdG9yVGFibGUpOwotCQkKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJbW9uaXRvclRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0JCW1vbml0b3JUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQkKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg4LCA4MCwgdHJ1ZSkpOwotCQlUYWJsZUNvbHVtbiBjb2wgPSBuZXcgVGFibGVDb2x1bW4obW9uaXRvclRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbC5zZXRUZXh0KE1lc3NhZ2VzLmRpYWxvZ01vbml0b3JDb2x1bW5TdGF0dXMpOwotCQkKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMiwgMTIwLCB0cnVlKSk7Ci0JCWNvbCA9IG5ldyBUYWJsZUNvbHVtbihtb25pdG9yVGFibGUsIFNXVC5OT05FKTsKLQkJY29sLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nTW9uaXRvckNvbHVtblR5cGUpOwotCQkKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg4LCA4MCwgdHJ1ZSkpOwotCQljb2wgPSBuZXcgVGFibGVDb2x1bW4obW9uaXRvclRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbC5zZXRUZXh0KE1lc3NhZ2VzLmRpYWxvZ01vbml0b3JDb2x1bW5Qb3J0KTsKLQkJCi0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoOCwgODAsIHRydWUpKTsKLQkJY29sID0gbmV3IFRhYmxlQ29sdW1uKG1vbml0b3JUYWJsZSwgU1dULk5PTkUpOwotCQljb2wuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29sdW1uTW9uaXRvclBvcnQpOwotCQkKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg4LCA4MCwgdHJ1ZSkpOwotCQljb2wgPSBuZXcgVGFibGVDb2x1bW4obW9uaXRvclRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbC5zZXRUZXh0KE1lc3NhZ2VzLmRpYWxvZ01vbml0b3JDb2x1bW5Db250ZW50VHlwZSk7Ci0JCQotCQltb25pdG9yVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBNb25pdG9yQ29udGVudFByb3ZpZGVyKHNlcnZlcikpOwotCQltb25pdG9yVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTW9uaXRvckxhYmVsUHJvdmlkZXIoc2VydmVyKSk7Ci0JCW1vbml0b3JUYWJsZVZpZXdlci5zZXRJbnB1dChBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7Ci0JCQotCQltb25pdG9yVGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCQlJTW9uaXRvcmVkU2VydmVyUG9ydCBwb3J0MSA9IChJTW9uaXRvcmVkU2VydmVyUG9ydCkgZTE7Ci0JCQkJSU1vbml0b3JlZFNlcnZlclBvcnQgcG9ydDIgPSAoSU1vbml0b3JlZFNlcnZlclBvcnQpIGUyOwotCQkJCWlmIChwb3J0MS5nZXRTZXJ2ZXJQb3J0KCkuZ2V0UG9ydCgpID09IHBvcnQyLmdldFNlcnZlclBvcnQoKS5nZXRQb3J0KCkpIHsKLQkJCQkJaWYgKHBvcnQxLmdldE1vbml0b3JQb3J0KCkgPT0gcG9ydDIuZ2V0TW9uaXRvclBvcnQoKSkgewotCQkJCQkJcmV0dXJuIDA7Ci0JCQkJCX0gZWxzZSBpZiAocG9ydDEuZ2V0TW9uaXRvclBvcnQoKSA+IHBvcnQyLmdldE1vbml0b3JQb3J0KCkpCi0JCQkJCQlyZXR1cm4gMTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCX0gZWxzZSBpZiAocG9ydDEuZ2V0U2VydmVyUG9ydCgpLmdldFBvcnQoKSA+IHBvcnQyLmdldFNlcnZlclBvcnQoKS5nZXRQb3J0KCkpCi0JCQkJCXJldHVybiAxOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9KTsKLQkJCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbkNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlidXR0b25Db21wLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJZmluYWwgSVNlcnZlciBzZXJ2ZXIyID0gc2VydmVyOwotCQlCdXR0b24gYWRkID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMuYWRkKTsKLQkJYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCU1vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IE1vbml0b3JEaWFsb2coZ2V0U2hlbGwoKSwgc2VydmVyMik7Ci0JCQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93LkNBTkNFTCkgewotCQkJCQlTZXJ2ZXJQb3J0IHBvcnQgPSBkaWFsb2cuZ2V0U2VydmVyUG9ydCgpOwotCQkJCQlJTW9uaXRvcmVkU2VydmVyUG9ydCBzcCA9IHNtbS5jcmVhdGVNb25pdG9yKHNlcnZlcjIsIHBvcnQsIGRpYWxvZy5nZXRNb25pdG9yUG9ydCgpLCBkaWFsb2cuZ2V0Q29udGVudFR5cGVzKCkpOwotCQkJCQlpZiAoc3AgIT0gbnVsbCkKLQkJCQkJCW1vbml0b3JUYWJsZVZpZXdlci5hZGQoc3ApOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpID09IG51bGwpCi0JCQlhZGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQotCQlmaW5hbCBCdXR0b24gZWRpdCA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLmVkaXQpOwotCQllZGl0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgbW9uaXRvclRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCUlNb25pdG9yZWRTZXJ2ZXJQb3J0IHBvcnQgPSAoSU1vbml0b3JlZFNlcnZlclBvcnQpIHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlNb25pdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBNb25pdG9yRGlhbG9nKGdldFNoZWxsKCksIHNlcnZlcjIsIHBvcnQuZ2V0U2VydmVyUG9ydCgpLCBwb3J0LmdldE1vbml0b3JQb3J0KCksIHBvcnQuZ2V0Q29udGVudFR5cGVzKCkpOwotCQkJCWlmIChkaWFsb2cub3BlbigpICE9IFdpbmRvdy5DQU5DRUwpIHsKLQkJCQkJc21tLnJlbW92ZU1vbml0b3IocG9ydCk7Ci0JCQkJCW1vbml0b3JUYWJsZVZpZXdlci5yZW1vdmUocG9ydCk7Ci0JCQkJCXBvcnQgPSBzbW0uY3JlYXRlTW9uaXRvcihzZXJ2ZXIyLCBkaWFsb2cuZ2V0U2VydmVyUG9ydCgpLCBkaWFsb2cuZ2V0TW9uaXRvclBvcnQoKSwgZGlhbG9nLmdldENvbnRlbnRUeXBlcygpKTsKLQkJCQkJaWYgKHBvcnQgIT0gbnVsbCkgewotCQkJCQkJbW9uaXRvclRhYmxlVmlld2VyLmFkZChwb3J0KTsKLQkJCQkJCW1vbml0b3JUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocG9ydCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJZWRpdC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCWZpbmFsIEJ1dHRvbiByZW1vdmUgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5yZW1vdmUpOwotCQlyZW1vdmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSU1vbml0b3JlZFNlcnZlclBvcnQgbXNwID0gKElNb25pdG9yZWRTZXJ2ZXJQb3J0KSBnZXRTZWxlY3Rpb24obW9uaXRvclRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJCQlpZiAobXNwLmlzU3RhcnRlZCgpKQotCQkJCQlzbW0uc3RvcE1vbml0b3IobXNwKTsKLQkJCQlzbW0ucmVtb3ZlTW9uaXRvcihtc3ApOwotCQkJCW1vbml0b3JUYWJsZVZpZXdlci5yZW1vdmUobXNwKTsKLQkJCX0KLQkJfSk7Ci0JCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCWZpbmFsIEJ1dHRvbiBzdGFydCA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLnN0YXJ0KTsKLQkJc3RhcnQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBtb25pdG9yVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJSU1vbml0b3JlZFNlcnZlclBvcnQgbXNwID0gKElNb25pdG9yZWRTZXJ2ZXJQb3J0KSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJc21tLnN0YXJ0TW9uaXRvcihtc3ApOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKGdldFNoZWxsKCksIGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQkJCW1vbml0b3JUYWJsZVZpZXdlci5yZWZyZXNoKG1zcCk7Ci0JCQkJbW9uaXRvclRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtc3ApKTsKLQkJCX0KLQkJfSk7Ci0JCXN0YXJ0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJZmluYWwgQnV0dG9uIHN0b3AgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5zdG9wKTsKLQkJc3RvcC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIG1vbml0b3JUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQlJTW9uaXRvcmVkU2VydmVyUG9ydCBtc3AgPSAoSU1vbml0b3JlZFNlcnZlclBvcnQpIHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlzbW0uc3RvcE1vbml0b3IobXNwKTsKLQkJCQltb25pdG9yVGFibGVWaWV3ZXIucmVmcmVzaChtc3ApOwotCQkJCW1vbml0b3JUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obXNwKSk7Ci0JCQl9Ci0JCX0pOwotCQlzdG9wLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJbW9uaXRvclRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSU1vbml0b3JlZFNlcnZlclBvcnQgcG9ydCA9IChJTW9uaXRvcmVkU2VydmVyUG9ydCkgZ2V0U2VsZWN0aW9uKG1vbml0b3JUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJaWYgKHBvcnQgIT0gbnVsbCkgewotCQkJCQllZGl0LnNldEVuYWJsZWQoIXBvcnQuaXNTdGFydGVkKCkpOwotCQkJCQlyZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJc3RhcnQuc2V0RW5hYmxlZCghcG9ydC5pc1N0YXJ0ZWQoKSk7Ci0JCQkJCXN0b3Auc2V0RW5hYmxlZChwb3J0LmlzU3RhcnRlZCgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlyZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN0YXJ0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzdG9wLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlJTW9uaXRvcmVkU2VydmVyUG9ydFtdIG1zcHMgPSBTZXJ2ZXJNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vbml0b3JlZFBvcnRzKHNlcnZlcik7IAotCQlpZiAobXNwcyAhPSBudWxsICYmIG1zcHMubGVuZ3RoID4gMCkKLQkJCW1vbml0b3JUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obXNwc1swXSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbDIpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWwyOwotCQlyZXR1cm4gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vbml0b3JDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTW9uaXRvckNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODkzMTM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTW9uaXRvckNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyTW9uaXRvck1hbmFnZXI7Ci0vKioKLSAqIE1vbml0b3IgcG9ydCBjb250ZW50IHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvckNvbnRlbnRQcm92aWRlciBleHRlbmRzIEJhc2VDb250ZW50UHJvdmlkZXIgewotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQotCXB1YmxpYyBNb25pdG9yQ29udGVudFByb3ZpZGVyKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBTZXJ2ZXJNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vbml0b3JlZFBvcnRzKHNlcnZlcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTW9uaXRvckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Nb25pdG9yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OGVlODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Nb25pdG9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogRGlhbG9nIHRoYXQgcHJvbXB0cyBhIHVzZXIgdG8gYWRkIG9yIGVkaXQgYSBzZXJ2ZXIgbW9uaXRvci4KLSAqLwotcHVibGljIGNsYXNzIE1vbml0b3JEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgU2VydmVyUG9ydCBwb3J0OwotCXByb3RlY3RlZCBpbnQgbW9uaXRvclBvcnQgPSAtMTsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gcG9ydENvbnRlbnRUeXBlczsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gY29udGVudFR5cGVzOwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdCA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIHBvcnRDaGFuZ2VkID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIEJ1dHRvbiBvazsKLQkKLQlwcm90ZWN0ZWQgVGFibGUgdGFibGU7Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCXByb3RlY3RlZCBib29sZWFuIGluaXQ7Ci0KLQkvKioKLQkgKiBNb25pdG9yRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsIHRoZSBzaGVsbAotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgotCSAqLwotCXB1YmxpYyBNb25pdG9yRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJU2VydmVyIHNlcnZlcikgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0KLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JfQotCi0JcHVibGljIE1vbml0b3JEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElTZXJ2ZXIgc2VydmVyLCBTZXJ2ZXJQb3J0IHBvcnQsIGludCBtb25pdG9yUG9ydCwgU3RyaW5nW10gY29udGVudFR5cGVzKSB7Ci0JCXRoaXMocGFyZW50U2hlbGwsIHNlcnZlcik7Ci0JCXRoaXMubW9uaXRvclBvcnQgPSBtb25pdG9yUG9ydDsKLQkJdGhpcy5jb250ZW50VHlwZXMgPSBjb250ZW50VHlwZXM7Ci0JCXRoaXMucG9ydCA9IHBvcnQ7Ci0JCWlzRWRpdCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nTW9uaXRvclRpdGxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2sgPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCS8vV29ya2JlbmNoSGVscC5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5URVJNSU5BVEVfU0VSVkVSX0RJQUxPRyk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy5kaWFsb2dNb25pdG9yQWRkRGVzY3JpcHRpb24sIG5ldyBTdHJpbmdbXSB7IHNlcnZlci5nZXROYW1lKCkgfSApKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS53aWR0aEhpbnQgPSAyNzU7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQl0YWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMTAwOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCQotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQkKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMiwgMTIwLCB0cnVlKSk7Ci0JCVRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2wuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29sdW1uVHlwZSk7Ci0JCQotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDQsIDQwLCB0cnVlKSk7Ci0JCWNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2wuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29sdW1uUG9ydCk7Ci0JCQotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFBvcnRDb250ZW50UHJvdmlkZXIoc2VydmVyKSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFBvcnRMYWJlbFByb3ZpZGVyKHNlcnZlcikpOwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7Ci0JCQotCQl0YWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQkJCVNlcnZlclBvcnQgcG9ydDEgPSAoU2VydmVyUG9ydCkgZTE7Ci0JCQkJU2VydmVyUG9ydCBwb3J0MiA9IChTZXJ2ZXJQb3J0KSBlMjsKLQkJCQlpZiAocG9ydDEuZ2V0UG9ydCgpID09IHBvcnQyLmdldFBvcnQoKSkKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJZWxzZSBpZiAocG9ydDEuZ2V0UG9ydCgpID4gcG9ydDIuZ2V0UG9ydCgpKQotCQkJCQlyZXR1cm4gMTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dNb25pdG9yTW9uaXRvclBvcnQpOwotCQkKLQkJZmluYWwgVGV4dCBwb3J0VGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxNTA7Ci0JCXBvcnRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCWlmIChtb25pdG9yUG9ydCA+PSAwKQotCQkJcG9ydFRleHQuc2V0VGV4dChtb25pdG9yUG9ydCArICIiKTsKLQotCQlwb3J0VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yUG9ydCA9IEludGVnZXIucGFyc2VJbnQocG9ydFRleHQuZ2V0VGV4dCgpKTsKLQkJCQkJaWYgKG9rICE9IG51bGwpCi0JCQkJCQlvay5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQltb25pdG9yUG9ydCA9IC0xOwotCQkJCQlpZiAob2sgIT0gbnVsbCkKLQkJCQkJCW9rLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQlwb3J0Q2hhbmdlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlKTsKLQkJCi0JCWZpbmFsIENvbWJvIGNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxNTA7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWludCBzaXplID0gY29tYm8uZ2V0SXRlbUNvdW50KCk7Ci0JCQkJaW50IHNlbCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJaWYgKHNlbCA9PSBzaXplIC0gMSkKLQkJCQkJY29udGVudFR5cGVzID0gcG9ydENvbnRlbnRUeXBlczsKLQkJCQllbHNlCi0JCQkJCWNvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXSB7IHBvcnRDb250ZW50VHlwZXNbc2VsXSB9OwotCQkJfQotCQl9KTsKLQkJCi0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJcG9ydCA9IChTZXJ2ZXJQb3J0KSBnZXRTZWxlY3Rpb24odGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCWlmIChwb3J0ID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoIXBvcnRDaGFuZ2VkKSB7Ci0JCQkJCXBvcnRUZXh0LnNldFRleHQoKHBvcnQuZ2V0UG9ydCgpICsgMSkgKyAiIik7Ci0JCQkJCXBvcnRDaGFuZ2VkID0gZmFsc2U7Ci0JCQkJfQotCQkJCXBvcnRDb250ZW50VHlwZXMgPSBwb3J0LmdldENvbnRlbnRUeXBlcygpOwotCQkJCVN0cmluZ1tdIHMgPSBudWxsOwotCQkJCVN0cmluZyBhbGwgPSBNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29udGVudFR5cGVBbGw7Ci0JCQkJaWYgKHBvcnRDb250ZW50VHlwZXMgPT0gbnVsbCB8fCBwb3J0Q29udGVudFR5cGVzLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCXMgPSBuZXcgU3RyaW5nW10geyBhbGwgfTsKLQkJCQl9IGVsc2UgewotCQkJCQlpbnQgc2l6ZSA9IHBvcnRDb250ZW50VHlwZXMubGVuZ3RoOwotCQkJCQlzID0gbmV3IFN0cmluZ1tzaXplKzFdOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJc1tpXSA9IE1vbml0b3JMYWJlbFByb3ZpZGVyLmdldENvbnRlbnRUeXBlU3RyaW5nKHBvcnRDb250ZW50VHlwZXNbaV0pOwotCQkJCQl9Ci0JCQkJCXNbc2l6ZV0gPSBhbGw7Ci0JCQkJfQotCQkJCWNvbWJvLnNldEl0ZW1zKHMpOwotCQkJCWNvbWJvLnNldFRleHQoYWxsKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCQotCQlpZiAocG9ydCAhPSBudWxsKSB7Ci0JCQlwb3J0Q2hhbmdlZCA9IHRydWU7Ci0JCQlTdHJpbmdbXSBjdCA9IGNvbnRlbnRUeXBlczsKLQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihwb3J0KSk7Ci0JCQlpZiAoY3QgIT0gbnVsbCAmJiBjdC5sZW5ndGggPiAwKQotCQkJCWNvbWJvLnNldFRleHQoTW9uaXRvckxhYmVsUHJvdmlkZXIuZ2V0Q29udGVudFR5cGVTdHJpbmcoY3RbMF0pKTsKLQkJfSBlbHNlIGlmICh0YWJsZVZpZXdlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCU9iamVjdCBvYmogPSB0YWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCk7Ci0JCQkJaWYgKG9iaiAhPSBudWxsKQotCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmopKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJCi0JCXBvcnRDaGFuZ2VkID0gZmFsc2U7Ci0JCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsMikgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDI7Ci0JCXJldHVybiBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0TW9uaXRvclBvcnQoKSB7Ci0JCXJldHVybiBtb25pdG9yUG9ydDsKLQl9Ci0KLQlwdWJsaWMgU2VydmVyUG9ydCBnZXRTZXJ2ZXJQb3J0KCkgewotCQlyZXR1cm4gcG9ydDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29udGVudFR5cGVzKCkgewotCQlyZXR1cm4gY29udGVudFR5cGVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vbml0b3JMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vbml0b3JMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMmE3ODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Nb25pdG9yTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklNb25pdG9yZWRTZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBNb25pdG9yIHBvcnQgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yTGFiZWxQcm92aWRlciBleHRlbmRzIEJhc2VMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOwotCi0JcHVibGljIE1vbml0b3JMYWJlbFByb3ZpZGVyKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCUlNb25pdG9yZWRTZXJ2ZXJQb3J0IHBvcnQgPSAoSU1vbml0b3JlZFNlcnZlclBvcnQpIGVsZW1lbnQ7Ci0JCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQlpZiAocG9ydC5pc1N0YXJ0ZWQoKSkKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19NT05JVE9SX09OKTsKLQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX01PTklUT1JfT0ZGKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlJTW9uaXRvcmVkU2VydmVyUG9ydCBwb3J0ID0gKElNb25pdG9yZWRTZXJ2ZXJQb3J0KSBlbGVtZW50OwotCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJaWYgKHBvcnQuaXNTdGFydGVkKCkpCi0JCQkJcmV0dXJuIE1lc3NhZ2VzLnN0YXJ0ZWQ7Ci0JCQlyZXR1cm4gTWVzc2FnZXMuc3RvcHBlZDsKLQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKQotCQkJcmV0dXJuIG5vdE51bGwocG9ydC5nZXRTZXJ2ZXJQb3J0KCkuZ2V0TmFtZSgpKTsKLQkJZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMikKLQkJCXJldHVybiBwb3J0LmdldFNlcnZlclBvcnQoKS5nZXRQb3J0KCkgKyAiIjsKLQkJZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMykKLQkJCXJldHVybiBwb3J0LmdldE1vbml0b3JQb3J0KCkgKyAiIjsKLQkJZWxzZSB7Ci0JCQlTdHJpbmdbXSBjb250ZW50ID0gcG9ydC5nZXRDb250ZW50VHlwZXMoKTsKLQkJCWlmIChjb250ZW50ID09IG51bGwgfHwgY29udGVudC5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm4gTWVzc2FnZXMuZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlQWxsOwotCQkJCi0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpbnQgc2l6ZSA9IGNvbnRlbnQubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoaSA+IDApCi0JCQkJCXNiLmFwcGVuZCgiLCIpOwotCQkJCXNiLmFwcGVuZChnZXRDb250ZW50VHlwZVN0cmluZyhjb250ZW50W2ldKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRDb250ZW50VHlwZVN0cmluZyhTdHJpbmcgcykgewotCQlpZiAoIndlYiIuZXF1YWxzKHMpKQotCQkJcmV0dXJuIE1lc3NhZ2VzLmRpYWxvZ01vbml0b3JDb250ZW50VHlwZVdlYjsKLQkJZWxzZSBpZiAoIndlYnNlcnZpY2VzIi5lcXVhbHMocykpCi0JCQlyZXR1cm4gTWVzc2FnZXMuZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlV2ViU2VydmljZXM7Ci0JCWVsc2UKLQkJCXJldHVybiBzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1BvcnRDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydENvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjIyMWM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogTW9uaXRvciBwb3J0IGNvbnRlbnQgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgQmFzZUNvbnRlbnRQcm92aWRlciB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOwotCi0JcHVibGljIFBvcnRDb250ZW50UHJvdmlkZXIoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIHNlcnZlci5nZXRTZXJ2ZXJQb3J0cyhudWxsKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Qb3J0TGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Qb3J0TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzY3NGY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotLyoqCi0gKiBTZXJ2ZXIgcG9ydCBsYWJlbCBwcm92aWRlci4KLSAqLwotcHVibGljIGNsYXNzIFBvcnRMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Ci0KLQlwdWJsaWMgUG9ydExhYmVsUHJvdmlkZXIoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJU2VydmVyUG9ydCBwb3J0ID0gKFNlcnZlclBvcnQpIGVsZW1lbnQ7Ci0JCWlmIChjb2x1bW5JbmRleCA9PSAwKQotCQkJcmV0dXJuIG5vdE51bGwocG9ydC5nZXROYW1lKCkpOwotCQllbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKQotCQkJcmV0dXJuIHBvcnQuZ2V0UG9ydCgpICsgIiI7Ci0JCWVsc2UKLQkJCXJldHVybiAiIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3MzlkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RUYWJsZUNvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIElSdW50aW1lIHNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgSVJ1bnRpbWUgZGVmYXVsdFJ1bnRpbWU7Ci0JcHJvdGVjdGVkIFJ1bnRpbWVTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjsKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIFJ1bnRpbWVTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHJ1bnRpbWVTZWxlY3RlZChJUnVudGltZSBydW50aW1lKTsKLQl9Ci0JCi0JY2xhc3MgUnVudGltZVZpZXdlclNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JCWJvb2xlYW4gc29ydEJ5TmFtZTsKLQkJcHVibGljIFJ1bnRpbWVWaWV3ZXJTb3J0ZXIoYm9vbGVhbiBzb3J0QnlOYW1lKSB7Ci0JCQl0aGlzLnNvcnRCeU5hbWUgPSBzb3J0QnlOYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCUlSdW50aW1lIHIxID0gKElSdW50aW1lKSBlMTsKLQkJCUlSdW50aW1lIHIyID0gKElSdW50aW1lKSBlMjsKLQkJCWlmIChzb3J0QnlOYW1lKQotCQkJCXJldHVybiBnZXRDb21wYXJhdG9yKCkuY29tcGFyZShub3ROdWxsKHIxLmdldE5hbWUoKSksIG5vdE51bGwocjIuZ2V0TmFtZSgpKSk7Ci0JCQkKLQkJCWlmIChyMS5nZXRSdW50aW1lVHlwZSgpID09IG51bGwpCi0JCQkJcmV0dXJuIC0xOwotCQkJaWYgKHIyLmdldFJ1bnRpbWVUeXBlKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gMTsKLQkJCXJldHVybiBnZXRDb21wYXJhdG9yKCkuY29tcGFyZShub3ROdWxsKHIxLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TmFtZSgpKSwgbm90TnVsbChyMi5nZXRSdW50aW1lVHlwZSgpLmdldE5hbWUoKSkpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgU3RyaW5nIG5vdE51bGwoU3RyaW5nIHMpIHsKLQkJCWlmIChzID09IG51bGwpCi0JCQkJcmV0dXJuICIiOwotCQkJcmV0dXJuIHM7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFJ1bnRpbWVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBSdW50aW1lU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIyKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXIyOwotCQkKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDAsIDE2MCwgdHJ1ZSkpOwotCQlUYWJsZUNvbHVtbiBjb2wgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sLnNldFRleHQoTWVzc2FnZXMuY29sdW1uTmFtZSk7Ci0JCWNvbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBSdW50aW1lVmlld2VyU29ydGVyKHRydWUpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgwLCAxMjUsIHRydWUpKTsKLQkJY29sID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbC5zZXRUZXh0KE1lc3NhZ2VzLmNvbHVtblR5cGUpOwotCQljb2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgUnVudGltZVZpZXdlclNvcnRlcihmYWxzZSkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJCi0JCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUnVudGltZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgUnVudGltZVRhYmxlTGFiZWxQcm92aWRlcigpOwotCQlsYWJlbFByb3ZpZGVyLmFkZExpc3RlbmVyKG5ldyBJTGFiZWxQcm92aWRlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdFtdIG9iaiA9IGV2ZW50LmdldEVsZW1lbnRzKCk7Ci0JCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKHRydWUpOwotCQkJCWVsc2UgewotCQkJCQlvYmogPSBTZXJ2ZXJVSVBsdWdpbi5hZGFwdExhYmVsQ2hhbmdlT2JqZWN0cyhvYmopOwotCQkJCQlpbnQgc2l6ZSA9IG9iai5sZW5ndGg7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCQkJdGFibGVWaWV3ZXIucmVmcmVzaChvYmpbaV0sIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7Ci0JCXRhYmxlVmlld2VyLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdIHsibmFtZSIsICJ0eXBlIn0pOwotCQl0YWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFJ1bnRpbWVWaWV3ZXJTb3J0ZXIodHJ1ZSkpOwotCQkKLQkJdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlPYmplY3Qgb2JqID0gZ2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVJ1bnRpbWUpCi0JCQkJCXNlbGVjdGlvbiA9IChJUnVudGltZSkgb2JqOwotCQkJCWVsc2UKLQkJCQkJc2VsZWN0aW9uID0gbnVsbDsKLQkJCQlsaXN0ZW5lci5ydW50aW1lU2VsZWN0ZWQoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0YWJsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5jaGFyYWN0ZXIgPT0gJ2wnKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUnVudGltZSBydW50aW1lID0gZ2V0U2VsZWN0ZWRSdW50aW1lKCk7Ci0JCQkJCQlJUnVudGltZVdvcmtpbmdDb3B5IHdjID0gcnVudGltZS5jcmVhdGVXb3JraW5nQ29weSgpOwotCQkJCQkJd2Muc2V0UmVhZE9ubHkoIXJ1bnRpbWUuaXNSZWFkT25seSgpKTsKLQkJCQkJCXdjLnNhdmUoZmFsc2UsIG51bGwpOwotCQkJCQkJcmVmcmVzaChydW50aW1lKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBhZnRlciBhZGRpbmcgYW4gaXRlbSBkbyB0aGUgcGFja2luZyBvZiB0aGUgdGFibGUKLQkJaWYgKHRhYmxlLmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCQkJZm9yIChpbnQgaT0wOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykKLQkJCQljb2x1bW5zW2ldLnBhY2soKTsKLQkJCXRhYmxlLnBhY2soKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlKCkgewotCQl0YWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULlNJTkdMRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGVWaWV3ZXIoKSB7Ci0JCXRhYmxlVmlld2VyID0gbmV3IExvY2tlZFRhYmxlVmlld2VyKHRhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgSVJ1bnRpbWUgZ2V0U2VsZWN0ZWRSdW50aW1lKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTdiMTZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlJ1bnRpbWU7Ci0vKioKLSAqIFJ1bnRpbWUgY29udGVudCBwcm92aWRlci4KLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBCYXNlQ29udGVudFByb3ZpZGVyIHsKLQkvKioKLQkgKiBSdW50aW1lQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJ1bnRpbWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlMaXN0PElSdW50aW1lPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUnVudGltZT4oKTsKLQkJSVJ1bnRpbWVbXSBydW50aW1lcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZXMoKTsKLQkJaWYgKHJ1bnRpbWVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoISgoUnVudGltZSlydW50aW1lc1tpXSkuaXNQcml2YXRlKCkpCi0JCQkJCWxpc3QuYWRkKHJ1bnRpbWVzW2ldKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVRhYmxlTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVGFibGVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMDEyNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVGFibGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0vKioKLSAqIFJ1bnRpbWUgdGFibGUgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyLCBJTG9ja2VkTGFiZWxQcm92aWRlciB7Ci0JLyoqCi0JICogUnVudGltZVRhYmxlTGFiZWxQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSdW50aW1lVGFibGVMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJ1bnRpbWVUYWJsZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVjb3JhdG9yIGEgbGFiZWwgZGVjb3JhdG9yLCBvciBudWxsIGlmIG5vIGRlY29yYXRvciBpcyByZXF1aXJlZAotCSAqLwotCXB1YmxpYyBSdW50aW1lVGFibGVMYWJlbFByb3ZpZGVyKElMYWJlbERlY29yYXRvciBkZWNvcmF0b3IpIHsKLQkJc3VwZXIoZGVjb3JhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGVsZW1lbnQ7Ci0JCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCQlpZiAocnVudGltZVR5cGUgIT0gbnVsbCkgewotCQkJCUltYWdlIGltYWdlID0gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShydW50aW1lVHlwZS5nZXRJZCgpKTsKLQkJCQlpZiAoZGVjb3JhdG9yICE9IG51bGwpIHsKLQkJCQkJSW1hZ2UgZGVjID0gZGVjb3JhdG9yLmRlY29yYXRlSW1hZ2UoaW1hZ2UsIGVsZW1lbnQpOwotCQkJCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gZGVjOwotCQkJCX0KLQkJCQlyZXR1cm4gaW1hZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZWxlbWVudDsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCVN0cmluZyB0ZXh0ID0gbm90TnVsbChydW50aW1lLmdldE5hbWUoKSk7Ci0JCQlpZiAoZGVjb3JhdG9yICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZGVjID0gZGVjb3JhdG9yLmRlY29yYXRlVGV4dCh0ZXh0LCBlbGVtZW50KTsKLQkJCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJCXJldHVybiBkZWM7Ci0JCQl9Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7Ci0JCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCQlpZiAocnVudGltZVR5cGUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbm90TnVsbChydW50aW1lVHlwZS5nZXROYW1lKCkpOwotCQkJcmV0dXJuICIiOwotCQl9IGVsc2UKLQkJCXJldHVybiAiIjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xvY2tlZChPYmplY3QgZWxlbWVudCkgewotCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBlbGVtZW50OwotCQlyZXR1cm4gcnVudGltZS5pc1JlYWRPbmx5KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdiZjg4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotLyoqCi0gKiBSdW50aW1lIGNvbnRlbnQgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lVHJlZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlciB7Ci0JLyoqCi0JICogUnVudGltZVRyZWVDb250ZW50UHJvdmlkZXIgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFJ1bnRpbWVUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZpbGxUcmVlKCkgewotCQljbGVhbigpOwotCQlMaXN0PFRyZWVFbGVtZW50PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxUcmVlRWxlbWVudD4oKTsKLQkJSVJ1bnRpbWVbXSBydW50aW1lcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZXMoKTsKLQkJaWYgKHJ1bnRpbWVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBydW50aW1lc1tpXS5nZXRSdW50aW1lVHlwZSgpOwotCQkJCXRyeSB7Ci0JCQkJCVRyZWVFbGVtZW50IGVsZSA9IGdldE9yQ3JlYXRlKGxpc3QsIHJ1bnRpbWVUeXBlLmdldFZlbmRvcigpKTsKLQkJCQkJZWxlLmNvbnRlbnRzLmFkZChydW50aW1lc1tpXSk7Ci0JCQkJCWVsZW1lbnRUb1BhcmVudE1hcC5wdXQocnVudGltZXNbaV0sIGVsZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiRXJyb3IgaW4gcnVudGltZSBjb250ZW50IHByb3ZpZGVyIiwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudHMgPSBsaXN0LnRvQXJyYXkoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHJlZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVRyZWVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDAzNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHJlZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotLyoqCi0gKiBSdW50aW1lIGxhYmVsIHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZVRyZWVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIFJ1bnRpbWVUcmVlTGFiZWxQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSdW50aW1lVHJlZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUnVudGltZVRyZWVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGRlY29yYXRvciBhIGxhYmVsIGRlY29yYXRvciwgb3IgbnVsbCBpZiBubyBkZWNvcmF0b3IgaXMgcmVxdWlyZWQKLQkgKi8KLQlwdWJsaWMgUnVudGltZVRyZWVMYWJlbFByb3ZpZGVyKElMYWJlbERlY29yYXRvciBkZWNvcmF0b3IpIHsKLQkJc3VwZXIoZGVjb3JhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2VJbXBsKE9iamVjdCBlbGVtZW50KSB7Ci0JCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGVsZW1lbnQ7Ci0JCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKTsKLQkJaWYgKHJ1bnRpbWVUeXBlICE9IG51bGwpIHsKLQkJCUltYWdlIGltYWdlID0gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShydW50aW1lVHlwZS5nZXRJZCgpKTsKLQkJCWlmIChkZWNvcmF0b3IgIT0gbnVsbCkgewotCQkJCUltYWdlIGRlYyA9IGRlY29yYXRvci5kZWNvcmF0ZUltYWdlKGltYWdlLCBlbGVtZW50KTsKLQkJCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJCXJldHVybiBkZWM7Ci0JCQl9Ci0JCQlyZXR1cm4gaW1hZ2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUZXh0SW1wbChPYmplY3QgZWxlbWVudCkgewotCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBlbGVtZW50OwotCQlyZXR1cm4gbm90TnVsbChydW50aW1lLmdldE5hbWUoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyLlRyZWVFbGVtZW50KSB7Ci0JCQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotCQkJCXJldHVybiBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZPTERFUik7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0SW1hZ2VJbXBsKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIHsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSAwKQotCQkJCXJldHVybiAoKFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIGVsZW1lbnQpLnRleHQ7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZWxlbWVudDsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCVN0cmluZyB0ZXh0ID0gbm90TnVsbChydW50aW1lLmdldE5hbWUoKSk7Ci0JCQlpZiAoZGVjb3JhdG9yICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZGVjID0gZGVjb3JhdG9yLmRlY29yYXRlVGV4dCh0ZXh0LCBydW50aW1lKTsKLQkJCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJCXJldHVybiBkZWM7Ci0JCQl9Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7Ci0JCQlpZiAocnVudGltZS5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwpCi0JCQkJcmV0dXJuIG5vdE51bGwocnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldE5hbWUoKSk7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcmV0dXJuICIiOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUeXBlQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUeXBlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYWY3NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmRpc2NvdmVyeS5EaXNjb3Zlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZVR5cGVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFRyZWVDb21wb3NpdGUgewotCXByb3RlY3RlZCBJUnVudGltZVR5cGUgc2VsZWN0aW9uOwotCXByb3RlY3RlZCBSdW50aW1lVHlwZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyOwotCXByb3RlY3RlZCBib29sZWFuIGNyZWF0aW9uOwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb247Ci0JcHJvdGVjdGVkIFN0cmluZyBydW50aW1lVHlwZUlkOwotCi0JcHJvdGVjdGVkIFJ1bnRpbWVUeXBlVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbFNlbGVjdGlvbiA9IHRydWU7Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIFJ1bnRpbWVUeXBlU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBydW50aW1lVHlwZVNlbGVjdGVkKElSdW50aW1lVHlwZSBydW50aW1lVHlwZSk7Ci0JfQotCi0JcHVibGljIFJ1bnRpbWVUeXBlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY3JlYXRpb24sIFJ1bnRpbWVUeXBlU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIyLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBydW50aW1lVHlwZUlkKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjI7Ci0JCXRoaXMuY3JlYXRpb24gPSBjcmVhdGlvbjsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJdGhpcy5ydW50aW1lVHlwZUlkID0gcnVudGltZVR5cGVJZDsKLQkJCi0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBSdW50aW1lVHlwZVRyZWVDb250ZW50UHJvdmlkZXIoY3JlYXRpb24sIHR5cGUsIHZlcnNpb24sIHJ1bnRpbWVUeXBlSWQpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQkKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBSdW50aW1lVHlwZVRyZWVMYWJlbFByb3ZpZGVyKCk7Ci0JCWxhYmVsUHJvdmlkZXIuYWRkTGlzdGVuZXIobmV3IElMYWJlbFByb3ZpZGVyTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0W10gb2JqID0gZXZlbnQuZ2V0RWxlbWVudHMoKTsKLQkJCQlpZiAob2JqID09IG51bGwpCi0JCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCh0cnVlKTsKLQkJCQllbHNlIHsKLQkJCQkJb2JqID0gU2VydmVyVUlQbHVnaW4uYWRhcHRMYWJlbENoYW5nZU9iamVjdHMob2JqKTsKLQkJCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQkJCXRyZWVWaWV3ZXIucmVmcmVzaChvYmpbaV0sIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlci5zZXRJbnB1dChBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7Ci0JCQotCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGdldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSkgewotCQkJCQlzZWxlY3Rpb24gPSAoSVJ1bnRpbWVUeXBlKSBvYmo7Ci0JCQkJCXNldERlc2NyaXB0aW9uKHNlbGVjdGlvbi5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzZWxlY3Rpb24gPSBudWxsOwotCQkJCQlzZXREZXNjcmlwdGlvbigiIik7Ci0JCQkJfQotCQkJCWxpc3RlbmVyLnJ1bnRpbWVUeXBlU2VsZWN0ZWQoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0cmVlVmlld2VyLnNldFNvcnRlcihuZXcgRGVmYXVsdFZpZXdlclNvcnRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSAmJiBpbml0aWFsU2VsZWN0aW9uKSB7Ci0JCQlpbml0aWFsU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQlpZiAoY29udGVudFByb3ZpZGVyLmdldEluaXRpYWxTZWxlY3Rpb24oKSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29udGVudFByb3ZpZGVyLmdldEluaXRpYWxTZWxlY3Rpb24oKSksIHRydWUpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfSU5GTywgIkZhaWxlZCB0byBzZXQgdGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9uIHRoZSBydW50aW1lIHR5cGUgdHJlZS4iLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlTGFiZWwoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5ydW50aW1lVHlwZUNvbXBUcmVlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb25MYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJSVNlbGVjdGlvbiBzZWwgPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUnVudGltZVR5cGVUcmVlQ29udGVudFByb3ZpZGVyKGNyZWF0aW9uLCB0eXBlLCB2ZXJzaW9uLCBydW50aW1lVHlwZUlkKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCk7Ci0JfQotCi0JcHVibGljIElSdW50aW1lVHlwZSBnZXRTZWxlY3RlZFJ1bnRpbWVUeXBlKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGV0YWlsc0xhYmVsKCkgewotCQlyZXR1cm4gTWVzc2FnZXMuaW5zdGFsbGFibGVTZXJ2ZXJMaW5rOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbG9zZVdpemFyZChDb21wb3NpdGUgY29tcCkgewotCQlpZiAoY29tcCA9PSBudWxsIHx8IGNvbXAuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCQkKLQkJQ29tcG9zaXRlIGMgPSBjb21wLmdldFBhcmVudCgpOwotCQlpZiAoYyBpbnN0YW5jZW9mIFNoZWxsKSB7Ci0JCQlTaGVsbCBzID0gKFNoZWxsKSBjOwotCQkJcy5jbG9zZSgpOwotCQl9Ci0JCWNsb3NlV2l6YXJkKGMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRldGFpbHNTZWxlY3RlZCgpIHsKLQkJaWYgKERpc2NvdmVyeS5sYXVuY2hFeHRlbnNpb25XaXphcmQoZ2V0U2hlbGwoKSwgTWVzc2FnZXMud2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJUaXRsZSwKLQkJCQlNZXNzYWdlcy53aXpOZXdJbnN0YWxsYWJsZVNlcnZlckRlc2NyaXB0aW9uKSkgewotCQkJLy9yZWZyZXNoKCk7Ci0JCQljbG9zZVdpemFyZCh0aGlzKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUeXBlVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHlwZVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2OWY4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUeXBlVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci0vKioKLSAqIFJ1bnRpbWUgdHlwZSBjb250ZW50IHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZVR5cGVUcmVlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGU7Ci0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uOwotCXByb3RlY3RlZCBTdHJpbmcgcnVudGltZVR5cGVJZDsKLQotCS8qKgotCSAqIFJ1bnRpbWVUeXBlQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBjcmVhdGlvbiB0cnVlIHRvIGluY2x1ZGUgcnVudGltZXMgdGhhdCBjYW4gYmUgY3JlYXRlZAotCSAqLwotCXB1YmxpYyBSdW50aW1lVHlwZVRyZWVDb250ZW50UHJvdmlkZXIoYm9vbGVhbiBjcmVhdGlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmNyZWF0aW9uID0gY3JlYXRpb247Ci0JfQotCi0JcHVibGljIFJ1bnRpbWVUeXBlVHJlZUNvbnRlbnRQcm92aWRlcihib29sZWFuIGNyZWF0aW9uLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBydW50aW1lVHlwZUlkKSB7Ci0JCXN1cGVyKGZhbHNlKTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJdGhpcy5ydW50aW1lVHlwZUlkID0gcnVudGltZVR5cGVJZDsKLQkJdGhpcy5jcmVhdGlvbiA9IGNyZWF0aW9uOwotCQkKLQkJZmlsbFRyZWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaWxsVHJlZSgpIHsKLQkJY2xlYW4oKTsKLQkJTGlzdDxUcmVlRWxlbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8VHJlZUVsZW1lbnQ+KCk7Ci0JCUlSdW50aW1lVHlwZVtdIHJ1bnRpbWVUeXBlcyA9IFNlcnZlclV0aWwuZ2V0UnVudGltZVR5cGVzKHR5cGUsIHZlcnNpb24sIHJ1bnRpbWVUeXBlSWQpOwotCQlpZiAocnVudGltZVR5cGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcnVudGltZVR5cGVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gcnVudGltZVR5cGVzW2ldOwotCQkJCWlmICghY3JlYXRpb24gfHwgcnVudGltZVR5cGUuY2FuQ3JlYXRlKCkpIHsKLQkJCQkJVHJlZUVsZW1lbnQgZWxlID0gZ2V0T3JDcmVhdGUobGlzdCwgcnVudGltZVR5cGUuZ2V0VmVuZG9yKCkpOwotCQkJCQllbGUuY29udGVudHMuYWRkKHJ1bnRpbWVUeXBlKTsKLQkJCQkJZWxlbWVudFRvUGFyZW50TWFwLnB1dChydW50aW1lVHlwZSwgZWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudHMgPSBsaXN0LnRvQXJyYXkoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHlwZVRyZWVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUeXBlVHJlZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3M2M2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUeXBlVHJlZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0vKioKLSAqIFJ1bnRpbWUgdHlwZSBsYWJlbCBwcm92aWRlci4KLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVUeXBlVHJlZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVMYWJlbFByb3ZpZGVyIHsKLQkvKioKLQkgKiBSdW50aW1lVHlwZVRyZWVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJ1bnRpbWVUeXBlVHJlZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUnVudGltZVR5cGVUcmVlTGFiZWxQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBkZWNvcmF0b3IgYSBsYWJlbCBkZWNvcmF0b3IsIG9yIG51bGwgaWYgbm8gZGVjb3JhdG9yIGlzIHJlcXVpcmVkCi0JICovCi0JcHVibGljIFJ1bnRpbWVUeXBlVHJlZUxhYmVsUHJvdmlkZXIoSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcikgewotCQlzdXBlcihkZWNvcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZUltcGwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gKElSdW50aW1lVHlwZSkgZWxlbWVudDsKLQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UocnVudGltZVR5cGUuZ2V0SWQoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUZXh0SW1wbChPYmplY3QgZWxlbWVudCkgewotCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSAoSVJ1bnRpbWVUeXBlKSBlbGVtZW50OwotCQlyZXR1cm4gbm90TnVsbChydW50aW1lVHlwZS5nZXROYW1lKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlckNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE4YjU2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRmlsdGVyZWRUcmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLlNlcnZlclRhYmxlTGFiZWxQcm92aWRlcjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFRyZWVDb21wb3NpdGUgewotCXByb3RlY3RlZCBJU2VydmVyIHNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgU2VydmVyU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXI7Ci0JcHJvdGVjdGVkIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxTZWxlY3Rpb24gPSB0cnVlOwotCi0JcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOwotCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnM7Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIFNlcnZlclNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgc2VydmVyU2VsZWN0ZWQoSVNlcnZlciBzZXJ2ZXIpOwotCX0KLQotCXB1YmxpYyBTZXJ2ZXJDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgU2VydmVyU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIyLCBJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JCXRoaXMubGF1bmNoTW9kZSA9IGxhdW5jaE1vZGU7Ci0JCQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXIyOwotCQkKLQkJVHJlZSB0cmVlMiA9IHRyZWVWaWV3ZXIuZ2V0VHJlZSgpOwotCQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUyLCBTV1QuU0lOR0xFKTsKLQkJY29sdW1uLnNldFRleHQoTWVzc2FnZXMudmlld1NlcnZlcik7Ci0JCWNvbHVtbi5zZXRXaWR0aCgzMjUpOwotCQkKLQkJVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZTIsIFNXVC5TSU5HTEUpOwotCQljb2x1bW4yLnNldFRleHQoTWVzc2FnZXMudmlld1N0YXRlKTsKLQkJY29sdW1uMi5zZXRXaWR0aCgxMDApOwotCQkKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIobW9kdWxlLCBsYXVuY2hNb2RlKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJCi0JCS8vSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBTZXJ2ZXJUcmVlTGFiZWxQcm92aWRlcigpOwotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IFNlcnZlclRhYmxlTGFiZWxQcm92aWRlcigpOwotCQlsYWJlbFByb3ZpZGVyLmFkZExpc3RlbmVyKG5ldyBJTGFiZWxQcm92aWRlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdFtdIG9iaiA9IGV2ZW50LmdldEVsZW1lbnRzKCk7Ci0JCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCQl0cmVlVmlld2VyLnJlZnJlc2godHJ1ZSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCW9iaiA9IFNlcnZlclVJUGx1Z2luLmFkYXB0TGFiZWxDaGFuZ2VPYmplY3RzKG9iaik7Ci0JCQkJCWludCBzaXplID0gb2JqLmxlbmd0aDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJCQl0cmVlVmlld2VyLnJlZnJlc2gob2JqW2ldLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlJPT1QpOwotCQl0cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoMSk7Ci0JCQotCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGdldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCQkJc2VsZWN0aW9uID0gKElTZXJ2ZXIpIG9iajsKLQkJCQkJc2V0RGVzY3JpcHRpb24oc2VsZWN0aW9uLmdldFNlcnZlclR5cGUoKS5nZXRSdW50aW1lVHlwZSgpLmdldERlc2NyaXB0aW9uKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNlbGVjdGlvbiA9IG51bGw7Ci0JCQkJCXNldERlc2NyaXB0aW9uKCIiKTsKLQkJCQl9Ci0JCQkJbGlzdGVuZXIuc2VydmVyU2VsZWN0ZWQoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVHJlZSgpIHsKLQkJdHJlZSA9IG5ldyBGaWx0ZXJlZFRyZWUodGhpcywgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04sIG5ldyBTZXJ2ZXJQYXR0ZXJuRmlsdGVyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyhib29sZWFuIGIpIHsKLQkJaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zID0gYjsKLQkJSVNlbGVjdGlvbiBzZWwgPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQljb250ZW50UHJvdmlkZXIuc2V0SW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zKGIpOwotCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSAmJiBpbml0aWFsU2VsZWN0aW9uKSB7Ci0JCQlpbml0aWFsU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQlkZWZlckluaXRpYWxpemF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoQWxsKCkgewotCQlJU2VsZWN0aW9uIHNlbCA9IHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyKG1vZHVsZSwgbGF1bmNoTW9kZSk7Ci0JCWNvbnRlbnRQcm92aWRlci5zZXRJbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMoaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uTGFiZWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGl0bGVMYWJlbCgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLndpek5ld1NlcnZlclNlbGVjdEV4aXN0aW5nOwotCX0KLQotCXB1YmxpYyBJU2VydmVyIGdldFNlbGVjdGVkU2VydmVyKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VydmVyIHNlcnZlcikgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZXJ2ZXIpLCB0cnVlKTsKLQkJZWxzZQotCQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVmZXJJbml0aWFsaXphdGlvbigpIHsKLQkJSm9iIGpvYiA9IG5ldyBKb2IoTWVzc2FnZXMuam9iSW5pdGlhbGl6aW5nU2VydmVyc1ZpZXcpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChjb250ZW50UHJvdmlkZXIuZ2V0SW5pdGlhbFNlbGVjdGlvbihtb2R1bGUuZ2V0UHJvamVjdCgpKSAhPSBudWxsKQotCQkJCQkJCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb250ZW50UHJvdmlkZXIuZ2V0SW5pdGlhbFNlbGVjdGlvbihtb2R1bGUuZ2V0UHJvamVjdCgpKSksIHRydWUpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBpZ25vcmUgLSB3aXphcmQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQkKLQkJam9iLnNldFN5c3RlbSh0cnVlKTsKLQkJam9iLnNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlclBhdHRlcm5GaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyUGF0dGVybkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDFlODllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyUGF0dGVybkZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlBhdHRlcm5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLQotcHVibGljIGNsYXNzIFNlcnZlclBhdHRlcm5GaWx0ZXIgZXh0ZW5kcyBQYXR0ZXJuRmlsdGVyIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0xlYWZNYXRjaChWaWV3ZXIgdmlld2VyLCBPYmplY3QgZWxlbWVudCkgewotCQlib29sZWFuIGIgPSBzdXBlci5pc0xlYWZNYXRjaCh2aWV3ZXIsIGVsZW1lbnQpOwotCQlpZiAoYikKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJT2JqZWN0IHBhcmVudCA9ICgoSVRyZWVDb250ZW50UHJvdmlkZXIpICgoQWJzdHJhY3RUcmVlVmlld2VyKSB2aWV3ZXIpCi0JCQkJLmdldENvbnRlbnRQcm92aWRlcigpKS5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxhYmVsVGV4dCA9ICgoSUxhYmVsUHJvdmlkZXIpICgoU3RydWN0dXJlZFZpZXdlcikgdmlld2VyKS5nZXRMYWJlbFByb3ZpZGVyKCkpCi0JCQkJCS5nZXRUZXh0KHBhcmVudCk7Ci0JCQkKLQkJCWlmIChsYWJlbFRleHQgIT0gbnVsbCAmJiB3b3JkTWF0Y2hlcyhsYWJlbFRleHQpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSAmJiBtYXRjaGVzUnVudGltZVR5cGUoKElSdW50aW1lVHlwZSkgZWxlbWVudCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUnVudGltZSAmJiBtYXRjaGVzUnVudGltZSgoSVJ1bnRpbWUpIGVsZW1lbnQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclR5cGUgJiYgbWF0Y2hlc1NlcnZlclR5cGUoKElTZXJ2ZXJUeXBlKSBlbGVtZW50KSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXIgJiYgbWF0Y2hlc1NlcnZlcigoSVNlcnZlcikgZWxlbWVudCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzTW9kdWxlVHlwZShJTW9kdWxlVHlwZSBtdCkgewotCQlTdHJpbmcgdGV4dCA9IG10LmdldE5hbWUoKTsKLQkJaWYgKHdvcmRNYXRjaGVzKHRleHQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXRleHQgPSBtdC5nZXRWZXJzaW9uKCk7Ci0JCWlmICh3b3JkTWF0Y2hlcyh0ZXh0KSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlc1J1bnRpbWVUeXBlKElSdW50aW1lVHlwZSBydCkgewotCQlTdHJpbmcgdGV4dCA9IHJ0LmdldE5hbWUoKTsKLQkJaWYgKHdvcmRNYXRjaGVzKHRleHQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXRleHQgPSBydC5nZXREZXNjcmlwdGlvbigpOwotCQlpZiAod29yZE1hdGNoZXModGV4dCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJdGV4dCA9IHJ0LmdldFZlbmRvcigpOwotCQlpZiAod29yZE1hdGNoZXModGV4dCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJdGV4dCA9IHJ0LmdldFZlcnNpb24oKTsKLQkJaWYgKHdvcmRNYXRjaGVzKHRleHQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlJTW9kdWxlVHlwZVtdIG10cyA9IHJ0LmdldE1vZHVsZVR5cGVzKCk7Ci0JCWlmIChtdHMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBtdHMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAobWF0Y2hlc01vZHVsZVR5cGUobXRzW2ldKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoZXNSdW50aW1lKElSdW50aW1lIHIpIHsKLQkJU3RyaW5nIHRleHQgPSByLmdldE5hbWUoKTsKLQkJaWYgKHdvcmRNYXRjaGVzKHRleHQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChyLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IHIuZ2V0TG9jYXRpb24oKS50b1BvcnRhYmxlU3RyaW5nKCk7Ci0JCQlpZiAod29yZE1hdGNoZXModGV4dCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl0ZXh0ID0gci5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCWlmICh3b3JkTWF0Y2hlcyh0ZXh0KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoci5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwgJiYgbWF0Y2hlc1J1bnRpbWVUeXBlKHIuZ2V0UnVudGltZVR5cGUoKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoZXNTZXJ2ZXJUeXBlKElTZXJ2ZXJUeXBlIHN0KSB7Ci0JCVN0cmluZyB0ZXh0ID0gc3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJaWYgKHdvcmRNYXRjaGVzKHRleHQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChzdC5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwgJiYgbWF0Y2hlc1J1bnRpbWVUeXBlKHN0LmdldFJ1bnRpbWVUeXBlKCkpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzU2VydmVyKElTZXJ2ZXIgc3QpIHsKLQkJU3RyaW5nIHRleHQgPSBzdC5nZXROYW1lKCk7Ci0JCWlmICh3b3JkTWF0Y2hlcyh0ZXh0KSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoc3QuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgbWF0Y2hlc1NlcnZlclR5cGUoc3QuZ2V0U2VydmVyVHlwZSgpKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OGExNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLS8qKgotICogUnVudGltZSB0eXBlIGNvbnRlbnQgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgSU1vZHVsZSBtb2R1bGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBsYXVuY2hNb2RlOwotCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9uczsKLQotCS8qKgotCSAqIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyKElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlzdXBlcihmYWxzZSk7Ci0JCXRoaXMubW9kdWxlID0gbW9kdWxlOwotCQl0aGlzLmxhdW5jaE1vZGUgPSBsYXVuY2hNb2RlOwotCQkKLQkJZmlsbFRyZWUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zKGJvb2xlYW4gYikgewotCQlpbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMgPSBiOwotCQlmaWxsVHJlZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBmaWxsVHJlZSgpIHsKLQkJY2xlYW4oKTsKLQkJTGlzdDxUcmVlRWxlbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8VHJlZUVsZW1lbnQ+KCk7Ci0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChhY2NlcHRTZXJ2ZXIoc2VydmVyc1tpXSkpIHsKLQkJCQkJVHJlZUVsZW1lbnQgdGUgPSBnZXRPckNyZWF0ZShsaXN0LCBzZXJ2ZXJzW2ldLmdldEhvc3QoKSk7Ci0JCQkJCXRlLmNvbnRlbnRzLmFkZChzZXJ2ZXJzW2ldKTsKLQkJCQkJZWxlbWVudFRvUGFyZW50TWFwLnB1dChzZXJ2ZXJzW2ldLCB0ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsZW1lbnRzID0gbGlzdC50b0FycmF5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0U2VydmVyKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCB8fCBsYXVuY2hNb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKCFTZXJ2ZXJVSVBsdWdpbi5pc0NvbXBhdGlibGVXaXRoTGF1bmNoTW9kZShzZXJ2ZXIsIGxhdW5jaE1vZGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJSU1vZHVsZVR5cGUgbXQgPSBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpOwotCQlpZiAoaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zKSB7Ci0JCQlpZiAoIVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRSdW50aW1lVHlwZSgpLmdldE1vZHVsZVR5cGVzKCksIG10LmdldElkKCksIG51bGwpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCWlmICghU2VydmVyVXRpbC5pc1N1cHBvcnRlZE1vZHVsZShzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKSwgbXQuZ2V0SWQoKSwgbXQuZ2V0VmVyc2lvbigpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHlwZUNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUeXBlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMmMxZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUeXBlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZGlzY292ZXJ5LkRpc2NvdmVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVHlwZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0VHJlZUNvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXJUeXBlIHNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgU2VydmVyVHlwZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyOwotCXByb3RlY3RlZCBTZXJ2ZXJUeXBlVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbFNlbGVjdGlvbiA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZVR5cGUgbW9kdWxlVHlwZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZlclR5cGVJZDsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzTG9jYWxob3N0OwotCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9uczsKLQotCXB1YmxpYyBpbnRlcmZhY2UgU2VydmVyVHlwZVNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgc2VydmVyVHlwZVNlbGVjdGVkKElTZXJ2ZXJUeXBlIHR5cGUpOwotCX0KLQotCXB1YmxpYyBTZXJ2ZXJUeXBlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElNb2R1bGVUeXBlIG1vZHVsZVR5cGUsIFN0cmluZyBzZXJ2ZXJUeXBlSWQsIFNlcnZlclR5cGVTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjIpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyMjsKLQkJCi0JCXRoaXMubW9kdWxlVHlwZSA9IG1vZHVsZVR5cGU7Ci0JCXRoaXMuc2VydmVyVHlwZUlkID0gc2VydmVyVHlwZUlkOwotCQkKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IFNlcnZlclR5cGVUcmVlQ29udGVudFByb3ZpZGVyKG1vZHVsZVR5cGUsIHNlcnZlclR5cGVJZCk7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IFNlcnZlclR5cGVUcmVlTGFiZWxQcm92aWRlcigpOwotCQlsYWJlbFByb3ZpZGVyLmFkZExpc3RlbmVyKG5ldyBJTGFiZWxQcm92aWRlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdFtdIG9iaiA9IGV2ZW50LmdldEVsZW1lbnRzKCk7Ci0JCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCQl0cmVlVmlld2VyLnJlZnJlc2godHJ1ZSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCW9iaiA9IFNlcnZlclVJUGx1Z2luLmFkYXB0TGFiZWxDaGFuZ2VPYmplY3RzKG9iaik7Ci0JCQkJCWludCBzaXplID0gb2JqLmxlbmd0aDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJCQl0cmVlVmlld2VyLnJlZnJlc2gob2JqW2ldLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlJPT1QpOwotCQkKLQkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdCBvYmogPSBnZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU2VydmVyVHlwZSkgewotCQkJCQlzZWxlY3Rpb24gPSAoSVNlcnZlclR5cGUpIG9iajsKLQkJCQkJc2V0RGVzY3JpcHRpb24oc2VsZWN0aW9uLmdldERlc2NyaXB0aW9uKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNlbGVjdGlvbiA9IG51bGw7Ci0JCQkJCXNldERlc2NyaXB0aW9uKCIiKTsKLQkJCQl9Ci0JCQkJbGlzdGVuZXIuc2VydmVyVHlwZVNlbGVjdGVkKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdHJlZVZpZXdlci5zZXRTb3J0ZXIobmV3IERlZmF1bHRWaWV3ZXJTb3J0ZXIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKHZpc2libGUgJiYgaW5pdGlhbFNlbGVjdGlvbikgewotCQkJaW5pdGlhbFNlbGVjdGlvbiA9IGZhbHNlOwotCQkJZGVmZXJJbml0aWFsaXphdGlvbigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVmZXJJbml0aWFsaXphdGlvbigpIHsKLQkJSm9iIGpvYiA9IG5ldyBKb2IoTWVzc2FnZXMuam9iSW5pdGlhbGl6aW5nU2VydmVyc1ZpZXcpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChjb250ZW50UHJvdmlkZXIuZ2V0SW5pdGlhbFNlbGVjdGlvbigpICE9IG51bGwpCi0JCQkJCQkJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbnRlbnRQcm92aWRlci5nZXRJbml0aWFsU2VsZWN0aW9uKCkpLCB0cnVlKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gaWdub3JlIC0gd2l6YXJkIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJCi0JCWpvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCWpvYi5zZXRQcmlvcml0eShKb2IuU0hPUlQpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXRIb3N0KGJvb2xlYW4gbmV3SG9zdCkgewotCQlpZiAoaXNMb2NhbGhvc3QgPT0gbmV3SG9zdCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlzTG9jYWxob3N0ID0gbmV3SG9zdDsKLQkJSVNlbGVjdGlvbiBzZWwgPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQljb250ZW50UHJvdmlkZXIuc2V0TG9jYWxob3N0KGlzTG9jYWxob3N0KTsKLQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCS8vdHJlZVZpZXdlci5leHBhbmRUb0xldmVsKDIpOwotCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWwsIHRydWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMoYm9vbGVhbiBiKSB7Ci0JCWluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyA9IGI7Ci0JCUlTZWxlY3Rpb24gc2VsID0gdHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJY29udGVudFByb3ZpZGVyLnNldEluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyhiKTsKLQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCwgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbkxhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlTGFiZWwoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5zZXJ2ZXJUeXBlQ29tcExhYmVsOwotCX0KLQotCXB1YmxpYyBJU2VydmVyVHlwZSBnZXRTZWxlY3RlZFNlcnZlclR5cGUoKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJSVNlbGVjdGlvbiBzZWwgPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIobW9kdWxlVHlwZSwgc2VydmVyVHlwZUlkKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXRhaWxzTGFiZWwoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5pbnN0YWxsYWJsZVNlcnZlckxpbms7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsb3NlV2l6YXJkKENvbXBvc2l0ZSBjb21wKSB7Ci0JCWlmIChjb21wID09IG51bGwgfHwgY29tcC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCUNvbXBvc2l0ZSBjID0gY29tcC5nZXRQYXJlbnQoKTsKLQkJaWYgKGMgaW5zdGFuY2VvZiBTaGVsbCkgewotCQkJU2hlbGwgcyA9IChTaGVsbCkgYzsKLQkJCXMuY2xvc2UoKTsKLQkJfQotCQljbG9zZVdpemFyZChjKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZXRhaWxzU2VsZWN0ZWQoKSB7Ci0JCWlmIChEaXNjb3ZlcnkubGF1bmNoRXh0ZW5zaW9uV2l6YXJkKGdldFNoZWxsKCksIE1lc3NhZ2VzLndpek5ld0luc3RhbGxhYmxlU2VydmVyVGl0bGUsCi0JCQkJTWVzc2FnZXMud2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJEZXNjcmlwdGlvbikpIHsKLQkJCS8vcmVmcmVzaCgpOwotCQkJY2xvc2VXaXphcmQodGhpcyk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUeXBlVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUeXBlVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDA4NWQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIFNlcnZlciB0eXBlIGNvbnRlbnQgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlVHJlZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlciB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbG9jYWxob3N0OwotCi0JcHJvdGVjdGVkIElNb2R1bGVUeXBlIG1vZHVsZVR5cGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBzZXJ2ZXJUeXBlSWQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zOwotCi0JLyoqCi0JICogU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZVR5cGUgYSBtb2R1bGUgdHlwZQotCSAqIEBwYXJhbSBzZXJ2ZXJUeXBlSWQgYSBzZXJ2ZXIgdHlwZSBpZCwgb3IgbnVsbCB0byBtYXRjaCBhbnkgaWQKLQkgKi8KLQlwdWJsaWMgU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIoSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSwgU3RyaW5nIHNlcnZlclR5cGVJZCkgewotCQlzdXBlcihmYWxzZSk7Ci0JCWxvY2FsaG9zdCA9IHRydWU7Ci0JCQotCQl0aGlzLm1vZHVsZVR5cGUgPSBtb2R1bGVUeXBlOwotCQl0aGlzLnNlcnZlclR5cGVJZCA9IHNlcnZlclR5cGVJZDsKLQkJCi0JCWZpbGxUcmVlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGZpbGxUcmVlKCkgewotCQljbGVhbigpOwotCi0JCUxpc3Q8VHJlZUVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFRyZWVFbGVtZW50PigpOwotCQlJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOwotCQlpZiAoc2VydmVyVHlwZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXJUeXBlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBzZXJ2ZXJUeXBlc1tpXTsKLQkJCQlpZiAoaW5jbHVkZShzZXJ2ZXJUeXBlKSkgewotCQkJCQl0cnkgewotCQkJCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpOwotCQkJCQkJVHJlZUVsZW1lbnQgZWxlID0gZ2V0T3JDcmVhdGUobGlzdCwgcnVudGltZVR5cGUuZ2V0VmVuZG9yKCkpOwotCQkJCQkJZWxlLmNvbnRlbnRzLmFkZChzZXJ2ZXJUeXBlKTsKLQkJCQkJCWVsZW1lbnRUb1BhcmVudE1hcC5wdXQoc2VydmVyVHlwZSwgZWxlKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJFcnJvciBpbiBzZXJ2ZXIgY29uZmlndXJhdGlvbiBjb250ZW50IHByb3ZpZGVyIiwgZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudHMgPSBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbmNsdWRlKElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUpIHsKLQkJaWYgKHNlcnZlclR5cGVJZCAhPSBudWxsICYmICFzZXJ2ZXJUeXBlLmdldElkKCkuc3RhcnRzV2l0aChzZXJ2ZXJUeXBlSWQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpOwotCQlpZiAocnVudGltZVR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCVN0cmluZyBtb2R1bGVUeXBlSWQgPSBudWxsOwotCQlpZiAobW9kdWxlVHlwZSAhPSBudWxsKQotCQkJbW9kdWxlVHlwZUlkID0gbW9kdWxlVHlwZS5nZXRJZCgpOwotCQlpZiAoaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zKSB7Ci0JCQlpZiAoIVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUocnVudGltZVR5cGUuZ2V0TW9kdWxlVHlwZXMoKSwgbW9kdWxlVHlwZUlkLCBudWxsKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbW9kdWxlVmVyc2lvbiA9IG51bGw7Ci0JCQlpZiAobW9kdWxlVHlwZSAhPSBudWxsKQotCQkJCW1vZHVsZVZlcnNpb24gPSBtb2R1bGVUeXBlLmdldFZlcnNpb24oKTsKLQkJCWlmICghU2VydmVyVXRpbC5pc1N1cHBvcnRlZE1vZHVsZShydW50aW1lVHlwZS5nZXRNb2R1bGVUeXBlcygpLCBtb2R1bGVUeXBlSWQsIG1vZHVsZVZlcnNpb24pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKGxvY2FsaG9zdCB8fCBzZXJ2ZXJUeXBlLnN1cHBvcnRzUmVtb3RlSG9zdHMoKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrRm9yTm9uU3R1YkVudmlyb25tZW50UnVudGltZShJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlKSB7Ci0JCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKTsKLQkJSVJ1bnRpbWVbXSBydW50aW1lcyA9IFNlcnZlclVJUGx1Z2luLmdldFJ1bnRpbWVzKHJ1bnRpbWVUeXBlKTsKLQkJaWYgKHJ1bnRpbWVzID09IG51bGwgfHwgcnVudGltZXMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmICghcnVudGltZXNbaV0uaXNTdHViKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2FsaG9zdChib29sZWFuIGxvY2FsKSB7Ci0JCWxvY2FsaG9zdCA9IGxvY2FsOwotCQlmaWxsVHJlZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyhib29sZWFuIGIpIHsKLQkJaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zID0gYjsKLQkJZmlsbFRyZWUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUeXBlVHJlZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHlwZVRyZWVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NzIyMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUeXBlVHJlZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLS8qKgotICogU2VydmVyIHR5cGUgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlVHJlZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVMYWJlbFByb3ZpZGVyIHsKLQkvKioKLQkgKiBTZXJ2ZXJUeXBlVHJlZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2VydmVyVHlwZVRyZWVMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFNlcnZlclR5cGVUcmVlTGFiZWxQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBkZWNvcmF0b3IgYSBsYWJlbCBkZWNvcmF0b3IsIG9yIG51bGwgaWYgbm8gZGVjb3JhdG9yIGlzIHJlcXVpcmVkCi0JICovCi0JcHVibGljIFNlcnZlclR5cGVUcmVlTGFiZWxQcm92aWRlcihJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yKSB7Ci0JCXN1cGVyKGRlY29yYXRvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlSW1wbChPYmplY3QgZWxlbWVudCkgewotCQlJU2VydmVyVHlwZSB0eXBlID0gKElTZXJ2ZXJUeXBlKSBlbGVtZW50OwotCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZSh0eXBlLmdldElkKCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGV4dEltcGwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSVNlcnZlclR5cGUgdHlwZSA9IChJU2VydmVyVHlwZSkgZWxlbWVudDsKLQkJcmV0dXJuIG5vdE51bGwodHlwZS5nZXROYW1lKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1ZlcnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvVmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTk3MGM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvVmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotcHVibGljIGNsYXNzIFZlcnNpb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1IgPSAiLiI7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIHZlcnNpb247Ci0KLQlwdWJsaWMgVmVyc2lvbihTdHJpbmcgcykgewotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHMsIFNFUEFSQVRPUik7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQotCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCk7Ci0JCQlpbnQgc2l6ZSA9IHN0ci5sZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KHN0ci5jaGFyQXQoaSkpKQotCQkJCQl0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCJWZXJzaW9uIHN0cmluZ3MgY2Fubm90IGNvbnRhaW4gJyIgKyBzdHIuY2hhckF0KGkpICsgIiciKTsKLQkJCX0KLQkJCWxpc3QuYWRkKHN0cik7Ci0JCX0KLQkJCi0JCXZlcnNpb24gPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHZlcnNpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVmVyc2lvbiBwYXJzZVZlcnNpb24oU3RyaW5nIHMpIHsKLQkJcmV0dXJuIG5ldyBWZXJzaW9uKHMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmUoVmVyc2lvbiB2MSwgVmVyc2lvbiB2MikgewotCQlpbnQgdjFsID0gdjEudmVyc2lvbi5sZW5ndGg7Ci0JCWludCB2MmwgPSB2Mi52ZXJzaW9uLmxlbmd0aDsKLQkJCi0JCWludCBzaXplID0gTWF0aC5taW4odjFsLCB2MmwpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlkb3VibGUgZDEgPSBEb3VibGUucGFyc2VEb3VibGUodjEudmVyc2lvbltpXSk7Ci0JCQkJZG91YmxlIGQyID0gRG91YmxlLnBhcnNlRG91YmxlKHYyLnZlcnNpb25baV0pOwotCQkJCQotCQkJCWludCBjID0gRG91YmxlLmNvbXBhcmUoZDEsIGQyKTsKLQkJCQlpZiAoYyAhPSAwKQotCQkJCQlyZXR1cm4gYzsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCQotCQkJaW50IGMgPSB2MS52ZXJzaW9uW2ldLmNvbXBhcmVUbyh2Mi52ZXJzaW9uW2ldKTsKLQkJCWlmIChjICE9IDApCi0JCQkJcmV0dXJuIGM7Ci0JCX0KLQkJaWYgKHYxbCA9PSB2MmwpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKHYxbCA+IHYybCkKLQkJCXJldHVybiAxOwotCQlyZXR1cm4gLTE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2ViYnJvd3Nlci9PcGVuQnJvd3NlcldvcmtiZW5jaEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2ViYnJvd3Nlci9PcGVuQnJvd3NlcldvcmtiZW5jaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTc1YmVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dlYmJyb3dzZXIvT3BlbkJyb3dzZXJXb3JrYmVuY2hBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2ViYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotLyoqCi0gKiBBY3Rpb24gdG8gb3BlbiB0aGUgV2ViIGJyb3N3ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuQnJvd3NlcldvcmtiZW5jaEFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0JLyoqCi0JICogT3BlbkJyb3dzZXJXb3JrYmVuY2hBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT3BlbkJyb3dzZXJXb3JrYmVuY2hBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhpcyBhY3Rpb24gZGVsZWdhdGUuICBUaGUgaW1wbGVtZW50b3Igc2hvdWxkIHVuaG9vayBhbnkgcmVmZXJlbmNlcwotCSAqIHRvIGl0c2VsZiBzbyB0aGF0IGdhcmJhZ2UgY29sbGVjdGlvbiBjYW4gb2NjdXIuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgYWN0aW9uIGRlbGVnYXRlIHdpdGggdGhlIHdvcmtiZW5jaCB3aW5kb3cgaXQgd2lsbCB3b3JrIGluLgotCSAqCi0JICogQHBhcmFtIHdpbmRvdyB0aGUgd2luZG93IHRoYXQgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoaXMgZGVsZWdhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGlzIGFjdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgZGVsZWdhdGluZyBhY3Rpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLgotCSAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBkbyB0aGUgYWN0dWFsIHdvcmsuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyB0aGUgcHJlc2VudGF0aW9uIHBvcnRpb24gb2YgdGhlCi0JICogICBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJdHJ5IHsKLQkJCUlXb3JrYmVuY2hCcm93c2VyU3VwcG9ydCBicm93c2VyU3VwcG9ydCA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QnJvd3NlclN1cHBvcnQoKTsKLQkJCUlXZWJCcm93c2VyIGJyb3dzZXIgPSBicm93c2VyU3VwcG9ydC5jcmVhdGVCcm93c2VyKElXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5MT0NBVElPTl9CQVIgfCBJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuTkFWSUdBVElPTl9CQVIsIG51bGwsIG51bGwsIG51bGwpOwotCQkJYnJvd3Nlci5vcGVuVVJMKG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBvcGVuaW5nIGJyb3dzZXIiLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgYWN0aW9uIGRlbGVnYXRlIHRoYXQgdGhlIHNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoIGhhcyBjaGFuZ2VkLgotCSAqIDxwPgotCSAqIEltcGxlbWVudGVycyBjYW4gdXNlIHRoaXMgb3Bwb3J0dW5pdHkgdG8gY2hhbmdlIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlCi0JICogYWN0aW9uIG9yIHRvIG1vZGlmeSBvdGhlciBwcmVzZW50YXRpb24gcHJvcGVydGllcy4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gcHJveHkgdGhhdCBoYW5kbGVzIHByZXNlbnRhdGlvbiBwb3J0aW9uIG9mIHRoZSBhY3Rpb24KLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93ZWJicm93c2VyL1N3aXRjaEJyb3dzZXJXb3JrYmVuY2hBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dlYmJyb3dzZXIvU3dpdGNoQnJvd3NlcldvcmtiZW5jaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGYwZjYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dlYmJyb3dzZXIvU3dpdGNoQnJvd3NlcldvcmtiZW5jaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53ZWJicm93c2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5Ccm93c2VyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLklCcm93c2VyRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLldlYkJyb3dzZXJQcmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuV2ViQnJvd3NlclV0aWw7Ci0vKioKLSAqIEFjdGlvbiB0byBvcGVuIHRoZSBXZWIgYnJvc3dlci4KLSAqLwotcHVibGljIGNsYXNzIFN3aXRjaEJyb3dzZXJXb3JrYmVuY2hBY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZTIgewotCS8qKgotCSAqIFRoZSBtZW51IGNyZWF0ZWQgYnkgdGhpcyBhY3Rpb24KLQkgKi8KLQlwcml2YXRlIE1lbnUgZk1lbnU7Ci0JCQotCXByb3RlY3RlZCBib29sZWFuIHJlY3JlYXRlTWVudSA9IGZhbHNlOwotCi0JLyoqCi0JICogU3dpdGNoQnJvd3NlcldvcmtiZW5jaEFjdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTd2l0Y2hCcm93c2VyV29ya2JlbmNoQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXNldE1lbnUobnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhpcyBhY3Rpb24ncyBkcm9wLWRvd24gbWVudSwgZGlzcG9zaW5nIHRoZSBwcmV2aW91cyBtZW51LgotCSAqIAotCSAqIEBwYXJhbSBtZW51IHRoZSBuZXcgbWVudQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNZW51KE1lbnUgbWVudSkgewotCQlpZiAoZk1lbnUgIT0gbnVsbCkgewotCQkJZk1lbnUuZGlzcG9zZSgpOwotCQl9Ci0JCWZNZW51ID0gbWVudTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gYWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgbWVudSB3aXRoIGFuIGFjY2VsZXJhdG9yIHNwZWNpZmllZAotCSAqIGJ5IHRoZSBnaXZlbiBudW1iZXIuCi0JICogCi0JICogQHBhcmFtIG1lbnUgdGhlIG1lbnUgdG8gYWRkIHRoZSBhY3Rpb24gdG8KLQkgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gdG8gYWRkCi0JICogQHBhcmFtIGFjY2VsZXJhdG9yIHRoZSBudW1iZXIgdGhhdCBzaG91bGQgYXBwZWFyIGFzIGFuIGFjY2VsZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KE1lbnUgbWVudSwgSUFjdGlvbiBhY3Rpb24sIGludCBhY2NlbGVyYXRvcikgewotCQlTdHJpbmdCdWZmZXIgbGFiZWw9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKGFjY2VsZXJhdG9yID49IDAgJiYgYWNjZWxlcmF0b3IgPCAxMCkgewotCQkJLy9hZGQgdGhlIG51bWVyaWNhbCBhY2NlbGVyYXRvcgotCQkJbGFiZWwuYXBwZW5kKCcmJyk7Ci0JCQlsYWJlbC5hcHBlbmQoYWNjZWxlcmF0b3IpOwotCQkJbGFiZWwuYXBwZW5kKCcgJyk7Ci0JCX0KLQkJbGFiZWwuYXBwZW5kKGFjdGlvbi5nZXRUZXh0KCkpOwotCQlhY3Rpb24uc2V0VGV4dChsYWJlbC50b1N0cmluZygpKTsKLQkJQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBpdGVtPSBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCQlpdGVtLmZpbGwobWVudSwgLTEpOwotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSBkcm9wLWRvd24gbWVudSB3aXRoIGZhdm9yaXRlcyBhbmQgbGF1bmNoIGhpc3RvcnksCi0JICogbGF1bmNoIHNob3J0Y3V0cywgYW5kIGFuIGFjdGlvbiB0byBvcGVuIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBkaWFsb2cuCi0JICoKLQkgKiBAcGFyYW0gbWVudSB0aGUgbWVudSB0byBmaWxsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbE1lbnUoTWVudSBtZW51KSB7Ci0JCWludCBpID0gMDsKLQkJaWYgKFdlYkJyb3dzZXJVdGlsLmNhblVzZUludGVybmFsV2ViQnJvd3NlcigpKSB7Ci0JCQlhZGRUb01lbnUobWVudSwgbmV3IFN3aXRjaERlZmF1bHRCcm93c2VyQWN0aW9uKG51bGwsIFdlYkJyb3dzZXJQcmVmZXJlbmNlLmdldEJyb3dzZXJDaG9pY2UoKSA9PSBXZWJCcm93c2VyUHJlZmVyZW5jZS5JTlRFUk5BTCwgbnVsbCksIGkrKyk7Ci0JCX0KLQkJSUJyb3dzZXJEZXNjcmlwdG9yIGN1cnJlbnQgPSBCcm93c2VyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRXZWJCcm93c2VyKCk7Ci0JCUJyb3dzZXJNYW5hZ2VyIGJyb3dzZXJNYW5hZ2VyID0gQnJvd3Nlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBicm93c2VyTWFuYWdlci5nZXRXZWJCcm93c2VycygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlCcm93c2VyRGVzY3JpcHRvciBicm93c2VyID0gKElCcm93c2VyRGVzY3JpcHRvcikgaXRlcmF0b3IubmV4dCgpOwotCQkJYWRkVG9NZW51KG1lbnUsIG5ldyBTd2l0Y2hEZWZhdWx0QnJvd3NlckFjdGlvbihicm93c2VyLCBXZWJCcm93c2VyUHJlZmVyZW5jZS5nZXRCcm93c2VyQ2hvaWNlKCkgIT0gV2ViQnJvd3NlclByZWZlcmVuY2UuSU5URVJOQUwgJiYgYnJvd3Nlci5lcXVhbHMoY3VycmVudCksIGJyb3dzZXJNYW5hZ2VyKSwgaSsrKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1lbnUgZm9yIHRoZSBhY3Rpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdE1lbnUoKSB7Ci0JCS8vIEFkZCBsaXN0ZW5lciB0byByZXBvcHVsYXRlIHRoZSBtZW51IGVhY2ggdGltZQotCQkvLyBpdCBpcyBzaG93biBiZWNhdXNlIG9mIGR5bmFtaWMgaGlzdG9yeSBsaXN0Ci0JCWZNZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCQkvL2lmIChyZWNyZWF0ZU1lbnUpIHsKLQkJCQkJTWVudSBtID0gKE1lbnUpIGUud2lkZ2V0OwotCQkJCQlNZW51SXRlbVtdIGl0ZW1zID0gbS5nZXRJdGVtcygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpdGVtc1tpXS5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQkJZmlsbE1lbnUobSk7Ci0JCQkJCXJlY3JlYXRlTWVudSA9IGZhbHNlOwotCQkJCS8vfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIE1lbnUgZ2V0TWVudShNZW51IHBhcmVudCkgewotCQlzZXRNZW51KG5ldyBNZW51KHBhcmVudCkpOwotCQkvL2ZpbGxNZW51KGZNZW51KTsKLQkJaW5pdE1lbnUoKTsKLQkJcmV0dXJuIGZNZW51OwotCX0KLQotCXB1YmxpYyBNZW51IGdldE1lbnUoQ29udHJvbCBwYXJlbnQpIHsKLQkJc2V0TWVudShuZXcgTWVudShwYXJlbnQpKTsKLQkJLy9maWxsTWVudShmTWVudSk7Ci0JCWluaXRNZW51KCk7Ci0JCXJldHVybiBmTWVudTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2ViYnJvd3Nlci9Td2l0Y2hEZWZhdWx0QnJvd3NlckFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2ViYnJvd3Nlci9Td2l0Y2hEZWZhdWx0QnJvd3NlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWY4YTE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dlYmJyb3dzZXIvU3dpdGNoRGVmYXVsdEJyb3dzZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53ZWJicm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLkJyb3dzZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuSUJyb3dzZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuV2ViQnJvd3NlclByZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQWN0aW9uIHRvIG9wZW4gdGhlIFdlYiBicm93c2VyLgotICovCi1wdWJsaWMgY2xhc3MgU3dpdGNoRGVmYXVsdEJyb3dzZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBJQnJvd3NlckRlc2NyaXB0b3Igd2ViYnJvd3NlcjsKLQlwcm90ZWN0ZWQgQnJvd3Nlck1hbmFnZXIgYnJvd3Nlck1hbmFnZXI7Ci0KLQkvKioKLQkgKiBTd2l0Y2hEZWZhdWx0QnJvd3NlckFjdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSB3ZWJicm93c2VyIGEgYnJvd3NlcgotCSAqIEBwYXJhbSBjdXJyZW50IHRydWUgaWYgdGhpcyBpcyB0aGUgY3VycmVudCBicm93c2VyCi0JICogQHBhcmFtIG1hbmFnZXIgdGhlIGJyb3dzZXIgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBTd2l0Y2hEZWZhdWx0QnJvd3NlckFjdGlvbihJQnJvd3NlckRlc2NyaXB0b3Igd2ViYnJvd3NlciwgYm9vbGVhbiBjdXJyZW50LCBCcm93c2VyTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXN1cGVyKCk7Ci0JCQotCQl0aGlzLndlYmJyb3dzZXIgPSB3ZWJicm93c2VyOwotCQl0aGlzLmJyb3dzZXJNYW5hZ2VyID0gbWFuYWdlcjsKLQkJaWYgKHdlYmJyb3dzZXIgPT0gbnVsbCkKLQkJCXNldFRleHQoTWVzc2FnZXMuaW50ZXJuYWxXZWJCcm93c2VyTmFtZSk7Ci0JCWVsc2UKLQkJCXNldFRleHQod2ViYnJvd3Nlci5nZXROYW1lKCkpOwotCQkKLQkJaWYgKGN1cnJlbnQpCi0JCQlzZXRDaGVja2VkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBkZWZpbmVkIG9uIDxjb2RlPklBY3Rpb248L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKHdlYmJyb3dzZXIgPT0gbnVsbCkKLQkJCVdlYkJyb3dzZXJQcmVmZXJlbmNlLnNldEJyb3dzZXJDaG9pY2UoV2ViQnJvd3NlclByZWZlcmVuY2UuSU5URVJOQUwpOwotCQllbHNlIHsKLQkJCVdlYkJyb3dzZXJQcmVmZXJlbmNlLnNldEJyb3dzZXJDaG9pY2UoV2ViQnJvd3NlclByZWZlcmVuY2UuRVhURVJOQUwpOwotCQkJYnJvd3Nlck1hbmFnZXIuc2V0Q3VycmVudFdlYkJyb3dzZXIod2ViYnJvd3Nlcik7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL0Fic3RyYWN0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvQWJzdHJhY3RXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVmODIyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvQWJzdHJhY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLS8qKgotICogQW4gYWJzdHJhY3QgV2l6YXJkIHRoYXQgY29udGFpbnMgaGVscGVyIG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdpemFyZCBleHRlbmRzIFdpemFyZCB7Ci0JcHJvdGVjdGVkIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBBYnN0cmFjdFdpemFyZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgd29ya2JlbmNoLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHdvcmtiZW5jaAotCSAqLwotCXB1YmxpYyBJV29ya2JlbmNoIGdldFdvcmtiZW5jaCgpIHsKLQkJcmV0dXJuIHdvcmtiZW5jaDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSB3b3JrYmVuY2ggYW5kIGN1cnJlbnQgc2VsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBuZXdXb3JrYmVuY2gKLQkgKiBAcGFyYW0gbmV3U2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIG5ld1dvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3U2VsZWN0aW9uKSB7Ci0JCXdvcmtiZW5jaCA9IG5ld1dvcmtiZW5jaDsKLQkJc2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvTW9kaWZ5TW9kdWxlc1dpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL01vZGlmeU1vZHVsZXNXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkYzE5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvTW9kaWZ5TW9kdWxlc1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQuTW9kaWZ5TW9kdWxlc1dpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotLyoqCi0gKiBBIHdpemFyZCB1c2VkIHRvIGFkZCBhbmQgcmVtb3ZlIG1vZHVsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZnlNb2R1bGVzV2l6YXJkIGV4dGVuZHMgVGFza1dpemFyZCB7Ci0Jc3RhdGljIGNsYXNzIE1vZGlmeU1vZHVsZXNXaXphcmQyIGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0KSB7Ci0JCQlsaXN0LmFkZChuZXcgTW9kaWZ5TW9kdWxlc1dpemFyZEZyYWdtZW50KHRydWUpKTsKLQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlNhdmVTZXJ2ZXJGcmFnbWVudCk7Ci0JCQkKLQkJCWxpc3QuYWRkKG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlJU2VydmVyQXR0cmlidXRlcyBzdnIgPSAoSVNlcnZlckF0dHJpYnV0ZXMpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIpOwotCQkJCQlpZiAoc3ZyIGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgc3ZyOwotCQkJCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCAmJgotCQkJCQkJCQlTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLmdldFB1Ymxpc2hPbkFkZFJlbW92ZU1vZHVsZSgpKSB7Ci0JCQkJCQkJSUFkYXB0YWJsZSBpbmZvID0gbnVsbDsKLQkJCQkJCQkvKklBZGFwdGFibGUgaW5mbyA9IG5ldyBJQWRhcHRhYmxlKCkgewotCQkJCQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQkJCQkJaWYgKFNoZWxsLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkKLQkJCQkJCQkJCQlyZXR1cm4gc2hlbGw7Ci0JCQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCQkJfQotCQkJCQkJCX07Ki8KLQkJCQkJCQlzZXJ2ZXIucHVibGlzaChJU2VydmVyLlBVQkxJU0hfSU5DUkVNRU5UQUwsIG51bGwsIGluZm8sIG51bGwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnlNb2R1bGVzV2l6YXJkIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgTW9kaWZ5TW9kdWxlc1dpemFyZChJU2VydmVyIHNlcnZlcikgewotCQlzdXBlcihNZXNzYWdlcy53aXpNb2R1bGVXaXphcmRUaXRsZSwgbmV3IE1vZGlmeU1vZHVsZXNXaXphcmQyKCkpOwotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUiwgc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvTmV3UnVudGltZVdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1J1bnRpbWVXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhNzg3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvTmV3UnVudGltZVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50Lk5ld1J1bnRpbWVXaXphcmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0vKioKLSAqIEEgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBydW50aW1lLgotICovCi1wdWJsaWMgY2xhc3MgTmV3UnVudGltZVdpemFyZCBleHRlbmRzIFRhc2tXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQkvKioKLQkgKiBOZXdSdW50aW1lV2l6YXJkIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE5ld1J1bnRpbWVXaXphcmQoKSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLndpek5ld1J1bnRpbWVXaXphcmRUaXRsZSwgbmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgewotCQkJCWxpc3QuYWRkKG5ldyBOZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQoKSk7Ci0JCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuU2F2ZVJ1bnRpbWVGcmFnbWVudCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIG5ld1dvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3U2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1NlcnZlcldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1NlcnZlcldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRkZDdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9OZXdTZXJ2ZXJXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQuTW9kaWZ5TW9kdWxlc1dpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50Lk5ld1NlcnZlcldpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50LlRhc2tzV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotLyoqCi0gKiBBIHdpemFyZCB0byBjcmVhdGUgYSBuZXcgc2VydmVyIGFuZCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE5ld1NlcnZlcldpemFyZCBleHRlbmRzIFRhc2tXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQkvKioKLQkgKiBOZXdTZXJ2ZXJXaXphcmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTmV3U2VydmVyV2l6YXJkKCkgewotCQl0aGlzKG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBOZXdTZXJ2ZXJXaXphcmQoZmluYWwgU3RyaW5nW10gaWRzLCBmaW5hbCBTdHJpbmdbXSB2YWx1ZXMpIHsKLQkJc3VwZXIoTWVzc2FnZXMud2l6TmV3U2VydmVyV2l6YXJkVGl0bGUsIG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKLQkJCQlsaXN0LmFkZChuZXcgTmV3U2VydmVyV2l6YXJkRnJhZ21lbnQoKSk7Ci0JCQkJCi0JCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuVGVtcFNhdmVSdW50aW1lRnJhZ21lbnQpOwotCQkJCWxpc3QuYWRkKFdpemFyZFRhc2tVdGlsLlRlbXBTYXZlU2VydmVyRnJhZ21lbnQpOwotCQkJCQotCQkJCWxpc3QuYWRkKG5ldyBNb2RpZnlNb2R1bGVzV2l6YXJkRnJhZ21lbnQoKSk7Ci0JCQkJbGlzdC5hZGQobmV3IFRhc2tzV2l6YXJkRnJhZ21lbnQoKSk7Ci0JCQkJCi0JCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuU2F2ZVJ1bnRpbWVGcmFnbWVudCk7Ci0JCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuU2F2ZVNlcnZlckZyYWdtZW50KTsKLQkJCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5TYXZlSG9zdG5hbWVGcmFnbWVudCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJaWYgKGlkcyAhPSBudWxsKSB7Ci0JCQlUYXNrTW9kZWwgdGFza01vZGVsMiA9IGdldFRhc2tNb2RlbCgpOwotCQkJaW50IHNpemUgPSBpZHMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQl0YXNrTW9kZWwyLnB1dE9iamVjdChpZHNbaV0sIHZhbHVlc1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggbmV3V29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBuZXdTZWxlY3Rpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvUnVuT25TZXJ2ZXJXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9SdW5PblNlcnZlcldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzRlMTNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9SdW5PblNlcnZlcldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklMYXVuY2hhYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9ucy5SdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50LlJ1bk9uU2VydmVyV2l6YXJkRnJhZ21lbnQ7Ci0vKioKLSAqIEEgd2l6YXJkIHVzZWQgZm9yIFJ1biBvbiBTZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5PblNlcnZlcldpemFyZCBleHRlbmRzIFRhc2tXaXphcmQgewotCQotCS8qKgotCSAqIFJ1bk9uU2VydmVyV2l6YXJkIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEgbGF1bmNoIG1vZGUKLQkgKiBAcGFyYW0gbW9kdWxlQXJ0aWZhY3QgYSBtb2R1bGUgYXJ0aWZhY3QKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBSdW5PblNlcnZlcldpemFyZChJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIGxhdW5jaE1vZGUsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCkgewotCQl0aGlzKG1vZHVsZSwgbGF1bmNoTW9kZSxtb2R1bGVBcnRpZmFjdCwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJ1bk9uU2VydmVyV2l6YXJkIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEgbGF1bmNoIG1vZGUKLQkgKiBAcGFyYW0gbW9kdWxlQXJ0aWZhY3QgYSBtb2R1bGUgYXJ0aWZhY3QKLQkgKiBAcGFyYW0gcHJvcGVydGllcyBhIEhhc2hNYXAgd2l0aCB0aGUga2V5L3ZhbHVlIHBhaXIgdGhhdCBkZWZpbmVzIHRoZSBiZWhhdmlvdXIgb2YgdGhlIHdpemFyZCAKLQkgKi8KLQlwdWJsaWMgUnVuT25TZXJ2ZXJXaXphcmQoSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBsYXVuY2hNb2RlLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QsIEhhc2hNYXAgcHJvcGVydGllcykgewotCQlzdXBlcihNZXNzYWdlcy53aXpSdW5PblNlcnZlclRpdGxlLCBjcmVhdGVSb290V2l6YXJkKG1vZHVsZSwgbGF1bmNoTW9kZSwgbW9kdWxlQXJ0aWZhY3QsIHByb3BlcnRpZXMpKTsKLQkJCi0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobGF1bmNoTW9kZSkpCi0JCQlzZXRXaW5kb3dUaXRsZShNZXNzYWdlcy53aXpEZWJ1Z09uU2VydmVyVGl0bGUpOwotCQllbHNlIGlmIChJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKQotCQkJc2V0V2luZG93VGl0bGUoTWVzc2FnZXMud2l6UHJvZmlsZU9uU2VydmVyVGl0bGUpOwotCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfTEFVTkNIX01PREUsIGxhdW5jaE1vZGUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFJ1bk9uU2VydmVyV2l6YXJkRnJhZ21lbnQgY3JlYXRlUm9vdFdpemFyZChJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIGxhdW5jaE1vZGUsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCwgSGFzaE1hcCBwcm9wZXJ0aWVzKXsKLQkJUnVuT25TZXJ2ZXJXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IG5ldyBSdW5PblNlcnZlcldpemFyZEZyYWdtZW50KG1vZHVsZSwgbGF1bmNoTW9kZSwgbW9kdWxlQXJ0aWZhY3QpOwotCQlzZXRGcmFnbWVudFByb3BlcnRpZXMoZnJhZ21lbnQsIHByb3BlcnRpZXMpOwotCQlyZXR1cm4gZnJhZ21lbnQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFJ1bk9uU2VydmVyV2l6YXJkRnJhZ21lbnQgY3JlYXRlUm9vdFdpemFyZAkoSVNlcnZlciBzZXJ2ZXIsIFN0cmluZyBsYXVuY2hNb2RlLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QsSGFzaE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCVJ1bk9uU2VydmVyV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSBuZXcgUnVuT25TZXJ2ZXJXaXphcmRGcmFnbWVudChzZXJ2ZXIsIGxhdW5jaE1vZGUsIG1vZHVsZUFydGlmYWN0KTsKLQkJc2V0RnJhZ21lbnRQcm9wZXJ0aWVzKGZyYWdtZW50LCBwcm9wZXJ0aWVzKTsJCQotCQlyZXR1cm4gZnJhZ21lbnQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0RnJhZ21lbnRQcm9wZXJ0aWVzKFJ1bk9uU2VydmVyV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQsIEhhc2hNYXAgcHJvcGVydGllcyl7Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpewotCQkJZnJhZ21lbnQuc2V0Q2xpZW50KChJQ2xpZW50KXByb3BlcnRpZXMuZ2V0KFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUuUk9TX0NMSUVOVCkpOwotCQkJZnJhZ21lbnQuc2V0TGF1bmNoYWJsZSgoSUxhdW5jaGFibGVBZGFwdGVyKXByb3BlcnRpZXMuZ2V0KFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUuUk9TX0xBVU5DSEFCTEUpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSdW5PblNlcnZlcldpemFyZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBhIGxhdW5jaCBtb2RlCi0JICogQHBhcmFtIG1vZHVsZUFydGlmYWN0IGEgbW9kdWxlIGFydGlmYWN0Ci0JICovCi0JcHVibGljIFJ1bk9uU2VydmVyV2l6YXJkKElTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgbGF1bmNoTW9kZSwgSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0LEhhc2hNYXAgcHJvcGVydGllcykgewotCQlzdXBlcihNZXNzYWdlcy53aXpSdW5PblNlcnZlclRpdGxlLCBjcmVhdGVSb290V2l6YXJkKHNlcnZlcixsYXVuY2hNb2RlLG1vZHVsZUFydGlmYWN0LCBwcm9wZXJ0aWVzKSk7Ci0JCQotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKQotCQkJc2V0V2luZG93VGl0bGUoTWVzc2FnZXMud2l6RGVidWdPblNlcnZlclRpdGxlKTsKLQkJZWxzZSBpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkKLQkJCXNldFdpbmRvd1RpdGxlKE1lc3NhZ2VzLndpelByb2ZpbGVPblNlcnZlclRpdGxlKTsKLQkJCi0JCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIHNlcnZlcik7Ci0JCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19MQVVOQ0hfTU9ERSwgbGF1bmNoTW9kZSk7Ci0JCWFkZFBhZ2VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXJ2ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChJU2VydmVyKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGlmIHRoZSB1c2VyIHdhbnRzIHRvIHVzZSB0aGUgc2VydmVyIGFzIGEgZGVmYXVsdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNlcnZlciBzaG91bGQgYmUgdGhlIGRlZmF1bHQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByZWZlcnJlZFNlcnZlcigpIHsKLQkJdHJ5IHsKLQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19ERUZBVUxUX1NFUlZFUik7Ci0JCQlyZXR1cm4gYi5ib29sZWFuVmFsdWUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VsZWN0ZWQgY2xpZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNsaWVudAotCSAqLwotCXB1YmxpYyBJQ2xpZW50IGdldFNlbGVjdGVkQ2xpZW50KCkgewotCQl0cnkgewotCQkJcmV0dXJuIChJQ2xpZW50KSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19DTElFTlQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGxhdW5jaGFibGUgYWRhcHRlcgotCSAqIEBwYXJhbSBsYXVuY2gKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXVuY2hhYmxlQWRhcHRlcihJTGF1bmNoYWJsZUFkYXB0ZXIgbGF1bmNoKXsKLQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfTEFVTkNIQUJMRV9BREFQVEVSLCBsYXVuY2gpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxhdW5jaGFibGUgYWRhcHRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyCi0JICovCi0JcHVibGljIElMYXVuY2hhYmxlQWRhcHRlciBnZXRMYXVuY2hhYmxlQWRhcHRlcigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSUxhdW5jaGFibGVBZGFwdGVyKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19MQVVOQ0hBQkxFX0FEQVBURVIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB3aXphcmQgc2hvdWxkIGJlIHNob3duIHRvIHRoZSB1c2VyLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB3aXphcmQgc2hvdWxkIGJlIHNob3duLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkQXBwZWFyKCkgewotCQlyZXR1cm4gZ2V0U2VydmVyKCkgPT0gbnVsbCB8fCBoYXNUYXNrcygpIHx8IGhhc0NsaWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB3aXphcmQgaGFzIHRhc2tzLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB3aXphcmQgaGFzIHRhc2tzLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzVGFza3MoKSB7Ci0JCXRyeSB7Ci0JCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfSEFTX1RBU0tTKTsKLQkJCXJldHVybiBiLmJvb2xlYW5WYWx1ZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgd2l6YXJkIGhhcyBtdWx0aXBsZSBjbGllbnRzIHRvIHNob3cuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHdpemFyZCBoYXMgbXVsdGlwbGUgY2xpZW50cywgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgIG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0NsaWVudHMoKSB7Ci0JCXRyeSB7Ci0JCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfSEFTX0NMSUVOVFMpOwotCQkJcmV0dXJuIGIuYm9vbGVhblZhbHVlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL1Rhc2tXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9UYXNrV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YjcxMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL1Rhc2tXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkVjbGlwc2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlLldvcmtzcGFjZVJ1bm5hYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLS8qKgotICogQSB3aXphcmQgdXNlZCB0byBleGVjdXRlIHRhc2tzLgotICovCi1wdWJsaWMgY2xhc3MgVGFza1dpemFyZCBpbXBsZW1lbnRzIElXaXphcmQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgRklOSVNIID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIENBTkNFTCA9IDM7Ci0KLQlwcml2YXRlIExpc3Q8SVdpemFyZFBhZ2U+IHBhZ2VzOwotCXByaXZhdGUgYm9vbGVhbiBhZGRpbmdQYWdlczsKLQlwcml2YXRlIE1hcDxXaXphcmRGcmFnbWVudCwgVGFza1dpemFyZFBhZ2U+IGZyYWdtZW50RGF0YSA9IG5ldyBIYXNoTWFwPFdpemFyZEZyYWdtZW50LCBUYXNrV2l6YXJkUGFnZT4oKTsKLQlwcm90ZWN0ZWQgVGFza01vZGVsIHRhc2tNb2RlbDsKLQkKLQlwcml2YXRlIElXaXphcmRDb250YWluZXIgY29udGFpbmVyID0gbnVsbDsKLQkKLQlwcml2YXRlIGJvb2xlYW4gbmVlZHNQcm9ncmVzc01vbml0b3IgPSBmYWxzZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNIZWxwQXZhaWxhYmxlID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBJbWFnZSBkZWZhdWx0SW1hZ2UgPSBudWxsOwotCQotCXByaXZhdGUgUkdCIHRpdGxlQmFyQ29sb3IgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgd2luZG93VGl0bGUgPSBudWxsOwotCQotCXByaXZhdGUgSURpYWxvZ1NldHRpbmdzIGRpYWxvZ1NldHRpbmdzID0gbnVsbDsKLQkKLQlwcml2YXRlIFdpemFyZEZyYWdtZW50IHJvb3RGcmFnbWVudDsKLQlwcml2YXRlIFdpemFyZEZyYWdtZW50IGN1cnJlbnRGcmFnbWVudDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBUYXNrV2l6YXJkIHdpdGggdGhlIGdpdmVuIHRpdGxlIGFuZCByb290IGZyYWdtZW50LgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZSBhIHRpdGxlCi0JICogQHBhcmFtIHJvb3RGcmFnbWVudCBhIHJvb3QgZnJhZ21lbnQKLQkgKi8KLQlwdWJsaWMgVGFza1dpemFyZChTdHJpbmcgdGl0bGUsIFdpemFyZEZyYWdtZW50IHJvb3RGcmFnbWVudCkgewotCQl0aGlzKHRpdGxlLCByb290RnJhZ21lbnQsIG51bGwpOwotCQlzZXRXaW5kb3dUaXRsZSh0aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFRhc2tXaXphcmQgd2l0aCB0aGUgZ2l2ZW4gdGl0bGUsIHJvb3QgZnJhZ21lbnQsIGFuZCB0YXNrIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZSBhIHRpdGxlCi0JICogQHBhcmFtIHJvb3RGcmFnbWVudCBhIHJvb3QgZnJhZ21lbnQKLQkgKiBAcGFyYW0gdGFza01vZGVsIGEgdGFzayBtb2RlbAotCSAqLwotCXB1YmxpYyBUYXNrV2l6YXJkKFN0cmluZyB0aXRsZSwgV2l6YXJkRnJhZ21lbnQgcm9vdEZyYWdtZW50LCBUYXNrTW9kZWwgdGFza01vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICh0aXRsZSAhPSBudWxsKQotCQkJc2V0V2luZG93VGl0bGUodGl0bGUpOwotCQl0aGlzLnJvb3RGcmFnbWVudCA9IHJvb3RGcmFnbWVudDsKLQkJdGhpcy50YXNrTW9kZWwgPSB0YXNrTW9kZWw7Ci0JCWlmICh0YXNrTW9kZWwgPT0gbnVsbCkKLQkJCXRoaXMudGFza01vZGVsID0gbmV3IFRhc2tNb2RlbCgpOwotCQkKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JCXNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXNrTW9kZWwoVGFza01vZGVsIHRhc2tNb2RlbCkgewotCQl0aGlzLnRhc2tNb2RlbCA9IHRhc2tNb2RlbDsKLQl9Ci0JCi0JcHVibGljIFRhc2tNb2RlbCBnZXRUYXNrTW9kZWwoKSB7Ci0JCXJldHVybiB0YXNrTW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Um9vdEZyYWdtZW50KFdpemFyZEZyYWdtZW50IHJvb3RGcmFnbWVudCkgewotCQl0aGlzLnJvb3RGcmFnbWVudCA9IHJvb3RGcmFnbWVudDsKLQl9Ci0JCi0JcHVibGljIFdpemFyZEZyYWdtZW50IGdldFJvb3RGcmFnbWVudCgpIHsKLQkJcmV0dXJuIHJvb3RGcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBDYW5jZWwgdGhlIGNsaWVudCBzZWxlY3Rpb24uCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQlmaW5hbCBMaXN0IGxpc3QgPSBnZXRBbGxXaXphcmRGcmFnbWVudHMoKTsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLQkJCQkJCWV4ZWN1dGVUYXNrKChXaXphcmRGcmFnbWVudCkgaXRlcmF0b3IubmV4dCgpLCBDQU5DRUwsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oY2UpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCVRocm93YWJsZSB0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChnZXRDb250YWluZXIoKSAhPSBudWxsKQotCQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCB0cnVlLCBydW5uYWJsZSk7Ci0JCQllbHNlCi0JCQkJcnVubmFibGUucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gdGUpIHsKLQkJCXQgPSB0ZS5nZXRDYXVzZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdCA9IGU7Ci0JCX0KLQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGNhbmNlbGxpbmcgdGFzayB3aXphcmQiLCB0KTsKLQkJfQotCQkKLQkJaWYgKHQgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IodC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksICgoQ29yZUV4Y2VwdGlvbil0KS5nZXRTdGF0dXMoKSk7Ci0JCX0gZWxzZQotCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKHQuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCi0JCXJldHVybiBmYWxzZTsKLQkJCi0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJaWYgKGN1cnJlbnRGcmFnbWVudCAhPSBudWxsKQotCQkJY3VycmVudEZyYWdtZW50LmV4aXQoKTsKLQkJCi0JCWZpbmFsIFdpemFyZEZyYWdtZW50IGNGcmFnbWVudCA9IGN1cnJlbnRGcmFnbWVudDsKLQotCQlmaW5hbCBMaXN0IGxpc3QgPSBnZXRBbGxXaXphcmRGcmFnbWVudHMoKTsKLQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkvLyBlbnRlciAmIGV4aXQgdGhlIHJlbWFpbmluZyBwYWdlcwotCQkJCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihjRnJhZ21lbnQpOwotCQkJCXdoaWxlIChpbmRleCA+IDAgJiYgaW5kZXggPCBsaXN0LnNpemUoKSAtIDEpIHsKLQkJCQkJZmluYWwgV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSAoV2l6YXJkRnJhZ21lbnQpIGxpc3QuZ2V0KCsraW5kZXgpOwotCQkJCQl0cnkgewotCQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJZnJhZ21lbnQuZW50ZXIoKTsKLQkJCQkJCQkJZnJhZ21lbnQuZXhpdCgpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkNvdWxkIG5vdCBlbnRlci9leGl0IHBhZ2UiLCBlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAodXNlSm9iKCkpIHsKLQkJCQkJY2xhc3MgRmluaXNoV2l6YXJkSm9iIGV4dGVuZHMgSm9iIHsKLQkJCQkJCXB1YmxpYyBGaW5pc2hXaXphcmRKb2IoKSB7Ci0JCQkJCQkJc3VwZXIoZ2V0Sm9iVGl0bGUoKSk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCQkJCQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmZhbWlseSIuZXF1YWxzKGZhbWlseSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IyKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0JCQkJCQkJCQlleGVjdXRlVGFzaygoV2l6YXJkRnJhZ21lbnQpIGl0ZXJhdG9yLm5leHQoKSwgRklOSVNILCBtb25pdG9yMik7Ci0JCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQkJCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgZmluaXNoaW5nIHdpemFyZCBqb2IiLCBjZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCAwLCBjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIG51bGwpOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJRmluaXNoV2l6YXJkSm9iIGpvYiA9IG5ldyBGaW5pc2hXaXphcmRKb2IoKTsKLQkJCQkJam9iLnNldFVzZXIodHJ1ZSk7Ci0JCQkJCWpvYi5zY2hlZHVsZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotCQkJCQkJZXhlY3V0ZVRhc2soKFdpemFyZEZyYWdtZW50KSBpdGVyYXRvci5uZXh0KCksIEZJTklTSCwgbW9uaXRvcik7Ci0JCQkJfQotCQkJfQotCQl9OwotCQkKLQkJVGhyb3dhYmxlIHQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGdldENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG5ldyBXb3Jrc3BhY2VSdW5uYWJsZUFkYXB0ZXIocnVubmFibGUpKTsKLQkJCWVsc2UKLQkJCQlydW5uYWJsZS5ydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB0ZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBmaW5pc2hpbmcgdGFzayB3aXphcmQiLCB0ZSk7Ci0JCQl9Ci0JCQl0ID0gdGUuZ2V0Q2F1c2UoKTsKLQkJfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpbnRlcnJ1cHRlZEV4KSB7Ci0JCQlpZiAoVHJhY2UuSU5GTykgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19JTkZPLCAiVGhlIHRhc2sgd2l6YXJkIHdhcyBjYW5jZWxsZWQuIiwgaW50ZXJydXB0ZWRFeCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7IC8vIHJldHVybiBmYWxzZSBzaW5jZSB0aGUgcmVxdWVzdCB3YXMgY2FuY2VsZWQKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgZmluaXNoaW5nIHRhc2sgd2l6YXJkIDIiLCBlKTsKLQkJCX0KLQkJCXQgPSBlOwotCQl9Ci0JCQotCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJFcnJvciBjb21wbGV0aW5nIHdpemFyZCIsIHQpOwotCQl9Ci0JCWlmICh0IGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKHQuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCAoKENvcmVFeGNlcHRpb24pdCkuZ2V0U3RhdHVzKCkpOwotCQl9IGVsc2UgaWYgKHQgaW5zdGFuY2VvZiBOdWxsUG9pbnRlckV4Y2VwdGlvbikKLQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcigiTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKLQkJZWxzZQotCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKHQuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkUGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCXBhZ2VzLmFkZChwYWdlKTsKLQkJcGFnZS5zZXRXaXphcmQodGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVUYXNrKFdpemFyZEZyYWdtZW50IGZyYWdtZW50LCBieXRlIHR5cGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZnJhZ21lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmICh0eXBlID09IEZJTklTSCkKLQkJCWZyYWdtZW50LnBlcmZvcm1GaW5pc2gobW9uaXRvcik7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ0FOQ0VMKQotCQkJZnJhZ21lbnQucGVyZm9ybUNhbmNlbChtb25pdG9yKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFdpemFyZEZyYWdtZW50IGdldEN1cnJlbnRXaXphcmRGcmFnbWVudCgpIHsKLQkJcmV0dXJuIGN1cnJlbnRGcmFnbWVudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3dpdGNoV2l6YXJkRnJhZ21lbnQoV2l6YXJkRnJhZ21lbnQgbmV3RnJhZ21lbnQpIHsKLQkJTGlzdCBsaXN0ID0gZ2V0QWxsV2l6YXJkRnJhZ21lbnRzKCk7Ci0JCWludCBvbGRJbmRleCA9IGxpc3QuaW5kZXhPZihjdXJyZW50RnJhZ21lbnQpOwotCQlpbnQgbmV3SW5kZXggPSBsaXN0LmluZGV4T2YobmV3RnJhZ21lbnQpOwotCQlpZiAob2xkSW5kZXggPT0gbmV3SW5kZXgpCi0JCQlyZXR1cm47Ci0JCQotCQkvL3NhZmVFeGVjdXRlVGFzayhjdXJyZW50RnJhZ21lbnQsIERFUEFSVFVSRSk7Ci0JCWlmIChjdXJyZW50RnJhZ21lbnQgIT0gbnVsbCkKLQkJCWN1cnJlbnRGcmFnbWVudC5leGl0KCk7Ci0JCQotCQlpZiAob2xkSW5kZXggPCBuZXdJbmRleCkKLQkJCW9sZEluZGV4ICsrOwotCQllbHNlCi0JCQlvbGRJbmRleCAtLTsKLQkJCi0JCXdoaWxlIChvbGRJbmRleCAhPSBuZXdJbmRleCkgewotCQkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSAoV2l6YXJkRnJhZ21lbnQpIGxpc3QuZ2V0KG9sZEluZGV4KTsKLQkJCS8vc2FmZUV4ZWN1dGVUYXNrKGZyYWdtZW50LCBBUlJJVkFMKTsKLQkJCS8vc2FmZUV4ZWN1dGVUYXNrKGZyYWdtZW50LCBERVBBUlRVUkUpOwotCQkJZnJhZ21lbnQuZW50ZXIoKTsKLQkJCWZyYWdtZW50LmV4aXQoKTsKLQkJCWlmIChvbGRJbmRleCA8IG5ld0luZGV4KQotCQkJCW9sZEluZGV4ICsrOwotCQkJZWxzZQotCQkJCW9sZEluZGV4IC0tOwotCQl9Ci0JCQotCQljdXJyZW50RnJhZ21lbnQgPSBuZXdGcmFnbWVudDsKLQkJLy9zYWZlRXhlY3V0ZVRhc2soY3VycmVudEZyYWdtZW50LCBBUlJJVkFMKTsKLQkJY3VycmVudEZyYWdtZW50LmVudGVyKCk7Ci0JfQotCQotCXByaXZhdGUgTGlzdDxXaXphcmRGcmFnbWVudD4gZ2V0QWxsV2l6YXJkRnJhZ21lbnRzKCkgewotCQlMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxXaXphcmRGcmFnbWVudD4oKTsKLQkJbGlzdC5hZGQocm9vdEZyYWdtZW50KTsKLQkJYWRkU3ViV2l6YXJkRnJhZ21lbnRzKHJvb3RGcmFnbWVudCwgbGlzdCk7Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSAoV2l6YXJkRnJhZ21lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICghdGFza01vZGVsLmVxdWFscyhmcmFnbWVudC5nZXRUYXNrTW9kZWwoKSkpCi0JCQkJZnJhZ21lbnQuc2V0VGFza01vZGVsKHRhc2tNb2RlbCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFN1YldpemFyZEZyYWdtZW50cyhXaXphcmRGcmFnbWVudCBmcmFnbWVudCwgTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZyYWdtZW50LmdldENoaWxkRnJhZ21lbnRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJV2l6YXJkRnJhZ21lbnQgY2hpbGQgPSAoV2l6YXJkRnJhZ21lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWxpc3QuYWRkKGNoaWxkKTsKLQkJCWFkZFN1YldpemFyZEZyYWdtZW50cyhjaGlsZCwgbGlzdCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWlmIChhZGRpbmdQYWdlcykKLQkJCXJldHVybjsKLQkJCi0JCXRyeSB7Ci0JCQlhZGRpbmdQYWdlcyA9IHRydWU7Ci0JCQlwYWdlcyA9IG5ldyBBcnJheUxpc3Q8SVdpemFyZFBhZ2U+KCk7Ci0JCQlJdGVyYXRvcjxXaXphcmRGcmFnbWVudD4gaXRlcmF0b3IgPSBnZXRBbGxXaXphcmRGcmFnbWVudHMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCVRhc2tXaXphcmRQYWdlIHBhZ2UgPSBnZXRGcmFnbWVudERhdGEoZnJhZ21lbnQpOwotCQkJCWlmIChmcmFnbWVudC5oYXNDb21wb3NpdGUoKSkgewotCQkJCQlpZiAocGFnZSAhPSBudWxsKQotCQkJCQkJYWRkUGFnZShwYWdlKTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlUYXNrV2l6YXJkUGFnZSBwYWdlMiA9IG5ldyBUYXNrV2l6YXJkUGFnZShmcmFnbWVudCk7Ci0JCQkJCQlmcmFnbWVudERhdGEucHV0KGZyYWdtZW50LCBwYWdlMik7Ci0JCQkJCQlhZGRQYWdlKHBhZ2UyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgYWRkaW5nIGZyYWdtZW50cyB0byB3aXphcmQiLCBlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWFkZGluZ1BhZ2VzID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKnByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlV2l6YXJkUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQljdXJyZW50LnVwZGF0ZVBhZ2VzKCk7Ci0JCQljdXJyZW50LmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHVwZGF0aW5nIHdpemFyZCBwYWdlcyIsIGUpOwotCQl9Ci0JfSovCi0KLQlwcml2YXRlIFRhc2tXaXphcmRQYWdlIGdldEZyYWdtZW50RGF0YShXaXphcmRGcmFnbWVudCBmcmFnbWVudCkgewotCQl0cnkgewotCQkJVGFza1dpemFyZFBhZ2UgcGFnZSA9IGZyYWdtZW50RGF0YS5nZXQoZnJhZ21lbnQpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcGFnZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgZ2V0dGluZyBmcmFnbWVudCBkYXRhIiwgZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBhZ2VzKCkgewotCQlhZGRQYWdlcygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2NhbkZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQkvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHRvIGNoZWNrIGlmIGFsbCBwYWdlcyBhcmUgY29tcGxldGUuCi0JCWZvciAoaW50IGk9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKykgewotCQkJaWYgKCEocGFnZXMuZ2V0KGkpKS5pc1BhZ2VDb21wbGV0ZSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQkvLyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBjcmVhdGUgYWxsIHRoZSBwYWdlcyBjb250cm9scwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLnNpemUoKTsgaSsrKXsKLQkJCUlXaXphcmRQYWdlIHBhZ2UgPSBwYWdlcy5nZXQoaSk7Ci0JCQlwYWdlLmNyZWF0ZUNvbnRyb2wocGFnZUNvbnRhaW5lcik7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBub3RpZnkgcGFnZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKykgewotCQkJcGFnZXMuZ2V0KGkpLmRpc3Bvc2UoKTsKLQkJfQotCi0JCS8vIGRpc3Bvc2Ugb2YgaW1hZ2UKLQkJaWYgKGRlZmF1bHRJbWFnZSAhPSBudWxsKSB7Ci0JCQlkZWZhdWx0SW1hZ2UuZGlzcG9zZSgpOwotCQkJZGVmYXVsdEltYWdlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldENvbnRhaW5lcigpCi0JICovCi0JcHVibGljIElXaXphcmRDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldERlZmF1bHRQYWdlSW1hZ2UoKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXREZWZhdWx0UGFnZUltYWdlKCkgewotCQlyZXR1cm4gZGVmYXVsdEltYWdlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldERpYWxvZ1NldHRpbmdzKCkKLQkgKi8KLQlwdWJsaWMgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCQlyZXR1cm4gZGlhbG9nU2V0dGluZ3M7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0TmV4dFBhZ2Uob3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCWludCBpbmRleCA9IHBhZ2VzLmluZGV4T2YocGFnZSk7Ci0JCWlmIChpbmRleCA9PSBwYWdlcy5zaXplKCkgLSAxIHx8IGluZGV4ID09IC0xKQotCQkJLy8gbGFzdCBwYWdlIG9yIHBhZ2Ugbm90IGZvdW5kCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXJldHVybiBwYWdlcy5nZXQoaW5kZXggKyAxKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXRQYWdlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldFBhZ2UoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHBhZ2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlJV2l6YXJkUGFnZSBwYWdlID0gcGFnZXMuZ2V0KGkpOwotCQkJU3RyaW5nIHBhZ2VOYW1lID0gcGFnZS5nZXROYW1lKCk7Ci0JCQlpZiAocGFnZU5hbWUuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBwYWdlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldFBhZ2VDb3VudCgpCi0JICovCi0JcHVibGljIGludCBnZXRQYWdlQ291bnQoKSB7Ci0JCXJldHVybiBwYWdlcy5zaXplKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0UGFnZXMoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZVtdIGdldFBhZ2VzKCkgewotCQlyZXR1cm4gcGFnZXMudG9BcnJheShuZXcgSVdpemFyZFBhZ2VbcGFnZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0UHJldmlvdXNQYWdlKG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZSkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0UHJldmlvdXNQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJaW50IGluZGV4ID0gcGFnZXMuaW5kZXhPZihwYWdlKTsKLQkJaWYgKGluZGV4ID09IDAgfHwgaW5kZXggPT0gLTEpCi0JCQkvLyBmaXJzdCBwYWdlIG9yIHBhZ2Ugbm90IGZvdW5kCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHBhZ2VzLmdldChpbmRleCAtIDEpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldFN0YXJ0aW5nUGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldFN0YXJ0aW5nUGFnZSgpIHsKLQkJaWYgKHBhZ2VzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlyZXR1cm4gcGFnZXMuZ2V0KDApOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldFRpdGxlQmFyQ29sb3IoKQotCSAqLwotCXB1YmxpYyBSR0IgZ2V0VGl0bGVCYXJDb2xvcigpIHsKLQkJcmV0dXJuIHRpdGxlQmFyQ29sb3I7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0V2luZG93VGl0bGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2luZG93VGl0bGUoKSB7Ci0JCXJldHVybiB3aW5kb3dUaXRsZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNpc0hlbHBBdmFpbGFibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSGVscEF2YWlsYWJsZSgpIHsKLQkJcmV0dXJuIGlzSGVscEF2YWlsYWJsZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNuZWVkc1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIG5lZWRzUHJldmlvdXNBbmROZXh0QnV0dG9ucygpIHsKLQkJcmV0dXJuIGZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyB8fCBwYWdlcy5zaXplKCkgPiAxOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI25lZWRzUHJvZ3Jlc3NNb25pdG9yKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuZWVkc1Byb2dyZXNzTW9uaXRvcigpIHsKLQkJcmV0dXJuIG5lZWRzUHJvZ3Jlc3NNb25pdG9yOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3NldENvbnRhaW5lcihvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZENvbnRhaW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoSVdpemFyZENvbnRhaW5lciB3aXphcmRDb250YWluZXIpIHsKLQkJdGhpcy5jb250YWluZXIgPSB3aXphcmRDb250YWluZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERpYWxvZ1NldHRpbmdzKElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncykgewotCQlkaWFsb2dTZXR0aW5ncyA9IHNldHRpbmdzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROZWVkc1Byb2dyZXNzTW9uaXRvcihib29sZWFuIGIpIHsKLQkJbmVlZHNQcm9ncmVzc01vbml0b3IgPSBiOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoYm9vbGVhbiBiKSB7Ci0JCWZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyA9IGI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFdpbmRvd1RpdGxlKFN0cmluZyB0aXRsZSkgewotCQl3aW5kb3dUaXRsZSA9IHRpdGxlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHVzZUpvYigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Sm9iVGl0bGUoKSB7Ci0JCXJldHVybiBnZXRXaW5kb3dUaXRsZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvVGFza1dpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9UYXNrV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzljOWJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9UYXNrV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci0vKioKLSAqIEEgdGFzayB3aXphcmQgcGFnZS4KLSAqLwotY2xhc3MgVGFza1dpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgSVdpemFyZEhhbmRsZSB7Ci0JcHJvdGVjdGVkIFdpemFyZEZyYWdtZW50IGZyYWdtZW50OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgVGFza1dpemFyZFBhZ2UoV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQpIHsKLQkJc3VwZXIoZnJhZ21lbnQudG9TdHJpbmcoKSk7Ci0JCXRoaXMuZnJhZ21lbnQgPSBmcmFnbWVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnRDb21wKSB7Ci0JCUNvbXBvc2l0ZSBjb21wID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbXAgPSBmcmFnbWVudC5jcmVhdGVDb21wb3NpdGUocGFyZW50Q29tcCwgdGhpcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiQ291bGQgbm90IGNyZWF0ZSB3aXphcmQgcGFnZSBjb21wb3NpdGUiLCBlKTsKLQkJCX0KLQkJfQotCQlpZiAoY29tcCA9PSBudWxsKSB7Ci0JCQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnRDb21wLCBTV1QuTk9ORSk7Ci0JCQljb21wLnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuVkVSVElDQUwpKTsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoIkludGVybmFsIGVycm9yIik7Ci0JCX0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDE1MCk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc2V0Q29udHJvbChjb21wKTsKLQkJCi0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0JCXVwZGF0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQl0cnkgewotCQkJaWYgKCFmcmFnbWVudC5pc0NvbXBsZXRlKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotCQlpZiAoZ2V0TmV4dFBhZ2UoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQl0cnkgewotCQkJaWYgKCFmcmFnbWVudC5pc0NvbXBsZXRlKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQotCQlpZiAodmlzaWJsZSkgewotCQkJVGFza1dpemFyZCB3aXphcmQgPSAoVGFza1dpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCQl3aXphcmQuc3dpdGNoV2l6YXJkRnJhZ21lbnQoZnJhZ21lbnQpOwotCQkJCi0JCQlpZiAoZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSAhPSBudWxsKQotCQkJCWdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCB0eXBlKSB7Ci0JCWlmICh0eXBlID09IElNZXNzYWdlUHJvdmlkZXIuRVJST1IgJiYgIiIuZXF1YWxzKG1lc3NhZ2UpKSB7Ci0JCQltZXNzYWdlID0gbnVsbDsKLQkJfQotCQlzdXBlci5zZXRNZXNzYWdlKG1lc3NhZ2UsIHR5cGUpOwotCQlXaXphcmRGcmFnbWVudCBmcmFnID0gKChUYXNrV2l6YXJkKSBnZXRXaXphcmQoKSkuZ2V0Q3VycmVudFdpemFyZEZyYWdtZW50KCk7Ci0JCWlmICghZnJhZ21lbnQuZXF1YWxzKGZyYWcpKQotCQkJcmV0dXJuOwotCQlnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKGJvb2xlYW4gZm9yaywgYm9vbGVhbiBjYW5jZWxhYmxlLCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnJ1bihmb3JrLCBjYW5jZWxhYmxlLCBydW5uYWJsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlpZiAoIWlzQ3JlYXRlZCkKLQkJCXJldHVybjsKLQkJCi0JCWZpbmFsIElXaXphcmRDb250YWluZXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7Ci0JCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmcmFnbWVudC51cGRhdGVDaGlsZEZyYWdtZW50cygpOwotCQkJCSgoVGFza1dpemFyZCkgZ2V0V2l6YXJkKCkpLnVwZGF0ZVBhZ2VzKCk7Ci0JCQkJCi0JCQkJaWYgKGNvbnRhaW5lci5nZXRDdXJyZW50UGFnZSgpICE9IG51bGwpCi0JCQkJCWNvbnRhaW5lci51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvV2l6YXJkVGFza1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9XaXphcmRUYXNrVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWY4MzM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9XaXphcmRUYXNrVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUHJvamVjdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkVjbGlwc2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmRUYXNrVXRpbCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19MQVVOQ0hBQkxFX0FEQVBURVIgPSAibGF1bmNoYWJsZUFkYXB0ZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfTEFVTkNIQUJMRSA9ICJsYXVuY2hhYmxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0NMSUVOVCA9ICJjbGllbnQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfQ0xJRU5UUyA9ICJjbGllbnRzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0RFRkFVTFRfU0VSVkVSID0gImRlZmF1bHRTZXJ2ZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfTU9ERSA9ICJtb2RlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0hBU19UQVNLUyA9ICJoYXNUYXNrcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19IQVNfQ0xJRU5UUyA9ICJoYXNDbGllbnRzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0ZFQVRVUkUgPSAiZmVhdHVyZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9FWElTVElORyA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfREVURUNUID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9NQU5VQUwgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBXaXphcmRGcmFnbWVudCBTYXZlUnVudGltZUZyYWdtZW50ID0gbmV3IFdpemFyZEZyYWdtZW50KCkgewotCQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJV2l6YXJkVGFza1V0aWwuc2F2ZVJ1bnRpbWUoZ2V0VGFza01vZGVsKCksIG1vbml0b3IpOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgV2l6YXJkRnJhZ21lbnQgU2F2ZVNlcnZlckZyYWdtZW50ID0gbmV3IFdpemFyZEZyYWdtZW50KCkgewotCQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJV2l6YXJkVGFza1V0aWwuc2F2ZVNlcnZlcihnZXRUYXNrTW9kZWwoKSwgbW9uaXRvcik7Ci0JCX0KLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBXaXphcmRGcmFnbWVudCBUZW1wU2F2ZVJ1bnRpbWVGcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCVdpemFyZFRhc2tVdGlsLnRlbXBTYXZlUnVudGltZShnZXRUYXNrTW9kZWwoKSwgbW9uaXRvcik7Ci0JCX0KLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBXaXphcmRGcmFnbWVudCBUZW1wU2F2ZVNlcnZlckZyYWdtZW50ID0gbmV3IFdpemFyZEZyYWdtZW50KCkgewotCQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJV2l6YXJkVGFza1V0aWwudGVtcFNhdmVTZXJ2ZXIoZ2V0VGFza01vZGVsKCksIG1vbml0b3IpOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgV2l6YXJkRnJhZ21lbnQgU2F2ZUhvc3RuYW1lRnJhZ21lbnQgPSBuZXcgV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCXB1YmxpYyB2b2lkIHBlcmZvcm1GaW5pc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQl0cnkgewotCQkJCUlTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlcjIgPSAoSVNlcnZlckF0dHJpYnV0ZXMpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIpOwotCQkJCVNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuYWRkSG9zdG5hbWUoc2VydmVyMi5nZXRIb3N0KCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIFdpemFyZFRhc2tVdGlsKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNhdmVSdW50aW1lKFRhc2tNb2RlbCB0YXNrTW9kZWwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSB0YXNrTW9kZWwuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwotCQlpZiAocnVudGltZSAhPSBudWxsICYmIHJ1bnRpbWUgaW5zdGFuY2VvZiBJUnVudGltZVdvcmtpbmdDb3B5KSB7Ci0JCQlJUnVudGltZVdvcmtpbmdDb3B5IHdvcmtpbmdDb3B5ID0gKElSdW50aW1lV29ya2luZ0NvcHkpIHJ1bnRpbWU7Ci0JCQlpZiAod29ya2luZ0NvcHkuaXNEaXJ0eSgpKQotCQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSwgd29ya2luZ0NvcHkuc2F2ZShmYWxzZSwgbW9uaXRvcikpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC50YXNrLklUYXNrI2RvVGFzaygpCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNhdmVTZXJ2ZXIoVGFza01vZGVsIHRhc2tNb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIHRhc2tNb2RlbC5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlciBpbnN0YW5jZW9mIElTZXJ2ZXJXb3JraW5nQ29weSkgewotCQkJSVNlcnZlcldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5ID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOwotCQkJaWYgKHdvcmtpbmdDb3B5LmlzRGlydHkoKSkgewotCQkJCUlGaWxlIGZpbGUgPSAoKFNlcnZlcil3b3JraW5nQ29weSkuZ2V0RmlsZSgpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJCQkKLQkJCQkJaWYgKCFmaWxlLmdldFByb2plY3QoKS5leGlzdHMoKSkKLQkJCQkJCUVjbGlwc2VVdGlsLmNyZWF0ZU5ld1NlcnZlclByb2plY3QobnVsbCwgcHJvamVjdC5nZXROYW1lKCksIG51bGwsIG1vbml0b3IpOwotCQkJCQkKLQkJCQkJUHJvamVjdFByb3BlcnRpZXMgcHAgPSBTZXJ2ZXJQbHVnaW4uZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCk7Ci0JCQkJCWlmICghcHAuaXNTZXJ2ZXJQcm9qZWN0KCkpCi0JCQkJCQlwcC5zZXRTZXJ2ZXJQcm9qZWN0KHRydWUsIG1vbml0b3IpOwotCQkJCX0KLQkJCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUiwgd29ya2luZ0NvcHkuc2F2ZShmYWxzZSwgbW9uaXRvcikpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHRlbXBTYXZlUnVudGltZShUYXNrTW9kZWwgdGFza01vZGVsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgdGFza01vZGVsLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKLQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCAmJiBydW50aW1lIGluc3RhbmNlb2YgSVJ1bnRpbWVXb3JraW5nQ29weSkgewotCQkJSVJ1bnRpbWVXb3JraW5nQ29weSB3b3JraW5nQ29weSA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBydW50aW1lOwotCQkJaWYgKCF3b3JraW5nQ29weS5pc0RpcnR5KCkpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlydW50aW1lID0gd29ya2luZ0NvcHkuc2F2ZShmYWxzZSwgbW9uaXRvcik7Ci0JCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUsIHJ1bnRpbWUuY3JlYXRlV29ya2luZ0NvcHkoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgdGVtcFNhdmVTZXJ2ZXIoVGFza01vZGVsIHRhc2tNb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIHRhc2tNb2RlbC5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlciBpbnN0YW5jZW9mIElTZXJ2ZXJXb3JraW5nQ29weSkgewotCQkJSVNlcnZlcldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5ID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOwotCQkJaWYgKCF3b3JraW5nQ29weS5pc0RpcnR5KCkpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlJRmlsZSBmaWxlID0gKChTZXJ2ZXIpd29ya2luZ0NvcHkpLmdldEZpbGUoKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQkJCi0JCQkJaWYgKCFmaWxlLmdldFByb2plY3QoKS5leGlzdHMoKSkKLQkJCQkJRWNsaXBzZVV0aWwuY3JlYXRlTmV3U2VydmVyUHJvamVjdChudWxsLCBwcm9qZWN0LmdldE5hbWUoKSwgbnVsbCwgbW9uaXRvcik7Ci0JCQkJCi0JCQkJUHJvamVjdFByb3BlcnRpZXMgcHAgPSBTZXJ2ZXJQbHVnaW4uZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCk7Ci0JCQkJaWYgKCFwcC5pc1NlcnZlclByb2plY3QoKSkKLQkJCQkJcHAuc2V0U2VydmVyUHJvamVjdCh0cnVlLCBtb25pdG9yKTsKLQkJCX0KLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSB3b3JraW5nQ29weS5nZXRSdW50aW1lKCk7Ci0JCQkKLQkJCXNlcnZlciA9IHdvcmtpbmdDb3B5LnNhdmUoZmFsc2UsIG1vbml0b3IpOwotCQkJd29ya2luZ0NvcHkgPSBzZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCQotCQkJd29ya2luZ0NvcHkuc2V0UnVudGltZShydW50aW1lKTsKLQkJCWlmICh3b3JraW5nQ29weS5nZXRTZXJ2ZXJUeXBlKCkuaGFzU2VydmVyQ29uZmlndXJhdGlvbigpKQotCQkJCSgoU2VydmVyV29ya2luZ0NvcHkpd29ya2luZ0NvcHkpLmltcG9ydFJ1bnRpbWVDb25maWd1cmF0aW9uKHJ1bnRpbWUsIG51bGwpOwotCQkJCi0JCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUiwgd29ya2luZ0NvcHkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE1vZHVsZShJTW9kdWxlIG1vZHVsZSwgVGFza01vZGVsIHRhc2tNb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIHRhc2tNb2RlbC5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJSU1vZHVsZSBwYXJlbnRNb2R1bGUgPSBudWxsOwotCQl0cnkgewotCQkJSU1vZHVsZVtdIHBhcmVudHMgPSBzZXJ2ZXIuZ2V0Um9vdE1vZHVsZXMobW9kdWxlLCBtb25pdG9yKTsKLQkJCWlmIChwYXJlbnRzICE9IG51bGwgJiYgcGFyZW50cy5sZW5ndGggPiAwKQotCQkJCXBhcmVudE1vZHVsZSA9IHBhcmVudHNbMF07Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19XQVJOSU5HLCAiQ291bGQgbm90IGZpbmQgcGFyZW50IG1vZHVsZSIsIGUpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAocGFyZW50TW9kdWxlID09IG51bGwpIHsKLQkJCS8vIHVzZSB0aGUgb3JpZ2luYWwgbW9kdWxlIHNpbmNlIG5vIHBhcmVudCBtb2R1bGUgaXMgYXZhaWxhYmxlCi0JCQlwYXJlbnRNb2R1bGUgPSBtb2R1bGU7Ci0JCX0KLQkJCi0JCUlNb2R1bGVbXSBtb2R1bGVzID0gc2VydmVyLmdldE1vZHVsZXMoKTsKLQkJaW50IHNpemUgPSBtb2R1bGVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChwYXJlbnRNb2R1bGUuZXF1YWxzKG1vZHVsZXNbaV0pKQotCQkJCXJldHVybjsKLQkJfQotCQkKLQkJSVNlcnZlcldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5ID0gc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCXdvcmtpbmdDb3B5Lm1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IHBhcmVudE1vZHVsZSB9LCBuZXcgSU1vZHVsZVswXSwgbW9uaXRvcik7Ci0JCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSLCB3b3JraW5nQ29weS5zYXZlKGZhbHNlLCBtb25pdG9yKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1vZGlmeU1vZHVsZXMoTGlzdDxJTW9kdWxlPiBhZGQsIExpc3Q8SU1vZHVsZT4gcmVtb3ZlLCBUYXNrTW9kZWwgdGFza01vZGVsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKChhZGQgPT0gbnVsbCB8fCBhZGQuaXNFbXB0eSgpKSAmJiAocmVtb3ZlID09IG51bGwgfHwgcmVtb3ZlLmlzRW1wdHkoKSkpCi0JCQlyZXR1cm47Ci0JCQotCQlJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHkgPSAoSVNlcnZlcldvcmtpbmdDb3B5KSB0YXNrTW9kZWwuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCQotCQkvLyBtb2RpZnkgbW9kdWxlcwotCQlJTW9kdWxlW10gcmVtb3ZlMiA9IG5ldyBJTW9kdWxlWzBdOwotCQlpZiAocmVtb3ZlICE9IG51bGwpIHsKLQkJCXJlbW92ZTIgPSBuZXcgSU1vZHVsZVtyZW1vdmUuc2l6ZSgpXTsKLQkJCXJlbW92ZS50b0FycmF5KHJlbW92ZTIpOwotCQl9Ci0JCQotCQlJTW9kdWxlW10gYWRkMiA9IG5ldyBJTW9kdWxlWzBdOwotCQlpZiAoYWRkICE9IG51bGwpIHsKLQkJCWFkZDIgPSBuZXcgSU1vZHVsZVthZGQuc2l6ZSgpXTsKLQkJCWFkZC50b0FycmF5KGFkZDIpOwotCQl9Ci0JCQotCQlJRmlsZSBmaWxlID0gKChTZXJ2ZXIpd29ya2luZ0NvcHkpLmdldEZpbGUoKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJCi0JCQlpZiAoIWZpbGUuZ2V0UHJvamVjdCgpLmV4aXN0cygpKQotCQkJCUVjbGlwc2VVdGlsLmNyZWF0ZU5ld1NlcnZlclByb2plY3QobnVsbCwgcHJvamVjdC5nZXROYW1lKCksIG51bGwsIG1vbml0b3IpOwotCQkJCi0JCQlQcm9qZWN0UHJvcGVydGllcyBwcCA9IFNlcnZlclBsdWdpbi5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KTsKLQkJCWlmICghcHAuaXNTZXJ2ZXJQcm9qZWN0KCkpCi0JCQkJcHAuc2V0U2VydmVyUHJvamVjdCh0cnVlLCBtb25pdG9yKTsKLQkJfQotCQkKLQkJd29ya2luZ0NvcHkubW9kaWZ5TW9kdWxlcyhhZGQyLCByZW1vdmUyLCBtb25pdG9yKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L0xpY2Vuc2VXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L0xpY2Vuc2VXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTU1YjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9MaWNlbnNlV2l6YXJkRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZS5MaWNlbnNlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTGljZW5zZVdpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQ0VOU0UgPSAibGljZW5zZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElDRU5TRV9OT05FID0gIm5vbmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQ0VOU0VfVU5LTk9XTiA9ICJ1bmtub3duIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUNFTlNFX0FDQ0VQVCA9ICJhY2NlcHQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQ0VOU0VfU0VSVkVSID0gImxpY2Vuc2Vfc2VydmVyIjsKLQotCXByb3RlY3RlZCBMaWNlbnNlQ29tcG9zaXRlIGNvbXA7Ci0KLQlwdWJsaWMgTGljZW5zZVdpemFyZEZyYWdtZW50KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgZW50ZXIoKSB7Ci0JCWlmIChjb21wICE9IG51bGwpCi0JCQljb21wLnVwZGF0ZUxpY2Vuc2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudGFzay5XaXphcmRUYXNrI2dldFdpemFyZFBhZ2UoKQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCWNvbXAgPSBuZXcgTGljZW5zZUNvbXBvc2l0ZShwYXJlbnQsIGdldFRhc2tNb2RlbCgpLCB3aXphcmQpOwotCQkKLQkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpekxpY2Vuc2VUaXRsZSk7Ci0JCXdpemFyZC5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy53aXpMaWNlbnNlRGVzY3JpcHRpb24pOwotCQl3aXphcmQuc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1dJWkJBTl9ORVdfU0VSVkVSKSk7Ci0JCXJldHVybiBjb21wOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCXRyeSB7Ci0JCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KExpY2Vuc2VXaXphcmRGcmFnbWVudC5MSUNFTlNFX0FDQ0VQVCk7Ci0JCQlpZiAoYiAhPSBudWxsICYmIGIuYm9vbGVhblZhbHVlKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9Nb2RpZnlNb2R1bGVzV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9Nb2RpZnlNb2R1bGVzV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5NzY4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvTW9kaWZ5TW9kdWxlc1dpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSU1vZHVsZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuV2l6YXJkVGFza1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZS5Nb2RpZnlNb2R1bGVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9kaWZ5TW9kdWxlc1dpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCXByb3RlY3RlZCBNb2RpZnlNb2R1bGVzQ29tcG9zaXRlIGNvbXA7Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZSBtb2R1bGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1B1Ymxpc2hPcHRpb247Ci0KLQlwdWJsaWMgTW9kaWZ5TW9kdWxlc1dpemFyZEZyYWdtZW50KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIE1vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudChib29sZWFuIHNob3dQdWJsaXNoT3B0aW9uKSB7Ci0JCXRoaXMuc2hvd1B1Ymxpc2hPcHRpb24gPSBzaG93UHVibGlzaE9wdGlvbjsKLQl9Ci0KLQlwdWJsaWMgTW9kaWZ5TW9kdWxlc1dpemFyZEZyYWdtZW50KElNb2R1bGUgbW9kdWxlKSB7Ci0JCXRoaXMubW9kdWxlID0gbW9kdWxlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC50YXNrLldpemFyZFRhc2sjZ2V0V2l6YXJkUGFnZSgpCi0JICovCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSBoYW5kbGUpIHsKLQkJY29tcCA9IG5ldyBNb2RpZnlNb2R1bGVzQ29tcG9zaXRlKHBhcmVudCwgaGFuZGxlLCBtb2R1bGUsIHNob3dQdWJsaXNoT3B0aW9uKTsKLQkJcmV0dXJuIGNvbXA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFza01vZGVsKFRhc2tNb2RlbCB0YXNrTW9kZWwpIHsKLQkJc3VwZXIuc2V0VGFza01vZGVsKHRhc2tNb2RlbCk7Ci0JCWlmIChjb21wICE9IG51bGwpCi0JCQljb21wLnNldFRhc2tNb2RlbCh0YXNrTW9kZWwpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENoaWxkRnJhZ21lbnRzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGcmFnbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbnRlcigpIHsKLQkJdXBkYXRlTW9kdWxlcygpOwotCQkvLyBhc2sgdGhlIGNvbXBvc2l0ZSB0byByZWZyZXNoCi0JCWNvbXAucmVmcmVzaCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1vZHVsZXMoKSB7Ci0JCWlmIChjb21wICE9IG51bGwpIHsKLQkJCUlTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlciA9IChJU2VydmVyQXR0cmlidXRlcykgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCQljb21wLnNldFRhc2tNb2RlbChnZXRUYXNrTW9kZWwoKSk7Ci0JCQljb21wLnNldFNlcnZlcihzZXJ2ZXIpOwotCQl9IGVsc2UgaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQlUYXNrTW9kZWwgdGFza01vZGVsID0gZ2V0VGFza01vZGVsKCk7Ci0JCQlpZiAodGFza01vZGVsID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IChJU2VydmVyV29ya2luZ0NvcHkpIHRhc2tNb2RlbC5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJCWlmIChzZXJ2ZXIgPT0gbnVsbCkgewotCQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfTU9EVUxFUywgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlmaW5hbCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZVtdPigpOwotCQkJKChTZXJ2ZXIpIHNlcnZlcikudmlzaXQobmV3IElNb2R1bGVWaXNpdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElNb2R1bGVbXSBtb2R1bGUyKSB7Ci0JCQkJCW1vZHVsZUxpc3QuYWRkKG1vZHVsZTIpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9LCBudWxsKTsKLQkJCQotCQkJLy8gYWRkIG1vZHVsZQotCQkJSU1vZHVsZSBwYXJlbnQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlJTW9kdWxlW10gcGFyZW50cyA9IHNlcnZlci5nZXRSb290TW9kdWxlcyhtb2R1bGUsIG51bGwpOwotCQkJCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKLQkJCQkKLQkJCQlpZiAocGFyZW50cyAhPSBudWxsICYmIHBhcmVudHMubGVuZ3RoID4gMCkgewotCQkJCQlwYXJlbnQgPSBwYXJlbnRzWzBdOwotCQkJCQlsaXN0LmFkZChwYXJlbnQpOwotCQkJCX0KLQkJCQkvLyBUT0RPIC0gZ2V0IHBhcmVudCBtb2R1bGVzIGNvcnJlY3QKLQkJCQlpZiAoIW1vZHVsZUxpc3QuY29udGFpbnMobW9kdWxlKSkgewotCQkJCQltb2R1bGVMaXN0LmFkZChuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0pOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKFRyYWNlLldBUk5JTkcpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJDb3VsZCBub3QgZmluZCBwYXJlbnQgbW9kdWxlIiwgZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX01PRFVMRVMsIG1vZHVsZUxpc3QpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJaWYgKGNvbXAgIT0gbnVsbCkKLQkJCXJldHVybiBjb21wLmlzQ29tcGxldGUoKTsKLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1GaW5pc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb21wICE9IG51bGwpIHsKLQkJCVdpemFyZFRhc2tVdGlsLm1vZGlmeU1vZHVsZXMoY29tcC5nZXRNb2R1bGVzVG9BZGQoKSwgY29tcC5nZXRNb2R1bGVzVG9SZW1vdmUoKSwgZ2V0VGFza01vZGVsKCksIG1vbml0b3IpOwotCQkJaWYgKHNob3dQdWJsaXNoT3B0aW9uKQotCQkJCVNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuc2V0UHVibGlzaE9uQWRkUmVtb3ZlTW9kdWxlKGNvbXAuc2hvdWxkUHVibGlzaEltbWVkaWF0ZWx5KCkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9OZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9OZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjczZDFlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvTmV3UnVudGltZVdpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5XaXphcmRUYXNrVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlLk5ld1J1bnRpbWVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JLy8gZmlsdGVyIGJ5IHR5cGUvdmVyc2lvbgotCXByb3RlY3RlZCBTdHJpbmcgdHlwZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb247Ci0KLQkvLyBmaWx0ZXIgYnkgcGFydGlhbCBydW50aW1lIHR5cGUgaWQKLQlwcm90ZWN0ZWQgU3RyaW5nIHJ1bnRpbWVUeXBlSWQ7Ci0KLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgV2l6YXJkRnJhZ21lbnQ+IGZyYWdtZW50TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBXaXphcmRGcmFnbWVudD4oKTsKLQotCXB1YmxpYyBOZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgTmV3UnVudGltZVdpemFyZEZyYWdtZW50KFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHJ1bnRpbWVUeXBlSWQpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJdGhpcy5ydW50aW1lVHlwZUlkID0gcnVudGltZVR5cGVJZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudGFzay5XaXphcmRUYXNrI2dldFdpemFyZFBhZ2UoKQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCXJldHVybiBuZXcgTmV3UnVudGltZUNvbXBvc2l0ZShwYXJlbnQsIHdpemFyZCwgZ2V0VGFza01vZGVsKCksIHR5cGUsIHZlcnNpb24sIHJ1bnRpbWVUeXBlSWQpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENoaWxkRnJhZ21lbnRzKCkgewotCQlMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0SW1wbCA9IG5ldyBBcnJheUxpc3Q8V2l6YXJkRnJhZ21lbnQ+KCk7Ci0JCWNyZWF0ZUNoaWxkRnJhZ21lbnRzKGxpc3RJbXBsKTsKLQkJcmV0dXJuIGxpc3RJbXBsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKLQkJaWYgKGdldFRhc2tNb2RlbCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJV2l6YXJkRnJhZ21lbnQgc3ViID0gZ2V0V2l6YXJkRnJhZ21lbnQocnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwotCQlpZiAoc3ViICE9IG51bGwpCi0JCQlsaXN0LmFkZChzdWIpOwotCQkKLQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IChJU2VydmVyV29ya2luZ0NvcHkpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIpOwotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSAmJiBzZXJ2ZXIgaW5zdGFuY2VvZiBTZXJ2ZXJXb3JraW5nQ29weSkgewotCQkJCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChydW50aW1lLmdldExvY2F0aW9uKCkgIT0gbnVsbCAmJiAhcnVudGltZS5nZXRMb2NhdGlvbigpLmlzRW1wdHkoKSkKLQkJCQkJCXN3Yy5pbXBvcnRSdW50aW1lQ29uZmlndXJhdGlvbihydW50aW1lLCBudWxsKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJCQotCQkJbGlzdC5hZGQobmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJCXB1YmxpYyB2b2lkIGVudGVyKCkgewotCQkJCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUyID0gKElSdW50aW1lV29ya2luZ0NvcHkpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKLQkJCQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcjIgPSAoSVNlcnZlcldvcmtpbmdDb3B5KSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJCQkJc2VydmVyMi5zZXRSdW50aW1lKHJ1bnRpbWUyKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJc3ViID0gZ2V0V2l6YXJkRnJhZ21lbnQoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLQkJCWlmIChzdWIgIT0gbnVsbCkKLQkJCQlsaXN0LmFkZChzdWIpOwotCQkJCi0JCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5TYXZlU2VydmVyRnJhZ21lbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFdpemFyZEZyYWdtZW50IGdldFdpemFyZEZyYWdtZW50KFN0cmluZyB0eXBlSWQpIHsKLQkJdHJ5IHsKLQkJCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gZnJhZ21lbnRNYXAuZ2V0KHR5cGVJZCk7Ci0JCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZnJhZ21lbnQ7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkKLQkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRXaXphcmRGcmFnbWVudCh0eXBlSWQpOwotCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLQkJCWZyYWdtZW50TWFwLnB1dCh0eXBlSWQsIGZyYWdtZW50KTsKLQkJcmV0dXJuIGZyYWdtZW50OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvTmV3U2VydmVyV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9OZXdTZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzQ3ZTU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9OZXdTZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuV2l6YXJkVGFza1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZS5OZXdTZXJ2ZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZS5OZXdNYW51YWxTZXJ2ZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Tb2NrZXRVdGlsOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE5ld1NlcnZlcldpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNT0RFX0VYSVNUSU5HID0gV2l6YXJkVGFza1V0aWwuTU9ERV9FWElTVElORzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9ERVRFQ1QgPSBXaXphcmRUYXNrVXRpbC5NT0RFX0RFVEVDVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9NQU5VQUwgPSBXaXphcmRUYXNrVXRpbC5NT0RFX01BTlVBTDsKLQotCXByb3RlY3RlZCBJTW9kdWxlIG1vZHVsZTsKLQlwcm90ZWN0ZWQgSU1vZHVsZVR5cGUgbW9kdWxlVHlwZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZlclR5cGVJZDsKLQlwcm90ZWN0ZWQgTmV3U2VydmVyQ29tcG9zaXRlIGNvbXA7Ci0KLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgV2l6YXJkRnJhZ21lbnQ+IGZyYWdtZW50TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBXaXphcmRGcmFnbWVudD4oKTsKLQlwcm90ZWN0ZWQgSVBhdGggcnVudGltZUxvY2F0aW9uID0gbnVsbDsKLQotCXB1YmxpYyBOZXdTZXJ2ZXJXaXphcmRGcmFnbWVudCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBOZXdTZXJ2ZXJXaXphcmRGcmFnbWVudChJTW9kdWxlVHlwZSBtb2R1bGVUeXBlLCBTdHJpbmcgc2VydmVyVHlwZUlkKSB7Ci0JCXRoaXMubW9kdWxlVHlwZSA9IG1vZHVsZVR5cGU7Ci0JCXRoaXMuc2VydmVyVHlwZUlkID0gc2VydmVyVHlwZUlkOwotCX0KLQotCXB1YmxpYyBOZXdTZXJ2ZXJXaXphcmRGcmFnbWVudChJTW9kdWxlIG1vZHVsZSkgewotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGVudGVyKCkgewotCQlzdXBlci5lbnRlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudGFzay5XaXphcmRUYXNrI2dldFdpemFyZFBhZ2UoKQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCVN0cmluZyBsYXVuY2hNb2RlID0gKFN0cmluZykgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX0xBVU5DSF9NT0RFKTsKLQotCQlpZiAobW9kdWxlVHlwZSAhPSBudWxsIHx8IHNlcnZlclR5cGVJZCAhPSBudWxsKQotCQkJY29tcCA9IG5ldyBOZXdTZXJ2ZXJDb21wb3NpdGUocGFyZW50LCB3aXphcmQsIG1vZHVsZVR5cGUsIHNlcnZlclR5cGVJZCwgbGF1bmNoTW9kZSk7Ci0JCWVsc2UKLQkJCWNvbXAgPSBuZXcgTmV3U2VydmVyQ29tcG9zaXRlKHBhcmVudCwgd2l6YXJkLCBtb2R1bGUsIGxhdW5jaE1vZGUpOwotCQlpZiAoZ2V0VGFza01vZGVsKCkgIT0gbnVsbCkKLQkJCWNvbXAuc2V0VGFza01vZGVsKGdldFRhc2tNb2RlbCgpKTsKLQkJcmV0dXJuIGNvbXA7Ci0JfQotCi0JcHJvdGVjdGVkIFdpemFyZEZyYWdtZW50IGdldFdpemFyZEZyYWdtZW50KFN0cmluZyB0eXBlSWQpIHsKLQkJdHJ5IHsKLQkJCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gZnJhZ21lbnRNYXAuZ2V0KHR5cGVJZCk7Ci0JCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZnJhZ21lbnQ7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkKLQkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRXaXphcmRGcmFnbWVudCh0eXBlSWQpOwotCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLQkJCWZyYWdtZW50TWFwLnB1dCh0eXBlSWQsIGZyYWdtZW50KTsKLQkJcmV0dXJuIGZyYWdtZW50OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENoaWxkRnJhZ21lbnRzKCkgewotCQlMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0SW1wbCA9IG5ldyBBcnJheUxpc3Q8V2l6YXJkRnJhZ21lbnQ+KCk7Ci0JCWNyZWF0ZUNoaWxkRnJhZ21lbnRzKGxpc3RJbXBsKTsKLQkJcmV0dXJuIGxpc3RJbXBsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKLQkJaWYgKGdldFRhc2tNb2RlbCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlCeXRlIGIgPSAoQnl0ZSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfTU9ERSk7Ci0JCWlmIChiICE9IG51bGwgJiYgYi5ieXRlVmFsdWUoKSA9PSBNT0RFX01BTlVBTCkgewotCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwotCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCAmJiBydW50aW1lIGluc3RhbmNlb2YgSVJ1bnRpbWVXb3JraW5nQ29weSkgewotCQkJCVdpemFyZEZyYWdtZW50IHN1YiA9IGdldFdpemFyZEZyYWdtZW50KHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKTsKLQkJCQlpZiAoc3ViICE9IG51bGwpCi0JCQkJCWxpc3QuYWRkKHN1Yik7Ci0JCQl9Ci0JCQkKLQkJCUlTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlciA9IChJU2VydmVyQXR0cmlidXRlcykgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCQlpZiAoc2VydmVyLmdldFNlcnZlclR5cGUoKS5oYXNTZXJ2ZXJDb25maWd1cmF0aW9uKCkgJiYgc2VydmVyIGluc3RhbmNlb2YgU2VydmVyV29ya2luZ0NvcHkpIHsKLQkJCQkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7Ci0JCQkJCWlmIChydW50aW1lICE9IG51bGwgJiYgcnVudGltZS5nZXRMb2NhdGlvbigpICE9IG51bGwgJiYgIXJ1bnRpbWUuZ2V0TG9jYXRpb24oKS5pc0VtcHR5KCkpIHsKLQkJCQkJCWlmIChydW50aW1lTG9jYXRpb24gPT0gbnVsbCB8fCAhcnVudGltZUxvY2F0aW9uLmVxdWFscyhydW50aW1lLmdldExvY2F0aW9uKCkpKQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXN3Yy5pbXBvcnRSdW50aW1lQ29uZmlndXJhdGlvbihydW50aW1lLCBudWxsKTsKLQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJCX0KLQkJCQkJCXJ1bnRpbWVMb2NhdGlvbiA9IHJ1bnRpbWUuZ2V0TG9jYXRpb24oKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlydW50aW1lTG9jYXRpb24gPSBudWxsOwotCQkJCX0KLQkJCQlXaXphcmRGcmFnbWVudCBzdWIgPSBnZXRXaXphcmRGcmFnbWVudChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotCQkJCWlmIChzdWIgIT0gbnVsbCkKLQkJCQkJbGlzdC5hZGQoc3ViKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChiICE9IG51bGwgJiYgYi5ieXRlVmFsdWUoKSA9PSBNT0RFX0VYSVNUSU5HKSB7Ci0JCQkvKmlmIChjb21wICE9IG51bGwpIHsKLQkJCQlJU2VydmVyIHNlcnZlciA9IGNvbXAuZ2V0U2VydmVyKCk7Ci0JCQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJCQlsaXN0LmFkZChuZXcgVGFza3NXaXphcmRGcmFnbWVudCgpKTsKLQkJCX0qLwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJaWYoZ2V0U2VydmVyKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmKGdldFNlcnZlcigpLmdldFNlcnZlclR5cGUoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIGNoZWNrSG9zdEFuZFNlcnZlclR5cGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrSG9zdEFuZFNlcnZlclR5cGUoKXsKLQkJYm9vbGVhbiBpc0NvbXBsZXRlID0gZmFsc2U7Ci0KLQkJYm9vbGVhbiBzdXBwb3J0c1JlbW90ZSA9IGdldFNlcnZlcigpLmdldFNlcnZlclR5cGUoKS5zdXBwb3J0c1JlbW90ZUhvc3RzKCk7Ci0JCQotCQlpZihjb21wICE9IG51bGwpewotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNvbXAuZ2V0TmV3TWFudWFsU2VydmVyQ29tcG9zaXRlKCk7Ci0JCQlpZihjb21wb3NpdGUgIT0gbnVsbCAmJiBjb21wb3NpdGUgaW5zdGFuY2VvZiBOZXdNYW51YWxTZXJ2ZXJDb21wb3NpdGUpewotCQkJCU5ld01hbnVhbFNlcnZlckNvbXBvc2l0ZSBtYW51YWxDb21wID0gKE5ld01hbnVhbFNlcnZlckNvbXBvc2l0ZSkgY29tcG9zaXRlOwotCQkJCWlmIChtYW51YWxDb21wLmlzVGltZXJSdW5uaW5nKCkgfHwgbWFudWFsQ29tcC5pc1RpbWVyU2NoZWR1bGVkKCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAobWFudWFsQ29tcC5nZXRDdXJyZW50SG9zdG5hbWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCl7Ci0JCQkJCWlzQ29tcGxldGUgPSBmYWxzZTsKLQkJCQl9IGVsc2UgaWYoIXN1cHBvcnRzUmVtb3RlICYmICFTb2NrZXRVdGlsLmlzTG9jYWxob3N0KG1hbnVhbENvbXAuZ2V0Q3VycmVudEhvc3RuYW1lKCkpKXsKLQkJCQkJaXNDb21wbGV0ZSA9IGZhbHNlOwotCQkJCX0gZWxzZSBpZiAoIW1hbnVhbENvbXAuY2FuU3VwcG9ydE1vZHVsZSgpICl7Ci0JCQkJCWlzQ29tcGxldGUgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNDb21wbGV0ZTsKLQl9CQotCi0JcHJpdmF0ZSBJU2VydmVyV29ya2luZ0NvcHkgZ2V0U2VydmVyKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChJU2VydmVyV29ya2luZ0NvcHkpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcGVyZm9ybUNhbmNlbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYoY29tcCAhPSBudWxsKSB7Ci0JCQljb21wLmdldE5ld01hbnVhbFNlcnZlckNvbXBvc2l0ZSgpLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5wZXJmb3JtQ2FuY2VsKG1vbml0b3IpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZihjb21wICE9IG51bGwpIHsKLQkJCWNvbXAuZ2V0TmV3TWFudWFsU2VydmVyQ29tcG9zaXRlKCkuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLnBlcmZvcm1GaW5pc2gobW9uaXRvcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9PcHRpb25hbENsaWVudFdpemFyZEZyYWdtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvT3B0aW9uYWxDbGllbnRXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGMxZmUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9PcHRpb25hbENsaWVudFdpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuRWNsaXBzZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5XaXphcmRUYXNrVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLS8qKgotICogQSBmcmFnbWVudCB1c2VkIHRvIHNlbGVjdCBhIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIE9wdGlvbmFsQ2xpZW50V2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JcHJvdGVjdGVkIElDbGllbnRbXSBjbGllbnRzOwotCi0JcHJvdGVjdGVkIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdDsKLQlwcm90ZWN0ZWQgSVNlcnZlciBsYXN0U2VydmVyOwotCXByb3RlY3RlZCBPYmplY3QgbGFzdExhdW5jaGFibGU7Ci0KLQlwdWJsaWMgT3B0aW9uYWxDbGllbnRXaXphcmRGcmFnbWVudChJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tb2R1bGVBcnRpZmFjdCA9IG1vZHVsZUFydGlmYWN0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3QpIHsKLQkJaWYgKGNsaWVudHMgIT0gbnVsbCAmJiBjbGllbnRzLmxlbmd0aCA+IDEpCi0JCQlsaXN0LmFkZChuZXcgU2VsZWN0Q2xpZW50V2l6YXJkRnJhZ21lbnQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2xpZW50cygpIHsKLQkJaWYgKGdldFRhc2tNb2RlbCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQl0cnkgewotCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCQkKLQkJCWlmIChzZXJ2ZXIgPT0gbnVsbCkgewotCQkJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX0xBVU5DSEFCTEVfQURBUFRFUiwgbnVsbCk7Ci0JCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfTEFVTkNIQUJMRSwgbnVsbCk7Ci0JCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfQ0xJRU5UUywgbnVsbCk7Ci0JCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfSEFTX0NMSUVOVFMsIG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvL2lmIChsYXN0U2VydmVyID09IG51bGwpCi0JCQkvLwlyZXR1cm47Ci0JCQkKLQkJCS8vIGdldCB0aGUgbGF1bmNoYWJsZSBhZGFwdGVyIGFuZCBtb2R1bGUgb2JqZWN0Ci0JCQlPYmplY3QgbGF1bmNoYWJsZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCU9iamVjdFtdIG9iaiA9IFNlcnZlclVJUGx1Z2luLmdldExhdW5jaGFibGVBZGFwdGVyKHNlcnZlciwgbW9kdWxlQXJ0aWZhY3QpOwotCQkJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX0xBVU5DSEFCTEVfQURBUFRFUiwgb2JqWzBdKTsKLQkJCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19MQVVOQ0hBQkxFLCBvYmpbMV0pOwotCQkJCWxhdW5jaGFibGUgPSBvYmpbMV07Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfTEFVTkNIQUJMRV9BREFQVEVSLCBudWxsKTsKLQkJCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19MQVVOQ0hBQkxFLCBudWxsKTsKLQkJCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19DTElFTlRTLCBudWxsKTsKLQkJCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19IQVNfQ0xJRU5UUywgbmV3IEJvb2xlYW4oZmFsc2UpKTsKLQkJCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IobnVsbCwgY2UuZ2V0U3RhdHVzKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJLy8gc3RvcCBoZXJlIGlmIHRoZSBzZXJ2ZXIgYW5kIGxhdW5jaGFibGUgaGF2ZW4ndCBjaGFuZ2VkCi0JCQlpZiAobGFzdFNlcnZlciAhPSBudWxsICYmIGxhc3RTZXJ2ZXIuZXF1YWxzKHNlcnZlcikpIHsKLQkJCQlpZiAobGFzdExhdW5jaGFibGUgPT0gbnVsbCAmJiBsYXVuY2hhYmxlID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAobGFzdExhdW5jaGFibGUgIT0gbnVsbCAmJiBsYXN0TGF1bmNoYWJsZS5lcXVhbHMobGF1bmNoYWJsZSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWxhc3RTZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCQlsYXN0TGF1bmNoYWJsZSA9IGxhdW5jaGFibGU7Ci0JCQkKLQkJCVN0cmluZyBsYXVuY2hNb2RlID0gKFN0cmluZykgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX0xBVU5DSF9NT0RFKTsKLQkJCWNsaWVudHMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRDbGllbnRzKHNlcnZlciwgbGF1bmNoYWJsZSwgbGF1bmNoTW9kZSk7Ci0JCQkKLQkJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX0NMSUVOVFMsIG51bGwpOwotCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfSEFTX0NMSUVOVFMsIG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JCQlpZiAoY2xpZW50cyAhPSBudWxsKSB7Ci0JCQkJaWYgKGNsaWVudHMubGVuZ3RoID4gMSkgewotCQkJCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19DTElFTlRTLCBjbGllbnRzKTsKLQkJCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfSEFTX0NMSUVOVFMsIG5ldyBCb29sZWFuKHRydWUpKTsKLQkJCQl9IGVsc2UKLQkJCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfQ0xJRU5ULCBjbGllbnRzWzBdKTsKLQkJCX0KLQkJCQotCQkJdXBkYXRlQ2hpbGRGcmFnbWVudHMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZW50ZXIoKSB7Ci0JCXVwZGF0ZUNsaWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZEZyYWdtZW50cygpIHsKLQkJdXBkYXRlQ2xpZW50cygpOwotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGcmFnbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXNrTW9kZWwoVGFza01vZGVsIHRhc2tNb2RlbCkgewotCQlzdXBlci5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKLQkJdXBkYXRlQ2xpZW50cygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvUnVuT25TZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L1J1bk9uU2VydmVyV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlYTZjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvUnVuT25TZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSUxhdW5jaGFibGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotLyoqCi0gKiBBIGZyYWdtZW50IHVzZWQgZm9yIHRoZSBSdW4gb24gU2VydmVyIHdpemFyZC4KLSAqLwotcHVibGljIGNsYXNzIFJ1bk9uU2VydmVyV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOwotCXByb3RlY3RlZCBJTW9kdWxlIG1vZHVsZTsKLQlwcm90ZWN0ZWQgSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0OwotCQotCXByb3RlY3RlZCBJQ2xpZW50IGNsaWVudDsKLQlwcm90ZWN0ZWQgSUxhdW5jaGFibGVBZGFwdGVyIGxhdW5jaGFibGU7Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIFJ1biBvbiBTZXJ2ZXIgd2l6YXJkIHdpdGggYWxsIHBhZ2VzLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZQotCSAqIEBwYXJhbSBtb2R1bGVBcnRpZmFjdAotCSAqLwotCXB1YmxpYyBSdW5PblNlcnZlcldpemFyZEZyYWdtZW50KElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgbGF1bmNoTW9kZSwgSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubW9kdWxlID0gbW9kdWxlOwotCQl0aGlzLm1vZHVsZUFydGlmYWN0ID0gbW9kdWxlQXJ0aWZhY3Q7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBSdW4gb24gU2VydmVyIHdpemFyZCB3aXRoIGEgZGVmYXVsdCBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBsYXVuY2hNb2RlCi0JICogQHBhcmFtIG1vZHVsZUFydGlmYWN0Ci0JICovCi0JcHVibGljIFJ1bk9uU2VydmVyV2l6YXJkRnJhZ21lbnQoSVNlcnZlciBzZXJ2ZXIsIFN0cmluZyBsYXVuY2hNb2RlLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXRoaXMubW9kdWxlQXJ0aWZhY3QgPSBtb2R1bGVBcnRpZmFjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0KSB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkgewotCQkJbGlzdC5hZGQobmV3IE5ld1NlcnZlcldpemFyZEZyYWdtZW50KG1vZHVsZSkpOwotCQkJCi0JCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5UZW1wU2F2ZVJ1bnRpbWVGcmFnbWVudCk7Ci0JCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5UZW1wU2F2ZVNlcnZlckZyYWdtZW50KTsKLQkJCQotCQkJbGlzdC5hZGQobmV3IE1vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudChtb2R1bGUpKTsKLQkJfQotCQkKLQkJbGlzdC5hZGQobmV3IFRhc2tzV2l6YXJkRnJhZ21lbnQoKSk7Ci0JCQotCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5TYXZlUnVudGltZUZyYWdtZW50KTsKLQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuU2F2ZVNlcnZlckZyYWdtZW50KTsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJbGlzdC5hZGQoV2l6YXJkVGFza1V0aWwuU2F2ZUhvc3RuYW1lRnJhZ21lbnQpOwotCQlpZiAoY2xpZW50ID09IG51bGwgfHwgbGF1bmNoYWJsZSA9PSBudWxsKXsKLQkJCWxpc3QuYWRkKG5ldyBPcHRpb25hbENsaWVudFdpemFyZEZyYWdtZW50KG1vZHVsZUFydGlmYWN0KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGllbnQoSUNsaWVudCBjbGllbnQpIHsKLQkJdGhpcy5jbGllbnQgPSBjbGllbnQ7CQkJCi0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF1bmNoYWJsZShJTGF1bmNoYWJsZUFkYXB0ZXIgbGF1bmNoYWJsZSkgewotCQl0aGlzLmxhdW5jaGFibGUgPSBsYXVuY2hhYmxlOwkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L1NlbGVjdENsaWVudFdpemFyZEZyYWdtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvU2VsZWN0Q2xpZW50V2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI3ZWI3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvU2VsZWN0Q2xpZW50V2l6YXJkRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuV2l6YXJkVGFza1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZS5TZWxlY3RDbGllbnRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLS8qKgotICogQSBmcmFnbWVudCB1c2VkIHRvIHNlbGVjdCBhIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdENsaWVudFdpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCXB1YmxpYyBTZWxlY3RDbGllbnRXaXphcmRGcmFnbWVudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0Q2xpZW50Q29tcG9zaXRlKHBhcmVudCwgd2l6YXJkLCBnZXRUYXNrTW9kZWwoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJdHJ5IHsKLQkJCUlDbGllbnRbXSBjbGllbnRzID0gKElDbGllbnRbXSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfQ0xJRU5UUyk7Ci0JCQlpZiAoY2xpZW50cyA9PSBudWxsIHx8IGNsaWVudHMubGVuZ3RoIDwgMikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfQ0xJRU5UKSAhPSBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvU3ViVGFza3NXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L1N1YlRhc2tzV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0YTFlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvU3ViVGFza3NXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlLlRhc2tzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3ViVGFza3NXaXphcmRGcmFnbWVudCBleHRlbmRzIFdpemFyZEZyYWdtZW50IHsKLQlwcm90ZWN0ZWQgVGFza3NDb21wb3NpdGUgY29tcDsKLQotCXByb3RlY3RlZCBMaXN0IHRhc2tzOwotCi0JcHVibGljIFN1YlRhc2tzV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbnRlcigpIHsKLQkJdXBkYXRlVGFza3ModGFza3MpOwotCQkKLQkJaWYgKGNvbXAgIT0gbnVsbCkKLQkJCWNvbXAuY3JlYXRlQ29udHJvbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZVRhc2tzKExpc3QgbmV3VGFza3MpIHsKLQkJdGFza3MgPSBuZXdUYXNrczsKLQkJaWYgKGNvbXAgIT0gbnVsbCkKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChjb21wICE9IG51bGwgJiYgIWNvbXAuaXNEaXNwb3NlZCgpKQotCQkJCQkJY29tcC5zZXRUYXNrcyh0YXNrcyk7Ci0JCQkJfQotCQkJfSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnRhc2suV2l6YXJkVGFzayNnZXRXaXphcmRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCkgewotCQljb21wID0gbmV3IFRhc2tzQ29tcG9zaXRlKHBhcmVudCwgd2l6YXJkKTsKLQkJcmV0dXJuIGNvbXA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L1Rhc2tzV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9UYXNrc1dpemFyZEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzVmNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L1Rhc2tzV2l6YXJkRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3IuSU9yZGVyZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuV2l6YXJkVGFza1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGFza3NXaXphcmRGcmFnbWVudCBleHRlbmRzIFdpemFyZEZyYWdtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFTS1NfUEVSX1BBR0UgPSA1OwotCi0JcHVibGljIGNsYXNzIFRhc2tJbmZvIGltcGxlbWVudHMgSU9yZGVyZWQgewotCQlwdWJsaWMgaW50IGtpbmQ7Ci0JCXB1YmxpYyBTdHJpbmcgaWQ7Ci0JCXB1YmxpYyBQdWJsaXNoT3BlcmF0aW9uIHRhc2syOwotCQkKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFQgPSAiZGVmYXVsdDoiOwotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpIHsKLQkJCWlmIChpZCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQkJaWYgKHNlbGVjdGVkVGFza01hcC5jb250YWluc0tleShpZCkpCi0JCQkJcmV0dXJuIChzZWxlY3RlZFRhc2tNYXAuZ2V0KGlkKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkKLQkJCWlmIChzZWxlY3RlZFRhc2tNYXAuY29udGFpbnNLZXkoREVGQVVMVCArIGlkKSkKLQkJCQlyZXR1cm4gKHNlbGVjdGVkVGFza01hcC5nZXQoREVGQVVMVCArIGlkKSkuYm9vbGVhblZhbHVlKCk7Ci0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0RGVmYXVsdFNlbGVjdGVkKGJvb2xlYW4gc2VsKSB7Ci0JCQlzZWxlY3RlZFRhc2tNYXAucHV0KERFRkFVTFQgKyBnZXRJZCgpLCBuZXcgQm9vbGVhbihzZWwpKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGdldERlZmF1bHRTZWxlY3RlZCgpIHsKLQkJCXJldHVybiAoc2VsZWN0ZWRUYXNrTWFwLmdldChERUZBVUxUICsgaWQpKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGJvb2xlYW4gc2VsKSB7Ci0JCQlzZWxlY3RlZFRhc2tNYXAucHV0KGdldElkKCksIG5ldyBCb29sZWFuKHNlbCkpOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGdldE9yZGVyKCkgewotCQkJcmV0dXJuIHRhc2syLmdldE9yZGVyKCk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQlyZXR1cm4gaWQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBUYXNrSW5mbykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlUYXNrSW5mbyB0aSA9IChUYXNrSW5mbykgb2JqOwotCQkJaWYgKGtpbmQgIT0gdGkua2luZCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCWlmIChpZCA9PSBudWxsIHx8ICFpZC5lcXVhbHModGkuaWQpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQkJaWYgKHRhc2syID09IG51bGwgJiYgdGkudGFzazIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCWlmICh0YXNrMiAhPSBudWxsICYmIHRpLnRhc2syID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQl0cnkgewotCQkJCWlmICh0YXNrMiAhPSBudWxsICYmIHRpLnRhc2syICE9IG51bGwpIHsKLQkJCQkJaWYgKHRhc2syLmdldEtpbmQoKSAhPSB0aS50YXNrMi5nZXRLaW5kKCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWlmICh0YXNrMi5nZXRPcmRlcigpICE9IHRpLnRhc2syLmdldE9yZGVyKCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWlmICghdGFzazIuZ2V0TGFiZWwoKS5lcXVhbHModGkudGFzazIuZ2V0TGFiZWwoKSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWlmICghdGFzazIuZ2V0RGVzY3JpcHRpb24oKS5lcXVhbHModGkudGFzazIuZ2V0RGVzY3JpcHRpb24oKSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Q8VGFza0luZm8+IHRhc2tzOwotCXByb3RlY3RlZCBib29sZWFuIGhhc09wdGlvbmFsVGFza3M7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUHJlZmVycmVkVGFza3M7Ci0KLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgQm9vbGVhbj4gc2VsZWN0ZWRUYXNrTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPigpOwotCi0JcHVibGljIFRhc2tzV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0KSB7Ci0JCWlmICh0YXNrcyA9PSBudWxsIHx8IHRhc2tzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJCi0JCWludCBzaXplID0gdGFza3Muc2l6ZSgpOwotCQlpbnQgcGFnZXMgPSAoc2l6ZSAtIDEpIC8gVEFTS1NfUEVSX1BBR0UgKyAxOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzOyBpKyspIHsKLQkJCVN1YlRhc2tzV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSBuZXcgU3ViVGFza3NXaXphcmRGcmFnbWVudCgpOwotCQkJTGlzdCBsaXN0MiA9IHRhc2tzLnN1Ykxpc3QoVEFTS1NfUEVSX1BBR0UgKiBpLCBNYXRoLm1pbihzaXplLCBUQVNLU19QRVJfUEFHRSAqIChpKzEpKSk7Ci0JCQlmcmFnbWVudC51cGRhdGVUYXNrcyhsaXN0Mik7Ci0JCQlsaXN0LmFkZChmcmFnbWVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbnRlcigpIHsKLQkJdXBkYXRlVGFza3MoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZEZyYWdtZW50cygpIHsKLQkJdXBkYXRlVGFza3MoKTsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRnJhZ21lbnRzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFza01vZGVsKFRhc2tNb2RlbCB0YXNrTW9kZWwpIHsKLQkJc3VwZXIuc2V0VGFza01vZGVsKHRhc2tNb2RlbCk7Ci0JCXVwZGF0ZVRhc2tzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlVGFza3MoKSB7Ci0JCWlmIChnZXRUYXNrTW9kZWwoKSA9PSBudWxsKSB7Ci0JCQl0YXNrcyA9IG51bGw7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlciA9IChJU2VydmVyQXR0cmlidXRlcykgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCUxpc3QgbW9kdWxlcyA9IChMaXN0KSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfTU9EVUxFUyk7Ci0JCQotCQlpZiAoc2VydmVyICE9IG51bGwgJiYgbW9kdWxlcyA9PSBudWxsKSB7Ci0JCQlmaW5hbCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZVtdPigpOwotCQkJKChTZXJ2ZXIpIHNlcnZlcikudmlzaXQobmV3IElNb2R1bGVWaXNpdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElNb2R1bGVbXSBtb2R1bGUyKSB7Ci0JCQkJCW1vZHVsZUxpc3QuYWRkKG1vZHVsZTIpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9LCBudWxsKTsKLQkJCQotCQkJbW9kdWxlcyA9IG1vZHVsZUxpc3Q7Ci0JCX0KLQkJCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBtb2R1bGVzICE9IG51bGwpIHsKLQkJCWhhc09wdGlvbmFsVGFza3MgPSBmYWxzZTsKLQkJCWhhc1ByZWZlcnJlZFRhc2tzID0gZmFsc2U7Ci0JCQlMaXN0PFRhc2tJbmZvPiB0YXNrTGlzdCA9IG5ldyBBcnJheUxpc3Q8VGFza0luZm8+KDUpOwotCQkJY3JlYXRlVGFza3ModGFza0xpc3QsIHNlcnZlciwgbW9kdWxlcyk7Ci0JCQkKLQkJCWlmICh0YXNrcyA9PSBudWxsIHx8ICF0YXNrcy5lcXVhbHModGFza0xpc3QpKSB7Ci0JCQkJdGFza3MgPSB0YXNrTGlzdDsKLQkJCQl1cGRhdGVDaGlsZEZyYWdtZW50cygpOwotCQkJCQotCQkJCWJvb2xlYW4gYiA9IGhhc09wdGlvbmFsVGFza3MgfHwgaGFzUHJlZmVycmVkVGFza3M7Ci0JCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfSEFTX1RBU0tTLCBuZXcgQm9vbGVhbihiKSk7CQkJCQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFza3MoTGlzdDxUYXNrSW5mbz4gdGFza0xpc3QsIElTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlciwgTGlzdCBtb2R1bGVzKSB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCUxpc3Q8U3RyaW5nPiBlbmFibGVkVGFza3MgPSAoKFNlcnZlcilzZXJ2ZXIpLmdldEVuYWJsZWRPcHRpb25hbFB1Ymxpc2hPcGVyYXRpb25JZHMoKTsKLQkJTGlzdDxTdHJpbmc+IGRpc2FibGVkVGFza3MgPSAoKFNlcnZlcilzZXJ2ZXIpLmdldERpc2FibGVkUHJlZmVycmVkUHVibGlzaE9wZXJhdGlvbklkcygpOwotCQlQdWJsaXNoT3BlcmF0aW9uW10gdGFza3MyID0gKChTZXJ2ZXIpc2VydmVyKS5nZXRBbGxUYXNrcyhtb2R1bGVzKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCB0YXNrczIubGVuZ3RoOyBqKyspIHsKLQkJCWludCBraW5kID0gdGFza3MyW2pdLmdldEtpbmQoKTsKLQkJCVN0cmluZyBpZCA9ICgoU2VydmVyKXNlcnZlcikuZ2V0UHVibGlzaE9wZXJhdGlvbklkKHRhc2tzMltqXSk7Ci0JCQlpZiAoa2luZCA9PSBQdWJsaXNoT3BlcmF0aW9uLk9QVElPTkFMIHx8IGtpbmQgPT0gUHVibGlzaE9wZXJhdGlvbi5QUkVGRVJSRUQpCi0JCQkJaGFzT3B0aW9uYWxUYXNrcyA9IHRydWU7Ci0JCQlpZiAoa2luZCA9PSBQdWJsaXNoT3BlcmF0aW9uLlBSRUZFUlJFRCkKLQkJCQloYXNQcmVmZXJyZWRUYXNrcyA9IHRydWU7Ci0JCQl0YXNrczJbal0uc2V0VGFza01vZGVsKGdldFRhc2tNb2RlbCgpKTsKLQkJCQotCQkJYm9vbGVhbiBzZWxlY3RlZCA9IHRydWU7Ci0JCQlpZiAoa2luZCA9PSBQdWJsaXNoT3BlcmF0aW9uLk9QVElPTkFMKSB7Ci0JCQkJaWYgKCFlbmFibGVkVGFza3MuY29udGFpbnMoaWQpKQotCQkJCQlzZWxlY3RlZCA9IGZhbHNlOwotCQkJfSBlbHNlIGlmIChraW5kID09IFB1Ymxpc2hPcGVyYXRpb24uUFJFRkVSUkVEKSB7Ci0JCQkJaWYgKGRpc2FibGVkVGFza3MuY29udGFpbnMoaWQpKQotCQkJCQlzZWxlY3RlZCA9IGZhbHNlOwotCQkJfQotCQkJdGFza0xpc3QuYWRkKGdldFNlcnZlclRhc2soc2VydmVyLCB0YXNrczJbal0sIHNlbGVjdGVkKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGFza0luZm8gZ2V0U2VydmVyVGFzayhJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIsIFB1Ymxpc2hPcGVyYXRpb24gdGFzazIsIGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJVGFza0luZm8gc3RpID0gbmV3IFRhc2tJbmZvKCk7Ci0JCXN0aS50YXNrMiA9IHRhc2syOwotCQlzdGkua2luZCA9IHRhc2syLmdldEtpbmQoKTsKLQkJc3RpLmlkID0gKChTZXJ2ZXIpc2VydmVyKS5nZXRQdWJsaXNoT3BlcmF0aW9uSWQodGFzazIpOwotCQlzdGkuc2V0RGVmYXVsdFNlbGVjdGVkKHNlbGVjdGVkKTsKLQkJCi0JCXJldHVybiBzdGk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBXaXphcmRGcmFnbWVudCNwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFoYXNPcHRpb25hbFRhc2tzKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKHRhc2tzID09IG51bGwgfHwgdGFza3MuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQkKLQkJVGFza01vZGVsIHRhc2tNb2RlbCA9IGdldFRhc2tNb2RlbCgpOwotCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKXRhc2tNb2RlbC5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJYm9vbGVhbiBjcmVhdGVkV0MgPSBmYWxzZTsKLQkJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBudWxsOwotCQlpZiAoc2VydmVyIGluc3RhbmNlb2YgU2VydmVyV29ya2luZ0NvcHkpCi0JCQl3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSlzZXJ2ZXI7Ci0JCWVsc2UgewotCQkJd2MgPSAoU2VydmVyV29ya2luZ0NvcHkpc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCQljcmVhdGVkV0MgPSB0cnVlOwotCQl9Ci0JCQotCQkvLyBjb21wYXJlIGxpc3RzCi0JCUxpc3Q8U3RyaW5nPiBkaXNhYmxlZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlMaXN0PFN0cmluZz4gZW5hYmxlZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHRhc2tzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVRhc2tJbmZvIHRhc2sgPSAoVGFza0luZm8paXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKFB1Ymxpc2hPcGVyYXRpb24uUkVRVUlSRUQgPT0gdGFzay5raW5kKQotCQkJCWNvbnRpbnVlOwotCQkJCi0JCQlTdHJpbmcgaWQgPSB3Yy5nZXRQdWJsaXNoT3BlcmF0aW9uSWQodGFzay50YXNrMik7Ci0JCQlpZiAoUHVibGlzaE9wZXJhdGlvbi5QUkVGRVJSRUQgPT0gdGFzay5raW5kKSB7Ci0JCQkJaWYgKCF0YXNrLmlzU2VsZWN0ZWQoKSkKLQkJCQkJZGlzYWJsZWQuYWRkKGlkKTsKLQkJCX0gZWxzZSBpZiAoUHVibGlzaE9wZXJhdGlvbi5PUFRJT05BTCA9PSB0YXNrLmtpbmQpIHsKLQkJCQlpZiAodGFzay5pc1NlbGVjdGVkKCkpCi0JCQkJCWVuYWJsZWQuYWRkKGlkKTsKLQkJCX0KLQkJfQotCQkKLQkJTGlzdDxTdHJpbmc+IGN1ckRpc2FibGVkID0gd2MuZ2V0RGlzYWJsZWRQcmVmZXJyZWRQdWJsaXNoT3BlcmF0aW9uSWRzKCk7Ci0JCUxpc3Q8U3RyaW5nPiBjdXJFbmFibGVkID0gd2MuZ2V0RW5hYmxlZE9wdGlvbmFsUHVibGlzaE9wZXJhdGlvbklkcygpOwotCQkKLQkJYm9vbGVhbiBkaWZmZXJlbnQgPSBmYWxzZTsKLQkJaWYgKGN1ckVuYWJsZWQuc2l6ZSgpICE9IGVuYWJsZWQuc2l6ZSgpIHx8IGN1ckRpc2FibGVkLnNpemUoKSAhPSBkaXNhYmxlZC5zaXplKCkpIHsKLQkJCWRpZmZlcmVudCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKFN0cmluZyBpZCA6IGN1ckRpc2FibGVkKSB7Ci0JCQkJaWYgKCFkaXNhYmxlZC5jb250YWlucyhpZCkpCi0JCQkJCWRpZmZlcmVudCA9IHRydWU7Ci0JCQl9Ci0JCQlmb3IgKFN0cmluZyBpZCA6IGN1ckVuYWJsZWQpIHsKLQkJCQlpZiAoIWVuYWJsZWQuY29udGFpbnMoaWQpKQotCQkJCQlkaWZmZXJlbnQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoZGlmZmVyZW50KSB7Ci0JCQl3Yy5yZXNldFByZWZlcnJlZFB1Ymxpc2hPcGVyYXRpb25zKCk7Ci0JCQl3Yy5yZXNldE9wdGlvbmFsUHVibGlzaE9wZXJhdGlvbnMoKTsKLQkJCQotCQkJSXRlcmF0b3I8VGFza0luZm8+IGl0ZXJhdG9yMiA9IHRhc2tzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IyLmhhc05leHQoKSkgewotCQkJCVRhc2tJbmZvIHRhc2sgPSBpdGVyYXRvcjIubmV4dCgpOwotCQkJCWlmIChQdWJsaXNoT3BlcmF0aW9uLlJFUVVJUkVEID09IHRhc2sua2luZCkKLQkJCQkJY29udGludWU7Ci0JCQkJCi0JCQkJaWYgKFB1Ymxpc2hPcGVyYXRpb24uUFJFRkVSUkVEID09IHRhc2sua2luZCkgewotCQkJCQlpZiAoIXRhc2suaXNTZWxlY3RlZCgpKQotCQkJCQkJd2MuZGlzYWJsZVByZWZlcnJlZFB1Ymxpc2hPcGVyYXRpb25zKHRhc2sudGFzazIpOwotCQkJCX0gZWxzZSBpZiAoUHVibGlzaE9wZXJhdGlvbi5PUFRJT05BTCA9PSB0YXNrLmtpbmQpIHsKLQkJCQkJaWYgKHRhc2suaXNTZWxlY3RlZCgpKQotCQkJCQkJd2MuZW5hYmxlT3B0aW9uYWxQdWJsaXNoT3BlcmF0aW9ucyh0YXNrLnRhc2syKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChjcmVhdGVkV0MgJiYgd2MuaXNEaXJ0eSgpKQotCQkJd2Muc2F2ZSh0cnVlLCBtb25pdG9yKTsKLQkJbW9uaXRvci5kb25lKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL0ZpeGVkVGFibGVMYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL0ZpeGVkVGFibGVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU3OTMyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9GaXhlZFRhYmxlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKLQotLy9pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLS8vaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRml4ZWRUYWJsZUxheW91dCBleHRlbmRzIExheW91dCB7Ci0JLy9wcml2YXRlIExpc3QgY29sdW1ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkvKnB1YmxpYyB2b2lkIGFkZENvbHVtbkRhdGEoSW50ZWdlciBkYXRhKSB7Ci0JCWNvbHVtbnMuYWRkKGRhdGEpOwotCX0qLwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0I2NvbXB1dGVTaXplKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgaW50LCBpbnQsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJVGFibGUgdGFibGUgPSAoVGFibGUpIGNvbXBvc2l0ZTsKLQkJUG9pbnQgcmVzdWx0ID0gdGFibGUuY29tcHV0ZVNpemUod0hpbnQsIGhIaW50LCBmbHVzaENhY2hlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQjbGF5b3V0KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCVRhYmxlIHRhYmxlID0gKFRhYmxlKSBjb21wb3NpdGU7Ci0JCVRhYmxlQ29sdW1uW10gdGFibGVDb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCQlpbnQgd2lkdGggPSB0YWJsZS5nZXRDbGllbnRBcmVhKCkud2lkdGggLSAxMDsKLQkJCi0JCXRhYmxlQ29sdW1uc1swXS5zZXRXaWR0aCh3aWR0aCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL0hvc3RuYW1lQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9Ib3N0bmFtZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTNiOGE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL0hvc3RuYW1lQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkF1dG9Db21wbGV0ZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkNvbnRyb2xEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkZpZWxkRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5GaWVsZERlY29yYXRpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5UZXh0Q29udGVudEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLS8qKgotICogQSBjb21wb3NpdGUgdXNlZCB0byBzZWxlY3QgYSBob3N0bmFtZS4KLSAqLwotcHVibGljIGNsYXNzIEhvc3RuYW1lQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTEhPU1QgPSAibG9jYWxob3N0IjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGhvc3Q7Ci0JcHJvdGVjdGVkIElIb3N0bmFtZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyOwotCQotCXByb3RlY3RlZCBUZXh0IGhvc3RuYW1lOwotCQotCXB1YmxpYyBpbnRlcmZhY2UgSUhvc3RuYW1lU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBob3N0bmFtZVNlbGVjdGVkKFN0cmluZyBob3N0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgSG9zdG5hbWVDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBhIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gbGlzdGVuZXIyIGEgaG9zdG5hbWUgc2VsZWN0aW9uIGxpc3RlbmVyCi0JICovCi0JcHVibGljIEhvc3RuYW1lQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElIb3N0bmFtZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyMikgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyMjsKLQkJCi0JCWNyZWF0ZUNvbnRyb2woKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBVSSBvZiB0aGUgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHModGhpcywgNCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCS8vV29ya2JlbmNoSGVscC5zZXRIZWxwKHRoaXMsIENvbnRleHRJZHMuU0VMRUNUX0NMSUVOVF9XSVpBUkQpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmhvc3RuYW1lKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCQotCQlob3N0bmFtZSA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOwotCQlob3N0bmFtZS5zZXRUZXh0KExPQ0FMSE9TVCk7Ci0JCWZpbmFsIENvbnRyb2xEZWNvcmF0aW9uIGhvc3RuYW1lRGVjb3JhdGlvbiA9IG5ldyBDb250cm9sRGVjb3JhdGlvbihob3N0bmFtZSwgU1dULlRPUCB8IFNXVC5MRUFEKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJaG9zdG5hbWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWhvc3RuYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWhvc3RuYW1lQ2hhbmdlZChob3N0bmFtZS5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCUZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuZ2V0RGVmYXVsdCgpOwotCQlGaWVsZERlY29yYXRpb24gZmQgPSByZWdpc3RyeS5nZXRGaWVsZERlY29yYXRpb24oRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuREVDX0NPTlRFTlRfUFJPUE9TQUwpOwotCQlob3N0bmFtZURlY29yYXRpb24uc2V0SW1hZ2UoZmQuZ2V0SW1hZ2UoKSk7Ci0JCWhvc3RuYW1lRGVjb3JhdGlvbi5zZXREZXNjcmlwdGlvblRleHQoZmQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQotCQlob3N0bmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJaG9zdG5hbWVEZWNvcmF0aW9uLnNob3coKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWhvc3RuYW1lRGVjb3JhdGlvbi5oaWRlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJTGlzdDxTdHJpbmc+IGhvc3RzID0gU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5nZXRIb3N0bmFtZXMoKTsKLQkJU3RyaW5nW10gaG9zdHMyID0gaG9zdHMudG9BcnJheShuZXcgU3RyaW5nW2hvc3RzLnNpemUoKV0pOwotCQluZXcgQXV0b0NvbXBsZXRlRmllbGQoaG9zdG5hbWUsIG5ldyBUZXh0Q29udGVudEFkYXB0ZXIoKSwgaG9zdHMyKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaG9zdG5hbWVDaGFuZ2VkKFN0cmluZyBuZXdIb3N0KSB7Ci0JCWlmIChuZXdIb3N0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAobmV3SG9zdC5lcXVhbHMoaG9zdCkpCi0JCQlyZXR1cm47Ci0KLQkJaG9zdCA9IG5ld0hvc3Q7Ci0JCWxpc3RlbmVyLmhvc3RuYW1lU2VsZWN0ZWQoaG9zdCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIb3N0bmFtZSgpIHsKLQkJcmV0dXJuIGhvc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SG9zdG5hbWUoU3RyaW5nIG5ld0hvc3RuYW1lKSB7Ci0JCWhvc3RuYW1lLnNldFRleHQobmV3SG9zdG5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL0xpY2Vuc2VDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL0xpY2Vuc2VDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk5YWNiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9MaWNlbnNlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5MaWNlbnNlV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotLyoqCi0gKiBBIGNvbXBvc2l0ZSB1c2VkIHRvIGFjY2VwdCBhIGxpY2Vuc2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWNlbnNlQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQljbGFzcyBMaWNlbnNlTGF5b3V0IGV4dGVuZHMgTGF5b3V0IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOREVOVCA9IDE1OwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1BBQ0lORyA9IDU7Ci0JCQotCQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQkJaWYgKHdIaW50IDwgMjAwKQotCQkJCXdIaW50ID0gMjAwOwotCQkJaWYgKGhIaW50IDwgMzAwKQotCQkJCWhIaW50ID0gMzAwOwotCQkJcmV0dXJuIG5ldyBQb2ludCh3SGludCwgaEhpbnQpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCQlQb2ludCBwMSA9IGNoaWxkcmVuWzFdLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2hDYWNoZSk7Ci0JCQlQb2ludCBwMiA9IGNoaWxkcmVuWzJdLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2hDYWNoZSk7Ci0JCQkKLQkJCVJlY3RhbmdsZSByID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLQkJCQotCQkJY2hpbGRyZW5bMl0uc2V0Qm91bmRzKHIueCArIElOREVOVCwgci55ICsgci5oZWlnaHQgLSBwMi55LCByLndpZHRoIC0gSU5ERU5ULCBwMi55KTsKLQkJCWNoaWxkcmVuWzFdLnNldEJvdW5kcyhyLnggKyBJTkRFTlQsIHIueSArIHIuaGVpZ2h0IC0gcDIueSAtIHAxLnkgLSBTUEFDSU5HLCByLndpZHRoIC0gSU5ERU5ULCBwMS55KTsKLQkJCWNoaWxkcmVuWzBdLnNldEJvdW5kcyhyLngsIHIueSwgci53aWR0aCwgci5oZWlnaHQgLSBwMS55IC0gcDIueSAtIFNQQUNJTkcgKiAzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBUYXNrTW9kZWwgdGFza01vZGVsOwotCXByb3RlY3RlZCBJV2l6YXJkSGFuZGxlIHdpemFyZDsKLQlwcm90ZWN0ZWQgVGV4dCBsaWNlbnNlVGV4dDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGFjY2VwdDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRlY2xpbmU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0ZWQ7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgTGljZW5zZUNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0YXNrTW9kZWwgYSB0YXNrIG1vZGVsCi0JICogQHBhcmFtIHdpemFyZCB0aGUgd2l6YXJkIHRoaXMgY29tcG9zaXRlIGlzIGNvbnRhaW5lZCBpbgotCSAqLwotCXB1YmxpYyBMaWNlbnNlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIFRhc2tNb2RlbCB0YXNrTW9kZWwsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLnRhc2tNb2RlbCA9IHRhc2tNb2RlbDsKLQkJdGhpcy53aXphcmQgPSB3aXphcmQ7Ci0JCQotCQljcmVhdGVDb250cm9sKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVUkgb2YgdGhlIHBhZ2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udHJvbCgpIHsKLQkJc2V0TGF5b3V0KG5ldyBMaWNlbnNlTGF5b3V0KCkpOwotCQkKLQkJbGljZW5zZVRleHQgPSBuZXcgVGV4dCh0aGlzLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULlJFQURfT05MWSB8IFNXVC5XUkFQKTsKLQkJbGljZW5zZVRleHQuc2V0QmFja2dyb3VuZChsaWNlbnNlVGV4dC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkpOwotCQkKLQkJYWNjZXB0ID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuUkFESU8pOwotCQlhY2NlcHQuc2V0VGV4dChNZXNzYWdlcy53aXpMaWNlbnNlQWNjZXB0KTsKLQkJYWNjZXB0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWFjY2VwdGVkID0gYWNjZXB0LmdldFNlbGVjdGlvbigpOwotCQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoTGljZW5zZVdpemFyZEZyYWdtZW50LkxJQ0VOU0VfQUNDRVBULCBuZXcgQm9vbGVhbihhY2NlcHRlZCkpOwotCQkJCXdpemFyZC51cGRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlkZWNsaW5lID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuUkFESU8pOwotCQlkZWNsaW5lLnNldFRleHQoTWVzc2FnZXMud2l6TGljZW5zZURlY2xpbmUpOwotCQkKLQkJdXBkYXRlTGljZW5zZSgpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUxpY2Vuc2UoKSB7Ci0JCVN0cmluZyBsaWNlbnNlID0gKFN0cmluZykgdGFza01vZGVsLmdldE9iamVjdChMaWNlbnNlV2l6YXJkRnJhZ21lbnQuTElDRU5TRSk7Ci0JCWlmIChsaWNlbnNlID09IG51bGwpCi0JCQlsaWNlbnNlID0gTGljZW5zZVdpemFyZEZyYWdtZW50LkxJQ0VOU0VfVU5LTk9XTjsKLQkJCi0JCU9iamVjdCBhY2MgPSB0YXNrTW9kZWwuZ2V0T2JqZWN0KExpY2Vuc2VXaXphcmRGcmFnbWVudC5MSUNFTlNFX0FDQ0VQVCk7Ci0JCWlmIChhY2MgPT0gbnVsbCkgewotCQkJYWNjZXB0ZWQgPSBmYWxzZTsKLQkJCWFjY2VwdC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZGVjbGluZS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JCQotCQlpZiAoTGljZW5zZVdpemFyZEZyYWdtZW50LkxJQ0VOU0VfTk9ORS5lcXVhbHMobGljZW5zZSkpIHsKLQkJCWxpY2Vuc2VUZXh0LnNldFRleHQoTWVzc2FnZXMud2l6TGljZW5zZU5vbmUpOwotCQkJYWNjZXB0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZGVjbGluZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWFjY2VwdGVkID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChMaWNlbnNlV2l6YXJkRnJhZ21lbnQuTElDRU5TRV9VTktOT1dOLmVxdWFscyhsaWNlbnNlKSkgewotCQkJbGljZW5zZVRleHQuc2V0VGV4dChNZXNzYWdlcy53aXpMaWNlbnNlTm9uZSk7Ci0JCQlhY2NlcHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWRlY2xpbmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWxpY2Vuc2VUZXh0LnNldFRleHQobGljZW5zZSk7Ci0JCQlhY2NlcHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWRlY2xpbmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCQl0YXNrTW9kZWwucHV0T2JqZWN0KExpY2Vuc2VXaXphcmRGcmFnbWVudC5MSUNFTlNFX0FDQ0VQVCwgbmV3IEJvb2xlYW4oYWNjZXB0ZWQpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTW9kaWZ5TW9kdWxlc0NvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTW9kaWZ5TW9kdWxlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2IwYmMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL01vZGlmeU1vZHVsZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyVUlDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVycy5Nb2R1bGVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLS8qKgotICogQSB3aXphcmQgcGFnZSB1c2VkIHRvIGFkZCBhbmQgcmVtb3ZlIG1vZHVsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZnlNb2R1bGVzQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1JFRlJFU0hfTU9EVUxFUyA9ICJyZWZyZXNoLW1vZHVsZXMiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSAicm9vdCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBDb2xvciBjb2xvcjsKLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgZm9udDsKLQotCXByb3RlY3RlZCBJV2l6YXJkSGFuZGxlIHdpemFyZDsKLQotCXByb3RlY3RlZCBJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIElSdW50aW1lIHJ1bnRpbWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcnVudGltZURpcnR5OwotCXByb3RlY3RlZCBPYmplY3QgcmVmcmVzaE1vZHVsZXM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1B1Ymxpc2hPcHRpb247Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcHVibGlzaEltbWVkaWF0ZWx5OwotCi0JcHJvdGVjdGVkIE1hcDxDaGlsZE1vZHVsZU1hcEtleSwgSU1vZHVsZVtdPiBjaGlsZE1vZHVsZU1hcCA9IG5ldyBIYXNoTWFwPENoaWxkTW9kdWxlTWFwS2V5LCBJTW9kdWxlW10+KCk7Ci0JcHJvdGVjdGVkIE1hcDxJTW9kdWxlLCBJTW9kdWxlW10+IHBhcmVudE1vZHVsZU1hcCA9IG5ldyBIYXNoTWFwPElNb2R1bGUsIElNb2R1bGVbXT4oKTsKLQotCS8vIG9yaWdpbmFsIG1vZHVsZXMgb24gdGhlIHNlcnZlcgotCXByb3RlY3RlZCBMaXN0PElNb2R1bGU+IG9yaWdpbmFsTW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKLQotCS8vIG1vZHVsZXMgYXZhaWxhYmxlIHRvIGJlIGFkZGVkIHRvIHRoZSBzZXJ2ZXIKLQlwcm90ZWN0ZWQgTGlzdDxJTW9kdWxlPiBtb2R1bGVzID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCi0JLy8gY3VycmVudCBtb2R1bGVzIG9uIHRoZSBzZXJ2ZXIKLQlwcm90ZWN0ZWQgTGlzdDxJTW9kdWxlPiBkZXBsb3llZCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKLQotCXByb3RlY3RlZCBUcmVlVmlld2VyIGF2YWlsYWJsZVRyZWVWaWV3ZXI7Ci0JcHJvdGVjdGVkIFRyZWVWaWV3ZXIgZGVwbG95ZWRUcmVlVmlld2VyOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBhZGQsIGFkZEFsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIHJlbW92ZSwgcmVtb3ZlQWxsOwotCi0JcHJvdGVjdGVkIFRhc2tNb2RlbCB0YXNrTW9kZWw7Ci0KLQkvLyBhIG1vZHVsZSB0aGF0IG11c3QgYmUga2VwdCBvbiB0aGUgc2VydmVyCi0JcHJvdGVjdGVkIElNb2R1bGUgcmVxdWlyZWRNb2R1bGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21wbGV0ZSA9IHRydWU7Ci0KLQkvLyB0aGUgcGFyZW50IG1vZHVsZXMgb2YgdGhlIGFib3ZlIG1vZHVsZXMuIGF0IGxlYXN0IG9uZSBvZiB0aGVzZSBtb2R1bGVzCi0JLy8gbXVzdCBiZSBrZXB0IG9uIHRoZSBzZXJ2ZXIKLQlwcm90ZWN0ZWQgSU1vZHVsZVtdIHJlcXVpcmVkTW9kdWxlczsKLQotCXByb3RlY3RlZCBNYXA8SU1vZHVsZSwgSVN0YXR1cz4gZXJyb3JNYXA7Ci0KLQlhYnN0cmFjdCBjbGFzcyBUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgcGFyZW50RWxlbWVudDsKLQkJCUlNb2R1bGVbXSBwYXJlbnQgPSBtcy5tb2R1bGU7Ci0JCQlJTW9kdWxlW10gY2hpbGRyZW4gPSBjaGlsZE1vZHVsZU1hcC5nZXQobmV3IENoaWxkTW9kdWxlTWFwS2V5KHBhcmVudCkpOwotCQkJCi0JCQlMaXN0PE1vZHVsZVNlcnZlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kdWxlU2VydmVyPigpOwotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlJTW9kdWxlIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQkJCQotCQkJCQlwYXJlbnRNb2R1bGVNYXAucHV0KGNoaWxkLCBwYXJlbnQpOwotCQkJCQkKLQkJCQkJaW50IHNpemUyID0gcGFyZW50Lmxlbmd0aDsKLQkJCQkJSU1vZHVsZVtdIG1vZHVsZTIgPSBuZXcgSU1vZHVsZVtzaXplMiArIDFdOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBhcmVudCwgMCwgbW9kdWxlMiwgMCwgc2l6ZTIpOwotCQkJCQltb2R1bGUyW3NpemUyXSA9IGNoaWxkOwotCQkJCQlsaXN0LmFkZChuZXcgTW9kdWxlU2VydmVyKG51bGwsIG1vZHVsZTIpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgZWxlbWVudDsKLQkJCUlNb2R1bGVbXSBjaGlsZCA9IG1zLm1vZHVsZTsKLQkJCUlNb2R1bGVbXSBtb2R1bGVzMiA9IHBhcmVudE1vZHVsZU1hcC5nZXQoY2hpbGQpOwotCQkJaWYgKG1vZHVsZXMyID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gbmV3IE1vZHVsZVNlcnZlcihudWxsLCBtb2R1bGVzMik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgZWxlbWVudDsKLQkJCUlNb2R1bGVbXSBwYXJlbnQgPSBtcy5tb2R1bGU7Ci0JCQlJTW9kdWxlW10gY2hpbGRyZW4gPSBjaGlsZE1vZHVsZU1hcC5nZXQobmV3IENoaWxkTW9kdWxlTWFwS2V5KHBhcmVudCkpOwotCQkJcmV0dXJuIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApOwotCQl9Ci0JfQotCi0JY2xhc3MgQXZhaWxhYmxlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlMaXN0PE1vZHVsZVNlcnZlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kdWxlU2VydmVyPigpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU1vZHVsZSBtb2R1bGUgPSAoSU1vZHVsZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWxpc3QuYWRkKG5ldyBNb2R1bGVTZXJ2ZXIobnVsbCwgbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBEZXBsb3llZENvbnRlbnRQcm92aWRlciBleHRlbmRzIFRyZWVDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJTGlzdDxNb2R1bGVTZXJ2ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE1vZHVsZVNlcnZlcj4oKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVwbG95ZWQuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJbGlzdC5hZGQobmV3IE1vZHVsZVNlcnZlcihudWxsLCBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0pKTsKLQkJCX0KLQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBrZXkgZWxlbWVudCBmb3IgdGhlIGNoaWxkIG1vZHVsZSBtYXAKLQkgKiBDaGlsZE1hcE1vZHVsZUtleQotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBDaGlsZE1vZHVsZU1hcEtleSB7Ci0JCXByb3RlY3RlZCBJTW9kdWxlW10gbW9kdWxlVHJlZTsKLQkJCi0JCXByb3RlY3RlZCBDaGlsZE1vZHVsZU1hcEtleShJTW9kdWxlIGN1ck1vZHVsZSkgewotCQkJaWYgKGN1ck1vZHVsZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlVHJlZSA9IG5ldyBJTW9kdWxlW10geyBjdXJNb2R1bGUgfTsKLQkJCX0KLQkJfQotCQkKLQkJcHJvdGVjdGVkIENoaWxkTW9kdWxlTWFwS2V5KElNb2R1bGVbXSBjdXJNb2R1bGVUcmVlKSB7Ci0JCQltb2R1bGVUcmVlID0gY3VyTW9kdWxlVHJlZTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogPT0gdGhpcykgLy8gc2FtZSBvYmplY3QKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgQ2hpbGRNb2R1bGVNYXBLZXkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQkKLQkJCUlNb2R1bGVbXSBjdXJDb21wYXJlTW9kdWxlID0gKChDaGlsZE1vZHVsZU1hcEtleSkgb2JqKS5tb2R1bGVUcmVlOwotCQkJaWYgKGN1ckNvbXBhcmVNb2R1bGUgPT0gbW9kdWxlVHJlZSkgewotCQkJCS8vIHRoZSBtb2R1bGUgdHJlZSBpcyB0aGUgc2FtZQotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChtb2R1bGVUcmVlID09IG51bGwgfHwgY3VyQ29tcGFyZU1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZVRyZWUubGVuZ3RoICE9IGN1ckNvbXBhcmVNb2R1bGUubGVuZ3RoKXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGNvbXBhcmUgZWFjaCBtb2R1bGUKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN1ckNvbXBhcmVNb2R1bGUubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCFjdXJDb21wYXJlTW9kdWxlW2ldLmVxdWFscyhtb2R1bGVUcmVlW2ldKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJLy8gZm9yY2UgdGhlIHNhbWUgaGFzaCBjb2RlIG9uIGFsbCB0aGUgaW5zdGFuY2VzIHRvIG1ha2VzIHN1cmUgdGhlCi0JCQkvLyBlcXVhbHMoT2JqZWN0KSBtZXRob2QgaXMgYmVpbmcgdXNlZCBmb3IgY29tcGFyaW5nIHRoZSBvYmplY3RzCi0JCQlyZXR1cm4gMTIzNDU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgTW9kaWZ5TW9kdWxlc0NvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aXphcmQgYSB3aXphcmQKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdGhhdCBpcyBiZWluZyBhZGRlZAotCSAqLwotCXB1YmxpYyBNb2RpZnlNb2R1bGVzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkLCBJTW9kdWxlIG1vZHVsZSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy53aXphcmQgPSB3aXphcmQ7Ci0JCXJlcXVpcmVkTW9kdWxlID0gbW9kdWxlOwotCQkKLQkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpek1vZHVsZVRpdGxlKTsKLQkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLndpek1vZHVsZURlc2NyaXB0aW9uKTsKLQkJd2l6YXJkLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19XSVpCQU5fU0VMRUNUX1NFUlZFUikpOwotCQkKLQkJY3JlYXRlQ29udHJvbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBNb2RpZnlNb2R1bGVzQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgYSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpemFyZCBhIHdpemFyZAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0aGF0IGlzIGJlaW5nIGFkZGVkCi0JICogQHBhcmFtIHNob3dQdWJsaXNoT3B0aW9uIHNob3cgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucwotCSAqLwotCXB1YmxpYyBNb2RpZnlNb2R1bGVzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkLCBJTW9kdWxlIG1vZHVsZSwgYm9vbGVhbiBzaG93UHVibGlzaE9wdGlvbikgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy53aXphcmQgPSB3aXphcmQ7Ci0JCXJlcXVpcmVkTW9kdWxlID0gbW9kdWxlOwotCQl0aGlzLnNob3dQdWJsaXNoT3B0aW9uID0gc2hvd1B1Ymxpc2hPcHRpb247Ci0JCQotCQl3aXphcmQuc2V0VGl0bGUoTWVzc2FnZXMud2l6TW9kdWxlVGl0bGUpOwotCQl3aXphcmQuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMud2l6TW9kdWxlRGVzY3JpcHRpb24pOwotCQl3aXphcmQuc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1dJWkJBTl9TRUxFQ1RfU0VSVkVSKSk7Ci0JCQotCQljcmVhdGVDb250cm9sKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmVyKElTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlcikgewotCQkKLQkJLy8gc2VlIGJ1ZyAxODU4NzUsIDIwNTg2OQotCQlpZiAocmVmcmVzaE1vZHVsZXMgPT0gdGFza01vZGVsLmdldE9iamVjdChUQVNLX1JFRlJFU0hfTU9EVUxFUykgJiYgc2VydmVyID09IHRoaXMuc2VydmVyKSB7Ci0JCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJaWYgKHJ1bnRpbWUgPT0gc2VydmVyLmdldFJ1bnRpbWUoKSkgewotCQkJCWlmIChydW50aW1lID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAocnVudGltZSBpbnN0YW5jZW9mIElSdW50aW1lV29ya2luZ0NvcHkpIHsKLQkJCQkJSVJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBydW50aW1lOwotCQkJCQlpZiAod2MuaXNEaXJ0eSgpID09IHJ1bnRpbWVEaXJ0eSkKLQkJCQkJCXJldHVybjsKLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQlyZWZyZXNoTW9kdWxlcyA9IHRhc2tNb2RlbC5nZXRPYmplY3QoVEFTS19SRUZSRVNIX01PRFVMRVMpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJcnVudGltZSA9IG51bGw7Ci0JCWVsc2UKLQkJCXJ1bnRpbWUgPSBzZXJ2ZXIuZ2V0UnVudGltZSgpOwotCQlydW50aW1lRGlydHkgPSBmYWxzZTsKLQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkgewotCQkJaWYgKHJ1bnRpbWUgaW5zdGFuY2VvZiBJUnVudGltZVdvcmtpbmdDb3B5KSB7Ci0JCQkJSVJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBydW50aW1lOwotCQkJCWlmICh3Yy5pc0RpcnR5KCkpCi0JCQkJCXJ1bnRpbWVEaXJ0eSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCW9yaWdpbmFsTW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKLQkJZGVwbG95ZWQgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7Ci0JCW1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7Ci0JCQotCQljaGlsZE1vZHVsZU1hcCA9IG5ldyBIYXNoTWFwPENoaWxkTW9kdWxlTWFwS2V5LCBJTW9kdWxlW10+KCk7Ci0JCQotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlTeXN0ZW0uc2V0UHJvcGVydHkoIkoyRUVjYWNoZSIsICIiICsgTWF0aC5yYW5kb20oKSk7Ci0JCQotCQkvLyBnZXQgY3VycmVudGx5IGRlcGxveWVkIG1vZHVsZXMKLQkJSU1vZHVsZVtdIGN1cnJlbnRNb2R1bGVzID0gc2VydmVyLmdldE1vZHVsZXMoKTsKLQkJaWYgKChjdXJyZW50TW9kdWxlcyAhPSBudWxsKSAmJiAoY3VycmVudE1vZHVsZXMubGVuZ3RoID4gMCkpIHsKLQkJCWludCBzaXplID0gY3VycmVudE1vZHVsZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlvcmlnaW5hbE1vZHVsZXMuYWRkKGN1cnJlbnRNb2R1bGVzW2ldKTsKLQkJCQlkZXBsb3llZC5hZGQoY3VycmVudE1vZHVsZXNbaV0pOwotCQkJfQotCQl9Ci0JCQotCQkvLyBhZGQgbmV3IG1vZHVsZQotCQlyZXF1aXJlZE1vZHVsZXMgPSBudWxsOwotCQllcnJvck1hcCA9IG5ldyBIYXNoTWFwPElNb2R1bGUsIElTdGF0dXM+KCk7Ci0JCWlmIChyZXF1aXJlZE1vZHVsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlNb2R1bGVbXSBwYXJlbnRzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKHJlcXVpcmVkTW9kdWxlLCBudWxsKTsKLQkJCQlpZiAocGFyZW50cyAhPSBudWxsICYmIHBhcmVudHMubGVuZ3RoID4gMCkKLQkJCQkJcmVxdWlyZWRNb2R1bGVzID0gcGFyZW50czsKLQkJCQllbHNlCi0JCQkJCXJlcXVpcmVkTW9kdWxlcyA9IG5ldyBJTW9kdWxlW10geyByZXF1aXJlZE1vZHVsZSB9OwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCWlmIChUcmFjZS5JTkZPKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19JTkZPLCAiQSBwb3NzaWJsZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gZXJyb3IiLCBjZSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkNvdWxkIG5vdCBmaW5kIHJvb3QgbW9kdWxlIiwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXF1aXJlZE1vZHVsZXMgIT0gbnVsbCAmJiAhZGVwbG95ZWQuY29udGFpbnMocmVxdWlyZWRNb2R1bGVzWzBdKSkKLQkJCWRlcGxveWVkLmFkZChyZXF1aXJlZE1vZHVsZXNbMF0pOwotCQkKLQkJLy8gZ2V0IHJlbWFpbmluZyBtb2R1bGVzCi0JCUlNb2R1bGVbXSBtb2R1bGVzMiA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKSk7Ci0JCWlmIChtb2R1bGVzMiAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IG1vZHVsZXMyLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSU1vZHVsZSBtb2R1bGUgPSBtb2R1bGVzMltpXTsKLQkJCQlpZiAoIWRlcGxveWVkLmNvbnRhaW5zKG1vZHVsZSkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlNb2R1bGVbXSBwYXJlbnRzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKG1vZHVsZSwgbnVsbCk7Ci0JCQkJCQlpZiAocGFyZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJaW50IHNpemUyID0gcGFyZW50cy5sZW5ndGg7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCQkJCWlmIChwYXJlbnRzW2pdLmVxdWFscyhtb2R1bGUpKSB7Ci0JCQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IHNlcnZlci5jYW5Nb2RpZnlNb2R1bGVzKG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwgbnVsbCwgbnVsbCk7Ci0JCQkJCQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpCi0JCQkJCQkJCQkJZXJyb3JNYXAucHV0KG1vZHVsZSwgc3RhdHVzKTsKLQkJCQkJCQkJCW1vZHVsZXMuYWRkKG1vZHVsZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJCWVycm9yTWFwLnB1dChtb2R1bGUsIGNlLmdldFN0YXR1cygpKTsKLQkJCQkJCW1vZHVsZXMuYWRkKG1vZHVsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGJ1aWxkIGNoaWxkIG1hcAotCQlJdGVyYXRvciBpdGVyYXRvciA9IGRlcGxveWVkLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlNb2R1bGUgbW9kdWxlID0gKElNb2R1bGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXRyeSB7Ci0JCQkJSU1vZHVsZVtdIGNoaWxkcmVuID0gc2VydmVyLmdldENoaWxkTW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sIG51bGwpOwotCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApCi0JCQkJCWNoaWxkTW9kdWxlTWFwLnB1dChuZXcgQ2hpbGRNb2R1bGVNYXBLZXkobW9kdWxlKSwgY2hpbGRyZW4pOwotCQkJCUlTdGF0dXMgc3RhdHVzID0gc2VydmVyLmNhbk1vZGlmeU1vZHVsZXMobnVsbCwgbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBudWxsKTsKLQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpCi0JCQkJCWVycm9yTWFwLnB1dChtb2R1bGUsIHN0YXR1cyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JCQotCQlpdGVyYXRvciA9IG1vZHVsZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSU1vZHVsZSBtb2R1bGUgPSAoSU1vZHVsZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQlJTW9kdWxlW10gY2hpbGRyZW4gPSBzZXJ2ZXIuZ2V0Q2hpbGRNb2R1bGVzKG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwgbnVsbCk7Ci0JCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkKLQkJCQkJY2hpbGRNb2R1bGVNYXAucHV0KG5ldyBDaGlsZE1vZHVsZU1hcEtleShtb2R1bGUpLCBjaGlsZHJlbik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JCQotCQkvLyBnZXQgY2hpbGRyZW4gcmVjdXJzaXZlbHkgb25lIGxldmVsCi0JCS8vIHB1dCBjaGlsZCBlbGVtZW50cyBpbnRvIGEgZGlmZmVyZW50IGxpc3QgdG8gYXZvaWQgY29uY3VycmVudCBtb2RpZmljYXRpb25zCi0JCUl0ZXJhdG9yPENoaWxkTW9kdWxlTWFwS2V5PiBpdGVyYXRvcjIgPSBjaGlsZE1vZHVsZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlMaXN0PENoaWxkTW9kdWxlTWFwS2V5PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxDaGlsZE1vZHVsZU1hcEtleT4oKTsKLQkJd2hpbGUgKGl0ZXJhdG9yMi5oYXNOZXh0KCkpIHsKLQkJCWxpc3QuYWRkKGl0ZXJhdG9yMi5uZXh0KCkpOwotCQl9Ci0JCQotCQlpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQ2hpbGRNb2R1bGVNYXBLZXkga2V5ID0gKENoaWxkTW9kdWxlTWFwS2V5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlJTW9kdWxlW10gY2hpbGRyZW4wID0gY2hpbGRNb2R1bGVNYXAuZ2V0KGtleSk7Ci0JCQlpZiAoY2hpbGRyZW4wICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IGNoaWxkcmVuMC5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJaW50IHNpemUyID0ga2V5Lm1vZHVsZVRyZWUubGVuZ3RoOwotCQkJCQlJTW9kdWxlW10gbW9kdWxlMiA9IG5ldyBJTW9kdWxlW3NpemUyICsgMV07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoa2V5Lm1vZHVsZVRyZWUsIDAsIG1vZHVsZTIsIDAsIHNpemUyKTsKLQkJCQkJbW9kdWxlMltzaXplMl0gPSBjaGlsZHJlbjBbaV07Ci0JCQkJCQotCQkJCQl0cnkgewotCQkJCQkJSU1vZHVsZVtdIGNoaWxkcmVuID0gc2VydmVyLmdldENoaWxkTW9kdWxlcyhtb2R1bGUyLCBudWxsKTsKLQkJCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApCi0JCQkJCQkJY2hpbGRNb2R1bGVNYXAucHV0KG5ldyBDaGlsZE1vZHVsZU1hcEtleShtb2R1bGUyKSwgY2hpbGRyZW4pOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiSjJFRWNhY2hlIiwgIiIpOwotCQkKLQkJdXBkYXRlVGFza01vZGVsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIGIpIHsKLQkJaWYgKGIpIHsKLQkJCXRoaXMucmVmcmVzaCgpOwotCQl9Ci0JCXN1cGVyLnNldFZpc2libGUoYik7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCB0aGUgY29tcG9zaXRlCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKGF2YWlsYWJsZVRyZWVWaWV3ZXIgPT0gbnVsbCB8fCBhdmFpbGFibGVUcmVlVmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCXJldHVybjsKLQkJCQl0cnkgeyAvLyB1cGRhdGUgdHJlZXMgaWYgd2UgY2FuCi0JCQkJCWF2YWlsYWJsZVRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCQlkZXBsb3llZFRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCQlzZXRFbmFibGVtZW50KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VGFza01vZGVsKFRhc2tNb2RlbCBtb2RlbCkgewotCQl0aGlzLnRhc2tNb2RlbCA9IG1vZGVsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFVJIG9mIHRoZSBwYWdlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2woKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCXNldExheW91dChsYXlvdXQpOwotCQlzZXRGb250KGdldFBhcmVudCgpLmdldEZvbnQoKSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5NT0RJRllfTU9EVUxFU19DT01QT1NJVEUpOwotCQkKLQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotCQljb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfR1JBWSk7Ci0JCUZvbnREYXRhW10gZmQgPSBnZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKLQkJaW50IHNpemUyID0gZmQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUyOyBpKyspCi0JCQlmZFtpXS5zZXRTdHlsZShTV1QuSVRBTElDKTsKLQkJZm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZkKTsKLQkJYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWZvbnQuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy53aXpNb2R1bGVNZXNzYWdlKTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy53aXpNb2R1bGVBdmFpbGFibGVMaXN0KTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCgiIik7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMud2l6TW9kdWxlRGVwbG95ZWRMaXN0KTsKLQkJCi0JCVRyZWUgYXZhaWxhYmxlVHJlZSA9IG5ldyBUcmVlKHRoaXMsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDIwMDsKLQkJZGF0YS53aWR0aEhpbnQgPSAxNTA7Ci0JCWF2YWlsYWJsZVRyZWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWF2YWlsYWJsZVRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihhdmFpbGFibGVUcmVlKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCWxhYmVsUHJvdmlkZXIuYWRkTGlzdGVuZXIobmV3IElMYWJlbFByb3ZpZGVyTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0W10gb2JqID0gZXZlbnQuZ2V0RWxlbWVudHMoKTsKLQkJCQlpZiAob2JqID09IG51bGwpCi0JCQkJCWF2YWlsYWJsZVRyZWVWaWV3ZXIucmVmcmVzaCh0cnVlKTsKLQkJCQllbHNlIHsKLQkJCQkJb2JqID0gU2VydmVyVUlQbHVnaW4uYWRhcHRMYWJlbENoYW5nZU9iamVjdHMob2JqKTsKLQkJCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQkJCWF2YWlsYWJsZVRyZWVWaWV3ZXIucmVmcmVzaChvYmpbaV0sIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWF2YWlsYWJsZVRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJYXZhaWxhYmxlVHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEF2YWlsYWJsZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJYXZhaWxhYmxlVHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKG5ldyBWaWV3ZXJDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCQkJaWYgKGUxIGluc3RhbmNlb2YgTW9kdWxlU2VydmVyICYmIGUyIGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQkJCU1vZHVsZVNlcnZlciBzMSA9IChNb2R1bGVTZXJ2ZXIpIGUxOwotCQkJCQlNb2R1bGVTZXJ2ZXIgczIgPSAoTW9kdWxlU2VydmVyKSBlMjsKLQkJCQkJcmV0dXJuIChzMS5tb2R1bGVbczEubW9kdWxlLmxlbmd0aCAtIDFdLmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHMyLm1vZHVsZVtzMi5tb2R1bGUubGVuZ3RoIC0gMV0uZ2V0TmFtZSgpKSk7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKLQkJCX0KLQkJfSk7Ci0JCWF2YWlsYWJsZVRyZWVWaWV3ZXIuc2V0SW5wdXQoUk9PVCk7Ci0JCQotCQlhdmFpbGFibGVUcmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0RW5hYmxlbWVudCgpOwotCQkJfQotCQl9KTsKLQkJYXZhaWxhYmxlVHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFbmFibGVtZW50KCk7Ci0JCQkJaWYgKGFkZC5pc0VuYWJsZWQoKSkKLQkJCQkJYWRkKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBzbG9zaCBidXR0b25zCi0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMTIwOwotCQljb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSA1OwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMjU7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAyMDsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCWFkZCA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCQlhZGQuc2V0VGV4dChNZXNzYWdlcy53aXpNb2R1bGVBZGQpOwotCQlhZGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWFkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJYWRkKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZW1vdmUgPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQkJcmVtb3ZlLnNldFRleHQoTWVzc2FnZXMud2l6TW9kdWxlUmVtb3ZlKTsKLQkJcmVtb3ZlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZW1vdmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXJlbW92ZShmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCIiKTsKLQkJCi0JCWFkZEFsbCA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCQlhZGRBbGwuc2V0VGV4dChNZXNzYWdlcy53aXpNb2R1bGVBZGRBbGwpOwotCQlhZGRBbGwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWFkZEFsbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJYWRkKHRydWUpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJlbW92ZUFsbCA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCQlyZW1vdmVBbGwuc2V0VGV4dChNZXNzYWdlcy53aXpNb2R1bGVSZW1vdmVBbGwpOwotCQlyZW1vdmVBbGwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJlbW92ZUFsbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVtb3ZlKHRydWUpOwotCQkJfQotCQl9KTsKLQkJCi0JCVRyZWUgZGVwbG95ZWRUcmVlID0gbmV3IFRyZWUodGhpcywgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxNTA7Ci0JCWRlcGxveWVkVHJlZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJZGVwbG95ZWRUcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoZGVwbG95ZWRUcmVlKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb1VwZGF0ZUl0ZW0oV2lkZ2V0IHdpZGdldCwgT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gZnVsbE1hcCkgewotCQkJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBUcmVlSXRlbSAmJiBjb2xvciAhPSBudWxsKSB7Ci0JCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIHdpZGdldDsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCQkJCQlJTW9kdWxlIG0gPSBtcy5tb2R1bGVbbXMubW9kdWxlLmxlbmd0aC0xXTsKLQkJCQkJCWlmIChtLmlzRXh0ZXJuYWwoKSkKLQkJCQkJCQlpdGVtLnNldEZvcmVncm91bmQoY29sb3IpOwotCQkJCQkJZWxzZQotCQkJCQkJCWl0ZW0uc2V0Rm9yZWdyb3VuZChudWxsKTsKLQkJCQkJCWlmICghKHNlcnZlciBpbnN0YW5jZW9mIElTZXJ2ZXIpIHx8ICgoSVNlcnZlcilzZXJ2ZXIpLmdldE1vZHVsZVB1Ymxpc2hTdGF0ZShtcy5tb2R1bGUpICE9IElTZXJ2ZXIuUFVCTElTSF9TVEFURV9OT05FKQotCQkJCQkJCWl0ZW0uc2V0Rm9udChmb250KTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlpdGVtLnNldEZvbnQobnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc3VwZXIuZG9VcGRhdGVJdGVtKHdpZGdldCwgZWxlbWVudCwgZnVsbE1hcCk7Ci0JCQl9Ci0JCX07Ci0JCWxhYmVsUHJvdmlkZXIgPSBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpOwotCQlsYWJlbFByb3ZpZGVyLmFkZExpc3RlbmVyKG5ldyBJTGFiZWxQcm92aWRlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdFtdIG9iaiA9IGV2ZW50LmdldEVsZW1lbnRzKCk7Ci0JCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCQlkZXBsb3llZFRyZWVWaWV3ZXIucmVmcmVzaCh0cnVlKTsKLQkJCQllbHNlIHsKLQkJCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQkJCWRlcGxveWVkVHJlZVZpZXdlci5yZWZyZXNoKG9ialtpXSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJZGVwbG95ZWRUcmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWRlcGxveWVkVHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IERlcGxveWVkQ29udGVudFByb3ZpZGVyKCkpOwotCQlkZXBsb3llZFRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgVmlld2VyQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQkJCWlmIChlMSBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlciAmJiBlMiBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJCQlNb2R1bGVTZXJ2ZXIgczEgPSAoTW9kdWxlU2VydmVyKSBlMTsKLQkJCQkJTW9kdWxlU2VydmVyIHMyID0gKE1vZHVsZVNlcnZlcikgZTI7Ci0JCQkJCXJldHVybiAoczEubW9kdWxlW3MxLm1vZHVsZS5sZW5ndGggLSAxXS5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShzMi5tb2R1bGVbczIubW9kdWxlLmxlbmd0aCAtIDFdLmdldE5hbWUoKSkpOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7Ci0JCQl9Ci0JCX0pOwotCQlkZXBsb3llZFRyZWVWaWV3ZXIuc2V0SW5wdXQoUk9PVCk7Ci0JCQotCQlkZXBsb3llZFRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFbmFibGVtZW50KCk7Ci0JCQl9Ci0JCX0pOwotCQlkZXBsb3llZFRyZWVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0RW5hYmxlbWVudCgpOwotCQkJCWlmIChyZW1vdmUuaXNFbmFibGVkKCkpCi0JCQkJCXJlbW92ZShmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJaWYgKHNob3dQdWJsaXNoT3B0aW9uKSB7Ci0JCQlmaW5hbCBCdXR0b24gcHVibGlzaCA9IG5ldyBCdXR0b24odGhpcywgU1dULkNIRUNLKTsKLQkJCXB1Ymxpc2guc2V0VGV4dChNZXNzYWdlcy53aXpNb2R1bGVQdWJsaXNoSW1tZWRpYXRlbHkpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlwdWJsaXNoLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJCXB1Ymxpc2hJbW1lZGlhdGVseSA9IFNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuZ2V0UHVibGlzaE9uQWRkUmVtb3ZlTW9kdWxlKCk7Ci0JCQlwdWJsaXNoLnNldFNlbGVjdGlvbihwdWJsaXNoSW1tZWRpYXRlbHkpOwotCQkJcHVibGlzaC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlwdWJsaXNoSW1tZWRpYXRlbHkgPSBwdWJsaXNoLmdldFNlbGVjdGlvbigpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCQotCQlzZXRFbmFibGVtZW50KCk7Ci0JCWF2YWlsYWJsZVRyZWUuc2V0Rm9jdXMoKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIE1vZHVsZVNlcnZlcltdIGdldEF2YWlsYWJsZVNlbGVjdGlvbigpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBhdmFpbGFibGVUcmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsLmlzRW1wdHkoKSkKLQkJCXJldHVybiBuZXcgTW9kdWxlU2VydmVyWzBdOwotCQkJCi0JCU1vZHVsZVNlcnZlciBbXSAgbXNzID0gbmV3IE1vZHVsZVNlcnZlcltzZWwuc2l6ZSgpXTsKLQkJU3lzdGVtLmFycmF5Y29weShzZWwudG9BcnJheSgpLCAwLCBtc3MsIDAsIHNlbC5zaXplKCkpOwotCQlyZXR1cm4gbXNzOwotCX0KLQotCXByb3RlY3RlZCBNb2R1bGVTZXJ2ZXJbXSBnZXREZXBsb3llZFNlbGVjdGlvbigpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBkZXBsb3llZFRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWwuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG5ldyBNb2R1bGVTZXJ2ZXJbMF07Ci0JCQotCQlNb2R1bGVTZXJ2ZXIgW10gIG1zcyA9IG5ldyBNb2R1bGVTZXJ2ZXJbc2VsLnNpemUoKV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoc2VsLnRvQXJyYXkoKSwgMCwgbXNzLCAwLCBzZWwuc2l6ZSgpKTsKLQkJcmV0dXJuIG1zczsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGUgZ2V0TW9kdWxlKE1vZHVsZVNlcnZlciBtcykgewotCQlpZiAobXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kdWxlW10gbW9kdWxlczIgPSBtcy5tb2R1bGU7Ci0JCXJldHVybiBtb2R1bGVzMlttb2R1bGVzMi5sZW5ndGggLSAxXTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKE1vZHVsZVNlcnZlcltdIG1zKSB7Ci0JCWlmIChtcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2R1bGVbXSBtb2R1bGVzMiA9IG5ldyBJTW9kdWxlW21zLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbXMubGVuZ3RoOyBpKyspCi0JCQltb2R1bGVzMltpXSA9IGdldE1vZHVsZShtc1tpXSk7Ci0JCQotCQlyZXR1cm4gbW9kdWxlczI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5hYmxlbWVudCgpIHsKLQkJd2l6YXJkLnNldE1lc3NhZ2UobnVsbCwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKLQkJCi0JCWludCBjb3VudCA9IDA7Ci0JCWlmIChyZXF1aXJlZE1vZHVsZXMgIT0gbnVsbCkgewotCQkJLy8gY291bnQgaG93IG1hbnkgb2YgcmVxdWlyZWRNb2R1bGVzIGFyZSBkZXBsb3llZAotCQkJaW50IHNpemUgPSByZXF1aXJlZE1vZHVsZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoZGVwbG95ZWQuY29udGFpbnMocmVxdWlyZWRNb2R1bGVzW2ldKSkKLQkJCQkJY291bnQrKzsKLQkJCX0KLQkJfQotCQkKLQkJLy8gZ2l2ZSBlcnJvciBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBwb3NzaWJsZSByZXF1aXJlZCBtb2R1bGVzIGFuZCBub25lIGFyZQotCQkvLyBhZGRlZCB0byB0aGUgc2VydmVyCi0JCWlzQ29tcGxldGUgPSB0cnVlOwotCQlpZiAocmVxdWlyZWRNb2R1bGVzICE9IG51bGwgJiYgcmVxdWlyZWRNb2R1bGVzLmxlbmd0aCA+IDEgJiYgY291bnQgPT0gMCkgewotCQkJU3RyaW5nIHMgPSAiIjsKLQkJCWludCBzaXplID0gcmVxdWlyZWRNb2R1bGVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKGkgPiAwKQotCQkJCQlzICs9ICIgfCAiOwotCQkJCXMgKz0gcmVxdWlyZWRNb2R1bGVzW2ldLmdldE5hbWUoKTsKLQkJCX0KLQkJCXdpemFyZC5zZXRNZXNzYWdlKE5MUy5iaW5kKE1lc3NhZ2VzLndpek1vZHVsZVJlcXVpcmVkTW9kdWxlcywgcyksIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJaXNDb21wbGV0ZSA9IGZhbHNlOwotCQl9Ci0JCQotCQkvLyBzZWxlY3Rpb24gc3BlY2lmaWMgbWVzc2FnZXMKLQkJTW9kdWxlU2VydmVyW10gbXMgPSBnZXRBdmFpbGFibGVTZWxlY3Rpb24oKTsKLQkJaWYgKG1zID09IG51bGwgfHwgIG1zLmxlbmd0aCA9PSAwKSB7Ci0JCQlhZGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlib29sZWFuIGVuYWJsZWQgPSBmYWxzZTsKLQkJCS8vIGl0ZXJhdGUgdGhyb3VnaCBzZWxlY3Rpb24sIGlmIHdlIGZpbmQgYXQgbGVhc3QgT05FIG1vZHVsZSB0aGF0IGNhbid0IGJlIGFkZGVkLCBleGl0IHRoZSBsb29wCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSU1vZHVsZSBtb2R1bGUgPSBnZXRNb2R1bGUobXNbaV0pOwotCQkJCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBlcnJvck1hcC5nZXQobW9kdWxlKTsKLQkJCQkJCWlmIChtb2R1bGVzLmNvbnRhaW5zKG1vZHVsZSkpIHsKLQkJCQkJCQlpZiAoc3RhdHVzID09IG51bGwgKQotCQkJCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCQkJCQllbHNlIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJCQkJCS8vIHRoaXMgbW9kdWxlIGNhbid0IGJlIGFkZGVkIGJlY2F1c2UgaGFzIGVycm9ycywgZXhpdCB0aGUgbG9vcAotCQkJCQkJCQllbmFibGVkID0gZmFsc2U7Ci0JCQkJCQkJCXdpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9IGVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORyl7Ci0JCQkJCQkJCWVuYWJsZWQgPSB0cnVlOwotCQkJCQkJCQl3aXphcmQuc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLklORk8pewotCQkJCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCQkJCQkJd2l6YXJkLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZXsKLQkJCQkJCQkvLyBhdCBsZWFzdCBPTkUgbW9kdWxlIGZyb20gdGhlIHNlbGVjdGlvbiBjYW4ndCBiZSBhZGRlZCwgZXhpdCB0aGUgbG9vcCAgIAotCQkJCQkJCWVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWlmIChUcmFjZS5JTkZPKSB7Ci0JCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX0lORk8sICJVbmFibGUgdG8gaGFuZGxlIGVycm9yIG1hcCBmb3IgbW9kdWxlOiIgKyBtb2R1bGUpOwotCQkJCQkJfSAKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWFkZC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JCWFkZEFsbC5zZXRFbmFibGVkKG1vZHVsZXMuc2l6ZSgpID4gMCk7Ci0JCQotCQltcyA9IGdldERlcGxveWVkU2VsZWN0aW9uKCk7Ci0JCWlmIChtcyA9PSBudWxsIHx8ICBtcy5sZW5ndGggPT0gMCkgewotCQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCQkvLyBpdGVyYXRlIHRocm91Z2ggc2VsZWN0aW9uLCBpZiB3ZSBmaW5kIGF0IGxlYXN0IE9ORSBtb2R1bGUgdGhhdCBjYW4ndCBiZSByZW1vdmVkLCBleGl0IHRoZSBsb29wCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSU1vZHVsZSBtb2R1bGUgPSBnZXRNb2R1bGUobXNbaV0pOwotCQkJCWlmIChtb2R1bGUgIT0gbnVsbCAmJiBkZXBsb3llZC5jb250YWlucyhtb2R1bGUpKSB7Ci0JCQkJCS8vIHByb3ZpZGUgZXJyb3IgYWJvdXQgcmVtb3ZpbmcgcmVxdWlyZWQgc2luZ2xlIG1vZHVsZQotCQkJCQkvLyByZXF1aXJlZCBtb2R1bGVzIGNhbid0IGJlIHJlbW92ZWQKLQkJCQkJaWYgKHJlcXVpcmVkTW9kdWxlcyAhPSBudWxsICl7Ci0JCQkJCQlpZiAocmVxdWlyZWRNb2R1bGVzLmxlbmd0aCA9PSAxICYmIHJlcXVpcmVkTW9kdWxlc1swXS5lcXVhbHMobW9kdWxlKSkgewotCQkJCQkJCS8vIHRoaXMgaXMgYSByZXF1aXJlZCBtb2R1bGUgYW5kIGNhbid0IGJlIHJlbW92ZWQsIGV4aXQgdGhlIGxvb3AKLQkJCQkJCQl3aXphcmQuc2V0TWVzc2FnZShOTFMuYmluZChNZXNzYWdlcy53aXpNb2R1bGVSZXF1aXJlZE1vZHVsZSwgbW9kdWxlLmdldE5hbWUoKSksIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJCQkJCWVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWVuYWJsZWQgPSB0cnVlOwotCQkJCQl9IGVsc2UgaWYoIGVycm9yTWFwLmNvbnRhaW5zS2V5KG1vZHVsZSkpewotCQkJCQkJLy8gdGhpcyBpcyBhIHJlcXVpcmVkIG1vZHVsZSBhbmQgY2FuJ3QgYmUgcmVtb3ZlZCwgZXhpdCB0aGUgbG9vcAotCQkJCQkJd2l6YXJkLnNldE1lc3NhZ2UoZXJyb3JNYXAuZ2V0KG1vZHVsZSkuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKLQkJCQkJCWVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UgCi0JCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZXsKLQkJCQkJLy8gdGhpcyBtb2R1bGUgaXMgbm90IGZvdW5kIGluIHRoZSAnZGVwbG95ZWQnIGFycmF5LCB0aGUgbW9kdWxlIG1pZ2h0IGJlIGEgY2hpbGQKLQkJCQkJLy8gYXQgbGVhc3QgT05FIG1vZHVsZSBmcm9tIHRoZSBzZWxlY3Rpb24gY2FuJ3QgYmUgcmVtb3ZlZCwgZXhpdCB0aGUgbG9vcAotCQkJCQllbmFibGVkID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXJlbW92ZS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JCi0JCWlmIChyZXF1aXJlZE1vZHVsZXMgPT0gbnVsbCkKLQkJCXJlbW92ZUFsbC5zZXRFbmFibGVkKGRlcGxveWVkLnNpemUoKSA+IDApOwotCQllbHNlCi0JCQlyZW1vdmVBbGwuc2V0RW5hYmxlZChkZXBsb3llZC5zaXplKCkgPiAxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGQoYm9vbGVhbiBhbGwpIHsKLQkJaWYgKGFsbCkgewotCQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gbmV3IElNb2R1bGVbbW9kdWxlcy5zaXplKCldOwotCQkJbW9kdWxlcy50b0FycmF5KG1vZHVsZXMyKTsKLQkJCW1vdmVBbGwobW9kdWxlczIsIHRydWUpOwotCQl9IGVsc2UKLQkJCW1vdmVBbGwoZ2V0TW9kdWxlcyhnZXRBdmFpbGFibGVTZWxlY3Rpb24oKSksIHRydWUpOwotCQl1cGRhdGVUYXNrTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoYm9vbGVhbiBhbGwpIHsKLQkJaWYgKGFsbCkgewotCQkJLy8gcGljayBvbmUgb2YgdGhlIHJlcXVpcmVkIG1vZHVsZXMgdG8ga2VlcAotCQkJSU1vZHVsZSBrZWVwID0gbnVsbDsKLQkJCWlmIChyZXF1aXJlZE1vZHVsZXMgIT0gbnVsbCkgewotCQkJCWludCBzaXplMiA9IHJlcXVpcmVkTW9kdWxlcy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKSB7Ci0JCQkJCWlmIChrZWVwID09IG51bGwgJiYgZGVwbG95ZWQuY29udGFpbnMocmVxdWlyZWRNb2R1bGVzW2ldKSkKLQkJCQkJCWtlZXAgPSByZXF1aXJlZE1vZHVsZXNbaV07Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlMaXN0PElNb2R1bGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7Ci0JCQlsaXN0LmFkZEFsbChkZXBsb3llZCk7Ci0JCQlsaXN0LnJlbW92ZShrZWVwKTsKLQkJCQotCQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gbmV3IElNb2R1bGVbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KG1vZHVsZXMyKTsKLQkJCQotCQkJbW92ZUFsbChtb2R1bGVzMiwgZmFsc2UpOwotCQl9IGVsc2UKLQkJCW1vdmVBbGwoZ2V0TW9kdWxlcyhnZXREZXBsb3llZFNlbGVjdGlvbigpKSwgZmFsc2UpOwotCQl1cGRhdGVUYXNrTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlQWxsKElNb2R1bGVbXSBtb2RzLCBib29sZWFuIGFkZDIpIHsKLQkJaW50IHNpemUgPSBtb2RzLmxlbmd0aDsKLQkJTGlzdDxJTW9kdWxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBlcnJvck1hcC5nZXQobW9kc1tpXSk7Ci0JCQkKLQkJCWlmIChzdGF0dXMgPT0gbnVsbCAmJiAhbGlzdC5jb250YWlucyhtb2RzW2ldKSkKLQkJCQlsaXN0LmFkZChtb2RzW2ldKTsKLQkJfQotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlNb2R1bGUgbW9kdWxlID0gKElNb2R1bGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCU1vZHVsZVNlcnZlciBtcyA9IG5ldyBNb2R1bGVTZXJ2ZXIobnVsbCwgbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9KTsKLQkJCWlmIChhZGQyKSB7Ci0JCQkJbW9kdWxlcy5yZW1vdmUobW9kdWxlKTsKLQkJCQlkZXBsb3llZC5hZGQobW9kdWxlKTsKLQkJCQlhdmFpbGFibGVUcmVlVmlld2VyLnJlbW92ZShtcyk7Ci0JCQkJZGVwbG95ZWRUcmVlVmlld2VyLmFkZChST09ULCBtcyk7Ci0JCQl9IGVsc2UgewotCQkJCW1vZHVsZXMuYWRkKG1vZHVsZSk7Ci0JCQkJZGVwbG95ZWQucmVtb3ZlKG1vZHVsZSk7Ci0JCQkJYXZhaWxhYmxlVHJlZVZpZXdlci5hZGQoUk9PVCwgbXMpOwotCQkJCWRlcGxveWVkVHJlZVZpZXdlci5yZW1vdmUobXMpOwotCQkJfQotCQl9Ci0KLQkJc2V0RW5hYmxlbWVudCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRhc2tNb2RlbCgpIHsKLQkJaWYgKHRhc2tNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfTU9EVUxFUywgZ2V0TW9kdWxlTWFwKCkpOwotCQl3aXphcmQudXBkYXRlKCk7Ci0JfQotCi0JcHVibGljIExpc3Q8SU1vZHVsZT4gZ2V0TW9kdWxlc1RvUmVtb3ZlKCkgewotCQlMaXN0PElNb2R1bGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gb3JpZ2luYWxNb2R1bGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlNb2R1bGUgbW9kdWxlID0gKElNb2R1bGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICghZGVwbG95ZWQuY29udGFpbnMobW9kdWxlKSkKLQkJCQlsaXN0LmFkZChtb2R1bGUpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyBMaXN0PElNb2R1bGU+IGdldE1vZHVsZXNUb0FkZCgpIHsKLQkJTGlzdDxJTW9kdWxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGRlcGxveWVkLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlNb2R1bGUgbW9kdWxlID0gKElNb2R1bGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICghb3JpZ2luYWxNb2R1bGVzLmNvbnRhaW5zKG1vZHVsZSkpCi0JCQkJbGlzdC5hZGQobW9kdWxlKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZENoaWxkTWFwKExpc3Q8SU1vZHVsZVtdPiBtYXAsIElNb2R1bGVbXSBwYXJlbnRzLCBJTW9kdWxlW10gY2hpbGRyZW4pIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlNb2R1bGUgbW9kdWxlID0gY2hpbGRyZW5baV07Ci0JCQkKLQkJCWludCBzaXplMiA9IHBhcmVudHMubGVuZ3RoOwotCQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gbmV3IElNb2R1bGVbc2l6ZTIgKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocGFyZW50cywgMCwgbW9kdWxlczIsIDAsIHNpemUyKTsKLQkJCW1vZHVsZXMyW3NpemUyXSA9IG1vZHVsZTsKLQkJCW1hcC5hZGQobW9kdWxlczIpOwotCQkJCi0JCQlJTW9kdWxlW10gY2hpbGRyZW4yID0gY2hpbGRNb2R1bGVNYXAuZ2V0KG5ldyBDaGlsZE1vZHVsZU1hcEtleShtb2R1bGUpKTsKLQkJCWlmIChjaGlsZHJlbjIgIT0gbnVsbCkKLQkJCQlhZGRDaGlsZE1hcChtYXAsIG1vZHVsZXMyLCBjaGlsZHJlbjIpOwotCQl9Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TW9kdWxlTWFwKCkgewotCQlmaW5hbCBMaXN0PElNb2R1bGVbXT4gbWFwID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlW10+KCk7Ci0JCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVwbG95ZWQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSU1vZHVsZSBtb2R1bGUgPSAoSU1vZHVsZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJSU1vZHVsZVtdIG1vZHVsZVRyZWUgPSBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH07Ci0JCQltYXAuYWRkKG1vZHVsZVRyZWUpOwotCQkJSU1vZHVsZVtdIGNoaWxkcmVuID0gY2hpbGRNb2R1bGVNYXAuZ2V0KG5ldyBDaGlsZE1vZHVsZU1hcEtleShtb2R1bGUpKTsKLQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKQotCQkJCWFkZENoaWxkTWFwKG1hcCwgbW9kdWxlVHJlZSwgY2hpbGRyZW4pOwotCQl9Ci0JCQotCQlyZXR1cm4gbWFwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCXJldHVybiBpc0NvbXBsZXRlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFB1Ymxpc2hJbW1lZGlhdGVseSgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hJbW1lZGlhdGVseTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTmV3RGV0ZWN0U2VydmVyQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdEZXRlY3RTZXJ2ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkZGRhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdEZXRlY3RTZXJ2ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuQmFzZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHVzZWQgdG8gZGV0ZWN0IGEgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgTmV3RGV0ZWN0U2VydmVyQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGhvc3Q7Ci0JCi0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIElTZXJ2ZXJTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjsKLQkKLQlwcm90ZWN0ZWQgTGlzdCBzZXJ2ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByb3RlY3RlZCBCdXR0b24gZGV0ZWN0OwotCXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0JcHJvdGVjdGVkIExhYmVsIGhvc3RMYWJlbDsKLQotCXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlclNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgc2VydmVyU2VsZWN0ZWQoSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyKTsKLQl9Ci0JCi0JcHVibGljIGNsYXNzIFNlcnZlckNvbnRlbnRQcm92aWRlciBleHRlbmRzIEJhc2VDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJcmV0dXJuIHNlcnZlcnMudG9BcnJheSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBjbGFzcyBTZXJ2ZXJMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIyKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCUlTZXJ2ZXIgc2VydmVyMiA9IChJU2VydmVyKSBlbGVtZW50OwotCQkJaWYgKGNvbHVtbkluZGV4ID09IDApCi0JCQkJcmV0dXJuIHNlcnZlcjIuZ2V0TmFtZSgpOwotCQkJZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMCkKLQkJCQlyZXR1cm4gIm4vYSI7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyMikgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IE5ld0RldGVjdFNlcnZlckNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBsaXN0ZW5lcjIgYSBzZXJ2ZXIgc2VsZWN0aW9uIGxpc3RlbmVyCi0JICovCi0JcHVibGljIE5ld0RldGVjdFNlcnZlckNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJU2VydmVyU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIyKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXIyOwotCi0JCWNyZWF0ZUNvbnRyb2woKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUhlYWRpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHNwYW4pIHsKLQkJTGFiZWwgbGFiZWwgPSBjcmVhdGVMYWJlbChwYXJlbnQsIHRleHQsIHNwYW4sIHRydWUsIGZhbHNlKTsKLQkJbGFiZWwuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRCYW5uZXJGb250KCkpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHNwYW4sIGJvb2xlYW4gYWxpZ25Ub3AsIGJvb2xlYW4gaW5kZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCWlmIChhbGlnblRvcCkKLQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlpZiAoaW5kZW50KQotCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBVSSBvZiB0aGUgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHModGhpcywgNCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCS8vV29ya2JlbmNoSGVscC5zZXRIZWxwKHRoaXMsIENvbnRleHRJZHMuU0VMRUNUX0NMSUVOVF9XSVpBUkQpOwotCQotCQljcmVhdGVIZWFkaW5nTGFiZWwodGhpcywgIlNlbGVjdCB0aGUgU2VydmVyIiwgMik7Ci0JCQotCQl0YWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULlNJTkdMRSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDYwOwotCQlkYXRhLndpZHRoSGludCA9IDUwOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIDEwMCwgdHJ1ZSkpOwotCQlUYWJsZUNvbHVtbiBjb2wgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sLnNldFRleHQoIlNlcnZlciIpOwotCQkKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg0MCwgODAsIHRydWUpKTsKLQkJVGFibGVDb2x1bW4gY29sMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2wyLnNldFRleHQoIlN0YXR1cyIpOwotCQkKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkJCi0JCXRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBTZXJ2ZXJDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFNlcnZlckxhYmVsUHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdIHsibmFtZSIsICJzdGF0dXMifSk7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KCJyb290Iik7Ci0JCQotCQlTdHJpbmcgZGF0ZSA9ICI8bm93PiI7Ci0JCWhvc3RMYWJlbCA9IGNyZWF0ZUxhYmVsKHRoaXMsICJMYXN0IGRldGVjdGVkIHNlcnZlcnMgb24gIiArIGhvc3QgKyAiIGF0ICIgKyBkYXRlICsgIjoiLCAxLCBmYWxzZSwgdHJ1ZSk7Ci0JCQotCQlkZXRlY3QgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbih0aGlzLCAiUmVmcmVzaCIpOwotCQlkZXRlY3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWRhdGEgPSAoR3JpZERhdGEpIGRldGVjdC5nZXRMYXlvdXREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EOwotCi0JCS8vIGxpc3RlbmVycwotCQlkZXRlY3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9KTsKLQotCQl0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJT2JqZWN0IG9iaiA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlJU2VydmVyV29ya2luZ0NvcHkgbmV3U2VydmVyID0gbnVsbDsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcldvcmtpbmdDb3B5KQotCQkJCQluZXdTZXJ2ZXIgPSAoSVNlcnZlcldvcmtpbmdDb3B5KSBvYmo7Ci0JCQkJCi0JCQkJaWYgKChuZXdTZXJ2ZXIgPT0gbnVsbCAmJiBzZXJ2ZXIgIT0gbnVsbCkgfHwgKG5ld1NlcnZlciAhPSBudWxsICYmICFuZXdTZXJ2ZXIuZXF1YWxzKHNlcnZlcikpKSB7Ci0JCQkJCXNlcnZlciA9IG5ld1NlcnZlcjsKLQkJCQkJbGlzdGVuZXIuc2VydmVyU2VsZWN0ZWQoc2VydmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2V0SG9zdChudWxsKTsKLQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7Ci0JCXJldHVybiBob3N0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKLQkJdGhpcy5ob3N0ID0gaG9zdDsKLQkJc2VydmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQlpZiAoaG9zdCAhPSBudWxsKSB7Ci0JCQlob3N0TGFiZWwuc2V0VGV4dCgiRGV0ZWN0ZWQgc2VydmVycyBvbiAiICsgaG9zdCArICI6Iik7Ci0JCQlkZXRlY3Quc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXRhYmxlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlob3N0TGFiZWwuc2V0VGV4dCgiTm8gaG9zdCBzZWxlY3RlZCIpOwotCQkJZGV0ZWN0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJdGFibGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGdldFNlcnZlcigpIHsKLQkJcmV0dXJuIHNlcnZlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTmV3TWFudWFsU2VydmVyQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdNYW51YWxTZXJ2ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFjMGRhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdNYW51YWxTZXJ2ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7Ci0KLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Ub29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuU29ja2V0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLkFic3RyYWN0VUlDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuQWJzdHJhY3RVSUNvbnRyb2wuSVVJQ29udHJvbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuQWJzdHJhY3RVSUNvbnRyb2wuVUlDb250cm9sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5TZXJ2ZXJUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLlRhc2tXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuV2l6YXJkVGFza1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZS5Ib3N0bmFtZUNvbXBvc2l0ZS5JSG9zdG5hbWVTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5TZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci0KLS8qKgotICogV2l6YXJkIHBhZ2UgdXNlZCB0byBjcmVhdGUgYSBzZXJ2ZXIgYW5kIGNvbmZpZ3VyYXRpb24gYXQgdGhlIHNhbWUgdGltZS4KLSAqLwotcHVibGljIGNsYXNzIE5ld01hbnVhbFNlcnZlckNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIElVSUNvbnRyb2xMaXN0ZW5lciB7Ci0JcHVibGljIGludGVyZmFjZSBTZXJ2ZXJTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHNlcnZlclNlbGVjdGVkKElTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlcik7Ci0JCXB1YmxpYyB2b2lkIHJ1bnRpbWVTZWxlY3RlZChJUnVudGltZSBydW50aW1lKTsKLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIElXaXphcmRIYW5kbGUyIHsKLQkJcHVibGljIHZvaWQgcnVuKGJvb2xlYW4gZm9yaywgYm9vbGVhbiBjYW5jZWxhYmxlLCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQkJcHVibGljIHZvaWQgdXBkYXRlKCk7Ci0JCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2UsIGludCBuZXdUeXBlKTsKLQl9Ci0JcHJvdGVjdGVkIElXaXphcmRIYW5kbGUyIHdpemFyZDsKLQotCXByb3RlY3RlZCBTZXJ2ZXJUeXBlQ29tcG9zaXRlIHNlcnZlclR5cGVDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgcnVudGltZUxhYmVsOwotCXByb3RlY3RlZCBDb21ibyBydW50aW1lQ29tYm87Ci0JcHJvdGVjdGVkIExpbmsgY29uZmlndXJlUnVudGltZXM7Ci0JcHJvdGVjdGVkIExpbmsgYWRkUnVudGltZTsKLQlwcm90ZWN0ZWQgSVJ1bnRpbWVbXSBydW50aW1lczsKLQlwcm90ZWN0ZWQgSVJ1bnRpbWUgbmV3UnVudGltZTsKLQotCXByb3RlY3RlZCBUZXh0IHNlcnZlck5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U2VydmVyTmFtZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXJ2ZXJOYW1lTW9kaWZpZWQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRpbmdTZXJ2ZXJOYW1lOwotCXByb3RlY3RlZCBUb29sQmFyTWFuYWdlciBzZXJ2ZXJOYW1lVG9vbEJhcjsKLQotCXByb3RlY3RlZCBJUnVudGltZSBydW50aW1lOwotCXByb3RlY3RlZCBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyOwotCXByb3RlY3RlZCBTZXJ2ZXJTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBTdHJpbmcgaG9zdDsKLQotCXByb3RlY3RlZCBJTW9kdWxlVHlwZSBtb2R1bGVUeXBlOwotCXByb3RlY3RlZCBJTW9kdWxlIG1vZHVsZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZlclR5cGVJZDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbmNsdWRlSW5jb21wYXRpYmxlOwotCQotCXByb3RlY3RlZCBIb3N0bmFtZUNvbXBvc2l0ZSBtYW51YWxIb3N0Q29tcDsKLQlJSG9zdG5hbWVTZWxlY3Rpb25MaXN0ZW5lciBob3N0bmFtZUxpc3RlbmVyOwotCXByb3RlY3RlZCBMYWJlbCBob3N0bmFtZUxhYmVsOwotCXByb3RlY3RlZCBUZXh0IGhvc3RuYW1lOwotCXByb3RlY3RlZCBDb250cm9sRGVjb3JhdGlvbiBob3N0bmFtZURlY29yYXRpb247Ci0KLQlwcm90ZWN0ZWQgU2VydmVyQ3JlYXRpb25DYWNoZSBjYWNoZSA9IG5ldyBTZXJ2ZXJDcmVhdGlvbkNhY2hlKCk7Ci0JCi0JcHJpdmF0ZSBJU2VydmVyVHlwZSBvbGRTZXJ2ZXJUeXBlOwotCQotCUhvc3RuYW1lQ2hhbmdlZEFjdGlvbiBob3N0bmFtZUNoYW5nZUFjdGlvbjsKLQlUaW1lciB0aW1lciA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNhblN1cHBvcnRNb2R1bGU9dHJ1ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2VydmVyIGFuZCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4gIElmIHRoZSBpbml0aWFsCi0JICogcmVzb3VyY2Ugc2VsZWN0aW9uIGNvbnRhaW5zIGV4YWN0bHkgb25lIGNvbnRhaW5lciByZXNvdXJjZSB0aGVuIGl0IHdpbGwgYmUKLQkgKiB1c2VkIGFzIHRoZSBkZWZhdWx0IGNvbnRhaW5lciByZXNvdXJjZS4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgYSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpemFyZCBhIHdpemFyZCBoYW5kbGUKLQkgKiBAcGFyYW0gbW9kdWxlVHlwZSBhIG1vZHVsZSB0eXBlCi0JICogQHBhcmFtIG1vZHVsZSBhbiBvcHRpb25hbCBtb2R1bGUKLQkgKiBAcGFyYW0gc2VydmVyVHlwZUlkIGEgc2VydmVyIHR5cGUgaWQsIG9yIG51bGwKLQkgKiBAcGFyYW0gaW5jbHVkZUluY29tcGF0aWJsZSB0cnVlIHRvIGluY2x1ZGUgaW5jb21wYXRpYmxlIHNlcnZlcnMgdGhhdCBzdXBwb3J0IHNpbWlsYXIgbW9kdWxlIHR5cGVzCi0JICogQHBhcmFtIGxpc3RlbmVyIGEgc2VydmVyIHNlbGVjdGlvbiBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBOZXdNYW51YWxTZXJ2ZXJDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZTIgd2l6YXJkLCBJTW9kdWxlVHlwZSBtb2R1bGVUeXBlLCBJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIHNlcnZlclR5cGVJZCwgYm9vbGVhbiBpbmNsdWRlSW5jb21wYXRpYmxlLCBTZXJ2ZXJTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy53aXphcmQgPSB3aXphcmQ7Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQkJCi0JCXRoaXMubW9kdWxlVHlwZSA9IG1vZHVsZVR5cGU7Ci0JCXRoaXMubW9kdWxlID0gbW9kdWxlOwotCQl0aGlzLnNlcnZlclR5cGVJZCA9IHNlcnZlclR5cGVJZDsKLQkJdGhpcy5pbmNsdWRlSW5jb21wYXRpYmxlID0gaW5jbHVkZUluY29tcGF0aWJsZTsKLQkJCi0JCWNyZWF0ZUNvbnRyb2woKTsKLQkJd2l6YXJkLnNldE1lc3NhZ2UoIiIsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIHBhZ2UncyBpbml0aWFsIHZpc3VhbCBjb21wb25lbnRzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2woKSB7Ci0JCS8vIHRvcCBsZXZlbCBncm91cAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJdGhpcy5zZXRGb250KGdldFBhcmVudCgpLmdldEZvbnQoKSk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscCh0aGlzLCBDb250ZXh0SWRzLk5FV19TRVJWRVJfV0laQVJEKTsKLQkJCi0JCUxpc3Q8U2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9uPiBwYWdlRXh0ZW5zaW9uTHN0ID0gU2VydmVyVUlQbHVnaW4uZ2V0U2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9ucygpOwotCQkvLyBBZGQgdGhlIHBhZ2UgbW9kaWZpZXIgdG9wIHNlY3Rpb24gVUkuIAotCQlmb3IgKFNlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbiBjdXJQYWdlRXh0ZW5zaW9uIDogcGFnZUV4dGVuc2lvbkxzdCkgewotCQkJY3VyUGFnZUV4dGVuc2lvbi5jcmVhdGVDb250cm9sKFNlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbi5VSV9QT1NJVElPTi5UT1AsIHRoaXMpOwotCQkJY3VyUGFnZUV4dGVuc2lvbi5zZXRVSUNvbnRyb2xMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQkKLQkJc2VydmVyVHlwZUNvbXBvc2l0ZSA9IG5ldyBTZXJ2ZXJUeXBlQ29tcG9zaXRlKHRoaXMsIG1vZHVsZVR5cGUsIHNlcnZlclR5cGVJZCwgbmV3IFNlcnZlclR5cGVDb21wb3NpdGUuU2VydmVyVHlwZVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VydmVyVHlwZVNlbGVjdGVkKElTZXJ2ZXJUeXBlIHR5cGUyKSB7Ci0JCQkJaGFuZGxlVHlwZVNlbGVjdGlvbih0eXBlMik7Ci0JCQkJLy9XaXphcmRVdGlsLmRlZmF1bHRTZWxlY3QocGFyZW50LCBDcmVhdGVTZXJ2ZXJXaXphcmRQYWdlLnRoaXMpOwotCQkJfQotCQl9KTsKLQkJc2VydmVyVHlwZUNvbXBvc2l0ZS5zZXRJbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMoaW5jbHVkZUluY29tcGF0aWJsZSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlzZXJ2ZXJUeXBlQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXdocy5zZXRIZWxwKHNlcnZlclR5cGVDb21wb3NpdGUsIENvbnRleHRJZHMuTkVXX1NFUlZFUl9UWVBFKTsKLQkJCi0JCS8vIEFkZCB0aGUgcGFnZSBtb2RpZmllciBtaWRkbGUgc2VjdGlvbiBVSS4gCi0JCWZvciAoU2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9uIGN1clBhZ2VFeHRlbnNpb24gOiBwYWdlRXh0ZW5zaW9uTHN0KSB7Ci0JCQljdXJQYWdlRXh0ZW5zaW9uLmNyZWF0ZUNvbnRyb2woU2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9uLlVJX1BPU0lUSU9OLk1JRERMRSwgdGhpcyk7Ci0JCX0KLQkJCi0JCWhvc3RuYW1lTGlzdGVuZXIgPSAJbmV3IElIb3N0bmFtZVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaG9zdG5hbWVTZWxlY3RlZChTdHJpbmcgc2VsZWN0ZWRIb3N0bmFtZSkgewotCQkJCXNldEhvc3Qoc2VsZWN0ZWRIb3N0bmFtZSk7Ci0JCQl9Ci0JICAgIH07CQkKLQkJaG9zdG5hbWVMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWhvc3RuYW1lTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5ob3N0bmFtZSk7Ci0JCWhvc3RuYW1lID0gbmV3IFRleHQodGhpcywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuQ0FOQ0VMKTsKLQkJaG9zdG5hbWUuc2V0VGV4dChIb3N0bmFtZUNvbXBvc2l0ZS5MT0NBTEhPU1QpOwotCQlob3N0bmFtZURlY29yYXRpb24gPSBuZXcgQ29udHJvbERlY29yYXRpb24oaG9zdG5hbWUsIFNXVC5UT1AgfCBTV1QuTEVBRCk7Ci0JCQotCQlHcmlkRGF0YSBkYXRhMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgKTsKLQkJaG9zdG5hbWUuc2V0TGF5b3V0RGF0YShkYXRhMik7Ci0JCW5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCQotCQlob3N0bmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRIb3N0bmFtZUNoYW5nZVRpbWVyKGhvc3RuYW1lLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJRmllbGREZWNvcmF0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBGaWVsZERlY29yYXRpb25SZWdpc3RyeS5nZXREZWZhdWx0KCk7Ci0JCUZpZWxkRGVjb3JhdGlvbiBmZCA9IHJlZ2lzdHJ5LmdldEZpZWxkRGVjb3JhdGlvbihGaWVsZERlY29yYXRpb25SZWdpc3RyeS5ERUNfQ09OVEVOVF9QUk9QT1NBTCk7Ci0JCWhvc3RuYW1lRGVjb3JhdGlvbi5zZXRJbWFnZShmZC5nZXRJbWFnZSgpKTsKLQkJaG9zdG5hbWVEZWNvcmF0aW9uLnNldERlc2NyaXB0aW9uVGV4dChmZC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCi0JCWhvc3RuYW1lLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQlob3N0bmFtZURlY29yYXRpb24uc2hvdygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJaG9zdG5hbWVEZWNvcmF0aW9uLmhpZGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlMaXN0PFN0cmluZz4gaG9zdHMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLmdldEhvc3RuYW1lcygpOwotCQlTdHJpbmdbXSBob3N0czIgPSBob3N0cy50b0FycmF5KG5ldyBTdHJpbmdbaG9zdHMuc2l6ZSgpXSk7Ci0JCW5ldyBBdXRvQ29tcGxldGVGaWVsZChob3N0bmFtZSwgbmV3IFRleHRDb250ZW50QWRhcHRlcigpLCBob3N0czIpOwotCQkKLQkJTGFiZWwgc2VydmVyTmFtZUxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJc2VydmVyTmFtZUxhYmVsLnNldFRleHQoTWVzc2FnZXMuc2VydmVyTmFtZSk7Ci0JCQotCQlzZXJ2ZXJOYW1lID0gbmV3IFRleHQodGhpcywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuQ0FOQ0VMKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlpZiAoKHNlcnZlck5hbWUuZ2V0U3R5bGUoKSAmIFNXVC5DQU5DRUwpICE9IDApCi0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJc2VydmVyTmFtZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyTmFtZS5zZXRUZXh0KHNlcnZlci5nZXROYW1lKCkpOwotCQkKLQkJc2VydmVyTmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAodXBkYXRpbmdTZXJ2ZXJOYW1lKQotCQkJCQlyZXR1cm47Ci0JCQkJCi0JCQkJU3RyaW5nIG5hbWUgPSBzZXJ2ZXJOYW1lLmdldFRleHQoKTsKLQkJCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCQkJc2VydmVyLnNldE5hbWUobmFtZSk7Ci0JCQkJCUlSdW50aW1lIHJ1bnRpbWUyID0gc2VydmVyLmdldFJ1bnRpbWUoKTsKLQkJCQkJaWYgKHJ1bnRpbWUyICE9IG51bGwgJiYgcnVudGltZTIgaW5zdGFuY2VvZiBJUnVudGltZVdvcmtpbmdDb3B5KSB7Ci0JCQkJCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ3YyA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBydW50aW1lMjsKLQkJCQkJCXJ3Yy5zZXROYW1lKG5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmIChzZXJ2ZXJOYW1lTW9kaWZpZWQpCi0JCQkJCXJldHVybjsKLQkJCQkKLQkJCQlzZXJ2ZXJOYW1lTW9kaWZpZWQgPSB0cnVlOwotCQkJCWlmIChzZXJ2ZXJOYW1lVG9vbEJhciAhPSBudWxsKQotCQkJCQlzZXJ2ZXJOYW1lVG9vbEJhci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlpZiAoKHNlcnZlck5hbWUuZ2V0U3R5bGUoKSAmIFNXVC5DQU5DRUwpID09IDApIHsKLQkJCXNlcnZlck5hbWVUb29sQmFyID0gbmV3IFRvb2xCYXJNYW5hZ2VyKFNXVC5GTEFUIHwgU1dULkhPUklaT05UQUwpOwotCQkJc2VydmVyTmFtZVRvb2xCYXIuY3JlYXRlQ29udHJvbCh0aGlzKTsKLQkJCQotCQkJSUFjdGlvbiByZXNldERlZmF1bHRBY3Rpb24gPSBuZXcgQWN0aW9uKCIiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ly8kTk9OLU5MUy0xJAotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJKChTZXJ2ZXJXb3JraW5nQ29weSlzZXJ2ZXIpLnNldERlZmF1bHRzKG51bGwpOwotCQkJCQlzZXJ2ZXJOYW1lLnNldFRleHQoc2VydmVyLmdldE5hbWUoKSk7Ci0JCQkJCXNlcnZlck5hbWVNb2RpZmllZCA9IGZhbHNlOwotCQkJCQlpZiAoc2VydmVyTmFtZVRvb2xCYXIgIT0gbnVsbCkKLQkJCQkJCXNlcnZlck5hbWVUb29sQmFyLmdldENvbnRyb2woKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQl9Ci0JCQl9OwotCQkJCi0JCQlyZXNldERlZmF1bHRBY3Rpb24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuc2VydmVyTmFtZURlZmF1bHQpOwotCQkJcmVzZXREZWZhdWx0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FVE9PTF9SRVNFVF9ERUZBVUxUKSk7Ci0JCQlyZXNldERlZmF1bHRBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRFRPT0xfUkVTRVRfREVGQVVMVCkpOwotCQkJCi0JCQlzZXJ2ZXJOYW1lVG9vbEJhci5hZGQocmVzZXREZWZhdWx0QWN0aW9uKTsKLQkJCXNlcnZlck5hbWVUb29sQmFyLnVwZGF0ZShmYWxzZSk7Ci0JCQlzZXJ2ZXJOYW1lVG9vbEJhci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQkJCi0JCXJ1bnRpbWVMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCXJ1bnRpbWVMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLndpek5ld1NlcnZlclJ1bnRpbWUpOwotCQkKLQkJcnVudGltZUNvbWJvID0gbmV3IENvbWJvKHRoaXMsIFNXVC5SRUFEX09OTFkpOwotCQlydW50aW1lQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJ1bnRpbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc2V0UnVudGltZShydW50aW1lc1tydW50aW1lQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV0pOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFkZFJ1bnRpbWUgPSBuZXcgTGluayh0aGlzLCBTV1QuTk9ORSk7Ci0JCWFkZFJ1bnRpbWUuc2V0VGV4dCgiPGE+IiArIE1lc3NhZ2VzLmFkZFJ1bnRpbWUgKyAiPC9hPiIpOwotCQlhZGRSdW50aW1lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCWFkZFJ1bnRpbWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHNlcnZlclR5cGVDb21wb3NpdGUuZ2V0U2VsZWN0ZWRTZXJ2ZXJUeXBlKCk7Ci0JCQkJc2hvd1J1bnRpbWVXaXphcmQoc2VydmVyVHlwZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJY29uZmlndXJlUnVudGltZXMgPSBuZXcgTGluayh0aGlzLCBTV1QuTk9ORSk7Ci0JCWNvbmZpZ3VyZVJ1bnRpbWVzLnNldFRleHQoIjxhPiIgKyBNZXNzYWdlcy5jb25maWd1cmVSdW50aW1lcyArICI8L2E+Iik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJY29uZmlndXJlUnVudGltZXMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY29uZmlndXJlUnVudGltZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHNob3dQcmVmZXJlbmNlUGFnZSgpKSB7Ci0JCQkJCXJ1bnRpbWUgPSBudWxsOwotCQkJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gc2VydmVyVHlwZUNvbXBvc2l0ZS5nZXRTZWxlY3RlZFNlcnZlclR5cGUoKTsKLQkJCQkJdXBkYXRlUnVudGltZUNvbWJvKHNlcnZlclR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBBZGQgdGhlIHBhZ2UgbW9kaWZpZXIgYm90dG9tIHNlY3Rpb24gVUkuIAotCQlmb3IgKFNlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbiBjdXJQYWdlRXh0ZW5zaW9uIDogcGFnZUV4dGVuc2lvbkxzdCkgewotCQkJY3VyUGFnZUV4dGVuc2lvbi5jcmVhdGVDb250cm9sKFNlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbi5VSV9QT1NJVElPTi5CT1RUT00sIHRoaXMpOwotCQl9Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3dQcmVmZXJlbmNlUGFnZSgpIHsKLQkJU3RyaW5nIGlkID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJlZmVyZW5jZVBhZ2UiOwotCQlTdHJpbmcgaWQyID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucnVudGltZS5wcmVmZXJlbmNlUGFnZSI7Ci0JCWZpbmFsIFByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBpZDIsIG5ldyBTdHJpbmdbXSB7IGlkLCBpZDIgfSwgbnVsbCk7Ci0JCXJldHVybiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spOwotCX0KLQotCXByb3RlY3RlZCBpbnQgc2hvd1J1bnRpbWVXaXphcmQoSVNlcnZlclR5cGUgc2VydmVyVHlwZSkgewotCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IG51bGw7Ci0JCVRhc2tNb2RlbCB0YXNrTW9kZWwgPSBuZXcgVGFza01vZGVsKCk7Ci0JCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKTsKLQkJZmluYWwgV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQyID0gU2VydmVyVUlQbHVnaW4uZ2V0V2l6YXJkRnJhZ21lbnQocnVudGltZVR5cGUuZ2V0SWQoKSk7Ci0JCWlmIChmcmFnbWVudDIgPT0gbnVsbCkKLQkJCXJldHVybiBXaW5kb3cuQ0FOQ0VMOwotCQkKLQkJdHJ5IHsKLQkJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZVdvcmtpbmdDb3B5ID0gcnVudGltZVR5cGUuY3JlYXRlUnVudGltZShudWxsLCBudWxsKTsKLQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSwgcnVudGltZVdvcmtpbmdDb3B5KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJaWYgKFRyYWNlLlNFVkVSRSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNUUklOR19TRVZFUkUsICJFcnJvciBjcmVhdGluZyBydW50aW1lIiwgY2UpOwotCQkJfQotCQkJcmV0dXJuIFdpbmRvdy5DQU5DRUw7Ci0JCX0KLQkJZnJhZ21lbnQgPSBuZXcgV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0KSB7Ci0JCQkJbGlzdC5hZGQoZnJhZ21lbnQyKTsKLQkJCQlsaXN0LmFkZChXaXphcmRUYXNrVXRpbC5TYXZlUnVudGltZUZyYWdtZW50KTsKLQkJCX0KLQkJfTsKLQkJVGFza1dpemFyZCB3aXphcmQyID0gbmV3IFRhc2tXaXphcmQoTWVzc2FnZXMud2l6TmV3UnVudGltZVdpemFyZFRpdGxlLCBmcmFnbWVudCwgdGFza01vZGVsKTsKLQkJd2l6YXJkMi5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIHdpemFyZDIpOwotCQlpbnQgcmV0dXJuVmFsdWUgPSBkaWFsb2cub3BlbigpOwotCQlpZiAocmV0dXJuVmFsdWUgIT0gV2luZG93LkNBTkNFTCkgewotCQkJdXBkYXRlUnVudGltZUNvbWJvKHNlcnZlclR5cGUpOwotCQkJSVJ1bnRpbWUgcnQgPSAoSVJ1bnRpbWUpdGFza01vZGVsLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKLQkJCWlmIChydCAhPSBudWxsICYmIHJ0LmdldE5hbWUoKSAhPSBudWxsICYmIHJ1bnRpbWVDb21iby5pbmRleE9mKHJ0LmdldE5hbWUoKSkgIT0gLTEpIHsKLQkJCQlzZXRSdW50aW1lKHJ0KTsKLQkJCQlydW50aW1lQ29tYm8uc2VsZWN0KHJ1bnRpbWVDb21iby5pbmRleE9mKHJ0LmdldE5hbWUoKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXR1cm5WYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRyb2xTdHJpbmdWYWx1ZShTdHJpbmcgY29udHJvbElkKSB7Ci0JCWlmIChjb250cm9sSWQgIT0gbnVsbCAmJiBBYnN0cmFjdFVJQ29udHJvbC5QUk9QX0hPU1ROQU1FLmVxdWFscyhjb250cm9sSWQpKSB7Ci0JCQlyZXR1cm4gaG9zdDsKLQkJfQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKLQkJdGhpcy5ob3N0ID0gaG9zdDsKLQkJaWYgKHNlcnZlclR5cGVDb21wb3NpdGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCUlTZXJ2ZXJUeXBlIHNlbGVjdGVkU2VydmVyVHlwZSA9IHNlcnZlclR5cGVDb21wb3NpdGUuZ2V0U2VsZWN0ZWRTZXJ2ZXJUeXBlKCk7Ci0JCWhhbmRsZUhvc3RuYW1lQ2hhbmdlKHNlbGVjdGVkU2VydmVyVHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUhvc3RuYW1lQ2hhbmdlKElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUpIHsKLQotCQl3aXphcmQuc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOwotCQlpZiAoIWNoZWNrSG9zdEFuZFNlcnZlclR5cGUoc2VydmVyVHlwZSkpIHsKLQkJCXJldHVybjsvLyBIb3N0IG5hbWUgdmFsaWRhdGlvbiBmYWlsZWQsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY29udGludWUgaGFuZGxpbmcgaG9zdG5hbWUgY2hhbmdlIGV2ZW50CQkJCi0JCX0KLQkJbG9hZFNlcnZlckltcGwoc2VydmVyVHlwZSk7Ci0JCQotCQlpZiAoc2VydmVyTmFtZSAhPSBudWxsICYmICFzZXJ2ZXJOYW1lTW9kaWZpZWQpIHsKLQkJCXVwZGF0aW5nU2VydmVyTmFtZSA9IHRydWU7Ci0JCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQkJc2VydmVyTmFtZS5zZXRUZXh0KCIiKTsKLQkJCWVsc2UKLQkJCQlzZXJ2ZXJOYW1lLnNldFRleHQoc2VydmVyLmdldE5hbWUoKSk7Ci0JCQl1cGRhdGluZ1NlcnZlck5hbWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJdXBkYXRlUnVudGltZUNvbWJvKHNlcnZlclR5cGUpOwotCQlpZiAoc2VydmVyTmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoc2VydmVyID09IG51bGwpIHsKLQkJCQlzZXJ2ZXJOYW1lLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCQlzZXJ2ZXJOYW1lVG9vbEJhci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlcnZlck5hbWUuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQkJc2VydmVyTmFtZVRvb2xCYXIuZ2V0Q29udHJvbCgpLnNldFZpc2libGUoc2VydmVyTmFtZU1vZGlmaWVkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgc2VydmVyJ3MgaG9zdCBuYW1lPGJyLz4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRTZXJ2ZXJUeXBlCi0JICogQHJldHVybiBUaGUgcmVzdWx0cyBvZiB2YWxpZGF0aW9uOiA8YnIvPgotCSAqIDxiPmZhbHNlPC9iPiBpbiBjYXNlIHdoZW4gdGhlIHNlbGVjdGVkIHNlcnZlciB0eXBlIGRvZXMgbm90IHN1cHBvcnQgcmVtb3RlIGhvc3QgYW5kIHRoZSBmaWVsZCAiaG9zdG5hbWUiIGlzIG5vdCByZWNvZ25pemVkIGFzIGxvY2FsaG9zdCBvbmUuICBUaGlzIG1ldGhvZCB3aWxsIGFsc28gcmV0dXJuIGZhbHNlIG9uIGFuIGludmFsaWQgc2VydmVyIHR5cGUuPGJyLz4gCi0JICogPGI+dHJ1ZTwvYj4gaW4gYW55IG90aGVyIGNhc2UgICAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0hvc3RBbmRTZXJ2ZXJUeXBlKElTZXJ2ZXJUeXBlIHNlbGVjdGVkU2VydmVyVHlwZSl7Ci0JCWlmKHNlbGVjdGVkU2VydmVyVHlwZSA9PSBudWxsKXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlib29sZWFuIHN1cHBvcnRzUmVtb3RlID0gc2VsZWN0ZWRTZXJ2ZXJUeXBlLnN1cHBvcnRzUmVtb3RlSG9zdHMoKTsKLQkJaWYgKGhvc3RuYW1lLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCl7Ci0JCQl3aXphcmQuc2V0TWVzc2FnZShOTFMuYmluZChNZXNzYWdlcy53aXpFbXB0eUhvc3ROYW1lLCBuZXcgT2JqZWN0WzBdKSwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYoIXN1cHBvcnRzUmVtb3RlICYmICFTb2NrZXRVdGlsLmlzTG9jYWxob3N0KGhvc3RuYW1lLmdldFRleHQoKSkpIHsKLQkJCXdpemFyZC5zZXRNZXNzYWdlKE5MUy5iaW5kKE1lc3NhZ2VzLndpekNoZWNrUmVtb3RlU3VwcG9ydCwgbmV3IE9iamVjdFswXSksIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZCBhIHNlcnZlciBvZiB0aGUgZ2l2ZW4gdHlwZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkU2VydmVySW1wbChJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlKSB7Ci0JCXNlcnZlciA9IG51bGw7Ci0JCQotCQlpZiAoc2VydmVyVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJYm9vbGVhbiBpc0xvY2FsaG9zdCA9IFNvY2tldFV0aWwuaXNMb2NhbGhvc3QoaG9zdCk7Ci0JCQotCQlzZXJ2ZXIgPSBjYWNoZS5nZXRDYWNoZWRTZXJ2ZXIoc2VydmVyVHlwZSwgaXNMb2NhbGhvc3QpOwotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCXNlcnZlci5zZXRIb3N0KGhvc3QpOwotCQkJKChTZXJ2ZXJXb3JraW5nQ29weSlzZXJ2ZXIpLnNldERlZmF1bHRzKG51bGwpOwotCQkJcnVudGltZSA9IHNlcnZlci5nZXRSdW50aW1lKCk7Ci0JCQlsaXN0ZW5lci5ydW50aW1lU2VsZWN0ZWQocnVudGltZSk7Ci0JCQlmaXJlU2VydmVyV29ya2luZ0NvcHlDaGFuZ2VkKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQkvLyB0cnkgdG8gY3JlYXRlIHJ1bnRpbWUgZmlyc3QKLQkJCUlSdW50aW1lIHJ1biA9IG51bGw7Ci0JCQlpZiAoc2VydmVyVHlwZS5oYXNSdW50aW1lKCkpIHsKLQkJCQlydW50aW1lID0gbnVsbDsKLQkJCQl1cGRhdGVSdW50aW1lcyhzZXJ2ZXJUeXBlLCBpc0xvY2FsaG9zdCk7Ci0JCQkJcnVuID0gZ2V0RGVmYXVsdFJ1bnRpbWUoKTsKLQkJCX0KLQkJCXNlcnZlciA9IGNhY2hlLmNyZWF0ZVNlcnZlcihzZXJ2ZXJUeXBlLCBydW4sIGlzTG9jYWxob3N0LCBudWxsKTsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJCXNlcnZlci5zZXRIb3N0KGhvc3QpOwotCQkJCQotCQkJCWlmIChzZXJ2ZXJUeXBlLmhhc1J1bnRpbWUoKSAmJiBzZXJ2ZXIuZ2V0UnVudGltZSgpID09IG51bGwpIHsKLQkJCQkJcnVudGltZSA9IG51bGw7Ci0JCQkJCXVwZGF0ZVJ1bnRpbWVzKHNlcnZlclR5cGUsIGlzTG9jYWxob3N0KTsKLQkJCQkJc2V0UnVudGltZShnZXREZWZhdWx0UnVudGltZSgpKTsKLQkJCQkJCi0JCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKS5oYXNTZXJ2ZXJDb25maWd1cmF0aW9uKCkgJiYgIXJ1bnRpbWUuZ2V0TG9jYXRpb24oKS5pc0VtcHR5KCkpCi0JCQkJCQkoKFNlcnZlcldvcmtpbmdDb3B5KXNlcnZlcikuaW1wb3J0UnVudGltZUNvbmZpZ3VyYXRpb24ocnVudGltZSwgbnVsbCk7Ci0JCQkJfQotCQkJCQotCQkJCSgoU2VydmVyV29ya2luZ0NvcHkpc2VydmVyKS5zZXREZWZhdWx0cyhudWxsKTsKLQkJCQlmaXJlU2VydmVyV29ya2luZ0NvcHlDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCWlmIChUcmFjZS5TRVZFUkUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfU0VWRVJFLCAiRXJyb3IgY3JlYXRpbmcgc2VydmVyIiwgY2UpOwotCQkJfQotCQkJc2VydmVyID0gbnVsbDsKLQkJCXJ1bnRpbWUgPSBudWxsOwotCQkJd2l6YXJkLnNldE1lc3NhZ2UoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKLQkJfQotCQkJCi0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXdpemFyZC5zZXRNZXNzYWdlKE1lc3NhZ2VzLndpekVycm9yU2VydmVyQ3JlYXRpb25FcnJvciwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JfQotCi0JLyoqCi0JICogUGljayB0aGUgZmlyc3Qgbm9uLXN0dWIgcnVudGltZSBmaXJzdC4gT3RoZXJ3aXNlLCBqdXN0IHBpY2sgdGhlIGZpcnN0IHJ1bnRpbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBydW50aW1lCi0JICovCi0JcHJvdGVjdGVkIElSdW50aW1lIGdldERlZmF1bHRSdW50aW1lKCkgewotCQlpZiAocnVudGltZXMgPT0gbnVsbCB8fCBydW50aW1lcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaWYgKHJ1bnRpbWVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoIXJ1bnRpbWVzW2ldLmlzU3R1YigpKQotCQkJCQlyZXR1cm4gcnVudGltZXNbaV07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJ1bnRpbWVzWzBdOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJ1bnRpbWVzKElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUsIGJvb2xlYW4gaXNMb2NhbGhvc3QpIHsKLQkJaWYgKHNlcnZlclR5cGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKTsKLQkJcnVudGltZXMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRSdW50aW1lcyhydW50aW1lVHlwZSk7Ci0JCW5ld1J1bnRpbWUgPSBudWxsOwotCQkKLQkJaWYgKHJ1bnRpbWVzICE9IG51bGwpIHsKLQkJCUxpc3Q8SVJ1bnRpbWU+IHJ1bnRpbWVzMiA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWU+KCk7Ci0JCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZTIgPSBydW50aW1lc1tpXTsKLQkJCQlpZiAoaXNMb2NhbGhvc3QgfHwgIXJ1bnRpbWUyLmlzU3R1YigpKQotCQkJCQlydW50aW1lczIuYWRkKHJ1bnRpbWUyKTsKLQkJCX0KLQkJCXJ1bnRpbWVzID0gbmV3IElSdW50aW1lW3J1bnRpbWVzMi5zaXplKCldOwotCQkJcnVudGltZXMyLnRvQXJyYXkocnVudGltZXMpOwotCQkJaWYgKHJ1bnRpbWVzLmxlbmd0aCA+IDApCi0JCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBjcmVhdGUgYSBuZXcgcnVudGltZQotCQl0cnkgewotCQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lV0MgPSBydW50aW1lVHlwZS5jcmVhdGVSdW50aW1lKG51bGwsIG51bGwpOwotCQkJcnVudGltZXMgPSBuZXcgSVJ1bnRpbWVbMV07Ci0JCQlydW50aW1lc1swXSA9IHJ1bnRpbWVXQzsKLQkJCW5ld1J1bnRpbWUgPSBydW50aW1lV0M7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkNvdWxkbid0IGNyZWF0ZSBydW50aW1lIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSdW50aW1lQ29tYm8oSVNlcnZlclR5cGUgc2VydmVyVHlwZSkgewotCQlpZiAoc2VydmVyVHlwZSA9PSBudWxsIHx8ICFzZXJ2ZXJUeXBlLmhhc1J1bnRpbWUoKSB8fCBzZXJ2ZXIgPT0gbnVsbCkgewotCQkJaWYgKHJ1bnRpbWVMYWJlbCAhPSBudWxsKSB7Ci0JCQkJcnVudGltZUxhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJ1bnRpbWVDb21iby5zZXRJdGVtcyhuZXcgU3RyaW5nWzBdKTsKLQkJCQlydW50aW1lQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcnVudGltZUxhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJCXJ1bnRpbWVDb21iby5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQljb25maWd1cmVSdW50aW1lcy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQljb25maWd1cmVSdW50aW1lcy5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlhZGRSdW50aW1lLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWFkZFJ1bnRpbWUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQl9Ci0JCQlydW50aW1lcyA9IG5ldyBJUnVudGltZVswXTsKLQkJCXNldFJ1bnRpbWUobnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXVwZGF0ZVJ1bnRpbWVzKHNlcnZlclR5cGUsICFTb2NrZXRVdGlsLmlzTG9jYWxob3N0KHNlcnZlci5nZXRIb3N0KCkpKTsKLQkJCi0JCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOwotCQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAocnVudGltZXNbaV0uZXF1YWxzKG5ld1J1bnRpbWUpKQotCQkJCWl0ZW1zW2ldID0gTWVzc2FnZXMud2l6TmV3U2VydmVyUnVudGltZUNyZWF0ZTsKLQkJCWVsc2UKLQkJCQlpdGVtc1tpXSA9IHJ1bnRpbWVzW2ldLmdldE5hbWUoKTsKLQkJfQotCQkKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXNldFJ1bnRpbWUoZ2V0RGVmYXVsdFJ1bnRpbWUoKSk7Ci0JCQotCQlpZiAocnVudGltZUNvbWJvICE9IG51bGwpIHsKLQkJCXJ1bnRpbWVDb21iby5zZXRJdGVtcyhpdGVtcyk7Ci0JCQlpZiAocnVudGltZXMubGVuZ3RoID4gMCkgewotCQkJCWludCBzZWwgPSAtMTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlpZiAocnVudGltZXNbaV0uZXF1YWxzKHJ1bnRpbWUpKQotCQkJCQkJc2VsID0gaTsKLQkJCQl9Ci0JCQkJaWYgKHNlbCA8IDApIHsKLQkJCQkJc2VsID0gMDsKLQkJCQl9Ci0JCQkJCi0JCQkJcnVudGltZUNvbWJvLnNlbGVjdChzZWwpOwotCQkJCXNldFJ1bnRpbWUocnVudGltZXNbc2VsXSk7Ci0JCQl9Ci0JCQkKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKTsKLQkJCWJvb2xlYW4gc2hvd1J1bnRpbWUgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRSdW50aW1lcyhydW50aW1lVHlwZSkubGVuZ3RoID49MTsKLQkJCXJ1bnRpbWVDb21iby5zZXRFbmFibGVkKHNob3dSdW50aW1lKTsKLQkJCXJ1bnRpbWVMYWJlbC5zZXRFbmFibGVkKHNob3dSdW50aW1lKTsKLQkJCWNvbmZpZ3VyZVJ1bnRpbWVzLnNldEVuYWJsZWQoc2hvd1J1bnRpbWUpOwotCQkJYWRkUnVudGltZS5zZXRFbmFibGVkKHNob3dSdW50aW1lKTsKLQkJCXJ1bnRpbWVMYWJlbC5zZXRWaXNpYmxlKHNob3dSdW50aW1lKTsKLQkJCXJ1bnRpbWVDb21iby5zZXRWaXNpYmxlKHNob3dSdW50aW1lKTsKLQkJCWNvbmZpZ3VyZVJ1bnRpbWVzLnNldFZpc2libGUoc2hvd1J1bnRpbWUpOwotCQkJYWRkUnVudGltZS5zZXRWaXNpYmxlKHNob3dSdW50aW1lKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFJ1bnRpbWUoSVJ1bnRpbWUgcnVudGltZTIpIHsKLQkJcnVudGltZSA9IHJ1bnRpbWUyOwotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCXNlcnZlci5zZXRSdW50aW1lKHJ1bnRpbWUpOwotCQkJKChTZXJ2ZXJXb3JraW5nQ29weSlzZXJ2ZXIpLnNldERlZmF1bHRzKG51bGwpOwotCQkJaWYgKCFzZXJ2ZXJOYW1lTW9kaWZpZWQpIHsKLQkJCQl1cGRhdGluZ1NlcnZlck5hbWUgPSB0cnVlOwotCQkJCXNlcnZlck5hbWUuc2V0VGV4dChzZXJ2ZXIuZ2V0TmFtZSgpKTsKLQkJCQl1cGRhdGluZ1NlcnZlck5hbWUgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNlcnZlci5zZXROYW1lKHNlcnZlck5hbWUuZ2V0VGV4dCgpKTsKLQkJCX0KLQkJCS8vIFZhbGlkYXRlIGlmIHNlbGVjdGVkIG1vZHVsZSBpcyBzdXBwb3J0ZWQgd2l0aCB0aGUgc2VsZWN0ZWQgcnVudGltZQotCQkJd2l6YXJkLnNldE1lc3NhZ2UobnVsbCwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKLQkJCWlmKCBtb2R1bGUhPW51bGwgKXsKLQkJCQljYW5TdXBwb3J0TW9kdWxlPXRydWU7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBOZXdTZXJ2ZXJDb21wb3NpdGUuaXNTdXBwb3J0ZWRNb2R1bGUoc2VydmVyLCBtb2R1bGUpOwotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUil7Ci0JCQkJCQl3aXphcmQuc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKLQkJCQkJCWNhblN1cHBvcnRNb2R1bGU9ZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKQotCQkJCQkJd2l6YXJkLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJCQkJZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5JTkZPKQotCQkJCQkJd2l6YXJkLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWxpc3RlbmVyLnJ1bnRpbWVTZWxlY3RlZChydW50aW1lKTsKLQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlU2VydmVyV29ya2luZ0NvcHlDaGFuZ2VkKCkgewotCQlMaXN0PFNlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbj4gcGFnZUV4dGVuc2lvbkxzdCA9IFNlcnZlclVJUGx1Z2luLmdldFNlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbnMoKTsKLQkJLy8gQWRkIHRoZSBwYWdlIG1vZGlmaWVyIHRvcCBzZWN0aW9uIFVJLiAKLQkJZm9yIChTZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb24gY3VyUGFnZUV4dGVuc2lvbiA6IHBhZ2VFeHRlbnNpb25Mc3QpIHsKLQkJCWN1clBhZ2VFeHRlbnNpb24uc2V0U2VydmVyV29ya2luZ0NvcHkoZ2V0U2VydmVyKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIHRoZSBzZXJ2ZXIgdHlwZSBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlVHlwZVNlbGVjdGlvbihJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlKSB7Ci0JCWJvb2xlYW4gd3JvbmcgPSBmYWxzZTsKLQkJaWYgKHNlcnZlclR5cGUgIT0gbnVsbCAmJiBtb2R1bGVUeXBlICE9IG51bGwpIHsKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKTsKLQkJCWlmICghU2VydmVyVXRpbC5pc1N1cHBvcnRlZE1vZHVsZShydW50aW1lVHlwZS5nZXRNb2R1bGVUeXBlcygpLCBtb2R1bGVUeXBlKSkgewotCQkJCXNlcnZlclR5cGUgPSBudWxsOwotCQkJCXdyb25nID0gdHJ1ZTsKLQkJCQkvL3dpemFyZC5zZXRNZXNzYWdlKCJOb3QgdGhlIHJpZ2h0IHNwZWMgbGV2ZWwyIiwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICh3cm9uZykgewotCQkJc2VydmVyID0gbnVsbDsKLQkJCXJ1bnRpbWUgPSBudWxsOwotCQkJd2l6YXJkLnNldE1lc3NhZ2UoTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JWZXJzaW9uTGV2ZWwsIG5ldyBPYmplY3RbXSB7IG1vZHVsZVR5cGUuZ2V0TmFtZSgpLCBtb2R1bGVUeXBlLmdldFZlcnNpb24oKSB9KSwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCX0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSBudWxsKSB7Ci0JCQlzZXJ2ZXIgPSBudWxsOwotCQkJcnVudGltZSA9IG51bGw7Ci0JCQl3aXphcmQuc2V0TWVzc2FnZSgiIiwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCXdpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQlsb2FkU2VydmVySW1wbChzZXJ2ZXJUeXBlKTsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBtb2R1bGUgIT0gbnVsbCkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gTmV3U2VydmVyQ29tcG9zaXRlLmlzU3VwcG9ydGVkTW9kdWxlKHNlcnZlciwgbW9kdWxlKTsKLQkJCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQkJCQl3aXphcmQuc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKLQkJCQkJZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKQotCQkJCQkJd2l6YXJkLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJCQkJZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5JTkZPKQotCQkJCQkJd2l6YXJkLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAoc2VydmVyTmFtZSAhPSBudWxsICYmICFzZXJ2ZXJOYW1lTW9kaWZpZWQpIHsKLQkJCXVwZGF0aW5nU2VydmVyTmFtZSA9IHRydWU7Ci0JCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQkJc2VydmVyTmFtZS5zZXRUZXh0KCIiKTsKLQkJCWVsc2UKLQkJCQlzZXJ2ZXJOYW1lLnNldFRleHQoc2VydmVyLmdldE5hbWUoKSk7Ci0JCQl1cGRhdGluZ1NlcnZlck5hbWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJdXBkYXRlUnVudGltZUNvbWJvKHNlcnZlclR5cGUpOwotCQlpZiAoc2VydmVyTmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoc2VydmVyID09IG51bGwpIHsKLQkJCQlzZXJ2ZXJOYW1lLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCQlzZXJ2ZXJOYW1lVG9vbEJhci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlcnZlck5hbWUuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQkJc2VydmVyTmFtZVRvb2xCYXIuZ2V0Q29udHJvbCgpLnNldFZpc2libGUoc2VydmVyTmFtZU1vZGlmaWVkKTsKLQkJCX0KLQkJfQotCQlsaXN0ZW5lci5zZXJ2ZXJTZWxlY3RlZChzZXJ2ZXIpOwotCQkvLyBGaXJlIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuIAotCQlMaXN0PFNlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbj4gcGFnZUV4dGVuc2lvbkxzdCA9IFNlcnZlclVJUGx1Z2luLmdldFNlcnZlckNyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbnMoKTsKLQkJZm9yIChTZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb24gY3VyUGFnZUV4dGVuc2lvbiA6IHBhZ2VFeHRlbnNpb25Mc3QpIHsKLQkJCWN1clBhZ2VFeHRlbnNpb24uaGFuZGxlUHJvcGVydHlDaGFuZ2VkKG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMsIEFic3RyYWN0VUlDb250cm9sLlBST1BfU0VSVkVSX1RZUEUsIG9sZFNlcnZlclR5cGUsIHNlcnZlclR5cGUpKTsKLQkJfQotCQkvLyBVcGRhdGUgdGhlIG9sZCBzZXJ2ZXIgdHlwZSB2YWx1ZS4KLQkJb2xkU2VydmVyVHlwZSA9IHNlcnZlclR5cGU7Ci0KLQkJY2hlY2tIb3N0QW5kU2VydmVyVHlwZShzZXJ2ZXJUeXBlKTsKLQkJd2l6YXJkLnVwZGF0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCi0JCWlmICh2aXNpYmxlKSB7Ci0JCQkvKmlmIChkZWZhdWx0U2VydmVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10geyBkZWZhdWx0U2VydmVyRmFjdG9yeSB9KTsKLQkJCQl0cmVlLnNob3dJdGVtKHRyZWUuZ2V0SXRlbXMoKVswXSk7Ci0JCQl9Ki8KLQkJCS8vIGZvcmNlIHRoZSBmb2N1cyB0byBpbml0aWFsbHkgdmFsaWRhdGUgdGhlIGZpZWxkcwotCQkJaGFuZGxlVHlwZVNlbGVjdGlvbihudWxsKTsKLQkJfQotCQkKLQkJQ29udHJvbFtdIGMgPSBnZXRDaGlsZHJlbigpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJaWYgKGNbaV0gIT0gbnVsbCAmJiBjW2ldIGluc3RhbmNlb2YgU2VydmVyVHlwZUNvbXBvc2l0ZSkKLQkJCQkJY1tpXS5zZXRWaXNpYmxlKHZpc2libGUpOwotCQl9Ci0JCWlmICh2aXNpYmxlKQotCQkJaGFuZGxlVHlwZVNlbGVjdGlvbihzZXJ2ZXJUeXBlQ29tcG9zaXRlLmdldFNlbGVjdGVkU2VydmVyVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXJ2ZXJUeXBlQ29tcG9zaXRlLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgSVJ1bnRpbWUgZ2V0UnVudGltZSgpIHsKLQkJcmV0dXJuIHJ1bnRpbWU7Ci0JfQotCi0JcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRTZXJ2ZXIoKSB7Ci0JCXJldHVybiBzZXJ2ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaG9zdG5hbWVDaGFuZ2VkKFN0cmluZyBuZXdIb3N0KSB7Ci0JCWlmIChuZXdIb3N0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8qCi0JCSAqIEJ1ZyAzNDk0MzQsIHdpdGggdGhlIGZpeCBpbiBUaW1lci5ydW5UaW1lciwgdGhlIGNoYW5jZSB0aGF0IGEgbmV3IAotCQkgKiBob3N0IG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIGhvc3QgbmFtZSB3aWxsIGJlIHZlcnkgcmFyZS4gSW4gc29tZSAgCi0JCSAqIGNhc2VzLCBpdCBzdGlsbCBuZWVkcyB0byBnbyB0aHJvdWdoIHByb2Nlc3NlcyBzdWNoIGFzIGxvYWRTZXJ2ZXJJbXBsLiAKLQkJICogSXQgZG9lc24ndCB3b3J0aCB0byBoYW5kbGUgaXQgZGlmZmVyZW50bHkuIFRoZXJlZm9yZSwgd2UgYXJlIG5vdCBjaGVja2luZyAKLQkJICogZm9yIHRoZSBzYW1lIGhvc3QgbmFtZSBpbiBoZXJlLgotCQkgKi8KLQotCQlob3N0ID0gbmV3SG9zdDsKLQkJaG9zdG5hbWVMaXN0ZW5lci5ob3N0bmFtZVNlbGVjdGVkKGhvc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIGhhbmRsZVVJQ29udHJvbE1hcENoYW5nZWQoTWFwPFN0cmluZywgVUlDb250cm9sRW50cnk+IGNvbnRyb2xNYXApIHsKLQkJaWYgKGNvbnRyb2xNYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlmb3IgKFN0cmluZyBjdXJDb250cm9sSWQgOiBjb250cm9sTWFwLmtleVNldCgpKSB7Ci0JCQlpZiAoQWJzdHJhY3RVSUNvbnRyb2wuUFJPUF9IT1NUTkFNRS5lcXVhbHMoY3VyQ29udHJvbElkKSkgewotCQkJCVVJQ29udHJvbEVudHJ5IGN1ckNvbnRyb2xFbnRyeSA9IGNvbnRyb2xNYXAuZ2V0KGN1ckNvbnRyb2xJZCk7Ci0JCQkJaWYgKGhvc3RuYW1lTGFiZWwgIT0gbnVsbCkKLQkJCQkJaG9zdG5hbWVMYWJlbC5zZXRFbmFibGVkKGN1ckNvbnRyb2xFbnRyeS5pc0VuYWJsZWQoKSk7Ci0JCQkJCi0JCQkJaWYgKGhvc3RuYW1lICE9IG51bGwpewotCQkJCQlpZiAoY3VyQ29udHJvbEVudHJ5LmdldE5ld1RleHRWYWx1ZSgpICE9IG51bGwpCi0JCQkJCQlob3N0bmFtZS5zZXRUZXh0KGN1ckNvbnRyb2xFbnRyeS5nZXROZXdUZXh0VmFsdWUoKSk7Ci0JCQkJCQotCQkJCQlob3N0bmFtZS5zZXRFbmFibGVkKGN1ckNvbnRyb2xFbnRyeS5pc0VuYWJsZWQoKSk7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChob3N0bmFtZURlY29yYXRpb24gIT0gbnVsbCl7Ci0JCQkJCWlmKGN1ckNvbnRyb2xFbnRyeS5pc0VuYWJsZWQoKSkKLQkJCQkJCWhvc3RuYW1lRGVjb3JhdGlvbi5zaG93KCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWhvc3RuYW1lRGVjb3JhdGlvbi5oaWRlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50SG9zdG5hbWUoKSB7Ci0JCWlmIChob3N0bmFtZSAhPSBudWxsKQotCQkJcmV0dXJuIGhvc3RuYW1lLmdldFRleHQoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuU3VwcG9ydE1vZHVsZSgpIHsKLQkJcmV0dXJuIGNhblN1cHBvcnRNb2R1bGU7Ci0JfQotCi0Jdm9pZCBzZXRIb3N0bmFtZUNoYW5nZVRpbWVyKFN0cmluZyBob3N0TmFtZSkgewotCQlpZiAoaG9zdG5hbWVDaGFuZ2VBY3Rpb24gPT0gbnVsbCkgewotCQkJaG9zdG5hbWVDaGFuZ2VBY3Rpb24gPSBuZXcgSG9zdG5hbWVDaGFuZ2VkQWN0aW9uKGhvc3ROYW1lKTsKLQkJfSBlbHNlIHsKLQkJCWhvc3RuYW1lQ2hhbmdlQWN0aW9uLnNldEhvc3ROYW1lKGhvc3ROYW1lKTsKLQkJfQotCi0JCWlmICh0aW1lciA9PSBudWxsKSB7Ci0JCQl0aW1lciA9IG5ldyBUaW1lcigzMDAsIGhvc3RuYW1lQ2hhbmdlQWN0aW9uKTsKLQkJfQotCQkvKgotCQkgKiBLaWNrIG9mZiB0aGUgdGltZXIgYW5kIHRoZW4gY2FsbCBzZXRNZXNzYWdlIGlmIHRoZSBUaW1lciB3YXNuJ3QKLQkJICogcHJldmlvdXNseSBydW5uaW5nIGJlY2F1c2Ugd2Ugd2FudCB0byB0cmlnZ2VyIHRoZSBpc0NvbXBsZXRlIG9uIHRoZSBwYWdlCi0JCSAqIHNvIHRoYXQgaXQgc3RvcHMgdGhlIHVzZXIgZnJvbSBwcm9jZWVkaW5nIHRvIHRoZSBuZXh0IHBhZ2Ugd2hpbGUgdGhlCi0JCSAqIHRpbWVyIGlzIHJ1bm5pbmcuCi0JCSAqLwotCQlpZiAoIXRpbWVyLmlzUnVubmluZygpKSB7Ci0JCQl0aW1lci5ydW5UaW1lcigpOwotCQkJd2l6YXJkLnNldE1lc3NhZ2UobnVsbCwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKLQkJfSBlbHNlIHsKLQkJCXRpbWVyLnJ1blRpbWVyKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1RpbWVyUnVubmluZygpIHsKLQkJaWYgKHRpbWVyID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGltZXIuaXNSdW5uaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNUaW1lclNjaGVkdWxlZCgpIHsKLQkJaWYgKHRpbWVyID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGltZXIuaXNTY2hlZHVsZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGUgdGltZXIgd2hlbiB0aGUgd2l6YXJkIGlzIGRpc3Bvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh0aW1lciAhPSBudWxsKSB7Ci0JCQl0aW1lci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEhvc3RuYW1lQ2hhbmdlZEFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyIHsKLQotCQlTdHJpbmcgaG9zdE5hbWU7Ci0KLQkJcHVibGljIEhvc3RuYW1lQ2hhbmdlZEFjdGlvbihTdHJpbmcgbmFtZSkgewotCQkJaG9zdE5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGEpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaG9zdG5hbWVDaGFuZ2VkKGhvc3ROYW1lKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCXZvaWQgc2V0SG9zdE5hbWUoU3RyaW5nIGhvc3QpIHsKLQkJCWhvc3ROYW1lID0gaG9zdDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdSdW50aW1lQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdSdW50aW1lQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NjJlOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTmV3UnVudGltZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5Db250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLlJ1bnRpbWVUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdSdW50aW1lQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgVHJlZSB0cmVlOwotCXByb3RlY3RlZCBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVTZXJ2ZXI7Ci0KLQlwcm90ZWN0ZWQgSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lOwotCi0JLy8gY2FjaGUgb2YgY3JlYXRlZCBydW50aW1lcyBhbmQgc2VydmVycwotCXByb3RlY3RlZCBNYXA8SVJ1bnRpbWVUeXBlLCBJUnVudGltZVdvcmtpbmdDb3B5PiBjYWNoZSA9IG5ldyBIYXNoTWFwPElSdW50aW1lVHlwZSwgSVJ1bnRpbWVXb3JraW5nQ29weT4oKTsKLQlwcm90ZWN0ZWQgTWFwPElSdW50aW1lLCBJU2VydmVyV29ya2luZ0NvcHk+IHNlcnZlckNhY2hlID0gbmV3IEhhc2hNYXA8SVJ1bnRpbWUsIElTZXJ2ZXJXb3JraW5nQ29weT4oKTsKLQotCXByb3RlY3RlZCBUYXNrTW9kZWwgdGFza01vZGVsOwotCXByb3RlY3RlZCBJV2l6YXJkSGFuZGxlIHdpemFyZDsKLQotCXByb3RlY3RlZCBTdHJpbmcgdHlwZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb247Ci0JcHJvdGVjdGVkIFN0cmluZyBydW50aW1lVHlwZUlkOwotCXByb3RlY3RlZCBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlOwotCi0JcHVibGljIE5ld1J1bnRpbWVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSB3aXphcmQsIFRhc2tNb2RlbCB0bSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgcnVudGltZVR5cGVJZCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCi0JCXRoaXMud2l6YXJkID0gd2l6YXJkOwotCQl0aGlzLnRhc2tNb2RlbCA9IHRtOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCQl0aGlzLnJ1bnRpbWVUeXBlSWQgPSBydW50aW1lVHlwZUlkOwotCQkKLQkJY3JlYXRlQ29udHJvbCgpOwotCQkKLQkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpek5ld1J1bnRpbWVUaXRsZSk7Ci0JCXdpemFyZC5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy53aXpOZXdSdW50aW1lRGVzY3JpcHRpb24pOwotCQl3aXphcmQuc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1dJWkJBTl9ORVdfUlVOVElNRSkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbCgpIHsKLQkJLy9pbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHModGhpcywgNCk7Ci0JCXNldExheW91dChsYXlvdXQpOwotCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJd2hzLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5ORVdfUlVOVElNRV9XSVpBUkQpOwotCQkKLQkJZmluYWwgUnVudGltZVR5cGVDb21wb3NpdGUgY29tcCA9IG5ldyBSdW50aW1lVHlwZUNvbXBvc2l0ZSh0aGlzLCB0cnVlLCBuZXcgUnVudGltZVR5cGVDb21wb3NpdGUuUnVudGltZVR5cGVTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bnRpbWVUeXBlU2VsZWN0ZWQoSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKSB7Ci0JCQkJaGFuZGxlU2VsZWN0aW9uKHJ1bnRpbWVUeXBlKTsKLQkJCX0KLQkJfSwgdHlwZSwgdmVyc2lvbiwgcnVudGltZVR5cGVJZCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMzAwOwotCQljb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQljcmVhdGVTZXJ2ZXIgPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5DSEVDSyk7Ci0JCWNyZWF0ZVNlcnZlci5zZXRUZXh0KE1lc3NhZ2VzLndpek5ld1J1bnRpbWVDcmVhdGVTZXJ2ZXIpOwotCQljcmVhdGVTZXJ2ZXIuc2V0U2VsZWN0aW9uKFNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuZ2V0Q3JlYXRlU2VydmVyV2l0aFJ1bnRpbWUoKSk7Ci0JCWNyZWF0ZVNlcnZlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVTZXJ2ZXIoKTsKLQkJCQlTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLnNldENyZWF0ZVNlcnZlcldpdGhSdW50aW1lKGNyZWF0ZVNlcnZlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlbGVjdGlvbihJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKLQkJaWYgKHJ1bnRpbWVUeXBlID09IG51bGwpCi0JCQlydW50aW1lID0gbnVsbDsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCXJ1bnRpbWUgPSBudWxsOwotCQkJCXJ1bnRpbWUgPSBjYWNoZS5nZXQocnVudGltZVR5cGUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCWlmIChydW50aW1lID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlydW50aW1lID0gcnVudGltZVR5cGUuY3JlYXRlUnVudGltZShudWxsLCBudWxsKTsKLQkJCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkKLQkJCQkJCWNhY2hlLnB1dChydW50aW1lVHlwZSwgcnVudGltZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JCXNlcnZlclR5cGUgPSBnZXRDb21wYXRpYmxlU2VydmVyVHlwZShydW50aW1lVHlwZSk7Ci0JCWhhbmRsZVNlcnZlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlcnZlcigpIHsKLQkJYm9vbGVhbiBvcHRpb24gPSBmYWxzZTsKLQkJaWYgKHNlcnZlclR5cGUgIT0gbnVsbCAmJiBzZXJ2ZXJUeXBlLmhhc1J1bnRpbWUoKSkKLQkJCW9wdGlvbiA9IHRydWU7Ci0JCWNyZWF0ZVNlcnZlci5zZXRWaXNpYmxlKG9wdGlvbik7Ci0JCQotCQlpZiAob3B0aW9uICYmIGNyZWF0ZVNlcnZlci5nZXRTZWxlY3Rpb24oKSkgewotCQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IGdldFNlcnZlcigpOwotCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIHNlcnZlcik7Ci0JCX0gZWxzZQotCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIG51bGwpOwotCQkKLQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FLCBydW50aW1lKTsKLQkJd2l6YXJkLnVwZGF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSVNlcnZlclR5cGUgZ2V0Q29tcGF0aWJsZVNlcnZlclR5cGUoSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKSB7Ci0JCUxpc3Q8SVNlcnZlclR5cGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXJUeXBlPigpOwotCQlJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOwotCQlpbnQgc2l6ZSA9IHNlcnZlclR5cGVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlSdW50aW1lVHlwZSBydCA9IHNlcnZlclR5cGVzW2ldLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCQlpZiAocnQgIT0gbnVsbCAmJiBydC5lcXVhbHMocnVudGltZVR5cGUpKQotCQkJCWxpc3QuYWRkKHNlcnZlclR5cGVzW2ldKTsKLQkJfQotCQlpZiAobGlzdC5zaXplKCkgPT0gMSkKLQkJCXJldHVybiBsaXN0LmdldCgwKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgc2VydmVyIG9mIHRoZSBnaXZlbiB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBJU2VydmVyV29ya2luZ0NvcHkgZ2V0U2VydmVyKCkgewotCQlpZiAoc2VydmVyVHlwZSA9PSBudWxsIHx8IHJ1bnRpbWUgPT0gbnVsbCB8fCAhc2VydmVyVHlwZS5oYXNSdW50aW1lKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIgPSBzZXJ2ZXJDYWNoZS5nZXQocnVudGltZSk7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBzZXJ2ZXI7Ci0JCQotCQl0cnkgewotCQkJc2VydmVyID0gc2VydmVyVHlwZS5jcmVhdGVTZXJ2ZXIobnVsbCwgbnVsbCwgcnVudGltZSwgbnVsbCk7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCQlzZXJ2ZXJDYWNoZS5wdXQocnVudGltZSwgc2VydmVyKTsKLQkJCQlyZXR1cm4gc2VydmVyOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIkVycm9yIGNyZWF0aW5nIHNlcnZlciIsIGNlKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElSdW50aW1lV29ya2luZ0NvcHkgZ2V0UnVudGltZSgpIHsKLQkJcmV0dXJuIHJ1bnRpbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQotCQlDb250cm9sW10gYyA9IGdldENoaWxkcmVuKCk7Ci0JCWlmIChjICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gYy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQlpZiAoY1tpXSAhPSBudWxsKQotCQkJCQljW2ldLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTmV3U2VydmVyQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdTZXJ2ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJhMzE5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdTZXJ2ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLlNlcnZlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5XaXphcmRUYXNrVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHVzZWQgdG8gc2VsZWN0IGEgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgTmV3U2VydmVyQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSB3aXphcmQ7Ci0JcHJvdGVjdGVkIFRhc2tNb2RlbCB0YXNrTW9kZWw7Ci0JcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOwotCXByb3RlY3RlZCBJTW9kdWxlVHlwZSBtb2R1bGVUeXBlOwotCXByb3RlY3RlZCBTdHJpbmcgc2VydmVyVHlwZUlkOwotCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9FWElTVElORyA9IFdpemFyZFRhc2tVdGlsLk1PREVfRVhJU1RJTkc7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfREVURUNUID0gV2l6YXJkVGFza1V0aWwuTU9ERV9ERVRFQ1Q7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfTUFOVUFMID0gV2l6YXJkVGFza1V0aWwuTU9ERV9NQU5VQUw7Ci0JcHJvdGVjdGVkIGJ5dGUgbW9kZTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZGV0ZWN0Q29tcDI7Ci0JcHJvdGVjdGVkIE5ld0RldGVjdFNlcnZlckNvbXBvc2l0ZSBkZXRlY3RDb21wOwotCXByb3RlY3RlZCBIb3N0bmFtZUNvbXBvc2l0ZSBkZXRlY3RIb3N0Q29tcDsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIG1hbnVhbENvbXAyOwotCXByb3RlY3RlZCBOZXdNYW51YWxTZXJ2ZXJDb21wb3NpdGUgbWFudWFsQ29tcDsKLQlwcm90ZWN0ZWQgSG9zdG5hbWVDb21wb3NpdGUgbWFudWFsSG9zdENvbXA7Ci0JcHJvdGVjdGVkIFNlcnZlckNvbXBvc2l0ZSBleGlzdGluZ0NvbXA7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHN0YWNrOwotCXByb3RlY3RlZCBTdGFja0xheW91dCBzdGFja0xheW91dDsgCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGxhc3RIb3N0bmFtZTsKLQotCXByb3RlY3RlZCBJU2VydmVyV29ya2luZ0NvcHkgZXhpc3RpbmdXQzsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBOZXdTZXJ2ZXJDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBhIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2l6YXJkIGEgd2l6YXJkIGhhbmRsZQotCSAqIEBwYXJhbSBtb2R1bGVUeXBlIGEgbW9kdWxlIHR5cGUsIG9yIG51bGwKLQkgKiBAcGFyYW0gc2VydmVyVHlwZUlkIGEgc2VydmVyIHR5cGUgaWQsIG9yIG51bGwKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBhIGxhdW5jaCBtb2RlCi0JICovCi0JcHVibGljIE5ld1NlcnZlckNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCwgSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSwgU3RyaW5nIHNlcnZlclR5cGVJZCwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRoaXMud2l6YXJkID0gd2l6YXJkOwotCQl0aGlzLm1vZHVsZVR5cGUgPSBtb2R1bGVUeXBlOwotCQl0aGlzLnNlcnZlclR5cGVJZCA9IHNlcnZlclR5cGVJZDsKLQkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKLQkJCi0JCXdpemFyZC5zZXRUaXRsZShNZXNzYWdlcy53aXpOZXdTZXJ2ZXJUaXRsZSk7Ci0JCXdpemFyZC5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy53aXpOZXdTZXJ2ZXJEZXNjcmlwdGlvbik7Ci0JCXdpemFyZC5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfV0laQkFOX05FV19TRVJWRVIpKTsKLQkJCi0JCWNyZWF0ZUNvbnRyb2woKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgTmV3U2VydmVyQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgYSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpemFyZCBhIHdpemFyZCBoYW5kbGUKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICogQHBhcmFtIGxhdW5jaE1vZGUgYSBsYXVuY2ggbW9kZQotCSAqLwotCXB1YmxpYyBOZXdTZXJ2ZXJDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSB3aXphcmQsIElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy53aXphcmQgPSB3aXphcmQ7Ci0JCXRoaXMubW9kdWxlID0gbW9kdWxlOwotCQl0aGlzLmxhdW5jaE1vZGUgPSBsYXVuY2hNb2RlOwotCQkKLQkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpek5ld1NlcnZlclRpdGxlKTsKLQkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLndpek5ld1NlcnZlckRlc2NyaXB0aW9uKTsKLQkJd2l6YXJkLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19XSVpCQU5fTkVXX1NFUlZFUikpOwotCQkKLQkJY3JlYXRlQ29udHJvbCgpOwotCX0KLQotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHNwYW4pIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIGNyZWF0ZUxhYmVsKHBhcmVudCwgdGV4dCwgMSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHNwYW4pIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0MiwgaW50IHNwYW4pIHsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRleHQuc2V0VGV4dCh0ZXh0Mik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVUkgb2YgdGhlIHBhZ2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udHJvbCgpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHModGhpcywgNCk7Ci0JCXNldExheW91dChsYXlvdXQpOwotCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJd2hzLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5ORVdfU0VSVkVSX1dJWkFSRCk7Ci0JCQotCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkKLQkJCQl3aXphcmQuc2V0VGl0bGUoTWVzc2FnZXMud2l6RGVidWdPblNlcnZlclRpdGxlKTsKLQkJCWVsc2UgaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobGF1bmNoTW9kZSkpCi0JCQkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpelByb2ZpbGVPblNlcnZlclRpdGxlKTsKLQkJCWVsc2UKLQkJCQl3aXphcmQuc2V0VGl0bGUoTWVzc2FnZXMud2l6UnVuT25TZXJ2ZXJUaXRsZSk7Ci0JCQl3aXphcmQuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMud2l6TmV3U2VydmVyUnVuT25TZXJ2ZXJEZXNjcmlwdGlvbik7Ci0JCQljcmVhdGVMYWJlbCh0aGlzLCBNZXNzYWdlcy53aXpOZXdTZXJ2ZXJTZWxlY3QsIDEpOwotCQl9Ci0JCQotCQlCdXR0b24gZXhpc3RpbmcgPSBudWxsOwotCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCWZpbmFsIEJ1dHRvbiBwcmVkZWZpbmVkID0gY3JlYXRlUmFkaW9CdXR0b24odGhpcywgTWVzc2FnZXMud2l6TmV3U2VydmVyRXhpc3RpbmcsIDEpOwotCQkJcHJlZGVmaW5lZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWlmIChwcmVkZWZpbmVkLmdldFNlbGVjdGlvbigpKQotCQkJCQkJdG9nZ2xlTW9kZShNT0RFX0VYSVNUSU5HKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWV4aXN0aW5nID0gcHJlZGVmaW5lZDsKLQkJfQotCQkKLQkJLypmaW5hbCBCdXR0b24gYXV0byA9IGNyZWF0ZVJhZGlvQnV0dG9uKHRoaXMsIE1lc3NhZ2VzLndpek5ld1NlcnZlckRldGVjdCIpLCAxKTsKLQkJYXV0by5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYXV0by5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoYXV0by5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJdG9nZ2xlTW9kZShNT0RFX0RFVEVDVCk7Ci0JCQl9Ci0JCX0pOyovCi0JCi0JCUJ1dHRvbiBtYW51YWwgPSBudWxsOwotCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCWZpbmFsIEJ1dHRvbiBtYW51YWxCdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbih0aGlzLCBNZXNzYWdlcy53aXpOZXdTZXJ2ZXJNYW51YWwsIDEpOwotCQkJbWFudWFsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaWYgKG1hbnVhbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCXRvZ2dsZU1vZGUoTU9ERV9NQU5VQUwpOwotCQkJCX0KLQkJCX0pOwotCQkJbWFudWFsID0gbWFudWFsQnV0dG9uOwotCQl9Ci0JCQotCQlzdGFjayA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXN0YWNrLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0JCXN0YWNrTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXN0YWNrTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJc3RhY2suc2V0TGF5b3V0KHN0YWNrTGF5b3V0KTsKLQkJCi0JCWlmIChtb2R1bGUgIT0gbnVsbCkKLQkJCWNyZWF0ZUV4aXN0aW5nQ29tcG9zaXRlKHN0YWNrKTsKLQkJY3JlYXRlQXV0b0NvbXBvc2l0ZShzdGFjayk7Ci0JCWNyZWF0ZU1hbnVhbENvbXBvc2l0ZShzdGFjayk7Ci0JCQotCQlpZiAoZXhpc3RpbmdDb21wICE9IG51bGwgJiYgZXhpc3RpbmcgIT0gbnVsbCkgewotCQkJaWYgKGlzRXhpc3RpbmdTZXJ2ZXIoKSkgewotCQkJCW1vZGUgPSBNT0RFX0VYSVNUSU5HOwotCQkJCXN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBleGlzdGluZ0NvbXA7Ci0JCQkJZXhpc3Rpbmcuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQltb2RlID0gTU9ERV9NQU5VQUw7Ci0JCQkJc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IG1hbnVhbENvbXAyOwotCQkJCW1hbnVhbENvbXAuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQlpZiAobWFudWFsICE9IG51bGwpCi0JCQkJCW1hbnVhbC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJZXhpc3Rpbmcuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJZXhpc3RpbmdDb21wLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9IGVsc2UgewotCQkJbW9kZSA9IE1PREVfTUFOVUFMOwotCQkJc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IG1hbnVhbENvbXAyOwotCQkJbWFudWFsQ29tcC5zZXRWaXNpYmxlKHRydWUpOwotCQkJaWYgKG1hbnVhbCAhPSBudWxsKQotCQkJCW1hbnVhbC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJCi0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJLy8gcHJlZmVycmVkIHNlcnZlciBidXR0b24KLQkJCWZpbmFsIEJ1dHRvbiBwcmVmID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuQ0hFQ0sgfCBTV1QuV1JBUCk7Ci0JCQlwcmVmLnNldFRleHQoTWVzc2FnZXMud2l6U2VsZWN0U2VydmVyUHJlZmVycmVkKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRU5EKTsKLQkJCXByZWYuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCXByZWYuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0YXNrTW9kZWwucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfREVGQVVMVF9TRVJWRVIsIG5ldyBCb29sZWFuKHByZWYuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocHJlZiwgQ29udGV4dElkcy5TRUxFQ1RfU0VSVkVSX1BSRUZFUkVOQ0UpOwotCQl9Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRvZ2dsZU1vZGUoYnl0ZSBuZXdNb2RlKSB7Ci0JCWlmICghaXNWaXNpYmxlKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAobmV3TW9kZSA9PSBtb2RlKQotCQkJcmV0dXJuOwotCQkKLQkJbW9kZSA9IG5ld01vZGU7Ci0JCXdpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQotCQlpZiAobW9kZSA9PSBNT0RFX0VYSVNUSU5HKSB7Ci0JCQlzdGFja0xheW91dC50b3BDb250cm9sID0gZXhpc3RpbmdDb21wOwotCQkJZXhpc3RpbmdDb21wLnNldFNlbGVjdGlvbihleGlzdGluZ0NvbXAuZ2V0U2VsZWN0ZWRTZXJ2ZXIoKSk7Ci0JCX0gZWxzZSBpZiAobW9kZSA9PSBNT0RFX0RFVEVDVCkgewotCQkJc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGRldGVjdENvbXAyOwotCQkJZGV0ZWN0Q29tcC5zZXRWaXNpYmxlKHRydWUpOwotCQl9IGVsc2UgewotCQkJc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IG1hbnVhbENvbXAyOwotCQkJbWFudWFsQ29tcC5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JCXN0YWNrLmxheW91dCgpOwotCQlpZiAodGFza01vZGVsICE9IG51bGwpIHsKLQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoV2l6YXJkVGFza1V0aWwuVEFTS19NT0RFLCBuZXcgQnl0ZShtb2RlKSk7Ci0JCQl1cGRhdGVUYXNrTW9kZWwoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBIb3N0bmFtZUNvbXBvc2l0ZSBjcmVhdGVIb3N0Q29tcG9zaXRlKENvbXBvc2l0ZSBjb21wKSB7Ci0JCUhvc3RuYW1lQ29tcG9zaXRlIGhvc3RDb21wID0gbmV3IEhvc3RuYW1lQ29tcG9zaXRlKGNvbXAsIG5ldyBIb3N0bmFtZUNvbXBvc2l0ZS5JSG9zdG5hbWVTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhvc3RuYW1lU2VsZWN0ZWQoU3RyaW5nIGhvc3QpIHsKLQkJCQlsYXN0SG9zdG5hbWUgPSBob3N0OwotCQkJCWlmIChkZXRlY3RDb21wICE9IG51bGwpCi0JCQkJCWRldGVjdENvbXAuc2V0SG9zdChob3N0KTsKLQkJCQlpZiAobWFudWFsQ29tcCAhPSBudWxsKQotCQkJCQltYW51YWxDb21wLnNldEhvc3QoaG9zdCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJaWYgKGxhc3RIb3N0bmFtZSAhPSBudWxsKQotCQkJaG9zdENvbXAuc2V0SG9zdG5hbWUobGFzdEhvc3RuYW1lKTsKLQkJCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWhvc3RDb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBob3N0Q29tcDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdXRvQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wKSB7Ci0JCWRldGVjdENvbXAyID0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlkZXRlY3RDb21wMi5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCWRldGVjdEhvc3RDb21wID0gY3JlYXRlSG9zdENvbXBvc2l0ZShkZXRlY3RDb21wMik7Ci0JCQotCQlkZXRlY3RDb21wID0gbmV3IE5ld0RldGVjdFNlcnZlckNvbXBvc2l0ZShkZXRlY3RDb21wMiwgbmV3IE5ld0RldGVjdFNlcnZlckNvbXBvc2l0ZS5JU2VydmVyU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2ZXJTZWxlY3RlZChJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCi0JCWlmIChsYXN0SG9zdG5hbWUgIT0gbnVsbCkKLQkJCWRldGVjdENvbXAuc2V0SG9zdChsYXN0SG9zdG5hbWUpOwotCQllbHNlCi0JCQlkZXRlY3RDb21wLnNldEhvc3QoImxvY2FsaG9zdCIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMTUwOwotCQlkZXRlY3RDb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXhpc3RpbmdDb21wb3NpdGUoQ29tcG9zaXRlIGNvbXApIHsKLQkJZXhpc3RpbmdDb21wID0gbmV3IFNlcnZlckNvbXBvc2l0ZShjb21wLCBuZXcgU2VydmVyQ29tcG9zaXRlLlNlcnZlclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VydmVyU2VsZWN0ZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJCQl3aXphcmQuc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOwotCQkJCQotCQkJCS8vIGNoZWNrIGZvciBjb21wYXRpYmlsaXR5Ci0JCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIG1vZHVsZSAhPSBudWxsKSB7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gaXNTdXBwb3J0ZWRNb2R1bGUoc2VydmVyLCBtb2R1bGUpOwotCQkJCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCQkJCXdpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJCQkJZWxzZSBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKQotCQkJCQkJCXdpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCQkJCQllbHNlIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLklORk8pCi0JCQkJCQkJd2l6YXJkLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQkJCQlzZXJ2ZXIgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmIChleGlzdGluZ1dDICE9IG51bGwpIHsKLQkJCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5lcXVhbHMoZXhpc3RpbmdXQy5nZXRPcmlnaW5hbCgpKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJZXhpc3RpbmdXQyA9IG51bGw7Ci0JCQkJfQotCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQkJZXhpc3RpbmdXQyA9IHNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOwotCQkJCXVwZGF0ZVRhc2tNb2RlbCgpOwotCQkJfQotCQl9LCBtb2R1bGUsIGxhdW5jaE1vZGUpOwotCQlleGlzdGluZ0NvbXAuc2V0SW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zKHRydWUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMTUwOwotCQlleGlzdGluZ0NvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGF0dXMgb2Ygd2hldGhlciB0aGUgZ2l2ZW4gbW9kdWxlIGNvdWxkIGJlIGFkZGVkIHRvIHRoZSBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcmV0dXJuIGFuIElTdGF0dXMgcmVwcmVzZW50aW5nIHRoZSBlcnJvciBvciB3YXJuaW5nLCBvciBudWxsIGlmIHRoZXJlIGFyZSBubyBwcm9ibGVtcwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSVN0YXR1cyBpc1N1cHBvcnRlZE1vZHVsZShJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIsIElNb2R1bGUgbW9kdWxlKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBtb2R1bGUgIT0gbnVsbCkgewotCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCk7Ci0JCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7Ci0JCQlpZiAoIVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUoc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpLmdldE1vZHVsZVR5cGVzKCksIG10KSkgewotCQkJCVN0cmluZyB0eXBlID0gbXQuZ2V0TmFtZSgpOwotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JWZXJzaW9uTGV2ZWwsIG5ldyBPYmplY3RbXSB7IHR5cGUsIG10LmdldFZlcnNpb24oKSB9KSk7Ci0JCQl9Ci0JCQkKLQkJCUlNb2R1bGVbXSByb290TW9kdWxlcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXJvb3RNb2R1bGVzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKG1vZHVsZSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJcmV0dXJuIGNlLmdldFN0YXR1cygpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoVHJhY2UuV0FSTklORykgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TVFJJTkdfV0FSTklORywgIkNvdWxkIG5vdCBmaW5kIHJvb3QgbW9kdWxlIiwgZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJvb3RNb2R1bGVzICE9IG51bGwpIHsKLQkJCQlpZiAocm9vdE1vZHVsZXMubGVuZ3RoID09IDApCi0JCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgTWVzc2FnZXMuZXJyb3JSb290TW9kdWxlKTsKLQkJCQkKLQkJCQlpbnQgc2l6ZSA9IHJvb3RNb2R1bGVzLmxlbmd0aDsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJCQkJc3RhdHVzID0gc2VydmVyLmNhbk1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7cm9vdE1vZHVsZXNbaV19LCBudWxsLCBudWxsKTsKLQkJCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuaXNPSygpKQotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWlmIChUcmFjZS5XQVJOSU5HKSB7Ci0JCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1dBUk5JTkcsICJDb3VsZCBub3QgZmluZCByb290IG1vZHVsZSIsIGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghZm91bmQgJiYgc3RhdHVzICE9IG51bGwpCi0JCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFeGlzdGluZ1NlcnZlcigpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsIHx8IGxhdW5jaE1vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlNb2R1bGVUeXBlIG10ID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKTsKLQkJCQlpZiAoU2VydmVyVUlQbHVnaW4uaXNDb21wYXRpYmxlV2l0aExhdW5jaE1vZGUoc2VydmVyc1tpXSwgbGF1bmNoTW9kZSkgJiYKLQkJCQkJU2VydmVyVXRpbC5pc1N1cHBvcnRlZE1vZHVsZShzZXJ2ZXJzW2ldLmdldFNlcnZlclR5cGUoKS5nZXRSdW50aW1lVHlwZSgpLmdldE1vZHVsZVR5cGVzKCksIG10KSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNYW51YWxDb21wb3NpdGUoQ29tcG9zaXRlIGNvbXApIHsKLQkJbWFudWFsQ29tcDIgPSBuZXcgQ29tcG9zaXRlKGNvbXAsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHModGhpcywgNCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCW1hbnVhbENvbXAyLnNldExheW91dChsYXlvdXQpOwotCQltYW51YWxDb21wMi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCi0JCUlNb2R1bGVUeXBlIG10ID0gbW9kdWxlVHlwZTsKLQkJYm9vbGVhbiBpbmNsdWRlSW5jb21wYXRpYmxlID0gdHJ1ZTsKLQkJaWYgKG1vZHVsZVR5cGUgIT0gbnVsbCkKLQkJCWluY2x1ZGVJbmNvbXBhdGlibGUgPSBmYWxzZTsKLQkJCi0JCWlmIChtb2R1bGUgIT0gbnVsbCkKLQkJCW10ID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKTsKLQkJCi0JCW1hbnVhbENvbXAgPSBuZXcgTmV3TWFudWFsU2VydmVyQ29tcG9zaXRlKG1hbnVhbENvbXAyLCBuZXcgTmV3TWFudWFsU2VydmVyQ29tcG9zaXRlLklXaXphcmRIYW5kbGUyKCkgewotCQkJcHVibGljIHZvaWQgcnVuKGJvb2xlYW4gZm9yaywgYm9vbGVhbiBjYW5jZWxhYmxlLCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJd2l6YXJkLnJ1bihmb3JrLCBjYW5jZWxhYmxlLCBydW5uYWJsZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCQkJd2l6YXJkLnVwZGF0ZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSwgaW50IG5ld1R5cGUpIHsKLQkJCQl3aXphcmQuc2V0TWVzc2FnZShuZXdNZXNzYWdlLCBuZXdUeXBlKTsKLQkJCX0KLQkJfSwgbXQsIG1vZHVsZSwgc2VydmVyVHlwZUlkLCBpbmNsdWRlSW5jb21wYXRpYmxlLCBuZXcgTmV3TWFudWFsU2VydmVyQ29tcG9zaXRlLlNlcnZlclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VydmVyU2VsZWN0ZWQoSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyKSB7Ci0JCQkJdXBkYXRlVGFza01vZGVsKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBydW50aW1lU2VsZWN0ZWQoSVJ1bnRpbWUgcnVudGltZSkgewotCQkJCXVwZGF0ZVRhc2tNb2RlbCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWlmIChsYXN0SG9zdG5hbWUgIT0gbnVsbCkKLQkJCW1hbnVhbENvbXAuc2V0SG9zdChsYXN0SG9zdG5hbWUpOwotCQllbHNlCi0JCQltYW51YWxDb21wLnNldEhvc3QoImxvY2FsaG9zdCIpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDM2MDsKLQkJbWFudWFsQ29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQkKLQlwdWJsaWMgTmV3TWFudWFsU2VydmVyQ29tcG9zaXRlIGdldE5ld01hbnVhbFNlcnZlckNvbXBvc2l0ZSAoKXsKLQkJcmV0dXJuIG1hbnVhbENvbXA7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRhc2tNb2RlbCgpIHsKLQkJaWYgKHRhc2tNb2RlbCAhPSBudWxsKSB7Ci0JCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gZ2V0U2VydmVyKCk7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUiwgc2VydmVyKTsKLQkJCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUsIHNlcnZlci5nZXRSdW50aW1lKCkpOwotCQkJfSBlbHNlIHsKLQkJCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUiwgbnVsbCk7Ci0JCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FLCBudWxsKTsKLQkJCX0KLQkJfQotCQl3aXphcmQudXBkYXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFza01vZGVsKFRhc2tNb2RlbCBtb2RlbCkgewotCQl0YXNrTW9kZWwgPSBtb2RlbDsKLQkJdGFza01vZGVsLnB1dE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX01PREUsIG5ldyBCeXRlKG1vZGUpKTsKLQkJdXBkYXRlVGFza01vZGVsKCk7Ci0JfQotCi0JcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRTZXJ2ZXIoKSB7Ci0JCWlmIChtb2RlID09IE1PREVfRVhJU1RJTkcpCi0JCQlyZXR1cm4gZXhpc3RpbmdXQzsgLy9leGlzdGluZ0NvbXAuZ2V0U2VsZWN0ZWRTZXJ2ZXIoKTsKLQkJZWxzZSBpZiAobW9kZSA9PSBNT0RFX0RFVEVDVCkKLQkJCXJldHVybiBkZXRlY3RDb21wLmdldFNlcnZlcigpOwotCQllbHNlCi0JCQlyZXR1cm4gbWFudWFsQ29tcC5nZXRTZXJ2ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVJ1bnRpbWUgZ2V0UnVudGltZSgpIHsKLQkJaWYgKG1vZGUgPT0gTU9ERV9FWElTVElORykgewotCQkJSVNlcnZlciBzZXJ2ZXIgPSBleGlzdGluZ0NvbXAuZ2V0U2VsZWN0ZWRTZXJ2ZXIoKTsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gc2VydmVyLmdldFJ1bnRpbWUoKTsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgaWYgKG1vZGUgPT0gTU9ERV9ERVRFQ1QpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZQotCQkJcmV0dXJuIG1hbnVhbENvbXAuZ2V0UnVudGltZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQotCQlDb250cm9sW10gYyA9IGdldENoaWxkcmVuKCk7Ci0JCWlmIChjICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gYy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQlpZiAoY1tpXSAhPSBudWxsKQotCQkJCQljW2ldLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvU2VsZWN0Q2xpZW50Q29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9TZWxlY3RDbGllbnRDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4MjhlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9TZWxlY3RDbGllbnRDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJVSUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdXNlZCB0byBzZWxlY3QgYSBzZXJ2ZXIgY2xpZW50LgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0Q2xpZW50Q29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSB3aXphcmQ7Ci0JcHJvdGVjdGVkIFRhc2tNb2RlbCB0YXNrTW9kZWw7Ci0KLQkvLyB0aGUgbGlzdCBvZiBlbGVtZW50cyB0byBzZWxlY3QgZnJvbQotCXByb3RlY3RlZCBJQ2xpZW50W10gY2xpZW50czsKLQotCS8vIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudAotCXByb3RlY3RlZCBJQ2xpZW50IHNlbGVjdGVkQ2xpZW50OwotCi0JLy8gdGhlIHRhYmxlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzCi0JcHJvdGVjdGVkIFRhYmxlIGVsZW1lbnRUYWJsZTsKLQotCS8vIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2VsZWN0ZWQgY2xpZW50Ci0JcHJvdGVjdGVkIExhYmVsIGRlc2NyaXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFNlbGVjdENsaWVudENvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aXphcmQgYSB3aXphcmQgaGFuZGxlCi0JICogQHBhcmFtIHRhc2tNb2RlbCBhIHRhc2sgbW9kZWwKLQkgKi8KLQlwdWJsaWMgU2VsZWN0Q2xpZW50Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkLCBUYXNrTW9kZWwgdGFza01vZGVsKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLndpemFyZCA9IHdpemFyZDsKLQkJdGhpcy50YXNrTW9kZWwgPSB0YXNrTW9kZWw7Ci0JCXRyeSB7Ci0JCQljbGllbnRzID0gKElDbGllbnRbXSkgdGFza01vZGVsLmdldE9iamVjdChXaXphcmRUYXNrVXRpbC5UQVNLX0NMSUVOVFMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkKLQkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpelNlbGVjdENsaWVudFRpdGxlKTsKLQkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLndpelNlbGVjdENsaWVudERlc2NyaXB0aW9uKTsKLQkJd2l6YXJkLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19XSVpCQU5fU0VMRUNUX1NFUlZFUl9DTElFTlQpKTsKLQkJCi0JCWNyZWF0ZUNvbnRyb2woKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBVSSBvZiB0aGUgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHModGhpcywgNCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCXdocy5zZXRIZWxwKHRoaXMsIENvbnRleHRJZHMuU0VMRUNUX0NMSUVOVF9XSVpBUkQpOwotCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMud2l6U2VsZWN0Q2xpZW50TWVzc2FnZSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQkJZWxlbWVudFRhYmxlID0gbmV3IFRhYmxlKHRoaXMsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDgwOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJZWxlbWVudFRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWVsZW1lbnRUYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlU2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVNlbGVjdGlvbigpOwotCQkJCS8vVE9ETzogV2l6YXJkVXRpbC5kZWZhdWx0U2VsZWN0KGdldFdpemFyZCgpLCBTZWxlY3RDbGllbnRXaXphcmRQYWdlLnRoaXMpOwotCQkJfQotCQl9KTsKLQkJd2hzLnNldEhlbHAoZWxlbWVudFRhYmxlLCBDb250ZXh0SWRzLlNFTEVDVF9DTElFTlQpOwotCQotCQlpZiAoY2xpZW50cyAhPSBudWxsKSB7Ci0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCWludCBzaXplID0gY2xpZW50cy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShlbGVtZW50VGFibGUsIFNXVC5OT05FKTsKLQkJCQlpdGVtLnNldFRleHQoMCwgbGFiZWxQcm92aWRlci5nZXRUZXh0KGNsaWVudHNbaV0pKTsKLQkJCQlpdGVtLnNldEltYWdlKDAsIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoY2xpZW50c1tpXSkpOwotCQkJCWl0ZW0uc2V0RGF0YShjbGllbnRzW2ldKTsKLQkJCX0KLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlkZXNjcmlwdGlvbiA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuV1JBUCk7Ci0JCWRlc2NyaXB0aW9uLnNldFRleHQoIiIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDcwOwotCQlkZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSB0aGUgc2VsZWN0aW9uIG9mIGEgY2xpZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlbGVjdGlvbigpIHsKLQkJaW50IGluZGV4ID0gZWxlbWVudFRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlzZWxlY3RlZENsaWVudCA9IG51bGw7Ci0JCWVsc2UKLQkJCXNlbGVjdGVkQ2xpZW50ID0gY2xpZW50c1tpbmRleF07Ci0JCQotCQl0YXNrTW9kZWwucHV0T2JqZWN0KFdpemFyZFRhc2tVdGlsLlRBU0tfQ0xJRU5ULCBzZWxlY3RlZENsaWVudCk7Ci0JCWlmIChzZWxlY3RlZENsaWVudCAhPSBudWxsKQotCQkJd2l6YXJkLnNldE1lc3NhZ2UobnVsbCwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKLQkJZWxzZQotCQkJd2l6YXJkLnNldE1lc3NhZ2UoIiIsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkKLQkJU3RyaW5nIGRlc2MgPSBudWxsOwotCQlpZiAoc2VsZWN0ZWRDbGllbnQgIT0gbnVsbCkKLQkJCWRlc2MgPSBzZWxlY3RlZENsaWVudC5nZXREZXNjcmlwdGlvbigpOwotCQlpZiAoZGVzYyA9PSBudWxsKQotCQkJZGVzYyA9ICIiOwotCQlkZXNjcmlwdGlvbi5zZXRUZXh0KGRlc2MpOwotCQkKLQkJd2l6YXJkLnVwZGF0ZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9TZXJ2ZXJDcmVhdGlvbkNhY2hlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9TZXJ2ZXJDcmVhdGlvbkNhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMGUzOGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvU2VydmVyQ3JlYXRpb25DYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci0vKioKLSAqIEEgaGVscGVyIGNsYXNzIHVzZWQgdG8gY2FjaGUgdGhlIGNyZWF0aW9uIG9mIHNlcnZlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJDcmVhdGlvbkNhY2hlIHsKLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgSVNlcnZlcldvcmtpbmdDb3B5PiBjYWNoZTsKLQotCS8qKgotCSAqIFNlcnZlckNyZWF0aW9uQ2FjaGUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2VydmVyQ3JlYXRpb25DYWNoZSgpIHsKLQkJc3VwZXIoKTsKLQkJY2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElTZXJ2ZXJXb3JraW5nQ29weT4oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGtleSB0byB1c2UgZm9yIHRoZSBnaXZlbiBzZXJ2ZXIgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSB0aGUgc2VydmVyIHR5cGUKLQkgKiBAcGFyYW0gaXNMb2NhbGhvc3QgdHJ1ZSBpZiB0aGUgc2VydmVyIGlzIGxvY2FsCi0JICogQHJldHVybiB0aGUga2V5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0S2V5KElTZXJ2ZXJUeXBlIHR5cGUsIGJvb2xlYW4gaXNMb2NhbGhvc3QpIHsKLQkJcmV0dXJuIHR5cGUuZ2V0SWQoKSArICJ8IiArIGlzTG9jYWxob3N0ICsgInwiOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBzZXJ2ZXIgYW5kIHB1dCBpdCBpbiB0aGUgY2FjaGUuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgc2VydmVyIHR5cGUKLQkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUsIG9yIG51bGwKLQkgKiBAcGFyYW0gaXNMb2NhbGhvc3QgdHJ1ZSBpZiB0aGUgc2VydmVyIGlzIGxvY2FsCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHJldHVybiBhIHNlcnZlciB3b3JraW5nIGNvcHkKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyBJU2VydmVyV29ya2luZ0NvcHkgY3JlYXRlU2VydmVyKElTZXJ2ZXJUeXBlIHR5cGUsIElSdW50aW1lIHJ1bnRpbWUsIGJvb2xlYW4gaXNMb2NhbGhvc3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gdHlwZS5jcmVhdGVTZXJ2ZXIobnVsbCwgbnVsbCwgcnVudGltZSwgbW9uaXRvcik7Ci0JCWNhY2hlLnB1dChnZXRLZXkodHlwZSwgaXNMb2NhbGhvc3QpLCBzZXJ2ZXIpOwotCQlyZXR1cm4gc2VydmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBwcmV2aW91c2x5IGNhY2hlZCBzZXJ2ZXIsIGlmIG9uZSBleGlzdHMKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSB0aGUgc2VydmVyIHR5cGUKLQkgKiBAcGFyYW0gaXNMb2NhbGhvc3QgdHJ1ZSBpZiB0aGUgc2VydmVyIGlzIGxvY2FsCi0JICogQHJldHVybiBhIHdvcmtpbmcgY29weQotCSAqLwotCXB1YmxpYyBJU2VydmVyV29ya2luZ0NvcHkgZ2V0Q2FjaGVkU2VydmVyKElTZXJ2ZXJUeXBlIHR5cGUsIGJvb2xlYW4gaXNMb2NhbGhvc3QpIHsKLQkJdHJ5IHsKLQkJCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIgPSBjYWNoZS5nZXQoZ2V0S2V5KHR5cGUsIGlzTG9jYWxob3N0KSk7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJcmV0dXJuIHNlcnZlcjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvVGFza3NDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1Rhc2tzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Mzc0NjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvVGFza3NDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5Db250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50LlRhc2tzV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdXNlZCB0byBzZWxlY3Qgc2VydmVyIGFuZCBtb2R1bGUgdGFza3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrc0NvbXBvc2l0ZSBleHRlbmRzIFNjcm9sbGVkQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSB3aXphcmQ7Ci0KLQkvLyB0aGUgbGlzdCBvZiBlbGVtZW50cyB0byBzZWxlY3QgZnJvbQotCXByb3RlY3RlZCBMaXN0IHRhc2tzOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY3JlYXRlZDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBUYXNrc0NvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aXphcmQgYSB3aXphcmQgaGFuZGxlCi0JICovCi0JcHVibGljIFRhc2tzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJdGhpcy53aXphcmQgPSB3aXphcmQ7Ci0JCQotCQl3aXphcmQuc2V0VGl0bGUoTWVzc2FnZXMud2l6VGFza1RpdGxlKTsKLQkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLndpelRhc2tEZXNjcmlwdGlvbik7Ci0JCXdpemFyZC5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfV0laQkFOX1NFTEVDVF9TRVJWRVIpKTsKLQkJCi0JCS8vY3JlYXRlQ29udHJvbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhc2tzKExpc3QgdGFza3MpIHsKLQkJdGhpcy50YXNrcyA9IHRhc2tzOwotCQkKLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQljaGlsZHJlbltpXS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWNyZWF0ZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBVSSBvZiB0aGUgcGFnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQlpZiAoY3JlYXRlZCkKLQkJCXJldHVybjsKLQkJCi0JCXNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkJCQotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotCQlzZXRDb250ZW50KGNvbXApOwotCQlUYXNrc0xheW91dCBsYXlvdXQgPSBuZXcgVGFza3NMYXlvdXQoU1dUVXRpbC5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHModGhpcywgNCkpOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQljb21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIENvbnRleHRJZHMuU0VMRUNUX1RBU0tfV0laQVJEKTsKLQkJCi0JCWludCBzaXplID0gMDsKLQkJaWYgKHRhc2tzICE9IG51bGwpCi0JCQlzaXplID0gdGFza3Muc2l6ZSgpOwotCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IHRhc2tzLmdldChpKTsKLQkJCWZpbmFsIFRhc2tzV2l6YXJkRnJhZ21lbnQuVGFza0luZm8gc3RpID0gKFRhc2tzV2l6YXJkRnJhZ21lbnQuVGFza0luZm8pIG9iajsKLQkJCWZpbmFsIEJ1dHRvbiBjaGVja2JveCA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLIHwgU1dULldSQVApOwotCQkJU3RyaW5nIGxhYmVsID0gc3RpLnRhc2syLmdldExhYmVsKCk7Ci0JCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCQljaGVja2JveC5zZXRUZXh0KGxhYmVsKTsKLQkJCWVsc2UKLQkJCQljaGVja2JveC5zZXRUZXh0KE1lc3NhZ2VzLmVsZW1lbnRVbmtub3duTmFtZSk7Ci0JCQotCQkJY2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXN0aS5zZXRTZWxlY3RlZChjaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlzdGkuc2V0U2VsZWN0ZWQoY2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlMYWJlbCBkZXNjcmlwdGlvbiA9IG5ldyBMYWJlbChjb21wLCBTV1QuV1JBUCk7Ci0JCQlTdHJpbmcgZGVzYyA9IHN0aS50YXNrMi5nZXREZXNjcmlwdGlvbigpOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkKLQkJCQlkZXNjcmlwdGlvbi5zZXRUZXh0KGRlc2MpOwotCQkJZWxzZQotCQkJCWRlc2NyaXB0aW9uLnNldFRleHQoTWVzc2FnZXMuZWxlbWVudFVua25vd25OYW1lKTsKLQkJCQotCQkJaWYgKHN0aS5raW5kID09IFB1Ymxpc2hPcGVyYXRpb24uUkVRVUlSRUQpIHsKLQkJCQljaGVja2JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJY2hlY2tib3guc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJZGVzY3JpcHRpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9IGVsc2UKLQkJCQljaGVja2JveC5zZXRTZWxlY3Rpb24oc3RpLmlzU2VsZWN0ZWQoKSk7Ci0JCX0KLQkJCi0JCWlmIChzaXplID09IDApCi0JCQlpZiAoVHJhY2UuU0VWRVJFKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU1RSSU5HX1NFVkVSRSwgIlRhc2sgY29tcG9zaXRlIGFwcGVhcmVkIHdpdGggbm8gdGFza3MhIik7Ci0JCQl9Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwotCQkKLQkJc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQkJc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0JCQotCQlzZXRNaW5TaXplKGNvbXAuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0JCWxheW91dCh0cnVlLCB0cnVlKTsKLQkJCi0JCWNyZWF0ZWQgPSB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9UYXNrc0xheW91dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvVGFza3NMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0ZDQ1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9UYXNrc0xheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrc0xheW91dCBleHRlbmRzIExheW91dCB7Ci0JcHJpdmF0ZSBpbnQgdmVydGljYWxTcGFjaW5nOwotCi0JcHVibGljIFRhc2tzTGF5b3V0KGludCB2ZXJ0aWNhbFNwYWNpbmcpIHsKLQkJdGhpcy52ZXJ0aWNhbFNwYWNpbmcgPSB2ZXJ0aWNhbFNwYWNpbmc7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0I2NvbXB1dGVTaXplKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgaW50LCBpbnQsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJLy9yZXR1cm4gbmV3IFBvaW50KHdIaW50LCBoSGludCk7Ci0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCQkKLQkJaW50IHkgPSA1OwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChpICUgMiA9PSAwKSB7Ci0JCQkJCWludCBoID0gY2hpbGRyZW5baV0uY29tcHV0ZVNpemUod0hpbnQsIFNXVC5ERUZBVUxUKS55OwotCQkJCQl5ICs9IGggKyB2ZXJ0aWNhbFNwYWNpbmcgLyAyOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludCBoID0gTWF0aC5tYXgoNDUsIGNoaWxkcmVuW2ldLmNvbXB1dGVTaXplKHdIaW50LCBTV1QuREVGQVVMVCkueSk7Ci0JCQkJCXkgKz0gaCArIHZlcnRpY2FsU3BhY2luZzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBQb2ludCgyMDAsIHkpOyAvLyArIHZlcnRpY2FsU3BhY2luZyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0I2xheW91dChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJUmVjdGFuZ2xlIHIgPSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOwotCQkKLQkJaW50IHkgPSByLnkgKyA1OwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChpICUgMiA9PSAwKSB7Ci0JCQkJCWludCBoID0gY2hpbGRyZW5baV0uY29tcHV0ZVNpemUoci53aWR0aCAtIDEwLCBTV1QuREVGQVVMVCkueTsKLQkJCQkJY2hpbGRyZW5baV0uc2V0Qm91bmRzKHIueCArIDUsIHksIHIud2lkdGggLSAxMCwgaCk7Ci0JCQkJCXkgKz0gaCArIHZlcnRpY2FsU3BhY2luZyAvIDI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW50IGggPSBNYXRoLm1heCg0NSwgY2hpbGRyZW5baV0uY29tcHV0ZVNpemUoci53aWR0aCAtIDI1LCBTV1QuREVGQVVMVCkueSk7Ci0JCQkJCWNoaWxkcmVuW2ldLnNldEJvdW5kcyhyLnggKyAyMCwgeSwgci53aWR0aCAtIDI1LCBoKTsKLQkJCQkJeSArPSBoICsgdmVydGljYWxTcGFjaW5nOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9Xb3Jrc3BhY2VSdW5uYWJsZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1dvcmtzcGFjZVJ1bm5hYmxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODA1MTlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1dvcmtzcGFjZVJ1bm5hYmxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLS8qKgotICogSVJ1bm5hYmxlV2l0aFByb2dyZXNzQWRhcHRlciB0byBhbGxvdyBpdCB0byBydW4gYW4gSVdvcmtzcGFjZVJ1bm5hYmxlLgotICovCi1wdWJsaWMgY2xhc3MgV29ya3NwYWNlUnVubmFibGVBZGFwdGVyIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQlwcml2YXRlIElXb3Jrc3BhY2VSdW5uYWJsZSB3b3Jrc3BhY2VSdW5uYWJsZTsKLQkKLQlwdWJsaWMgV29ya3NwYWNlUnVubmFibGVBZGFwdGVyKElXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSkgewotCQl3b3Jrc3BhY2VSdW5uYWJsZSA9IHJ1bm5hYmxlOwotCX0KLQotCS8qCi0JICogQHNlZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MjcnVuKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih3b3Jrc3BhY2VSdW5uYWJsZSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmFiYWVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+VGhlIHNlcnZlciB0b29scyBVSS48L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5TZXJ2ZXJVSUNvcmUgaXMgdGhlIG1haW4gZW50cnktcG9pbnQgZm9yIHRoZSBBUEkuIEZyb20gaGVyZSwgY2xpZW50cwotY2FuIGdldCB0aGUgd2l6YXJkIHBhZ2VzIGZvciBhIHBhcnRpY3VsYXIgc2VydmVyIHR5cGUsIGdldCBhIGxhYmVsCi1wcm92aWRlciBmb3IgYWxsIHNlcnZlciB0eXBlcywgb3IgbGF1bmNoIFJ1biBvbiBTZXJ2ZXIgZGlyZWN0bHkuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+U2VydmVyVUlVdGlsIHByb3ZpZGVzIHV0aWxpdHkgbWV0aG9kcy4gQ3VycmVudGx5LCB0aGlzIGlzIGxpbWl0ZWQgdG8KLWxhdW5jaGluZyB0aGUgc2VydmVyIHJ1bnRpbWUgd2l6YXJkIGFuZCBlZGl0aW5nIGFuIGV4aXN0aW5nIHNlcnZlcgotcnVudGltZS48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiIGlzIGEgZ2VuZXJpYyBzZXJ2ZXIgdG9vbHMgdGFiIHRoYXQgY2FuCi1iZSB1c2VkIGluIGxhdW5jaCBjb25maWd1cmF0aW9uIHRhYiBncm91cHMgZm9yIGEgc2VydmVyIGxhdW5jaC4gSXQgc2hvd3MKLWluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJ2ZXIgdG8gdGhlIHVzZXIuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczZTI2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLTxoZWFkPgotCTwhLS0gIEVzY2FwZSB0byB0aGUgcm9vdCBvZiB5b3VyIHNvdXJjZSBmb2xkZXIgIC0tPgotCTxtZXRhCi0JCW5hbWU9InJvb3QiCi0JCWNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLQk8dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08YWJzdHJhY3Q+VGhlIHNlcnZlciB0b29scyBVSS48L2Fic3RyYWN0PgotCi08cD5TZXJ2ZXJVSUNvcmUgaXMgdGhlIG1haW4gZW50cnktcG9pbnQgZm9yIHRoZSBBUEkuIEZyb20gaGVyZSwgY2xpZW50cwotY2FuIGdldCB0aGUgd2l6YXJkIHBhZ2VzIGZvciBhIHBhcnRpY3VsYXIgc2VydmVyIHR5cGUsIGdldCBhIGxhYmVsCi1wcm92aWRlciBmb3IgYWxsIHNlcnZlciB0eXBlcywgb3IgbGF1bmNoIFJ1biBvbiBTZXJ2ZXIgZGlyZWN0bHkuPC9wPgotCi08cD5TZXJ2ZXJVSVV0aWwgcHJvdmlkZXMgdXRpbGl0eSBtZXRob2RzLiBDdXJyZW50bHksIHRoaXMgaXMgbGltaXRlZCB0bwotbGF1bmNoaW5nIHRoZSBzZXJ2ZXIgcnVudGltZSB3aXphcmQgYW5kIGVkaXRpbmcgYW4gZXhpc3Rpbmcgc2VydmVyCi1ydW50aW1lLjwvcD4KLQotPHA+U2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYiBpcyBhIGdlbmVyaWMgc2VydmVyIHRvb2xzIHRhYiB0aGF0IGNhbgotYmUgdXNlZCBpbiBsYXVuY2ggY29uZmlndXJhdGlvbiB0YWIgZ3JvdXBzIGZvciBhIHNlcnZlciBsYXVuY2guIEl0IHNob3dzCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VydmVyIHRvIHRoZSB1c2VyLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9JV2l6YXJkSGFuZGxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS93aXphcmQvSVdpemFyZEhhbmRsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWM5NzUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9JV2l6YXJkSGFuZGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLS8qKgotICogQSB3aXphcmQgaGFuZGxlLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdpemFyZEhhbmRsZSBleHRlbmRzIElNZXNzYWdlUHJvdmlkZXIgewotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHdpemFyZCBlcnJvciBtZXNzYWdlcyBhbmQgYnV0dG9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHRpdGxlIG9mIHRoaXMgd2l6YXJkIHBhZ2UuCi0JICogIAotCSAqIEBwYXJhbSB0aXRsZSB0aGUgdGl0bGUgb2YgdGhlIHdpemFyZCBwYWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKTsKLQotCS8qKgotCSAqIFRoZSBwYWdlJ3MgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIGRlc2MgdGhlIHBhZ2UncyBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjKTsKLQotCS8qKgotCSAqIFRoZSBwYWdlJ3MgaW1hZ2UgZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2UgdGhlIHBhZ2UncyBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBpbWFnZSk7Ci0KLQkvKioKLQkgKiBTZXQgYW4gZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdNZXNzYWdlIHRoZSBuZXcgbWVzc2FnZQotCSAqIEBwYXJhbSBuZXdUeXBlIHRoZSBuZXcgdHlwZSwgZnJvbSBJU3RhdHVzCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSwgaW50IG5ld1R5cGUpOwotCi0JLyoqCi0JICogRXhlY3V0ZSBhIHJ1bm5hYmxlIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUgd2l6YXJkLiBUaGlzIHdpbGwgdHlwaWNhbGx5Ci0JICogZGlzYWJsZSB0aGUgd2l6YXJkIHdoaWxlIHRoZSBydW5uYWJsZSBpcyBydW5uaW5nLCBhbmQgcHJvdmlkZSBhIHByb2dyZXNzCi0JICogbW9uaXRvciBmb3IgdGhlIHVzZXIuICAKLQkgKiAKLQkgKiBAcGFyYW0gZm9yayB0cnVlIGlmIGEgc2VwYXJhdGUgdGhyZWFkIHNob3VsZCBiZSB1c2VkCi0JICogQHBhcmFtIGNhbmNlbGFibGUgdHJ1ZSBpZiBpdCBzaG91bGQgYmUgY2FuY2VsYWJsZQotCSAqIEBwYXJhbSBydW5uYWJsZSB0aGUgcnVubmFibGUKLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHRocm93biBpZiBpdCBpcyBpbnRlcnJ1cHRlZAotCSAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlcmUgaXMgYW4gZXJyb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9TZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9TZXJ2ZXJDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjNjBkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS93aXphcmQvU2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLkFic3RyYWN0VUlDb250cm9sOwotCi0vKioKLSAqIEEgbW9kaWZpZXIgY2xhc3MgdGhhdCBhbGxvdyBhZG9wdGVyIHRvIG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBzZXJ2ZXIgY3JlYXRpb24gd2l6YXJkIHBhZ2UuCi0gKiBJdCBhbHNvIGhhcyBwbGFjZXMgd2hlcmUgYWRvcHRlciBjYW4gaW5qZWN0IGN1c3RvbSBHVUkgaW50byB0aGUgc2VydmVyIGNyZWF0aW9uIHdpemFyZCBwYWdlLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyQ3JlYXRpb25XaXphcmRQYWdlRXh0ZW5zaW9uIGV4dGVuZHMgQWJzdHJhY3RVSUNvbnRyb2wgewotCXByb3RlY3RlZCBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyV2MgPSBudWxsOwotCQotCS8qKgotCSAqIFRoZSBsaXN0IG9mIHBvc2l0aW9uIG9uIHRoZSBzZXJ2ZXIgY3JlYXRpb24gd2l6YXJkIHBhZ2UgdGhhdCBhbGxvd3MgaW5zZXJ0aW5nIGN1c3RvbSBHVUkuCi0JICogVUlfUE9TSVRJT04KLQkgKi8KLQlwdWJsaWMgZW51bSBVSV9QT1NJVElPTiB7IFRPUCwgTUlERExFLCBCT1RUT00gfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBjdXN0b21lciBVSSBvbiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLgotCSAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgcG9zaXRpb24gb24gdGhlIHNlcnZlciBjcmVhdGlvbiB3aXphcmQgcGFnZSB0aGF0IGFsbG93cyBpbnNlcnRpbmcgY3VzdG9tIEdVSS4KLQkgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBjb21wb3NpdGUuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY3JlYXRlQ29udHJvbChVSV9QT1NJVElPTiBwb3NpdGlvbiwgQ29tcG9zaXRlIHBhcmVudCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBzZXJ2ZXIgd29ya2luZyBjb3B5IHRvIHRoZSBjb250cm9sIHRvIGFsbG93IGV4dGVuc2lvbiB0byBzdG9yZSB0aGUgZXh0ZW5zaW9uIHZhbHVlcy4KLQkgKiBAcGFyYW0gY3VyU2VydmVyV2MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJXb3JraW5nQ29weShJU2VydmVyV29ya2luZ0NvcHkgY3VyU2VydmVyV2MpIHsKLQkJc2VydmVyV2MgPSBjdXJTZXJ2ZXJXYzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS93aXphcmQvV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9XaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzdlNTA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9XaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwotLyoqCi0gKiBBIHdpemFyZCBmcmFnbWVudCBpcyBhIG5vZGUgd2l0aGluIGEgd2l6YXJkIHRoYXQgcHJvdmlkZXMgYSBjb21wbGV0ZWx5Ci0gKiBleHRlbmRhYmxlIHdpemFyZCBmbG93IGJ5IHN1cHBvcnRpbmcgYSBmbGV4aWJsZSB0cmVlIHN0cnVjdHVyZSBmb3IgdGhlCi0gKiBwYWdlcy4gQXMgdGhlIHVzZXIgd2Fsa3MgcGFnZXMgdGhyb3VnaCB0aGUgd2l6YXJkLCB0aGV5IGFyZSBhY3R1YWxseQotICogdHJhdmVyc2luZyB0aGUgbm9kZXMgb2YgYSB0cmVlLCBhbmQgZWFjaCBub2RlIGNhbiBhZGQgb3IgcmVtb3ZlIGNoaWxkcmVuCi0gKiBhdCBhbnkgdGltZS4KLSAqIAotICogRWFjaCBub2RlIG1heSBiZSBub24tVUkgKHVzZWZ1bCBmb3IgaW5qZWN0aW5nIGJlaGF2aW91ciBpbnRvIHRoZSB0cmVlKQotICogb3IgY29udGFpbiBhIHNpbmdsZSB3aXphcmQgcGFnZSAoQHNlZSBoYXNDb21wb3NpdGUoKSBhbmQKLSAqIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUsIElXaXphcmRIYW5kbGUpKS4gVGhlIG5vZGUgbWF5IGFsc28gaGF2ZQotICogY2hpbGRyZW4gKEBzZWUgZ2V0Q2hpbGRGcmFnbWVudHMoKSwgd2hpY2ggc2hvdWxkIGJlIHVwZGF0ZWQgb3IgcmVmcmVzaGVkCi0gKiB3aGVuZXZlciB0aGUgdXBkYXRlQ2hpbGRGcmFnbWVudHMoKSBtZXRob2QgaXMgY2FsbGVkIGJ5IGFub3RoZXIgbm9kZSB0bwotICogbGV0IHRoaXMgbm9kZSBrbm93IHRoYXQgaXQncyBzdGF0ZSBtYXkgaGF2ZSBjaGFuZ2VkLgotICogCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgYSBjcmVhdGVDaGlsZEZyYWdtZW50cygpIG1ldGhvZCB0byBhbGxvdyB0aGUKLSAqIGZyYWdtZW50IHRvIGFkZCBpdCdzIGNoaWxkcmVuIGludG8gdGhlIHRyZWUuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBtYXkKLSAqIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhcyB0aGUgdHJlZSBpcyB1cGRhdGVkIGFuZCBpdCBtdXN0IHJldHVybiB0aGUKLSAqIHNhbWUgaW5zdGFuY2Ugb2YgYW55IGNoaWxkcmVuIHRoYXQgaGF2ZSBwcmV2aW91c2x5IGJlZW4gcmV0dXJuZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdpemFyZEZyYWdtZW50IHsKLQlwcml2YXRlIFRhc2tNb2RlbCB0YXNrTW9kZWw7Ci0JcHJpdmF0ZSBib29sZWFuIGlzQ29tcGxldGUgPSB0cnVlOwotCXByaXZhdGUgTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdEltcGw7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgZnJhZ21lbnQgaGFzIGFuIGFzc29jaWF0ZWQgVUksCi0JICogYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBoYXMgYSBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb21wb3NpdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnJhZ21lbnQuCi0JICogVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgd2hlbiBoYXNDb21wb3NpdGUoKSByZXR1cm5zIHRydWUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBhIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gaGFuZGxlIGEgd2l6YXJkIGhhbmRsZQotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgY29tcG9zaXRlCi0JICovCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSBoYW5kbGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgd2l6YXJkIHRhc2sgbW9kZWwuCi0JICogPHA+Ci0JICogQSB0YXNrIG1vZGVsIGlzIHNoYXJlZCBieSBhbGwgZnJhZ21lbnRzIGluIHRoZSB3aXphcmQgYW5kIGlzIHVzZWQgdG8gc2hhcmUKLQkgKiBkYXRhLiBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3ZlcmFsbCB0YXNrIGZsb3cgYW5kIGFsbG93cwotCSAqIGZyYWdtZW50cyB0byBzdG9yZSBhbmQgcmV0cmlldmUgZGF0YS4gSXRzIHVzYWdlIGFsbG93cyBtdWx0aXBsZSBmcmFnbWVudHMKLQkgKiB0byBiZSBjaGFpbmVkIHRvZ2V0aGVyIGFuZCBzaGFyZSBkYXRhIGZyb20gdGhlIG91dHB1dCBvZiBvbmUgZnJhZ21lbnQgdG8KLQkgKiB0aGUgaW5wdXQgb2YgYW5vdGhlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHRhc2tNb2RlbCB0aGUgdGFzayBtb2RlbAotCSAqIEBzZWUgI2dldFRhc2tNb2RlbCgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFza01vZGVsKFRhc2tNb2RlbCB0YXNrTW9kZWwpIHsKLQkJdGhpcy50YXNrTW9kZWwgPSB0YXNrTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHRhc2sgbW9kZWwuCi0JICogCi0JICogQHJldHVybiB0aGUgdGFzayBtb2RlbAotCSAqIEBzZWUgI3NldFRhc2tNb2RlbChUYXNrTW9kZWwpCi0JICovCi0JcHVibGljIFRhc2tNb2RlbCBnZXRUYXNrTW9kZWwoKSB7Ci0JCXJldHVybiB0YXNrTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHdpemFyZCB0aGF0IHRoaXMgZnJhZ21lbnQgYmVsb25ncyB0byBoYXMgdHJhdmVyc2VkCi0JICogaW50byB0aGlzIHdpemFyZCBmcmFnbWVudC4gSXQgaXMgY2FsbGVkIHRvIGdpdmUgdGhlIGZyYWdtZW50IHRoZQotCSAqIG9wcG9ydHVuaXR5IHRvIGluaXRpYWxpemUgYW55IHZhbHVlcyBzaG93biBpbiB0aGUgY29tcG9zaXRlIG9yCi0JICogdXBkYXRlIHRoZSB0YXNrIG1vZGVsLgotCSAqIDxwPgotCSAqIFdoZW4gZmluaXNoIGlzIHByZXNzZWQsIHRoZSBjdXJyZW50IGZyYWdtZW50IGlzIGV4aXQoKWVkLCBhbmQgdGhlbgotCSAqIHBlcmZvcm1GaW5pc2goKSBpcyBjYWxsZWQgb24gYWxsIG9mIHRoZSBmcmFnbWVudHMgaW4gdGhlIHRyZWUuCi0JICogZW50ZXIoKSBhbmQgZXhpdCgpIGFyZSBub3QgY2FsbGVkIG9uIHRoZSByZW1haW5pbmcgZnJhZ21lbnRzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlbnRlcigpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSB3aXphcmQgdGhhdCB0aGlzIGZyYWdtZW50IGJlbG9uZ3MgdG8gaGFzIHRyYXZlcnNlZAotCSAqIG91dCBvZiB0aGlzIHdpemFyZCBmcmFnbWVudC4gSXQgaXMgY2FsbGVkIHRvIGdpdmUgdGhlIGZyYWdtZW50IHRoZQotCSAqIG9wcG9ydHVuaXR5IHRvIHNhdmUgYW55IHZhbHVlcyBlbnRlcmVkIGludG8gdGhlIGNvbXBvc2l0ZSBvcgotCSAqIHVwZGF0ZSB0aGUgdGFzayBtb2RlbC4KLQkgKiA8cD4KLQkgKiBXaGVuIGZpbmlzaCBpcyBwcmVzc2VkLCB0aGUgY3VycmVudCBmcmFnbWVudCBpcyBleGl0KCllZCwgYW5kIHRoZW4KLQkgKiBwZXJmb3JtRmluaXNoKCkgaXMgY2FsbGVkIG9uIGFsbCBvZiB0aGUgZnJhZ21lbnRzIGluIHRoZSB0cmVlLgotCSAqIGVudGVyKCkgYW5kIGV4aXQoKSBhcmUgbm90IGNhbGxlZCBvbiB0aGUgcmVtYWluaW5nIGZyYWdtZW50cy4gCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGV4aXQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgd2l6YXJkIHRoYXQgdGhpcyBmcmFnbWVudCBiZWxvbmdzIHRvIGlzIGZpbmlzaGVkLgotCSAqIEFmdGVyIGV4aXQoKWluZyB0aGUgY3VycmVudCBwYWdlLCBhbGwgZnJhZ21lbnQncyBwZXJmb3JtRmluaXNoKCkKLQkgKiBtZXRob2RzIGFyZSBjYWxsZWQgaW4gb3JkZXIuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgbm90IGNhbGxlZCBvbiB0aGUgVUkgdGhyZWFkIGFuZCBtdXN0IG5vdCBhY2Nlc3MgdGhlCi0JICogY29tcG9zaXRlLiBOb3Qgb25seSBtaWdodCB0aGUgdXNlciBuZXZlciBoYXZlIGFjY2Vzc2VkIHRoZSBmcmFnbWVudCdzCi0JICogY29tcG9zaXRlLCBidXQgdGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBhc3luY2hyb25vdXNseSBvbiBhIGpvYgotCSAqIG9uY2UgdGhlIHdpemFyZCBoYXMgY2xvc2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSB3aXphcmQgdGhhdCB0aGlzIGZyYWdtZW50IGJlbG9uZ3MgdG8gaXMgY2FuY2VsZWQuCi0JICogQWZ0ZXIgZXhpdCgpaW5nIHRoZSBjdXJyZW50IHBhZ2UsIGFsbCBmcmFnbWVudCdzIHBlcmZvcm1DYW5jZWwoKQotCSAqIG1ldGhvZHMgYXJlIGNhbGxlZCBpbiBvcmRlci4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQgYW5kIG11c3Qgbm90IGFjY2VzcyB0aGUKLQkgKiBjb21wb3NpdGUuIE5vdCBvbmx5IG1pZ2h0IHRoZSB1c2VyIG5ldmVyIGhhdmUgYWNjZXNzZWQgdGhlIGZyYWdtZW50J3MKLQkgKiBjb21wb3NpdGUsIGJ1dCB0aGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGFzeW5jaHJvbm91c2x5IG9uIGEgam9iCi0JICogb25jZSB0aGUgd2l6YXJkIGhhcyBjbG9zZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQ2FuY2VsKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgZnJhZ21lbnRzLiBDaGlsZCBmcmFnbWVudHMgY29tZSBkaXJlY3RseSBhZnRlciB0aGlzIGZyYWdtZW50Ci0JICogaW4gdGhlIHdpemFyZCBmbG93LgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGNoaWxkIGZyYWdtZW50cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldENoaWxkRnJhZ21lbnRzKCkgewotCQlpZiAobGlzdEltcGwgPT0gbnVsbCkgewotCQkJbGlzdEltcGwgPSBuZXcgQXJyYXlMaXN0PFdpemFyZEZyYWdtZW50PigpOwotCQkJY3JlYXRlQ2hpbGRGcmFnbWVudHMobGlzdEltcGwpOwotCQl9Ci0JCXJldHVybiBsaXN0SW1wbDsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gZ2l2ZSB0aGUgZnJhZ21lbnQgYSBjaGFuY2UgdG8gdXBkYXRlIGl0J3MgY2hpbGQgZnJhZ21lbnRzIGluCi0JICogcmVzcG9uc2UgdG8gb3RoZXIgY2hhbmdlcyB3aXRoaW4gdGhlIHdpemFyZCBvciB0YXNrIG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUNoaWxkRnJhZ21lbnRzKCkgewotCQlsaXN0SW1wbCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBnZXRDaGlsZEZyYWdtZW50cygpIHRvCi0JICogYWxsb3cgdGhpcyBmcmFnbWVudCB0byBhZGQgaXQncyBjaGlsZHJlbi4gVGhpcyBtZXRob2QgbXVzdCBjYWNoZSBhbmQKLQkgKiByZXR1cm4gdGhlIHNhbWUgaW5zdGFuY2Ugb2YgYW55IGNoaWxkIGZyYWdtZW50IGNyZWF0ZWQuIElmIG5ldwotCSAqIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBlYWNoIHRpbWUgdGhlIHdpemFyZCBpcyB1cGRhdGVkLCB0aGUgZW5hYmxlbWVudAotCSAqIHN0YXRlIGFuZCB0aGUgZmxvdyBvZiB0aGUgd2l6YXJkIHdpbGwgYmUgaW5jb3JyZWN0LiAKLQkgKiAKLQkgKiBAcGFyYW0gbGlzdCBhIGxpc3QgdG8gYWRkIHRoZSBjaGlsZCBmcmFnbWVudHMgdG8KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBmcmFnbWVudCBpcyBjb21wbGV0ZSAoY2FuIGZpbmlzaCkuIElmIGl0IGlzCi0JICogY29tcGxldGUgdGhlIHVzZXIgd2lsbCBiZSBhbGxvd2VkIHRvIGdvIHRvIHRoZSBuZXh0IGZyYWdtZW50IG9yCi0JICogZmluaXNoIHRoZSB3aXphcmQuIElmIHRoZSBmcmFnbWVudCBpcyBub3QgY29tcGxldGUsIHRoZSBOZXh0IGJ1dHRvbgotCSAqIHdpbGwgYmUgZGlzYWJsZWQuIElmIHRoZSBmcmFnbWVudCBpcyBjb21wbGV0ZSBidXQgYW5vdGhlciBmcmFnbWVudAotCSAqIGlzIG5vdCBjb21wbGV0ZSwgdGhlIEZpbmlzaCBidXR0b24gd2lsbCBub3QgYmUgZW5hYmxlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmcmFnbWVudCBpcyBjb21wbGV0ZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCXJldHVybiBpc0NvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgaXNDb21wbGV0ZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcGxldGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZyYWdtZW50IGlzIGNvbXBsZXRlLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29tcGxldGUoYm9vbGVhbiBjb21wbGV0ZSkgewotCQl0aGlzLmlzQ29tcGxldGUgPSBjb21wbGV0ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvd2l6YXJkL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NjU3YjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvd2l6YXJkL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+V2l6YXJkIGFuZCB0YXNrIHN1cHBvcnQgZm9yIHRoZSBzZXJ2ZXIgdG9vbHMgVUkuPC9wPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+V2l6YXJkRnJhZ21lbnQgaXMgZXh0ZW5kZWQgdG8gcHJvdmlkZSBhIHN1YnRyZWUgb2Ygd2l6YXJkIHBhZ2VzIG9yIHRhc2tzCi10aGF0IGNhbiBiZSBpbnNlcnRlZCBpbnRvIGEgbGFyZ2VyIHdpemFyZCBmbG93LiBUYXNrV2l6YXJkIGlzIHRoZSBzdGFuZGFyZAotd2l6YXJkIHRoYXQga25vd3MgaG93IHRvIGhhbmRsZSBXaXphcmRGcmFnbWVudHMgYW5kIGRpc3BsYXkgdGhlbSBpbiBvcmRlcgotd2l0aGluIGEgc2luZ2xlIHdpemFyZC4gSXQgdXNlcyB0aGUgVGFza1dpemFyZFBhZ2VzIHRvIGRpc3BsYXkgdGhlIHdpemFyZAotZnJhZ21lbnQncyBjb21wb3NpdGVzIHdpdGhpbiB0aGUgd2l6YXJkLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA0MzMzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS93aXphcmQvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci08aGVhZD4KLQk8IS0tICBFc2NhcGUgdG8gdGhlIHJvb3Qgb2YgeW91ciBzb3VyY2UgZm9sZGVyICAtLT4KLQk8bWV0YQotCQluYW1lPSJyb290IgotCQljb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0JPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotPGFic3RyYWN0PldpemFyZCBhbmQgdGFzayBzdXBwb3J0IGZvciB0aGUgc2VydmVyIHRvb2xzIFVJLjwvYWJzdHJhY3Q+Ci0KLTxwPldpemFyZEZyYWdtZW50IGlzIGV4dGVuZGVkIHRvIHByb3ZpZGUgYSBzdWJ0cmVlIG9mIHdpemFyZCBwYWdlcyBvciB0YXNrcwotdGhhdCBjYW4gYmUgaW5zZXJ0ZWQgaW50byBhIGxhcmdlciB3aXphcmQgZmxvdy4gVGFza1dpemFyZCBpcyB0aGUgc3RhbmRhcmQKLXdpemFyZCB0aGF0IGtub3dzIGhvdyB0byBoYW5kbGUgV2l6YXJkRnJhZ21lbnRzIGFuZCBkaXNwbGF5IHRoZW0gaW4gb3JkZXIKLXdpdGhpbiBhIHNpbmdsZSB3aXphcmQuIEl0IHVzZXMgdGhlIFRhc2tXaXphcmRQYWdlcyB0byBkaXNwbGF5IHRoZSB3aXphcmQKLWZyYWdtZW50J3MgY29tcG9zaXRlcyB3aXRoaW4gdGhlIHdpemFyZC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg==